private void GetConnectors(Link link, out ConnectorElement startConnectorElement, out ConnectorElement endConnectorElement) { startConnectorElement = (ConnectorElement)Document.FindElement(new Point(link.StartPointX, link.StartPointY)); endConnectorElement = (ConnectorElement)Document.FindElement(new Point(link.EndPointX, link.EndPointY)); if (startConnectorElement == null || endConnectorElement == null) { var startNode = Document.Elements.GetArray().FirstOrDefault(n => n.Id == link.StartNodeId); var endNode = Document.Elements.GetArray().FirstOrDefault(n => n.Id == link.EndNodeId); if (startNode != null && endNode != null) { var listTuples = new List <LineVariantTuple>(); foreach (var connector1 in ((NodeElement)startNode).Connectors) { foreach (var connector2 in ((NodeElement)endNode).Connectors) { listTuples.Add(new LineVariantTuple { StartPoint = connector1.Location, EndPoint = connector2.Location }); } } var minLengthLine = listTuples.OrderBy(l => l.Length).FirstOrDefault(); if (minLengthLine != null) { startConnectorElement = (ConnectorElement)Document.FindElement(minLengthLine.StartPoint); endConnectorElement = (ConnectorElement)Document.FindElement(minLengthLine.EndPoint); } } } }
protected override void OnMouseMove(MouseEventArgs e) { if (e.Button == MouseButtons.None) { Cursor = Cursors.Arrow; var mousePoint = Gsc2Goc(new Point(e.X, e.Y)); if ((_resizeAction != null) && ((Document.Action == DesignerAction.Select) || ((Document.Action == DesignerAction.Connect) && _resizeAction.IsResizingLink))) { Cursor = _resizeAction.UpdateResizeCornerCursor(mousePoint); } if (Document.Action == DesignerAction.Connect) { var mousePointerElementTMP = Document.FindElement(mousePoint); if (_mousePointerElement != mousePointerElementTMP) { if (mousePointerElementTMP is ConnectorElement) { _mousePointerElement = mousePointerElementTMP; _mousePointerElement.Invalidate(); Invalidate(_mousePointerElement, true); } else if (_mousePointerElement != null) { _mousePointerElement.Invalidate(); Invalidate(_mousePointerElement, true); _mousePointerElement = null; } } } else { Invalidate(_mousePointerElement, true); _mousePointerElement = null; } } if (e.Button == MouseButtons.Left) { var dragPoint = Gsc2Goc(new Point(e.X, e.Y)); if ((_resizeAction != null) && _resizeAction.IsResizing) { _resizeAction.Resize(dragPoint); Invalidate(); } if ((_moveAction != null) && _moveAction.IsMoving) { _moveAction.Move(dragPoint); Invalidate(); } if (_isMultiSelection || _isAddSelection) { var p = Gsc2Goc(new Point(e.X, e.Y)); _selectionArea.Size = new Size(p.X - _selectionArea.Location.X, p.Y - _selectionArea.Location.Y); _selectionArea.Invalidate(); Invalidate(_selectionArea, true); } if (_isAddLink) { _selectedElement = Document.FindElement(dragPoint); if (_selectedElement is ConnectorElement && Document.CanAddLink(_connStart, (ConnectorElement)_selectedElement)) { _linkLine.Connector2 = (ConnectorElement)_selectedElement; } else { _linkLine.Connector2 = _connEnd; } var moveController = (IMoveController)((IControllable)_connEnd).GetController(); moveController.Move(dragPoint); base.Invalidate(); } } base.OnMouseMove(e); }
protected override void OnMouseDown(MouseEventArgs e) { Point mousePoint; //ShowSelectionCorner((document.Action==DesignerAction.Select)); switch (Document.Action) { // SELECT case DesignerAction.Connect: case DesignerAction.Select: if (e.Button == MouseButtons.Left) { mousePoint = Gsc2Goc(new Point(e.X, e.Y)); //Verify resize action StartResizeElement(mousePoint); if ((_resizeAction != null) && _resizeAction.IsResizing) { break; } //Verify LabelElement editing if (_isEditLabel) { EndEditLabel(); } // Search element by click _selectedElement = Document.FindElement(mousePoint); if (_selectedElement != null) { //Events var eventMouseDownArg = new ElementMouseEventArgs(_selectedElement, e.X, e.Y); OnElementMouseDown(eventMouseDownArg); // Double-click to edit Label if ((e.Clicks == 2) && _selectedElement is ILabelElement) { StartEditLabel(); break; } // Element selected if (_selectedElement is ConnectorElement) { StartAddLink((ConnectorElement)_selectedElement, mousePoint); _selectedElement = null; } else { StartSelectElements(_selectedElement, mousePoint); } } else { // If click is on neutral area, clear selection Document.ClearSelection(); var p = Gsc2Goc(new Point(e.X, e.Y)); ; _isMultiSelection = true; _selectionArea.Location = p; _selectionArea.Size = new Size(0, 0); } base.Invalidate(); } break; // ADD case DesignerAction.Add: if (e.Button == MouseButtons.Left) { mousePoint = Gsc2Goc(new Point(e.X, e.Y)); StartAddElement(mousePoint); } break; // DELETE case DesignerAction.Delete: if (e.Button == MouseButtons.Left) { mousePoint = Gsc2Goc(new Point(e.X, e.Y)); DeleteElement(mousePoint); } break; } base.OnMouseDown(e); }