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); } } } } } }
/// <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; }
/// <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; }