| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474 |
- /*************************************************************************************
- Extended WPF Toolkit
- Copyright (C) 2007-2013 Xceed Software Inc.
- This program is provided to you under the terms of the Microsoft Public
- License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license
- For more features, controls, and fast professional support,
- pick up the Plus Edition at http://xceed.com/wpf_toolkit
- Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids
- ***********************************************************************************/
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Windows;
- using System.Windows.Media;
- using System.Diagnostics;
- using Xceed.Wpf.AvalonDock.Layout;
- namespace Xceed.Wpf.AvalonDock.Controls
- {
- internal class DocumentPaneDropTarget : DropTarget<LayoutDocumentPaneControl>
- {
- internal DocumentPaneDropTarget(LayoutDocumentPaneControl paneControl, Rect detectionRect, DropTargetType type)
- : base(paneControl, detectionRect, type)
- {
- _targetPane = paneControl;
- }
- internal DocumentPaneDropTarget(LayoutDocumentPaneControl paneControl, Rect detectionRect, DropTargetType type, int tabIndex)
- : base(paneControl, detectionRect, type)
- {
- _targetPane = paneControl;
- _tabIndex = tabIndex;
- }
- LayoutDocumentPaneControl _targetPane;
- int _tabIndex = -1;
- protected override void Drop(LayoutDocumentFloatingWindow floatingWindow)
- {
- ILayoutDocumentPane targetModel = _targetPane.Model as ILayoutDocumentPane;
- switch (Type)
- {
- case DropTargetType.DocumentPaneDockBottom:
- #region DropTargetType.DocumentPaneDockBottom
- {
- var newLayoutDocumentPane = new LayoutDocumentPane(floatingWindow.RootDocument);
- var parentModel = targetModel.Parent as LayoutDocumentPaneGroup;
- if (parentModel == null)
- {
- var parentContainer = targetModel.Parent as ILayoutContainer;
- var newParentModel = new LayoutDocumentPaneGroup() { Orientation = System.Windows.Controls.Orientation.Vertical};
- parentContainer.ReplaceChild(targetModel, newParentModel);
- newParentModel.Children.Add(targetModel as LayoutDocumentPane);
- newParentModel.Children.Add(newLayoutDocumentPane);
- }
- else
- {
- var manager = parentModel.Root.Manager;
- if (!manager.AllowMixedOrientation || parentModel.Orientation == System.Windows.Controls.Orientation.Vertical)
- {
- parentModel.Orientation = System.Windows.Controls.Orientation.Vertical;
- int targetPaneIndex = parentModel.IndexOfChild(targetModel);
- parentModel.Children.Insert(targetPaneIndex + 1, newLayoutDocumentPane);
- }
- else
- {
- LayoutDocumentPaneGroup newChildGroup = new LayoutDocumentPaneGroup();
- newChildGroup.Orientation = System.Windows.Controls.Orientation.Vertical;
- parentModel.ReplaceChild(targetModel, newChildGroup);
- newChildGroup.Children.Add(targetModel);
- newChildGroup.Children.Add(newLayoutDocumentPane);
- }
- }
- }
- break;
- #endregion
- case DropTargetType.DocumentPaneDockTop:
- #region DropTargetType.DocumentPaneDockTop
- {
- var newLayoutDocumentPane = new LayoutDocumentPane(floatingWindow.RootDocument);
- var parentModel = targetModel.Parent as LayoutDocumentPaneGroup;
- if (parentModel == null)
- {
- var parentContainer = targetModel.Parent as ILayoutContainer;
- var newParentModel = new LayoutDocumentPaneGroup() { Orientation = System.Windows.Controls.Orientation.Vertical };
- parentContainer.ReplaceChild(targetModel, newParentModel);
- newParentModel.Children.Add(targetModel as LayoutDocumentPane);
- newParentModel.Children.Insert(0, newLayoutDocumentPane);
- }
- else
- {
- var manager = parentModel.Root.Manager;
- if (!manager.AllowMixedOrientation || parentModel.Orientation == System.Windows.Controls.Orientation.Vertical)
- {
- parentModel.Orientation = System.Windows.Controls.Orientation.Vertical;
- int targetPaneIndex = parentModel.IndexOfChild(targetModel);
- parentModel.Children.Insert(targetPaneIndex, newLayoutDocumentPane);
- }
- else
- {
- LayoutDocumentPaneGroup newChildGroup = new LayoutDocumentPaneGroup();
- newChildGroup.Orientation = System.Windows.Controls.Orientation.Vertical;
- parentModel.ReplaceChild(targetModel, newChildGroup);
- newChildGroup.Children.Add(newLayoutDocumentPane);
- newChildGroup.Children.Add(targetModel);
- }
- }
- }
- break;
- #endregion
- case DropTargetType.DocumentPaneDockLeft:
- #region DropTargetType.DocumentPaneDockLeft
- {
- var newLayoutDocumentPane = new LayoutDocumentPane(floatingWindow.RootDocument);
- var parentModel = targetModel.Parent as LayoutDocumentPaneGroup;
- if (parentModel == null)
- {
- var parentContainer = targetModel.Parent as ILayoutContainer;
- var newParentModel = new LayoutDocumentPaneGroup() { Orientation = System.Windows.Controls.Orientation.Horizontal };
- parentContainer.ReplaceChild(targetModel, newParentModel);
- newParentModel.Children.Add(targetModel);
- newParentModel.Children.Insert(0, newLayoutDocumentPane);
- }
- else
- {
- var manager = parentModel.Root.Manager;
- if (!manager.AllowMixedOrientation || parentModel.Orientation == System.Windows.Controls.Orientation.Horizontal)
- {
- parentModel.Orientation = System.Windows.Controls.Orientation.Horizontal;
- int targetPaneIndex = parentModel.IndexOfChild(targetModel);
- parentModel.Children.Insert(targetPaneIndex, newLayoutDocumentPane);
- }
- else
- {
- LayoutDocumentPaneGroup newChildGroup = new LayoutDocumentPaneGroup();
- newChildGroup.Orientation = System.Windows.Controls.Orientation.Horizontal;
- parentModel.ReplaceChild(targetModel, newChildGroup);
- newChildGroup.Children.Add(newLayoutDocumentPane);
- newChildGroup.Children.Add(targetModel);
- }
- }
- }
- break;
- #endregion
- case DropTargetType.DocumentPaneDockRight:
- #region DropTargetType.DocumentPaneDockRight
- {
- var newLayoutDocumentPane = new LayoutDocumentPane(floatingWindow.RootDocument);
- var parentModel = targetModel.Parent as LayoutDocumentPaneGroup;
- if (parentModel == null)
- {
- var parentContainer = targetModel.Parent as ILayoutContainer;
- var newParentModel = new LayoutDocumentPaneGroup() { Orientation = System.Windows.Controls.Orientation.Horizontal };
- parentContainer.ReplaceChild(targetModel, newParentModel);
- newParentModel.Children.Add(targetModel as LayoutDocumentPane);
- newParentModel.Children.Add(newLayoutDocumentPane);
- }
- else
- {
- var manager = parentModel.Root.Manager;
- if (!manager.AllowMixedOrientation || parentModel.Orientation == System.Windows.Controls.Orientation.Horizontal)
- {
- parentModel.Orientation = System.Windows.Controls.Orientation.Horizontal;
- int targetPaneIndex = parentModel.IndexOfChild(targetModel);
- parentModel.Children.Insert(targetPaneIndex + 1, newLayoutDocumentPane);
- }
- else
- {
- LayoutDocumentPaneGroup newChildGroup = new LayoutDocumentPaneGroup();
- newChildGroup.Orientation = System.Windows.Controls.Orientation.Horizontal;
- parentModel.ReplaceChild(targetModel, newChildGroup);
- newChildGroup.Children.Add(targetModel);
- newChildGroup.Children.Add(newLayoutDocumentPane);
- }
- }
- }
- break;
- #endregion
- case DropTargetType.DocumentPaneDockInside:
- #region DropTargetType.DocumentPaneDockInside
- {
- var paneModel = targetModel as LayoutDocumentPane;
- var sourceModel = floatingWindow.RootDocument;
- int i = _tabIndex == -1 ? 0 : _tabIndex;
- sourceModel.IsActive = false;
- paneModel.Children.Insert(i, sourceModel);
- sourceModel.IsActive = true;
- }
- break;
- #endregion
- }
- base.Drop(floatingWindow);
- }
- protected override void Drop(LayoutAnchorableFloatingWindow floatingWindow)
- {
- ILayoutDocumentPane targetModel = _targetPane.Model as ILayoutDocumentPane;
- switch (Type)
- {
- case DropTargetType.DocumentPaneDockBottom:
- #region DropTargetType.DocumentPaneDockBottom
- {
- var parentModel = targetModel.Parent as LayoutDocumentPaneGroup;
- var newLayoutDocumentPane = new LayoutDocumentPane();
- if (parentModel == null)
- {
- var parentContainer = targetModel.Parent as ILayoutContainer;
- var newParentModel = new LayoutDocumentPaneGroup() { Orientation = System.Windows.Controls.Orientation.Vertical };
- parentContainer.ReplaceChild(targetModel, newParentModel);
- newParentModel.Children.Add(targetModel as LayoutDocumentPane);
- newParentModel.Children.Add(newLayoutDocumentPane);
- }
- else
- {
- var manager = parentModel.Root.Manager;
- if (!manager.AllowMixedOrientation || parentModel.Orientation == System.Windows.Controls.Orientation.Vertical)
- {
- parentModel.Orientation = System.Windows.Controls.Orientation.Vertical;
- int targetPaneIndex = parentModel.IndexOfChild(targetModel);
- parentModel.Children.Insert(targetPaneIndex + 1, newLayoutDocumentPane);
- }
- else
- {
- LayoutDocumentPaneGroup newChildGroup = new LayoutDocumentPaneGroup();
- newChildGroup.Orientation = System.Windows.Controls.Orientation.Vertical;
- parentModel.ReplaceChild(targetModel, newChildGroup);
- newChildGroup.Children.Add(targetModel);
- newChildGroup.Children.Add(newLayoutDocumentPane);
- }
- }
- foreach (var cntToTransfer in floatingWindow.RootPanel.Descendents().OfType<LayoutAnchorable>().ToArray())
- newLayoutDocumentPane.Children.Add(cntToTransfer);
- }
- break;
- #endregion
- case DropTargetType.DocumentPaneDockTop:
- #region DropTargetType.DocumentPaneDockTop
- {
- var parentModel = targetModel.Parent as LayoutDocumentPaneGroup;
- var newLayoutDocumentPane = new LayoutDocumentPane();
- if (parentModel == null)
- {
- var parentContainer = targetModel.Parent as ILayoutContainer;
- var newParentModel = new LayoutDocumentPaneGroup() { Orientation = System.Windows.Controls.Orientation.Vertical };
- parentContainer.ReplaceChild(targetModel, newParentModel);
- newParentModel.Children.Add(newLayoutDocumentPane);
- newParentModel.Children.Add(targetModel as LayoutDocumentPane);
- }
- else
- {
- var manager = parentModel.Root.Manager;
- if (!manager.AllowMixedOrientation || parentModel.Orientation == System.Windows.Controls.Orientation.Vertical)
- {
- parentModel.Orientation = System.Windows.Controls.Orientation.Vertical;
- int targetPaneIndex = parentModel.IndexOfChild(targetModel);
- parentModel.Children.Insert(targetPaneIndex, newLayoutDocumentPane);
- }
- else
- {
- LayoutDocumentPaneGroup newChildGroup = new LayoutDocumentPaneGroup();
- newChildGroup.Orientation = System.Windows.Controls.Orientation.Vertical;
- parentModel.ReplaceChild(targetModel, newChildGroup);
- newChildGroup.Children.Add(newLayoutDocumentPane);
- newChildGroup.Children.Add(targetModel);
- }
- }
- foreach (var cntToTransfer in floatingWindow.RootPanel.Descendents().OfType<LayoutAnchorable>().ToArray())
- newLayoutDocumentPane.Children.Add(cntToTransfer);
- }
- break;
- #endregion
- case DropTargetType.DocumentPaneDockLeft:
- #region DropTargetType.DocumentPaneDockLeft
- {
- var parentModel = targetModel.Parent as LayoutDocumentPaneGroup;
- var newLayoutDocumentPane = new LayoutDocumentPane();
- if (parentModel == null)
- {
- var parentContainer = targetModel.Parent as ILayoutContainer;
- var newParentModel = new LayoutDocumentPaneGroup() { Orientation = System.Windows.Controls.Orientation.Horizontal };
- parentContainer.ReplaceChild(targetModel, newParentModel);
- newParentModel.Children.Add(newLayoutDocumentPane);
- newParentModel.Children.Add(targetModel as LayoutDocumentPane);
- }
- else
- {
- var manager = parentModel.Root.Manager;
- if (!manager.AllowMixedOrientation || parentModel.Orientation == System.Windows.Controls.Orientation.Horizontal)
- {
- parentModel.Orientation = System.Windows.Controls.Orientation.Horizontal;
- int targetPaneIndex = parentModel.IndexOfChild(targetModel);
- parentModel.Children.Insert(targetPaneIndex, newLayoutDocumentPane);
- }
- else
- {
- LayoutDocumentPaneGroup newChildGroup = new LayoutDocumentPaneGroup();
- newChildGroup.Orientation = System.Windows.Controls.Orientation.Horizontal;
- parentModel.ReplaceChild(targetModel, newChildGroup);
- newChildGroup.Children.Add(newLayoutDocumentPane);
- newChildGroup.Children.Add(targetModel);
- }
- }
- foreach (var cntToTransfer in floatingWindow.RootPanel.Descendents().OfType<LayoutAnchorable>().ToArray())
- newLayoutDocumentPane.Children.Add(cntToTransfer);
- }
- break;
- #endregion
- case DropTargetType.DocumentPaneDockRight:
- #region DropTargetType.DocumentPaneDockRight
- {
- var parentModel = targetModel.Parent as LayoutDocumentPaneGroup;
- var newLayoutDocumentPane = new LayoutDocumentPane();
- if (parentModel == null)
- {
- var parentContainer = targetModel.Parent as ILayoutContainer;
- var newParentModel = new LayoutDocumentPaneGroup() { Orientation = System.Windows.Controls.Orientation.Horizontal };
- parentContainer.ReplaceChild(targetModel, newParentModel);
- newParentModel.Children.Add(targetModel as LayoutDocumentPane);
- newParentModel.Children.Add(newLayoutDocumentPane);
- }
- else
- {
- var manager = parentModel.Root.Manager;
- if (!manager.AllowMixedOrientation || parentModel.Orientation == System.Windows.Controls.Orientation.Horizontal)
- {
- parentModel.Orientation = System.Windows.Controls.Orientation.Horizontal;
- int targetPaneIndex = parentModel.IndexOfChild(targetModel);
- parentModel.Children.Insert(targetPaneIndex + 1, newLayoutDocumentPane);
- }
- else
- {
- LayoutDocumentPaneGroup newChildGroup = new LayoutDocumentPaneGroup();
- newChildGroup.Orientation = System.Windows.Controls.Orientation.Horizontal;
- parentModel.ReplaceChild(targetModel, newChildGroup);
- newChildGroup.Children.Add(targetModel);
- newChildGroup.Children.Add(newLayoutDocumentPane);
- }
- }
- foreach (var cntToTransfer in floatingWindow.RootPanel.Descendents().OfType<LayoutAnchorable>().ToArray())
- newLayoutDocumentPane.Children.Add(cntToTransfer);
- }
- break;
- #endregion
- case DropTargetType.DocumentPaneDockInside:
- #region DropTargetType.DocumentPaneDockInside
- {
- var paneModel = targetModel as LayoutDocumentPane;
- var layoutAnchorablePaneGroup = floatingWindow.RootPanel as LayoutAnchorablePaneGroup;
- int i = _tabIndex == -1 ? 0 : _tabIndex;
- LayoutAnchorable anchorableToActivate = null;
- foreach (var anchorableToImport in layoutAnchorablePaneGroup.Descendents().OfType<LayoutAnchorable>().ToArray())
- {
- paneModel.Children.Insert(i, anchorableToImport);
- i++;
- anchorableToActivate = anchorableToImport;
- }
- anchorableToActivate.IsActive = true;
- }
- break;
- #endregion
- }
- base.Drop(floatingWindow);
- }
- public override System.Windows.Media.Geometry GetPreviewPath(OverlayWindow overlayWindow, LayoutFloatingWindow floatingWindowModel)
- {
- switch (Type)
- {
- case DropTargetType.DocumentPaneDockInside:
- {
- var targetScreenRect = TargetElement.GetScreenArea();
- targetScreenRect.Offset(-overlayWindow.Left, -overlayWindow.Top);
- if (_tabIndex == -1)
- {
- return new RectangleGeometry(targetScreenRect);
- }
- else
- {
- var translatedDetectionRect = new Rect(DetectionRects[0].TopLeft, DetectionRects[0].BottomRight);
- translatedDetectionRect.Offset(-overlayWindow.Left, -overlayWindow.Top);
- var pathFigure = new PathFigure();
- pathFigure.StartPoint = targetScreenRect.BottomRight;
- pathFigure.Segments.Add(new LineSegment() { Point = new Point(targetScreenRect.Right, translatedDetectionRect.Bottom) });
- pathFigure.Segments.Add(new LineSegment() { Point = translatedDetectionRect.BottomRight });
- pathFigure.Segments.Add(new LineSegment() { Point = translatedDetectionRect.TopRight });
- pathFigure.Segments.Add(new LineSegment() { Point = translatedDetectionRect.TopLeft });
- pathFigure.Segments.Add(new LineSegment() { Point = translatedDetectionRect.BottomLeft });
- pathFigure.Segments.Add(new LineSegment() { Point = new Point(targetScreenRect.Left, translatedDetectionRect.Bottom) });
- pathFigure.Segments.Add(new LineSegment() { Point = targetScreenRect.BottomLeft });
- pathFigure.IsClosed = true;
- pathFigure.IsFilled = true;
- pathFigure.Freeze();
- return new PathGeometry(new PathFigure[] { pathFigure });
- }
- }
- case DropTargetType.DocumentPaneDockBottom:
- {
- var targetScreenRect = TargetElement.GetScreenArea();
- targetScreenRect.Offset(-overlayWindow.Left, -overlayWindow.Top);
- targetScreenRect.Offset(0.0, targetScreenRect.Height / 2.0);
- targetScreenRect.Height /= 2.0;
- return new RectangleGeometry(targetScreenRect);
- }
- case DropTargetType.DocumentPaneDockTop:
- {
- var targetScreenRect = TargetElement.GetScreenArea();
- targetScreenRect.Offset(-overlayWindow.Left, -overlayWindow.Top);
- targetScreenRect.Height /= 2.0;
- return new RectangleGeometry(targetScreenRect);
- }
- case DropTargetType.DocumentPaneDockLeft:
- {
- var targetScreenRect = TargetElement.GetScreenArea();
- targetScreenRect.Offset(-overlayWindow.Left, -overlayWindow.Top);
- targetScreenRect.Width /= 2.0;
- return new RectangleGeometry(targetScreenRect);
- }
- case DropTargetType.DocumentPaneDockRight:
- {
- var targetScreenRect = TargetElement.GetScreenArea();
- targetScreenRect.Offset(-overlayWindow.Left, -overlayWindow.Top);
- targetScreenRect.Offset(targetScreenRect.Width / 2.0, 0.0);
- targetScreenRect.Width /= 2.0;
- return new RectangleGeometry(targetScreenRect);
- }
- }
- return null;
- }
- }
- }
|