コード例 #1
0
        private void FlowchartItemMouseLeave(object sender, EventArgs e)
        {
            //Fix false mouse leave event caused by hint showing
            Control thisItem = Parent.GetChildAtPoint(Parent.PointToClient(MousePosition));

            if (thisItem == this)
            {
                return;
            }

            //Turn current resize position state to None
            _resizePosition = ItemResizePosition.None;
            SetCursorAccordingToResizePosition(_resizePosition);

            //Reset MouseOn state for control under cursor
            if (ControlUnderCursor != null)
            {
                if (ControlUnderCursor.State != ItemControlState.Disabled)
                {
                    ControlUnderCursor.State = ItemControlState.Normal;
                }
                ControlUnderCursor = null;
                Repaint();
            }
        }
コード例 #2
0
        private ItemResizePosition GetCurrentResizePosition(Point pos)
        {
            ItemResizePosition resizePosition = ItemResizePosition.None;

            if (ItemRegion != null)
            {
                RectangleF rect = ClientRectangle;
                rect.Size = ItemRegion.GetBounds().Size;

                //Right
                if (pos.X >= rect.Width - ResizeBorderWidth)
                {
                    resizePosition = pos.Y >= rect.Height - ResizeBorderWidth
                                         ? ItemResizePosition.BottomRight
                                         : ItemResizePosition.Right;
                }
                else

                if (pos.Y >= rect.Height - ResizeBorderWidth)
                {
                    resizePosition = ItemResizePosition.Bottom;
                }
            }

            return(resizePosition);
        }
コード例 #3
0
        private void SetCursorAccordingToResizePosition(ItemResizePosition resizePosition)
        {
            switch (resizePosition)
            {
            case ItemResizePosition.Move:
                Cursor = Cursors.SizeAll;
                break;

            case ItemResizePosition.Bottom:
                Cursor = Cursors.SizeNS;
                break;

            case ItemResizePosition.Right:
                Cursor = Cursors.SizeWE;
                break;

            case ItemResizePosition.BottomRight:
                Cursor = Cursors.SizeNWSE;
                break;

            default:
                Cursor = _controlUnderCursor != null
                                 ? _controlUnderCursor.Cursor
                                 : Cursors.Default;
                break;
            }
        }
コード例 #4
0
 private void CheckOnResize(Point pos)
 {
     if (ControlUnderCursor == null)
     {
         ItemResizePosition resizePosition = GetCurrentResizePosition(pos);
         SetCursorAccordingToResizePosition(resizePosition);
     }
 }
コード例 #5
0
        private void FlowchartItemMouseUp(object sender, MouseEventArgs e)
        {
            _mouseDown = false;

            //If some control was handled mouse
            if (CheckOnSelectedItemControlUnhandleMouse())
            {
                _itemControlThatHandledMouse = null;
            }
            else
            {
                if (LinkingArrows.Count > 0)
                {
                    Parent.Repaint();
                }
            }

            //If item control under cursor, check on repaint
            if (!CheckOnRepaintItemControls(e.Location, e.Button))
            {
                //otherwise check on item resize or move
                if (!ReadOnly && e.Button == MouseButtons.Left)
                {
                    ItemResizePosition resizePosition = _resizePosition;
                    _resizePosition = GetCurrentResizePosition(e.Location);
                    SetCursorAccordingToResizePosition(_resizePosition);

                    //Fire actual delegate
                    switch (resizePosition)
                    {
                    case ItemResizePosition.Move:
                    {
                        ItemMoved?.Invoke(this);
                        break;
                    }

                    default:
                    {
                        if (_resizePosition <= ItemResizePosition.BottomRight &&
                            _resizePosition > ItemResizePosition.None &&
                            ItemResized != null)
                        {
                            ItemResized(this);
                        }
                        break;
                    }
                    }
                }

                //Call ItemMouseUp delegate
                ItemMouseUp?.Invoke(this, e);

                //Call ItemMouseClick delegate
                ItemMouseClick?.Invoke(this);
            }
        }
コード例 #6
0
        private void FlowchartItemMouseMove(object sender, MouseEventArgs e)
        {
            //If mouse button pressed
            if (_mouseDown)
            {
                //Check on mouse handled by item control
                if (_resizePosition == ItemResizePosition.None &&
                    CheckOnSelectedItemControlHandleMouse(e.Location))
                {
                    _resizePosition = ItemResizePosition.HandledByItemControl;
                }

                //If mouse handled by item control, process mouse by this control
                if (_resizePosition == ItemResizePosition.HandledByItemControl)
                {
                    CheckOnSelectedItemControlMouseMove(e.Location);
                }

                //Do resize control
                else if (_resizePosition > ItemResizePosition.Move)
                {
                    ResizeControl(e.Location);
                }

                //Do move control
                else if (!ReadOnly && e.Button == MouseButtons.Left)
                {
                    //Select actual resize position
                    if (_resizePosition == ItemResizePosition.None)
                    {
                        _resizePosition = ItemResizePosition.Move;
                        SetCursorAccordingToResizePosition(_resizePosition);
                    }

                    //Move control
                    MoveControl(e.Location);

                    //Repaint parent for linking arrows
                    if (Parent.LinkingArrows.Count > 0)
                    {
                        Parent.Repaint();
                    }
                }
            }
            else
            {
                //If item control under cursor, check on repaint
                if (!CheckOnRepaintItemControls(e.Location, MouseButtons.None) && !ReadOnly)
                {
                    //otherwise check on item resize
                    CheckOnResize(e.Location);
                }
            }
        }
コード例 #7
0
        private void FlowchartItemMouseDown(object sender, MouseEventArgs e)
        {
            if (Parent.SetItemSelected(this))
            {
                _mouseDown        = true;
                _previousMousePos = e.Location;

                //Set item selected
                Selected = true;

                //If item control under cursor, check on repaint
                if (!CheckOnRepaintItemControls(e.Location, e.Button))
                {
                    //otherwise check on item resize
                    if (!ReadOnly && e.Button == MouseButtons.Left)
                    {
                        _resizePosition = GetCurrentResizePosition(e.Location);
                    }

                    //Call ItemMouseDown delegate
                    ItemMouseDown?.Invoke(this, e);
                }
            }
        }
コード例 #8
0
        private bool CheckOnRepaintItemControls(Point pos, MouseButtons mb)
        {
            //If mouse inside workplace rectangle, get item control under cursor
            IItemControl control = GetItemControlUnderCursor(pos);

            if (!WorkplaceRectangle.Contains(pos) && !(control is ItemLinkPoint))
            {
                control = null;
            }

            //If control under cursor it`s not same as previous control under cursor
            //or control state was changed, process changes
            if (control != ControlUnderCursor || (control != null &&
                                                  (ItemControlHelper.ControlStateToMouseButton(control) != mb)))
            {
                //Control state was changed
                if (control != null && control == ControlUnderCursor)
                {
                    ItemControlState controlState = control.State;
                    ItemControlHelper.SetControlStateAccordingToMouse(control, mb);

                    //Check on mouse down
                    if (control.State == ItemControlState.ClickedLeft ||
                        control.State == ItemControlState.ClickedRight)
                    {
                        //Update current item control selection
                        SetItemControlSelected(control);

                        //Call ItemControlMouseDown delegate
                        ItemControlMouseDown?.Invoke(this, (IItemElement)control.UserObject,
                                                     new MouseEventArgs(mb, 1, pos.X, pos.Y, 0));
                    }

                    //Check on mouse click
                    else if ((controlState == ItemControlState.ClickedLeft ||
                              controlState == ItemControlState.ClickedRight) &&
                             control.State == ItemControlState.MouseOn)
                    {
                        //Get popped mouse button
                        mb = controlState == ItemControlState.ClickedLeft
                                 ? MouseButtons.Left
                                 : MouseButtons.Right;

                        //Call ItemControlMouseUp delegate
                        ItemControlMouseUp?.Invoke(this, control.UserObject as IItemElement,
                                                   new MouseEventArgs(mb, 1, pos.X, pos.Y, 0));

                        //Internal ItemControlClick
                        OnItemControlClick(control, mb);

                        //Call ItemControlMouseClick delegate
                        ItemControlMouseClick?.Invoke(this, (IItemElement)control.UserObject);
                    }
                }
                else
                {
                    //If control under cursor it`s not same as previous control under cursor
                    if (ControlUnderCursor != null && ControlUnderCursor.State != ItemControlState.Disabled)
                    {
                        ControlUnderCursor.State = ItemControlState.Normal;
                    }
                    if (control != null)
                    {
                        control.State = ItemControlState.MouseOn;
                    }
                }

                //Set current item control as Control under cursor
                ControlUnderCursor = control;

                //Repaint item
                Repaint();

                //Drop resize position
                _resizePosition = ItemResizePosition.None;
                SetCursorAccordingToResizePosition(_resizePosition);

                //Done
                return(true);
            }

            //No changes
            return(false);
        }