private void TestDrop() { if (IsCtrlKeyDown) { ShowsDockControlGuide = false; PaneWithGuide = null; if (_source.CanDrop(DockTreePosition.Floating)) { Target = Target.Floating; } else { Target = Target.Empty; } } else { ShowsDockControlGuide = true; DockPane pane = PaneAtPoint(); Debug.Assert(pane == null || (pane != null && _source.CanDrop(pane))); PaneWithGuide = pane; Target = TargetAtPoint(); } SetCursor(); }
private DockPane PaneAtPointNativeFloatingWindows(IDragSource source, double deltaX, double deltaY, out bool stopHitTest) { stopHitTest = false; FloatingWindowCollection floatingWindows = DockControl.FloatingWindows; Point pt = GetStartMousePosition(_overlayWindow); pt.Offset(deltaX, deltaY); for (int i = floatingWindows.Count - 1; i >= 0; i--) { FloatingWindow floatingWindow = floatingWindows[i]; if (!floatingWindow.IsVisible) { continue; } NativeFloatingWindow nativeWindow = NativeFloatingWindow.GetNativeFloatingWindow(floatingWindow); Rect windowBounds = nativeWindow.GetPreviewBounds(_overlayWindow); stopHitTest = windowBounds.Contains(pt); if (stopHitTest) { pt = GetStartMousePosition(nativeWindow); pt.Offset(deltaX, deltaY); var result = PaneFromHitTestResult(source, VisualTreeHelper.HitTest(nativeWindow, pt)); if (result == null || !source.CanDrop(result)) { stopHitTest = false; continue; } return(result); } } return(null); }
private static DockPane PaneFromHitTestResult(IDragSource source, HitTestResult result) { if (result == null || result.VisualHit == null) { return(null); } for (Visual visual = result.VisualHit as Visual; visual != null; visual = VisualTreeHelper.GetParent(visual) as Visual) { DockItem targetItem = GetTargetItem(visual); DropPosition targetPosition = GetTargetPosition(visual); if (targetItem != null && targetPosition == DropPosition.None && source.CanDrop(targetItem.FirstPane)) { return(targetItem.FirstPane); } } return(null); }
private DockPane PaneAtPointWpfFloatingWindows(IDragSource source, double deltaX, double deltaY, out bool stopHitTest) { stopHitTest = false; FloatingWindowCollection floatingWindows = DockControl.FloatingWindows; Point pt = GetStartMousePosition(_wpfFloatingWindowClient); pt.Offset(deltaX, deltaY); for (int i = floatingWindows.Count - 1; i >= 0; i--) { FloatingWindow floatingWindow = floatingWindows[i]; if (!floatingWindow.IsVisible) { continue; } WpfFloatingWindow window = _wpfFloatingWindowClient.ItemContainerGenerator.ContainerFromItem(floatingWindow) as WpfFloatingWindow; if (window == null) { continue; } Rect windowBounds = new Rect(window.Left, window.Top, window.ActualWidth, window.ActualHeight); stopHitTest = windowBounds.Contains(pt); if (stopHitTest) { pt = _wpfFloatingWindowClient.TranslatePoint(pt, window); var result = PaneFromHitTestResult(source, VisualTreeHelper.HitTest(window, pt)); if (result == null || !source.CanDrop(result)) { stopHitTest = false; continue; } return(result); } } return(null); }