示例#1
0
        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);
                    }
                }
            }
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }