context: #region License
  
  /* Copyright (c) 2006 Leslie Sanford
   * 
   * Permission is hereby granted, free of charge, to any person obtaining a copy 
   * of this software and associated documentation files (the "Software"), to 
   * deal in the Software without restriction, including without limitation the 
   * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 
   * sell copies of the Software, and to permit persons to whom the Software is 
   * furnished to do so, subject to the following conditions:
   * 
   * The above copyright notice and this permission notice shall be included in 
   * all copies or substantial portions of the Software. 
   * 
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
   * THE SOFTWARE.
   */
  
  #endregion
  
  #region Contact
  
  /*
   * Leslie Sanford
   * Email: jabberdabber@hotmail.com
   */
  
  #endregion
  
  using System;
  using System.Collections.Generic;
  using System.Drawing;
  using System.Windows.Forms;
  using Sanford.Multimedia;
  
  namespace Sanford.Multimedia.Midi.UI
  {
      public partial class PianoControl
      {
          private class PianoKey : Control
          {
              private PianoControl owner;
  
              private bool on = false;
  
              private SolidBrush onBrush = new SolidBrush(Color.SkyBlue);
  
              private SolidBrush offBrush = new SolidBrush(Color.White);
  
              private int noteID = 60;
  
              public PianoKey(PianoControl owner)
              {
                  this.owner = owner;
                  this.TabStop = false;
              }
  
              public void PressPianoKey()
              {
                  #region Guard
  
                  if(on)
                  {
                      return;
                  }
  
                  #endregion
  
                  on = true;
  
                  Invalidate();
  
                  owner.OnPianoKeyDown(new PianoKeyEventArgs(noteID));
              }
  
              public void ReleasePianoKey()
              {
                  #region Guard
  
                  if(!on)
                  {
                      return;
                  }
  
                  #endregion
  
                  on = false;
  
                  Invalidate();
  
                  owner.OnPianoKeyUp(new PianoKeyEventArgs(noteID));
              }
  
              protected override void Dispose(bool disposing)
              {
                  if(disposing)
                  {
                      onBrush.Dispose();
                      offBrush.Dispose();
                  }
  
                  base.Dispose(disposing);
              }
  
              protected override void OnMouseEnter(EventArgs e)
              {
                  if(Control.MouseButtons == MouseButtons.Left)
                  {
                      PressPianoKey();
                  }
  
                  base.OnMouseEnter(e);
              }
  
              protected override void OnMouseLeave(EventArgs e)
              {
                  if(on)
                  {
                      ReleasePianoKey();
                  }
  
                  base.OnMouseLeave(e);
              }
  
              protected override void OnMouseDown(MouseEventArgs e)
              {
                  PressPianoKey();
  
                  if(!owner.Focused)
                  {
                      owner.Focus();
                  }
  
                  base.OnMouseDown(e);
              }
  
              protected override void OnMouseUp(MouseEventArgs e)
              {
                  ReleasePianoKey();
  
                  base.OnMouseUp(e);
              }
  
              protected override void OnMouseMove(MouseEventArgs e)
              {
                  if(e.X < 0 || e.X > Width || e.Y < 0 || e.Y > Height)
                  {
                      Capture = false;
                  }
  
                  base.OnMouseMove(e);
              }
  
              protected override void OnPaint(PaintEventArgs e)
              {
                  if(on)
                  {
                      e.Graphics.FillRectangle(onBrush, 0, 0, Size.Width, Size.Height);
                  }
                  else
                  {
                      e.Graphics.FillRectangle(offBrush, 0, 0, Size.Width, Size.Height);
                  }
  
                  e.Graphics.DrawRectangle(Pens.Black, 0, 0, Size.Width - 1, Size.Height - 1);
  
                  base.OnPaint(e);
              }
  
              public Color NoteOnColor
              {
                  get
                  {
                      return onBrush.Color;
                  }
                  set
                  {
                      onBrush.Color = value;
  
                      if(on)
                      {
                          Invalidate();
                      }
                  }
              }
  
              public Color NoteOffColor
              {
                  get
                  {
                      return offBrush.Color;
                  }
                  set
                  {
                      offBrush.Color = value;
  
                      if(!on)
                      {
                          Invalidate();
                      }
                  }
              }
  
              public int NoteID
              {
                  get
                  {
                      return noteID;
                  }
                  set
                  {
                      #region Require
  
  
gt:                     if(value < 0 || value > ShortMessage.DataMaxValue)