void ISectionHost.DoDragDropOperation( Section sectionToDrag )
        {
            _draggingSections = sectionToDrag.GetExpandedDragList();
            object[] data = sectionToDrag.GetDragObjects();

            _imageWindowOffX = sectionToDrag.HostBasedRectangle.X - CursorClientPosition.X;
            _imageWindowOffY = sectionToDrag.HostBasedRectangle.Y - CursorClientPosition.Y;

            _imageWindow = CreateDragImageWindow( _draggingSections, data.Length != _draggingSections.Length );

            if( DoDragDrop( data, DragDropEffects.Copy | DragDropEffects.Move ) == DragDropEffects.None )
            {
                Point cursorPos = PointToClient( Cursor.Position );
                if( _lastDragAction == DragAction.Drop )
                {
                    Rectangle rc = Rectangle.Empty;
                    foreach( Section s in _draggingSections )
                    {
                        if( rc == Rectangle.Empty )
                        {
                            rc = s.HostBasedRectangle;
                        }
                        else
                        {
                            rc = Rectangle.Union( rc, s.HostBasedRectangle );
                        }
                    }
                    foreach( Section s in _draggingSections )
                    {
                        if( s.CanDropInVoid && !rc.Contains( cursorPos ) )
                        {
                            s.DroppedInVoid();
                        }
                    }
                }
            }
            FinishDropOperation();
        }
        private void FinishDropOperation()
        {
            if( _currentDropSection != null )
            {
                _currentDropSection.DragLeave();
                _currentDropSection = null;
            }

            if( _sectionMouseButtonPressed != null )
            {
                _sectionMouseButtonPressed.MouseUp( new MouseEventArgs( MouseButtons.Left, 1, 0, 0, 0 ) );
                _sectionMouseButtonPressed = null;
            }
            _draggingSections = null;
            Cursor = Cursors.Arrow;
            if( _imageWindow != null )
            {
                _imageWindow.Dispose();
                _imageWindow = null;
            }
            _currentDropSection = null;
        }
 public void Dispose()
 {
     if( !_disposed )
     {
         if( --_referencesCount == 0 )
         {
             if( _upArrowWindow != null )
             {
                 _upArrowWindow.Close();
                 _upArrowWindow = null;
             }
             if( _downArrowWindow != null )
             {
                 _downArrowWindow.Close();
                 _downArrowWindow = null;
             }
         }
         Debug.Assert( _referencesCount >= 0 );
         _disposed = true;
     }
 }