public PEMidiTrack(Track track)
        {
            InitializeComponent();

            if (!DesignMode)
            {
                DifficultyButtons.ForEach(x =>
                {
                    x.Button.Click += delegate(object o, EventArgs e)
                    {
                        setDifficulty(x.Difficulty);
                    };
                    x.Button.MouseDown += delegate(object sender, MouseEventArgs e)
                    {
                        x.Button.Tag = e.Location;
                    };
                    x.Button.MouseUp += delegate(object sender, MouseEventArgs e)
                    {
                        x.Button.Tag = null;
                    };
                    x.Button.MouseMove += delegate(object sender, MouseEventArgs e)
                    {
                        if (e.Button == System.Windows.Forms.MouseButtons.Left &&
                            x.Button.Tag != null && ((Point)x.Button.Tag).Distance(e.Location) > 3)
                        {
                            x.Button.DoDragDrop(new PETrackDifficulty(this, x.Difficulty), DragDropEffects.All);
                            ItemDifficultyBeginDrag.IfObjectNotNull(bd => bd(this, x.Difficulty, null));
                        }
                    };

                    x.Button.AllowDrop = true;

                    x.Button.DragEnter += new DragEventHandler(Button_DragEnter);
                    x.Button.DragDrop  += new DragEventHandler(Button_DragDrop);
                });

                setDifficulty(GuitarDifficulty.Expert);
                Track = track;


                labelTrackName.AllowDrop  = true;
                labelTrackName.DragEnter += new DragEventHandler(panelTrackName_DragEnter);
                labelTrackName.DragDrop  += new DragEventHandler(panelTrackName_DragDrop);
                labelTrackName.DragOver  += new DragEventHandler(panelTrackName_DragOver);

                labelTrackName.MouseMove += new MouseEventHandler(panelTrackName_MouseMove);
                labelTrackName.MouseUp   += new MouseEventHandler(panelTrackName_MouseUp);
                labelTrackName.MouseDown += new MouseEventHandler(panelTrackName_MouseDown);
            }
        }
        void Button_DragDrop(object sender, DragEventArgs e)
        {
            var dropDiff = e.GetDropObject <PETrackDifficulty>();

            if (dropDiff != null)
            {
                var btn = DifficultyButtons.SingleOrDefault(x => x.Button == sender);

                if ((dropDiff.MidiTrack != btn.MidiTrack) || (dropDiff.MidiTrack == btn.MidiTrack && dropDiff.Difficulty != btn.Difficulty))
                {
                    DifficultyItemDropped.IfObjectNotNull(d => d(this, DifficultyButtons.Single(x => x.Button == sender).Difficulty, e));
                }
            }
        }
        void Button_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.None;
            var dropDiff = e.GetDropObject <PETrackDifficulty>();

            if (dropDiff != null)
            {
                var btn = DifficultyButtons.SingleOrDefault(x => x.Button == sender);

                if ((dropDiff.MidiTrack != btn.MidiTrack) || (dropDiff.MidiTrack == btn.MidiTrack && dropDiff.Difficulty != btn.Difficulty))
                {
                    e.Effect = DragDropEffects.All;
                }
            }
        }