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(); } }
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); }
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; } }
private void CheckOnResize(Point pos) { if (ControlUnderCursor == null) { ItemResizePosition resizePosition = GetCurrentResizePosition(pos); SetCursorAccordingToResizePosition(resizePosition); } }
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); } }
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); } } }
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); } } }
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); }