bool RespondsToDragHandle(FPGameObject gameObject, FPDragHandle dragHandle)
        {
            bool respondsToWidth = gameObject.WidthSegments > 0;
            bool respondsToHeight = gameObject.HeightSegments > 0;

            if (!respondsToWidth && IsWidthHandle(dragHandle))
                return false;

            if (!respondsToHeight && IsHeightHandle(dragHandle))
                return false;

            return true;
        }
        PointF PointFromHandleAroundRect(FPDragHandle handle, RectangleF rect)
        {
            switch (handle)
            {
                case FPDragHandle.TopLeft:
                    return new PointF(rect.X, rect.Y);
                case FPDragHandle.BottomLeft:
                    return new PointF(rect.X, rect.Y + rect.Height);
                case FPDragHandle.TopRight:
                    return new PointF(rect.X + rect.Width, rect.Y);
                case FPDragHandle.BottomRight:
                    return new PointF(rect.X + rect.Width, rect.Y + rect.Height);

                case FPDragHandle.MiddleLeft:
                    return new PointF(rect.X, rect.Y + rect.Height / 2.0f);
                case FPDragHandle.MiddleTop:
                    return new PointF(rect.X + rect.Width / 2.0f, rect.Y);
                case FPDragHandle.MiddleRight:
                    return new PointF(rect.X + rect.Width, rect.Y + rect.Height / 2.0f);
                case FPDragHandle.MiddleBottom:
                    return new PointF(rect.X + rect.Width / 2.0f, rect.Y + rect.Height);
                case FPDragHandle.Center:
                    return new PointF(rect.X + rect.Width / 2.0f, rect.Y + rect.Height / 2.0f);

                default:
                    return PointF.Empty;
            }
        }
 bool IsWidthHandle(FPDragHandle handle)
 {
     switch (handle)
     {
         case FPDragHandle.TopLeft:
         case FPDragHandle.BottomLeft:
         case FPDragHandle.TopRight:
         case FPDragHandle.BottomRight:
         case FPDragHandle.MiddleLeft:
         case FPDragHandle.MiddleRight:
             return true;
         case FPDragHandle.MiddleTop:
         case FPDragHandle.MiddleBottom:
         case FPDragHandle.Center:
         case FPDragHandle.None:
         default:
             return false;
     }
 }
        private void levelView_MouseMoved(object sender, MouseEventArgs e)
        {
            PointF location = LevelViewLocation(e);
            currentHandle = FPDragHandle.None;

            const float handleSize = 14.0f;
            RectangleF handleRect = new RectangleF(0.0f, 0.0f, handleSize, handleSize);

            if (selectedIndices.Count == 1)
            {
                var draggedObject = DraggedObject;
                for (FPDragHandle handle = FPDragHandle.TopLeft; handle < FPDragHandle.Center; handle++)
                {
                    if (!RespondsToDragHandle(draggedObject, handle))
                        continue;

                    PointF handlePoint = PointFromHandleAroundRect(handle, draggedObject.Rect);

                    handleRect.X = handlePoint.X - handleRect.Width / 2.0f;
                    handleRect.Y = handlePoint.Y - handleRect.Height / 2.0f;

                    if (handleRect.Contains(location))
                    {
                        currentHandle = handle;
                        beginMovePoint = endMovePoint = location;
                        break;
                    }
                }

                if (currentHandle == FPDragHandle.None)
                {
                    if (draggedObject.Rect.Contains(location))
                    {
                        currentHandle = FPDragHandle.Center;
                        beginMovePoint = endMovePoint = location;
                    }
                }
            }
            else
            {
                foreach (var index in selectedIndices)
                {
                    var gameObject = gameObjects[index];
                    if (gameObject.Rect.Contains(location))
                    {
                        currentHandle = FPDragHandle.Center;
                        beginMovePoint = endMovePoint = location;
                        break;
                    }
                }

            }

            levelView.Invalidate();
        }
 private void BeginResize(FPDragHandle handle)
 {
     BeforeAction("Resize Selected");
 }