//public override void GetConnections(List<ConnectionViewModel> connections, ConnectorInfo info)
        //{
        //    base.GetConnections(connections, info);
        //    foreach (var item in info.Outputs.Where(p => p.ConnectorFor.DataObject is ITypedItem))
        //    {
        //        var referenceItem = item.ConnectorFor.DataObject as ITypedItem;
        //        if (referenceItem == null) continue;
        //        var sourceObject = referenceItem.RelatedNode();
        //        if (sourceObject == null) continue;
        //        foreach (var input in info.Inputs.Where(p => p.ConnectorFor.DataObject == sourceObject))
        //        {
        //            connections.Add(new ConnectionViewModel(info.DiagramViewModel)
        //            {
        //                Remove = Remove,
        //                Name = item.Name + "->" + input.Name,
        //                ConnectorA = item,
        //                ConnectorB = input,
        //                Color = new Color(0.3f, 0.4f, 0.75f)
        //            });
        //        }
        //    }
        //}

        public override void Remove(ConnectionViewModel connectionViewModel)
        {
            base.Remove(connectionViewModel);
            var obj = connectionViewModel.ConnectorA.ConnectorFor.DataObject as ITypedItem;

            if (obj != null)
            {
                obj.RelatedType = null;
            }
        }
        public void QueryContextMenu(ContextMenuUI ui, MouseEvent evt, params object[] obj)
        {
            var connector = obj.FirstOrDefault() as ConnectorViewModel;

            if (connector != null)
            {
                var connections =
                    InvertGraphEditor.CurrentDiagramViewModel.GraphItems.OfType <ConnectionViewModel>()
                    .Where(p => p.ConnectorA == connector || p.ConnectorB == connector).ToArray();

                foreach (var connection in connections)
                {
                    ConnectionViewModel connection1 = connection;
                    ui.AddCommand(new ContextMenuItem()
                    {
                        Title   = string.Format("Remove {0}", connection1.Name),
                        Group   = "Remove",
                        Command = new LambdaCommand("Remove Connection", () => { connection1.Remove(connection1); })
                    });
                }
            }
        }
        public override void OnMouseMove(MouseEvent e)
        {
            base.OnMouseMove(e);
            _startPos = StartConnector.Bounds.center;

            _endPos = e.MousePosition;

            endViewModel = ConnectorAtMouse;
            color        = Color.green;

            if (endViewModel == null)
            {
                var nodeAtMouse = ViewModelAtMouse as DiagramNodeViewModel;

                if (nodeAtMouse != null)
                {
                    foreach (var connector in nodeAtMouse.Connectors)
                    {
                        // Skip anything that might still be visible but not "visible"
                        if (nodeAtMouse.IsCollapsed)
                        {
                            if (connector != connector.InputConnector || connector != connector.OutputConnector)
                            {
                                continue;
                            }
                        }
                        ConnectionViewModel connection = null;
                        foreach (var strategy in InvertGraphEditor.ConnectionStrategies)
                        {
                            //try and connect them
                            connection = strategy.Connect(DiagramViewModel, StartConnector, connector);
                            if (connection != null)
                            {
                                break;
                            }
                        }
                        if (connection != null)
                        {
                            CurrentConnection        = connection;
                            _endPos                  = connector.Bounds.center;
                            connector.HasConnections = true;
                            break;
                        }
                    }
                    if (CurrentConnection != null)
                    {
                        // Grab the default connector
                        var adjustedBounds = new Rect(nodeAtMouse.Bounds.x - 9, nodeAtMouse.Bounds.y + 1,
                                                      nodeAtMouse.Bounds.width + 19, nodeAtMouse.Bounds.height + 9);


                        //InvertGraphEditor.PlatformDrawer.DrawStretchBox(adjustedBounds.Scale(InvertGraphEditor.DesignerWindow.Scale),InvertStyles.NodeBackground,20);
                    }
                }
                else
                {
                    CurrentConnection = null;
                }
            }
            else
            {
                foreach (var strategy in InvertGraphEditor.ConnectionStrategies)
                {
                    //try and connect them
                    var connection = strategy.Connect(DiagramViewModel, StartConnector, endViewModel);
                    if (connection != null)
                    {
                        CurrentConnection = connection;
                        break;
                    }
                }
                if (CurrentConnection == null)
                {
                    color = Color.red;
                }
                else
                {
                    _endPos = endViewModel.Bounds.center;
                }
            }
        }