DockingManagerDropTarget.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /*************************************************************************************
  2. Extended WPF Toolkit
  3. Copyright (C) 2007-2013 Xceed Software Inc.
  4. This program is provided to you under the terms of the Microsoft Public
  5. License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license
  6. For more features, controls, and fast professional support,
  7. pick up the Plus Edition at http://xceed.com/wpf_toolkit
  8. Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids
  9. ***********************************************************************************/
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Windows;
  15. using System.Windows.Media;
  16. using Xceed.Wpf.AvalonDock.Layout;
  17. namespace Xceed.Wpf.AvalonDock.Controls
  18. {
  19. internal class DockingManagerDropTarget : DropTarget<DockingManager>
  20. {
  21. internal DockingManagerDropTarget(DockingManager manager, Rect detectionRect, DropTargetType type)
  22. : base(manager, detectionRect, type)
  23. {
  24. _manager = manager;
  25. }
  26. DockingManager _manager;
  27. protected override void Drop(LayoutAnchorableFloatingWindow floatingWindow)
  28. {
  29. switch (Type)
  30. {
  31. case DropTargetType.DockingManagerDockLeft:
  32. #region DropTargetType.DockingManagerDockLeft
  33. {
  34. if (_manager.Layout.RootPanel.Orientation != System.Windows.Controls.Orientation.Horizontal &&
  35. _manager.Layout.RootPanel.Children.Count == 1)
  36. _manager.Layout.RootPanel.Orientation = System.Windows.Controls.Orientation.Horizontal;
  37. if (_manager.Layout.RootPanel.Orientation == System.Windows.Controls.Orientation.Horizontal)
  38. {
  39. var layoutAnchorablePaneGroup = floatingWindow.RootPanel as LayoutAnchorablePaneGroup;
  40. if (layoutAnchorablePaneGroup != null &&
  41. layoutAnchorablePaneGroup.Orientation == System.Windows.Controls.Orientation.Horizontal)
  42. {
  43. var childrenToTransfer = layoutAnchorablePaneGroup.Children.ToArray();
  44. for (int i = 0; i < childrenToTransfer.Length; i++)
  45. _manager.Layout.RootPanel.Children.Insert(i, childrenToTransfer[i]);
  46. }
  47. else
  48. _manager.Layout.RootPanel.Children.Insert(0, floatingWindow.RootPanel);
  49. }
  50. else
  51. {
  52. var newOrientedPanel = new LayoutPanel()
  53. {
  54. Orientation = System.Windows.Controls.Orientation.Horizontal
  55. };
  56. newOrientedPanel.Children.Add(floatingWindow.RootPanel);
  57. newOrientedPanel.Children.Add(_manager.Layout.RootPanel);
  58. _manager.Layout.RootPanel = newOrientedPanel;
  59. }
  60. }
  61. break;
  62. #endregion
  63. case DropTargetType.DockingManagerDockRight:
  64. #region DropTargetType.DockingManagerDockRight
  65. {
  66. if (_manager.Layout.RootPanel.Orientation != System.Windows.Controls.Orientation.Horizontal &&
  67. _manager.Layout.RootPanel.Children.Count == 1)
  68. _manager.Layout.RootPanel.Orientation = System.Windows.Controls.Orientation.Horizontal;
  69. if (_manager.Layout.RootPanel.Orientation == System.Windows.Controls.Orientation.Horizontal)
  70. {
  71. var layoutAnchorablePaneGroup = floatingWindow.RootPanel as LayoutAnchorablePaneGroup;
  72. if (layoutAnchorablePaneGroup != null &&
  73. layoutAnchorablePaneGroup.Orientation == System.Windows.Controls.Orientation.Horizontal)
  74. {
  75. var childrenToTransfer = layoutAnchorablePaneGroup.Children.ToArray();
  76. for (int i = 0; i < childrenToTransfer.Length; i++)
  77. _manager.Layout.RootPanel.Children.Add(childrenToTransfer[i]);
  78. }
  79. else
  80. _manager.Layout.RootPanel.Children.Add(floatingWindow.RootPanel);
  81. }
  82. else
  83. {
  84. var newOrientedPanel = new LayoutPanel()
  85. {
  86. Orientation = System.Windows.Controls.Orientation.Horizontal
  87. };
  88. newOrientedPanel.Children.Add(_manager.Layout.RootPanel);
  89. newOrientedPanel.Children.Add(floatingWindow.RootPanel);
  90. _manager.Layout.RootPanel = newOrientedPanel;
  91. }
  92. }
  93. break;
  94. #endregion
  95. case DropTargetType.DockingManagerDockTop:
  96. #region DropTargetType.DockingManagerDockTop
  97. {
  98. if (_manager.Layout.RootPanel.Orientation != System.Windows.Controls.Orientation.Vertical &&
  99. _manager.Layout.RootPanel.Children.Count == 1)
  100. _manager.Layout.RootPanel.Orientation = System.Windows.Controls.Orientation.Vertical;
  101. if (_manager.Layout.RootPanel.Orientation == System.Windows.Controls.Orientation.Vertical)
  102. {
  103. var layoutAnchorablePaneGroup = floatingWindow.RootPanel as LayoutAnchorablePaneGroup;
  104. if (layoutAnchorablePaneGroup != null &&
  105. layoutAnchorablePaneGroup.Orientation == System.Windows.Controls.Orientation.Vertical)
  106. {
  107. var childrenToTransfer = layoutAnchorablePaneGroup.Children.ToArray();
  108. for (int i = 0; i < childrenToTransfer.Length; i++)
  109. _manager.Layout.RootPanel.Children.Insert(i, childrenToTransfer[i]);
  110. }
  111. else
  112. _manager.Layout.RootPanel.Children.Insert(0, floatingWindow.RootPanel);
  113. }
  114. else
  115. {
  116. var newOrientedPanel = new LayoutPanel()
  117. {
  118. Orientation = System.Windows.Controls.Orientation.Vertical
  119. };
  120. newOrientedPanel.Children.Add(floatingWindow.RootPanel);
  121. newOrientedPanel.Children.Add(_manager.Layout.RootPanel);
  122. _manager.Layout.RootPanel = newOrientedPanel;
  123. }
  124. }
  125. break;
  126. #endregion
  127. case DropTargetType.DockingManagerDockBottom:
  128. #region DropTargetType.DockingManagerDockBottom
  129. {
  130. if (_manager.Layout.RootPanel.Orientation != System.Windows.Controls.Orientation.Vertical &&
  131. _manager.Layout.RootPanel.Children.Count == 1)
  132. _manager.Layout.RootPanel.Orientation = System.Windows.Controls.Orientation.Vertical;
  133. if (_manager.Layout.RootPanel.Orientation == System.Windows.Controls.Orientation.Vertical)
  134. {
  135. var layoutAnchorablePaneGroup = floatingWindow.RootPanel as LayoutAnchorablePaneGroup;
  136. if (layoutAnchorablePaneGroup != null &&
  137. layoutAnchorablePaneGroup.Orientation == System.Windows.Controls.Orientation.Vertical)
  138. {
  139. var childrenToTransfer = layoutAnchorablePaneGroup.Children.ToArray();
  140. for (int i = 0; i < childrenToTransfer.Length; i++)
  141. _manager.Layout.RootPanel.Children.Add(childrenToTransfer[i]);
  142. }
  143. else
  144. _manager.Layout.RootPanel.Children.Add(floatingWindow.RootPanel);
  145. }
  146. else
  147. {
  148. var newOrientedPanel = new LayoutPanel()
  149. {
  150. Orientation = System.Windows.Controls.Orientation.Vertical
  151. };
  152. newOrientedPanel.Children.Add(_manager.Layout.RootPanel);
  153. newOrientedPanel.Children.Add(floatingWindow.RootPanel);
  154. _manager.Layout.RootPanel = newOrientedPanel;
  155. }
  156. }
  157. break;
  158. #endregion
  159. }
  160. base.Drop(floatingWindow);
  161. }
  162. public override System.Windows.Media.Geometry GetPreviewPath(OverlayWindow overlayWindow, LayoutFloatingWindow floatingWindowModel)
  163. {
  164. var anchorableFloatingWindowModel = floatingWindowModel as LayoutAnchorableFloatingWindow;
  165. var layoutAnchorablePane = anchorableFloatingWindowModel.RootPanel as ILayoutPositionableElement;
  166. var layoutAnchorablePaneWithActualSize = anchorableFloatingWindowModel.RootPanel as ILayoutPositionableElementWithActualSize;
  167. var targetScreenRect = TargetElement.GetScreenArea();
  168. switch (Type)
  169. {
  170. case DropTargetType.DockingManagerDockLeft:
  171. {
  172. var desideredWidth = layoutAnchorablePane.DockWidth.IsAbsolute ? layoutAnchorablePane.DockWidth.Value : layoutAnchorablePaneWithActualSize.ActualWidth;
  173. var previewBoxRect = new Rect(
  174. targetScreenRect.Left - overlayWindow.Left,
  175. targetScreenRect.Top - overlayWindow.Top,
  176. Math.Min(desideredWidth, targetScreenRect.Width / 2.0),
  177. targetScreenRect.Height);
  178. return new RectangleGeometry(previewBoxRect);
  179. }
  180. case DropTargetType.DockingManagerDockTop:
  181. {
  182. var desideredHeight = layoutAnchorablePane.DockHeight.IsAbsolute ? layoutAnchorablePane.DockHeight.Value : layoutAnchorablePaneWithActualSize.ActualHeight;
  183. var previewBoxRect = new Rect(
  184. targetScreenRect.Left - overlayWindow.Left,
  185. targetScreenRect.Top - overlayWindow.Top,
  186. targetScreenRect.Width,
  187. Math.Min(desideredHeight, targetScreenRect.Height / 2.0));
  188. return new RectangleGeometry(previewBoxRect);
  189. }
  190. case DropTargetType.DockingManagerDockRight:
  191. {
  192. var desideredWidth = layoutAnchorablePane.DockWidth.IsAbsolute ? layoutAnchorablePane.DockWidth.Value : layoutAnchorablePaneWithActualSize.ActualWidth;
  193. var previewBoxRect = new Rect(
  194. targetScreenRect.Right - overlayWindow.Left - Math.Min(desideredWidth, targetScreenRect.Width / 2.0),
  195. targetScreenRect.Top - overlayWindow.Top,
  196. Math.Min(desideredWidth, targetScreenRect.Width / 2.0),
  197. targetScreenRect.Height);
  198. return new RectangleGeometry(previewBoxRect);
  199. }
  200. case DropTargetType.DockingManagerDockBottom:
  201. {
  202. var desideredHeight = layoutAnchorablePane.DockHeight.IsAbsolute ? layoutAnchorablePane.DockHeight.Value : layoutAnchorablePaneWithActualSize.ActualHeight;
  203. var previewBoxRect = new Rect(
  204. targetScreenRect.Left - overlayWindow.Left,
  205. targetScreenRect.Bottom - overlayWindow.Top - Math.Min(desideredHeight, targetScreenRect.Height / 2.0),
  206. targetScreenRect.Width,
  207. Math.Min(desideredHeight, targetScreenRect.Height / 2.0));
  208. return new RectangleGeometry(previewBoxRect);
  209. }
  210. }
  211. throw new InvalidOperationException();
  212. }
  213. }
  214. }