private bool IsBounded(IEnumerable <object> items) { var oneItem = new object[1]; foreach (IPickingAdapter pickingAdapter in AdaptedControl.AsAll <IPickingAdapter>()) { foreach (object item in items) { oneItem[0] = item; Rectangle adapterBounds = pickingAdapter.GetBounds(oneItem); if (!adapterBounds.IsEmpty) { return(true); } } } foreach (IPickingAdapter2 pickingAdapter in AdaptedControl.AsAll <IPickingAdapter2>()) { foreach (object item in items) { oneItem[0] = item; Rectangle adapterBounds = pickingAdapter.GetBounds(oneItem); if (!adapterBounds.IsEmpty) { return(true); } } } return(false); }
/// <summary> /// Performs custom actions on adaptable control MouseUp events; base method should /// be called first</summary> /// <param name="sender">Adaptable control</param> /// <param name="e">Mouse event args</param> protected override void OnMouseUp(object sender, MouseEventArgs e) { base.OnMouseUp(sender, e); if (e.Button == MouseButtons.Left) { if (m_draggingAnnotations != null) { if (m_initiated) { ITransactionContext transactionContext = AdaptedControl.ContextAs <ITransactionContext>(); transactionContext.DoTransaction( delegate { foreach (IItemDragAdapter itemDragAdapter in AdaptedControl.AsAll <IItemDragAdapter>()) { itemDragAdapter.EndDrag(); } }, "Drag Items".Localize()); m_initiated = false; } } if (m_autoTranslateAdapter != null) { m_autoTranslateAdapter.Enabled = false; } } }
private void control_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right && ((Control.ModifierKeys & Keys.Alt) == 0)) { Point p = new Point(e.X, e.Y); object target = null; foreach (IPickingAdapter pickingAdapter in AdaptedControl.AsAll <IPickingAdapter>()) { DiagramHitRecord hitRecord = pickingAdapter.Pick(p); if (hitRecord.Item != null) { target = hitRecord.Item; break; } } // iter over IPickingAdapter if (target == null) { foreach (IPickingAdapter2 pickingAdapter in AdaptedControl.AsAll <IPickingAdapter2>()) { DiagramHitRecord hitRecord = pickingAdapter.Pick(p); if (hitRecord.Item != null) { target = hitRecord.Item; break; } } } object context = AdaptedControl.Context; TriggeringLocation = p; var commands = new List <object>(m_providers.GetCommands(context, target)); OnContextMenuOpening(commands); Point screenP = AdaptedControl.PointToScreen(p); m_commandService.RunContextMenu(commands, screenP); } }
private void control_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.None && AdaptedControl.Focused) { object pickedItem = null; object pickedPart = null; DiagramHitRecord hitRecord = null; foreach (IPickingAdapter pickingAdapter in AdaptedControl.AsAll <IPickingAdapter>()) { hitRecord = pickingAdapter.Pick(new Point(e.X, e.Y)); if (hitRecord.Item != null) { pickedItem = hitRecord.Item; pickedPart = hitRecord.Part; break; } } if (pickedItem == null) { foreach (IPickingAdapter2 pickingAdapter in AdaptedControl.AsAll <IPickingAdapter2>()) { hitRecord = pickingAdapter.Pick(new Point(e.X, e.Y)); if (hitRecord.Item != null) { pickedItem = hitRecord.Item; pickedPart = hitRecord.Part; break; } } } if (hitRecord.Item != m_hoverItem || hitRecord.Part != m_hoverPart || hitRecord.SubItem != m_hoverSubItem || hitRecord.SubPart != m_hoverSubPart) { StartHover(hitRecord); } } }
/// <summary> /// Performs custom actions when performing a mouse dragging operation</summary> /// <param name="e">Mouse move event args</param> protected override void OnDragging(MouseEventArgs e) { if (m_layoutContext != null && !m_isDragging) { ResetHotNode(); if (e.Button == MouseButtons.Left && ((Control.ModifierKeys & Keys.Alt) == 0) && !AdaptedControl.Capture) { { m_firstPoint = GdiUtil.InverseTransform(m_transformAdapter.Transform, FirstPoint); m_mousePick = m_graphAdapter.Pick(FirstPoint); if (m_mousePick.Node != null) { m_initiated = true; foreach (IItemDragAdapter itemDragAdapter in AdaptedControl.AsAll <IItemDragAdapter>()) { itemDragAdapter.BeginDrag(this); } AdaptedControl.Capture = true; if (m_autoTranslateAdapter != null) { m_autoTranslateAdapter.Enabled = true; } } } } } if (m_draggingNodes != null) { AdaptedControl.Invalidate(); } }
/// <summary> /// Computes a rectangle bounding a collection of objects</summary> /// <param name="items">Enumeration of objects to find bounds for</param> /// <returns>Rectangle bounding a collection of objects</returns> protected Rectangle GetBounds(IEnumerable <object> items) { Rectangle bounds = new Rectangle(); foreach (IPickingAdapter pickingAdapter in AdaptedControl.AsAll <IPickingAdapter>()) { Rectangle adapterBounds = pickingAdapter.GetBounds(items); if (!adapterBounds.IsEmpty) { bounds = bounds.IsEmpty ? adapterBounds : Rectangle.Union(bounds, adapterBounds); } } foreach (IPickingAdapter2 pickingAdapter in AdaptedControl.AsAll <IPickingAdapter2>()) { Rectangle adapterBounds = pickingAdapter.GetBounds(items); if (!adapterBounds.IsEmpty) { bounds = bounds.IsEmpty ? adapterBounds : Rectangle.Union(bounds, adapterBounds); } } return(bounds); }
/// <summary> /// Performs custom actions when ending a mouse dragging operation</summary> /// <param name="e">Mouse event args</param> protected override void OnEndDrag(MouseEventArgs e) { base.OnEndDrag(e); if (m_draggingNodes != null && m_draggingNodes.Length > 0) { foreach (var draggingNode in m_draggingNodes) { ResetCustomStyle(draggingNode); } foreach (IItemDragAdapter itemDragAdapter in AdaptedControl.AsAll <IItemDragAdapter>()) { itemDragAdapter.EndingDrag(); //call ourselves, too } var transactionContext = AdaptedControl.ContextAs <ITransactionContext>(); transactionContext.DoTransaction(delegate { foreach (IItemDragAdapter itemDragAdapter in AdaptedControl.AsAll <IItemDragAdapter>()) { itemDragAdapter.EndDrag(); //call ourselves, too } }, "Drag Items".Localize()); if (m_autoTranslateAdapter != null) { m_autoTranslateAdapter.Enabled = false; } AdaptedControl.Invalidate(); } m_draggingNodes = null; m_newPositions = null; m_oldPositions = null; ResetCustomStyle(m_targetItem); m_targetItem = null; m_resizing = false; AdaptedControl.Cursor = Cursors.Default; }
/// <summary> /// Performs custom actions when performing a mouse dragging operation</summary> /// <param name="e">Mouse event args</param> protected override void OnDragging(MouseEventArgs e) { if (m_layoutContext != null && m_draggingAnnotations == null) { if (e.Button == MouseButtons.Left && ((Control.ModifierKeys & Keys.Alt) == 0) && !AdaptedControl.Capture) { { m_mousePick = Pick(FirstPoint); if (m_mousePick.Item != null) { m_initiated = true; foreach (IItemDragAdapter itemDragAdapter in AdaptedControl.AsAll <IItemDragAdapter>()) { itemDragAdapter.BeginDrag(this); } AdaptedControl.Capture = true; if (m_autoTranslateAdapter != null) { m_autoTranslateAdapter.Enabled = true; } } } } } if (m_draggingAnnotations != null) { AdaptedControl.Invalidate(); } }
/// <summary> /// Raises the BeginDrag event and performs custom processing</summary> /// <param name="e">A MouseEventArgs that contains the event data</param> protected override void OnBeginDrag(MouseEventArgs e) { base.OnBeginDrag(e); if (m_layoutContext != null && e.Button == MouseButtons.Left && ((Control.ModifierKeys & Keys.Alt) == 0) && !AdaptedControl.Capture) { m_firstPoint = GdiUtil.InverseTransform(m_transformAdapter.Transform, FirstPoint); m_mousePick = m_graphAdapter.Pick(FirstPoint); if (CanDragging()) { foreach (var itemDragAdapter in AdaptedControl.AsAll <IItemDragAdapter>()) { if (itemDragAdapter != this) { itemDragAdapter.BeginDrag(this); } } // drag all selected nodes, and any edges impinging on them ActiveCollection <TNode> draggingNodes = new ActiveCollection <TNode>(); HashSet <TNode> nodes = new HashSet <TNode>(); foreach (var node in m_selectionContext.GetSelection <TNode>()) { if (AllowDragging(node)) { AddDragNode(node, draggingNodes, nodes); } } m_draggingNodes = draggingNodes.GetSnapshot <TNode>(); if ((m_draggingNodes.Length == 1) && m_draggingNodes[0] == m_mousePick.Item) { if (m_mousePick.SubItem != null) { if (m_mousePick.SubItem.Is <TNode>()) // favor dragging sub item { m_draggingNodes[0] = m_mousePick.SubItem.Cast <TNode>(); } if (m_mousePick.SubPart.Is <DiagramBorder>()) // sub-container resizing? { var borderPart = m_mousePick.SubPart.Cast <DiagramBorder>(); if (m_editableGraphContainer != null && m_editableGraphContainer.CanResize(m_mousePick.SubItem, borderPart)) { m_firstBound = m_graphAdapter.GetLocalBound(m_mousePick.SubItem.As <TNode>()); m_resizing = true; m_targetItem = m_mousePick.SubItem; } } } else if (m_mousePick.Part.Is <DiagramBorder>()) // then favor container resizing { var borderPart = m_mousePick.Part.Cast <DiagramBorder>(); if (m_editableGraphContainer != null && m_editableGraphContainer.CanResize(m_mousePick.Item, borderPart)) { m_firstBound = m_graphAdapter.GetLocalBound(m_mousePick.Item.As <TNode>()); m_resizing = true; m_targetItem = m_mousePick.Item; } } } m_newPositions = new Point[m_draggingNodes.Length]; m_oldPositions = new Point[m_draggingNodes.Length]; for (int i = 0; i < m_draggingNodes.Length; i++) { // Initialize m_newPositions in case the mouse up event occurs before // a paint event, which can happen during rapid clicking. Point currentLocation = m_draggingNodes[i].Bounds.Location; m_newPositions[i] = currentLocation; m_oldPositions[i] = currentLocation; } AdaptedControl.Capture = true; if (m_autoTranslateAdapter != null) { m_autoTranslateAdapter.Enabled = true; } } } }