private void UpdateSelection(Collection <ISelectable> itemsToSelect, Rect rubberBand, DiagramDesignerCanvas dCanvas)
        {
            foreach (Control item in dCanvas.Children)
            {
                Rect itemRect   = VisualTreeHelper.GetDescendantBounds(item);
                Rect itemBounds = item.TransformToAncestor(designerCanvas).TransformBounds(itemRect);

                // drag decorator requires this;
                itemBounds.Inflate(-DragDecoratorInflateValue, -DragDecoratorInflateValue);

                if (rubberBand.Contains(itemBounds))
                {
                    if (item is ISelectable)
                    {
                        itemsToSelect.Add(item as ISelectable);
                    }
                }

                if (item is DiagramDesignerItem)
                {
                    DiagramDesignerItem designerItem = item as DiagramDesignerItem;
                    if (designerItem.IsDiagramLink)
                    {
                        continue;
                    }

                    DiagramDesignerCanvas canvas = DiagramHelper.GetChild(designerItem, typeof(DiagramDesignerCanvas)) as DiagramDesignerCanvas;
                    if (canvas != null)
                    {
                        UpdateSelection(itemsToSelect, rubberBand, canvas);
                    }
                }
            }
        }
        private static void IsSelectedPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            DiagramDesignerItem item = obj as DiagramDesignerItem;

            if (item.DataContext != null)
            {
                if (item != null)
                {
                    DiagramDesigner designer = DiagramHelper.GetDiagramDesigner(item) as DiagramDesigner;
                    if (designer != null)
                    {
                        if ((bool)args.NewValue)
                        {
                            if (!designer.SelectionService.CurrentSelection.Contains(item))
                            {
                                designer.SelectionService.AddToSelection(item, false);
                            }

                            if (item.IsSelected && !item.IsFocused)
                            {
                                item.Focus();
                            }
                        }
                        else
                        {
                            if (designer.SelectionService.CurrentSelection.Contains(item))
                            {
                                designer.SelectionService.RemoveFromSelection(item, false);
                            }
                        }
                    }
                }
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Dragging has started, see if VM is IDiagramLinkViewModel and notify of moving start.
        /// </summary>
        void DragThumb_DragStarted(object sender, DragStartedEventArgs e)
        {
            diagramDesigner   = DiagramHelper.GetDiagramDesigner(this);
            diagramDesignerVM = diagramDesigner.DataContext as IDiagramViewModel;

            selectedItem   = null;
            selectedItemVM = null;

            edgePointVM = this.DataContext as IEdgePointViewModel;

            List <ISelectable> selection = diagramDesigner.SelectionService.CurrentSelection;

            if (selection.Count == 1)
            {
                foreach (ISelectable item in selection)
                {
                    if (item is DiagramDesignerItem)
                    {
                        if ((item as DiagramDesignerItem).IsDiagramLink)
                        {
                            selectedItem = item as DiagramDesignerItem;
                        }
                    }
                }

                // create control to display on the drag adorner
                dragCanvas = new Canvas();
                IDiagramLinkViewModel designerItem = selectedItem.DataContext as IDiagramLinkViewModel;
                selectedItemVM = designerItem;

                AddLinkAnchorAndShape(new PointD(designerItem.StartEdgePoint.X, designerItem.StartEdgePoint.Y),
                                      new PointD(designerItem.EndEdgePoint.X, designerItem.EndEdgePoint.Y));

                // create drag adorner
                if (diagramDesigner != null && selectedItemVM != null && selectedItem != null && edgePointVM != null)
                {
                    AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(diagramDesigner);
                    if (adornerLayer != null)
                    {
                        this.dragAdorner = new DragAdorner(diagramDesigner, dragCanvas, false, 1.0);
                        if (this.dragAdorner != null)
                        {
                            adornerLayer.Add(this.dragAdorner);
                            e.Handled = true;
                        }
                    }
                }
            }
            e.Handled = false;
        }
        /// <summary>
        /// Dragging has started, see if VM is IDiagramLinkViewModel and notify of moving start.
        /// </summary>
        void DragThumb_DragStarted(object sender, DragStartedEventArgs e)
        {
            diagramDesigner = DiagramHelper.GetDiagramDesigner(this);
            diagramDesignerVM = diagramDesigner.DataContext as IDiagramViewModel;

            selectedItem = null;
            selectedItemVM = null;

            edgePointVM = this.DataContext as IEdgePointViewModel;

            List<ISelectable> selection = diagramDesigner.SelectionService.CurrentSelection;
            if (selection.Count == 1)
            {
                foreach (ISelectable item in selection)
                {
                    if (item is DiagramDesignerItem)
                        if ((item as DiagramDesignerItem).IsDiagramLink)
                        {
                            selectedItem = item as DiagramDesignerItem;
                        }
                }

                // create control to display on the drag adorner
                dragCanvas = new Canvas();
                IDiagramLinkViewModel designerItem = selectedItem.DataContext as IDiagramLinkViewModel;
                selectedItemVM = designerItem;

                AddLinkAnchorAndShape(new PointD(designerItem.StartEdgePoint.X, designerItem.StartEdgePoint.Y),
                    new PointD(designerItem.EndEdgePoint.X, designerItem.EndEdgePoint.Y));

                // create drag adorner 
                if (diagramDesigner != null && selectedItemVM != null && selectedItem != null && edgePointVM != null)
                {
                    AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(diagramDesigner);
                    if (adornerLayer != null)
                    {
                        this.dragAdorner = new DragAdorner(diagramDesigner, dragCanvas, false, 1.0);
                        if (this.dragAdorner != null)
                        {
                            adornerLayer.Add(this.dragAdorner);
                            e.Handled = true;
                        }
                    }
                }
            }
            e.Handled = false;
        }
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="designer">Diagram designer.</param>
        /// <param name="sourceConnector">Source item of the relationship.</param>
        /// <param name="startPoint">Start point.</param>
        public DiagramConnectorAdorner(DiagramDesigner designer, DiagramConnector sourceConnector, Point startPoint)
            : base(designer)
        {
            this.diagramDesigner = designer;
            if (this.diagramDesigner.DataContext is IDiagramViewModel)
                diagramDesignerVM = this.diagramDesigner.DataContext as IDiagramViewModel;
            this.sourceConnector = sourceConnector;
            this.startPoint = startPoint;

            sourceItem = sourceConnector.DiagramItem;
            //if (sourceConnector.DiagramItem is ISelectable)
            //    this.sourceElement = (sourceConnector.DiagramItem as ISelectable).SelectedData;

            drawingPen = new Pen(Brushes.LightSlateGray, 1);
            drawingPen.LineJoin = PenLineJoin.Round;
            
            this.Cursor = Cursors.Cross;
        }
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="designer">Diagram designer.</param>
        /// <param name="sourceConnector">Source item of the relationship.</param>
        /// <param name="startPoint">Start point.</param>
        public DiagramConnectorAdorner(DiagramDesigner designer, DiagramConnector sourceConnector, Point startPoint)
            : base(designer)
        {
            this.diagramDesigner = designer;
            if (this.diagramDesigner.DataContext is IDiagramViewModel)
            {
                diagramDesignerVM = this.diagramDesigner.DataContext as IDiagramViewModel;
            }
            this.sourceConnector = sourceConnector;
            this.startPoint      = startPoint;

            sourceItem = sourceConnector.DiagramItem;
            //if (sourceConnector.DiagramItem is ISelectable)
            //    this.sourceElement = (sourceConnector.DiagramItem as ISelectable).SelectedData;

            drawingPen          = new Pen(Brushes.LightSlateGray, 1);
            drawingPen.LineJoin = PenLineJoin.Round;

            this.Cursor = Cursors.Cross;
        }
        /// <summary>
        /// Hit testing.
        /// </summary>
        /// <param name="hitPoint">Location to do a hit test at.</param>
        private void HitTesting(Point hitPoint)
        {
            DependencyObject hitObject = diagramDesigner.InputHitTest(hitPoint) as DependencyObject;

            while (hitObject != null)
            {
                if (hitObject is DiagramDesignerItem)
                {
                    hitItem = hitObject as DiagramDesignerItem;
                    if (!hitItem.IsDiagramLink)
                    {
                        if (sourceItem != null && hitItem != null && this.diagramDesigner.CreateRelationshipCommand != null)
                        {
                            object sourceData = sourceItem.SelectedData;
                            object targetData = hitItem.SelectedData;
                            if (sourceData != null && targetData != null)
                            {
                                ViewModelRelationshipCreationInfo info = new ViewModelRelationshipCreationInfo(sourceData, targetData);
                                if (info.Source != null && info.Target != null)
                                {
                                    if (this.diagramDesigner.CreateRelationshipCommand.CanExecute(info))
                                    {
                                        return;
                                    }
                                }
                            }
                        }
                    }

                    hitItem = null;
                    return;
                }

                hitObject = VisualTreeHelper.GetParent(hitObject);
            }

            hitItem = null;
        }
Esempio n. 8
0
        /// <summary>
        /// Gets the item that is directly under the mouse.
        /// </summary>
        /// <param name="position">Position.</param>
        /// <returns>Item under the mouse or null.</returns>
        public object GetItemAtPosition(PointD position)
        {
            DiagramDesignerItem hitItem   = null;
            DependencyObject    hitObject = this.InputHitTest(position.ToPoint()) as DependencyObject;

            while (hitObject != null)
            {
                if (hitObject is DiagramDesignerItem)
                {
                    hitItem = hitObject as DiagramDesignerItem;
                    break;
                }

                hitObject = VisualTreeHelper.GetParent(hitObject);
            }
            if (hitItem != null)
            {
                return(hitItem.DataContext);
            }
            else
            {
                return(null);
            }
        }
        /// <summary>
        /// Hit testing.
        /// </summary>
        /// <param name="hitPoint">Location to do a hit test at.</param>
        private void HitTesting(Point hitPoint)
        {
            DependencyObject hitObject = diagramDesigner.InputHitTest(hitPoint) as DependencyObject;
            while (hitObject != null )
            {
                if (hitObject is DiagramDesignerItem)
                {
                    hitItem = hitObject as DiagramDesignerItem;
                    if (!hitItem.IsDiagramLink)
                    {
                        if (sourceItem != null && hitItem != null && this.diagramDesigner.CreateRelationshipCommand != null)
                        {
                            object sourceData = sourceItem.SelectedData;
                            object targetData = hitItem.SelectedData;
                            if (sourceData != null && targetData != null)
                            {
                                ViewModelRelationshipCreationInfo info = new ViewModelRelationshipCreationInfo(sourceData, targetData);
                                if (info.Source != null && info.Target != null)
                                    if (this.diagramDesigner.CreateRelationshipCommand.CanExecute(info))
                                    {
                                        return;
                                    }
                            }
                        }
                    }

                    hitItem = null;
                    return;
                }

                hitObject = VisualTreeHelper.GetParent(hitObject);
            }

            hitItem = null;
        }