diff --git a/source/Components/AvalonDock.Themes.Aero/Theme.xaml b/source/Components/AvalonDock.Themes.Aero/Theme.xaml
index f47eccd9..11932e51 100644
--- a/source/Components/AvalonDock.Themes.Aero/Theme.xaml
+++ b/source/Components/AvalonDock.Themes.Aero/Theme.xaml
@@ -1336,7 +1336,7 @@
-
@@ -1351,7 +1351,7 @@
VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
DropDownContextMenu="{Binding Model.Root.Manager.DocumentContextMenu, RelativeSource={RelativeSource TemplatedParent}}"
- DropDownContextMenuDataContext="{Binding Path=RootDocumentLayoutItem, RelativeSource={RelativeSource TemplatedParent}}"
+ DropDownContextMenuDataContext="{Binding Path=SingleContentLayoutItem, RelativeSource={RelativeSource TemplatedParent}}"
ToolTip="{x:Static avalonDockProperties:Resources.Document_CxMenu_Hint}">
-
@@ -907,7 +907,7 @@
VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
DropDownContextMenu="{Binding Model.Root.Manager.DocumentContextMenu, RelativeSource={RelativeSource TemplatedParent}}"
- DropDownContextMenuDataContext="{Binding Path=RootDocumentLayoutItem, RelativeSource={RelativeSource TemplatedParent}}"
+ DropDownContextMenuDataContext="{Binding Path=SingleContentLayoutItem, RelativeSource={RelativeSource TemplatedParent}}"
ToolTip="{x:Static avalonDockProperties:Resources.Document_CxMenu_Hint}">
@@ -944,7 +944,7 @@
Focusable="False"
Style="{StaticResource AvalonDock_Expression_ButtonStyle}"
Visibility="{Binding Path=IsEnabled, RelativeSource={RelativeSource Self}, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}"
- Command="{Binding Path=RootDocumentLayoutItem.CloseCommand, RelativeSource={RelativeSource TemplatedParent}}"
+ Command="{Binding Path=SingleContentLayoutItem.CloseCommand, RelativeSource={RelativeSource TemplatedParent}}"
ToolTip="{x:Static avalonDockProperties:Resources.Document_Close}"
Grid.Column="3">
diff --git a/source/Components/AvalonDock.Themes.Metro/Theme.xaml b/source/Components/AvalonDock.Themes.Metro/Theme.xaml
index 22ae9782..36bc5510 100644
--- a/source/Components/AvalonDock.Themes.Metro/Theme.xaml
+++ b/source/Components/AvalonDock.Themes.Metro/Theme.xaml
@@ -1394,7 +1394,7 @@
-
@@ -1409,7 +1409,7 @@
VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
DropDownContextMenu="{Binding Model.Root.Manager.DocumentContextMenu, RelativeSource={RelativeSource TemplatedParent}}"
- DropDownContextMenuDataContext="{Binding Path=RootDocumentLayoutItem, RelativeSource={RelativeSource TemplatedParent}}"
+ DropDownContextMenuDataContext="{Binding Path=SingleContentLayoutItem, RelativeSource={RelativeSource TemplatedParent}}"
ToolTip="{x:Static avalonDockProperties:Resources.Document_CxMenu_Hint}">
-
@@ -1491,7 +1491,7 @@
VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
DropDownContextMenu="{Binding Model.Root.Manager.DocumentContextMenu, RelativeSource={RelativeSource TemplatedParent}}"
- DropDownContextMenuDataContext="{Binding Path=RootDocumentLayoutItem, RelativeSource={RelativeSource TemplatedParent}}"
+ DropDownContextMenuDataContext="{Binding Path=SingleContentLayoutItem, RelativeSource={RelativeSource TemplatedParent}}"
ToolTip="{x:Static avalonDockProperties:Resources.Document_CxMenu_Hint}">
- ().FirstOrDefault();
switch (Type)
{
case DropTargetType.DocumentPaneDockBottom:
#region DropTargetType.DocumentPaneDockBottom
- {
- var newLayoutDocumentPane = new LayoutDocumentPane(floatingWindow.RootDocument);
- var parentModel = targetModel.Parent as LayoutDocumentPaneGroup;
+ {
+ var parentModel = targetModel.Parent as ILayoutGroup;
+ var parentModelOrientable = targetModel.Parent as ILayoutOrientableGroup;
+ int insertToIndex = parentModel.IndexOfChild(targetModel);
- if (parentModel == null)
+ if (parentModelOrientable.Orientation != System.Windows.Controls.Orientation.Vertical &&
+ parentModel.ChildrenCount == 1)
+ parentModelOrientable.Orientation = System.Windows.Controls.Orientation.Vertical;
+
+ if (parentModelOrientable.Orientation == System.Windows.Controls.Orientation.Vertical)
+ {
+ var layoutDocumentPaneGroup = floatingWindow.RootPanel as LayoutDocumentPaneGroup;
+ if (layoutDocumentPaneGroup != null &&
+ (layoutDocumentPaneGroup.Children.Count == 1 ||
+ layoutDocumentPaneGroup.Orientation == System.Windows.Controls.Orientation.Vertical))
{
- 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);
+ var documentsToMove = layoutDocumentPaneGroup.Children.ToArray();
+ for (int i = 0; i < documentsToMove.Length; i++)
+ parentModel.InsertChildAt(insertToIndex + 1 + i, documentsToMove[i]);
}
else
+ parentModel.InsertChildAt(insertToIndex + 1, floatingWindow.RootPanel);
+ }
+ else
+ {
+ var targetModelAsPositionableElement = targetModel as ILayoutPositionableElement;
+ var newOrientedPanel = new LayoutDocumentPaneGroup()
{
- 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);
- }
+ Orientation = System.Windows.Controls.Orientation.Vertical,
+ DockWidth = targetModelAsPositionableElement.DockWidth,
+ DockHeight = targetModelAsPositionableElement.DockHeight,
+ };
+
+ parentModel.InsertChildAt(insertToIndex, newOrientedPanel);
+ newOrientedPanel.Children.Add(targetModel);
+ newOrientedPanel.Children.Add(floatingWindow.RootPanel);
- }
}
+ }
break;
+
#endregion
case DropTargetType.DocumentPaneDockTop:
#region DropTargetType.DocumentPaneDockTop
- {
- var newLayoutDocumentPane = new LayoutDocumentPane(floatingWindow.RootDocument);
- var parentModel = targetModel.Parent as LayoutDocumentPaneGroup;
+ {
+ var parentModel = targetModel.Parent as ILayoutGroup;
+ var parentModelOrientable = targetModel.Parent as ILayoutOrientableGroup;
+ int insertToIndex = parentModel.IndexOfChild(targetModel);
- if (parentModel == null)
+ if (parentModelOrientable.Orientation != System.Windows.Controls.Orientation.Vertical &&
+ parentModel.ChildrenCount == 1)
+ parentModelOrientable.Orientation = System.Windows.Controls.Orientation.Vertical;
+
+ if (parentModelOrientable.Orientation == System.Windows.Controls.Orientation.Vertical)
+ {
+ var layoutDocumentPaneGroup = floatingWindow.RootPanel as LayoutDocumentPaneGroup;
+ if (layoutDocumentPaneGroup != null &&
+ (layoutDocumentPaneGroup.Children.Count == 1 ||
+ layoutDocumentPaneGroup.Orientation == System.Windows.Controls.Orientation.Vertical))
{
- 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);
+ var documentsToMove = layoutDocumentPaneGroup.Children.ToArray();
+ for (int i = 0; i < documentsToMove.Length; i++)
+ parentModel.InsertChildAt(insertToIndex + i, documentsToMove[i]);
}
else
+ parentModel.InsertChildAt(insertToIndex, floatingWindow.RootPanel);
+ }
+ else
+ {
+ var targetModelAsPositionableElement = targetModel as ILayoutPositionableElement;
+ var newOrientedPanel = new LayoutDocumentPaneGroup()
{
- 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);
- }
+ Orientation = System.Windows.Controls.Orientation.Vertical,
+ DockWidth = targetModelAsPositionableElement.DockWidth,
+ DockHeight = targetModelAsPositionableElement.DockHeight,
+ };
+
+ parentModel.InsertChildAt(insertToIndex, newOrientedPanel);
+ //the floating window must be added after the target modal as it could be raise a CollectGarbage call
+ newOrientedPanel.Children.Add(targetModel);
+ newOrientedPanel.Children.Insert(0, floatingWindow.RootPanel);
- }
}
+ }
break;
#endregion
case DropTargetType.DocumentPaneDockLeft:
#region DropTargetType.DocumentPaneDockLeft
- {
- var newLayoutDocumentPane = new LayoutDocumentPane(floatingWindow.RootDocument);
- var parentModel = targetModel.Parent as LayoutDocumentPaneGroup;
+ {
+ var parentModel = targetModel.Parent as ILayoutGroup;
+ var parentModelOrientable = targetModel.Parent as ILayoutOrientableGroup;
+ int insertToIndex = parentModel.IndexOfChild(targetModel);
- if (parentModel == null)
+ if (parentModelOrientable.Orientation != System.Windows.Controls.Orientation.Horizontal &&
+ parentModel.ChildrenCount == 1)
+ parentModelOrientable.Orientation = System.Windows.Controls.Orientation.Horizontal;
+
+ if (parentModelOrientable.Orientation == System.Windows.Controls.Orientation.Horizontal)
+ {
+ var layoutDocumentPaneGroup = floatingWindow.RootPanel as LayoutDocumentPaneGroup;
+ if (layoutDocumentPaneGroup != null &&
+ (layoutDocumentPaneGroup.Children.Count == 1 ||
+ layoutDocumentPaneGroup.Orientation == System.Windows.Controls.Orientation.Horizontal))
{
- 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);
+ var documentsToMove = layoutDocumentPaneGroup.Children.ToArray();
+ for (int i = 0; i < documentsToMove.Length; i++)
+ parentModel.InsertChildAt(insertToIndex + i, documentsToMove[i]);
}
else
+ parentModel.InsertChildAt(insertToIndex, floatingWindow.RootPanel);
+ }
+ else
+ {
+ var targetModelAsPositionableElement = targetModel as ILayoutPositionableElement;
+ var newOrientedPanel = new LayoutDocumentPaneGroup()
{
- 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);
- }
- }
+ Orientation = System.Windows.Controls.Orientation.Horizontal,
+ DockWidth = targetModelAsPositionableElement.DockWidth,
+ DockHeight = targetModelAsPositionableElement.DockHeight,
+ };
+
+ parentModel.InsertChildAt(insertToIndex, newOrientedPanel);
+ //the floating window must be added after the target modal as it could be raise a CollectGarbage call
+ newOrientedPanel.Children.Add(targetModel);
+ newOrientedPanel.Children.Insert(0, floatingWindow.RootPanel);
+
}
+ }
break;
#endregion
case DropTargetType.DocumentPaneDockRight:
#region DropTargetType.DocumentPaneDockRight
- {
- var newLayoutDocumentPane = new LayoutDocumentPane(floatingWindow.RootDocument);
- var parentModel = targetModel.Parent as LayoutDocumentPaneGroup;
+ {
+ var parentModel = targetModel.Parent as ILayoutGroup;
+ var parentModelOrientable = targetModel.Parent as ILayoutOrientableGroup;
+ int insertToIndex = parentModel.IndexOfChild(targetModel);
- if (parentModel == null)
+ if (parentModelOrientable.Orientation != System.Windows.Controls.Orientation.Horizontal &&
+ parentModel.ChildrenCount == 1)
+ parentModelOrientable.Orientation = System.Windows.Controls.Orientation.Horizontal;
+
+ if (parentModelOrientable.Orientation == System.Windows.Controls.Orientation.Horizontal)
+ {
+ var layoutDocumentPaneGroup = floatingWindow.RootPanel as LayoutDocumentPaneGroup;
+ if (layoutDocumentPaneGroup != null &&
+ (layoutDocumentPaneGroup.Children.Count == 1 ||
+ layoutDocumentPaneGroup.Orientation == System.Windows.Controls.Orientation.Horizontal))
{
- 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);
+ var documentToMove = layoutDocumentPaneGroup.Children.ToArray();
+ for (int i = 0; i < documentToMove.Length; i++)
+ parentModel.InsertChildAt(insertToIndex + 1 + i, documentToMove[i]);
}
else
+ parentModel.InsertChildAt(insertToIndex + 1, floatingWindow.RootPanel);
+ }
+ else
+ {
+ var targetModelAsPositionableElement = targetModel as ILayoutPositionableElement;
+ var newOrientedPanel = new LayoutDocumentPaneGroup()
{
- 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);
- }
+ Orientation = System.Windows.Controls.Orientation.Horizontal,
+ DockWidth = targetModelAsPositionableElement.DockWidth,
+ DockHeight = targetModelAsPositionableElement.DockHeight,
+ };
+
+ parentModel.InsertChildAt(insertToIndex, newOrientedPanel);
+ newOrientedPanel.Children.Add(targetModel);
+ newOrientedPanel.Children.Add(floatingWindow.RootPanel);
- }
}
+ }
break;
#endregion
case DropTargetType.DocumentPaneDockInside:
#region DropTargetType.DocumentPaneDockInside
- {
- var paneModel = targetModel as LayoutDocumentPane;
- var sourceModel = floatingWindow.RootDocument;
+ {
+ var paneModel = targetModel as LayoutDocumentPane;
+ var layoutDocumentPaneGroup = floatingWindow.RootPanel as LayoutDocumentPaneGroup;
- int i = 0;
- if (_tabIndex != -1)
- {
- i = _tabIndex;
- }
- else
- {
- var previousIndex = 0;
- var previousContainer = ((ILayoutPreviousContainer)sourceModel).PreviousContainer;
- if (object.ReferenceEquals(previousContainer, targetModel) && (sourceModel.PreviousContainerIndex != -1))
- {
- previousIndex = sourceModel.PreviousContainerIndex;
- }
-
- i = previousIndex;
- }
- sourceModel.IsActive = false;
- paneModel.Children.Insert(System.Math.Min(paneModel.Children.Count, i), sourceModel);
- sourceModel.IsActive = true;
+ int i = _tabIndex == -1 ? 0 : _tabIndex;
+ foreach (var anchorableToImport in
+ layoutDocumentPaneGroup.Descendents().OfType().ToArray())
+ {
+ paneModel.Children.Insert(i, anchorableToImport);
+ i++;
}
+ }
break;
- #endregion
-
-
+ #endregion
}
+ documentActive.IsActive = true;
+
base.Drop(floatingWindow);
}
diff --git a/source/Components/AvalonDock/Controls/DocumentPaneGroupDropTarget.cs b/source/Components/AvalonDock/Controls/DocumentPaneGroupDropTarget.cs
index 5e249d76..7a41da17 100644
--- a/source/Components/AvalonDock/Controls/DocumentPaneGroupDropTarget.cs
+++ b/source/Components/AvalonDock/Controls/DocumentPaneGroupDropTarget.cs
@@ -44,8 +44,8 @@ protected override void Drop(LayoutDocumentFloatingWindow floatingWindow)
#region DropTargetType.DocumentPaneGroupDockInside
{
var paneGroupModel = targetModel as LayoutDocumentPaneGroup;
- var paneModel = paneGroupModel.Children[0] as LayoutDocumentPane;
- var sourceModel = floatingWindow.RootDocument;
+ var paneModel = paneGroupModel as LayoutDocumentPaneGroup;
+ var sourceModel = floatingWindow.RootPanel as LayoutDocumentPaneGroup;
paneModel.Children.Insert(0, sourceModel);
}
diff --git a/source/Components/AvalonDock/Controls/DragService.cs b/source/Components/AvalonDock/Controls/DragService.cs
index cfc0f1f9..4ed0c635 100644
--- a/source/Components/AvalonDock/Controls/DragService.cs
+++ b/source/Components/AvalonDock/Controls/DragService.cs
@@ -186,6 +186,7 @@ internal void Abort()
private void GetOverlayWindowHosts()
{
_overlayWindowHosts.AddRange(_manager.GetFloatingWindowsByZOrder().OfType().Where(fw => fw != _floatingWindow && fw.IsVisible));
+ _overlayWindowHosts.AddRange(_manager.GetFloatingWindowsByZOrder().OfType().Where(fw => fw != _floatingWindow && fw.IsVisible));
_overlayWindowHosts.Add(_manager);
}
diff --git a/source/Components/AvalonDock/Controls/LayoutDocumentFloatingWindowControl.cs b/source/Components/AvalonDock/Controls/LayoutDocumentFloatingWindowControl.cs
index f2c981c8..bbd210af 100644
--- a/source/Components/AvalonDock/Controls/LayoutDocumentFloatingWindowControl.cs
+++ b/source/Components/AvalonDock/Controls/LayoutDocumentFloatingWindowControl.cs
@@ -8,14 +8,18 @@ This program is provided to you under the terms of the Microsoft Public
************************************************************************/
using System;
+using System.Collections.Generic;
+using System.Linq;
using AvalonDock.Layout;
using System.Windows;
using System.Windows.Controls.Primitives;
+using System.Windows.Input;
+using AvalonDock.Commands;
using Microsoft.Windows.Shell;
namespace AvalonDock.Controls
{
- public class LayoutDocumentFloatingWindowControl : LayoutFloatingWindowControl
+ public class LayoutDocumentFloatingWindowControl : LayoutFloatingWindowControl, IOverlayWindowHost
{
#region Members
@@ -34,6 +38,9 @@ internal LayoutDocumentFloatingWindowControl(LayoutDocumentFloatingWindow model,
: base(model, isContentImmutable)
{
_model = model;
+ HideWindowCommand = new RelayCommand((p) => OnExecuteHideWindowCommand(p), (p) => CanExecuteHideWindowCommand(p));
+ CloseWindowCommand = new RelayCommand((p) => OnExecuteCloseWindowCommand(p), (p) => CanExecuteCloseWindowCommand(p));
+ Closed += (sender, args) => { Owner?.Focus(); };
UpdateThemeResources();
}
@@ -44,43 +51,72 @@ internal LayoutDocumentFloatingWindowControl(LayoutDocumentFloatingWindow model)
#endregion
- #region Properties
+ #region Overrides
- public LayoutItem RootDocumentLayoutItem
+ public override ILayoutElement Model
{
get
{
- return _model.Root.Manager.GetLayoutItemFromModel(_model.RootDocument);
+ return _model;
}
}
- #endregion
+ #region SingleContentLayoutItem
+
+ ///
+ /// SingleContentLayoutItem Dependency Property
+ ///
+ public static readonly DependencyProperty SingleContentLayoutItemProperty =
+ DependencyProperty.Register("SingleContentLayoutItem", typeof(LayoutItem), typeof(LayoutDocumentFloatingWindowControl),
+ new FrameworkPropertyMetadata((LayoutItem)null,
+ new PropertyChangedCallback(OnSingleContentLayoutItemChanged)));
+
+ ///
+ /// Gets or sets the SingleContentLayoutItem property. This dependency property
+ /// indicates the layout item of the selected content when is shown a single document pane.
+ ///
+ public LayoutItem SingleContentLayoutItem
+ {
+ get { return (LayoutItem)GetValue(SingleContentLayoutItemProperty); }
+ set { SetValue(SingleContentLayoutItemProperty, value); }
+ }
- #region Overrides
+ ///
+ /// Handles changes to the property.
+ ///
+ private static void OnSingleContentLayoutItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ ((LayoutDocumentFloatingWindowControl)d).OnSingleContentLayoutItemChanged(e);
+ }
- public override ILayoutElement Model
+ ///
+ /// Provides derived classes an opportunity to handle changes to the property.
+ ///
+ protected virtual void OnSingleContentLayoutItemChanged(DependencyPropertyChangedEventArgs e)
{
- get
- {
- return _model;
- }
}
+ #endregion
+
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
- if (_model.RootDocument == null)
- {
- InternalClose();
- }
- else
- {
- var manager = _model.Root.Manager;
+ var manager = _model.Root.Manager;
- Content = manager.CreateUIElementForModel(_model.RootDocument);
+ Content = manager.CreateUIElementForModel(_model.RootPanel);
+ // TODO IsVisibleChanged
+ //SetBinding(SingleContentLayoutItemProperty, new Binding("Model.SinglePane.SelectedContent") { Source = this, Converter = new LayoutItemFromLayoutModelConverter() });
- _model.RootDocumentChanged += new EventHandler(_model_RootDocumentChanged);
+ _model.RootPanel.ChildrenCollectionChanged += RootPanelOnChildrenCollectionChanged;
+ }
+
+ void _model_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
+ {
+ if (e.PropertyName == "RootPanel" &&
+ _model.RootPanel == null)
+ {
+ InternalClose();
}
}
@@ -91,8 +127,8 @@ protected override IntPtr FilterMessage(IntPtr hwnd, int msg, IntPtr wParam, Int
case Win32Helper.WM_NCLBUTTONDOWN: //Left button down on title -> start dragging over docking manager
if (wParam.ToInt32() == Win32Helper.HT_CAPTION)
{
- if (_model.RootDocument != null)
- _model.RootDocument.IsActive = true;
+ _model.Descendents().OfType().First(p => p.ChildrenCount > 0 && p.SelectedContent != null).SelectedContent.IsActive = true;
+ handled = true;
}
break;
case Win32Helper.WM_NCRBUTTONUP:
@@ -115,26 +151,36 @@ protected override IntPtr FilterMessage(IntPtr hwnd, int msg, IntPtr wParam, Int
protected override void OnClosed(EventArgs e)
{
var root = Model.Root;
- root.Manager.RemoveFloatingWindow(this);
- root.CollectGarbage();
+ // MK sometimes root is null, prevent crash, or should it always be set??
+ if (root != null)
+ {
+ root.Manager.RemoveFloatingWindow(this);
+ root.CollectGarbage();
+ }
+
+ if (_overlayWindow != null)
+ {
+ _overlayWindow.Close();
+ _overlayWindow = null;
+ }
base.OnClosed(e);
if (!CloseInitiatedByUser)
{
- root.FloatingWindows.Remove(_model);
+ root?.FloatingWindows.Remove(_model);
}
- _model.RootDocumentChanged -= new EventHandler(_model_RootDocumentChanged);
+ _model.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(_model_PropertyChanged);
}
#endregion
#region Private Methods
- private void _model_RootDocumentChanged(object sender, EventArgs e)
+ private void RootPanelOnChildrenCollectionChanged(object sender, EventArgs e)
{
- if (_model.RootDocument == null)
+ if( _model.RootPanel == null ||_model.RootPanel.Children.Count == 0)
{
InternalClose();
}
@@ -143,11 +189,11 @@ private void _model_RootDocumentChanged(object sender, EventArgs e)
private bool OpenContextMenu()
{
var ctxMenu = _model.Root.Manager.DocumentContextMenu;
- if (ctxMenu != null && RootDocumentLayoutItem != null)
+ if (ctxMenu != null && SingleContentLayoutItem != null)
{
ctxMenu.PlacementTarget = null;
ctxMenu.Placement = PlacementMode.MousePoint;
- ctxMenu.DataContext = RootDocumentLayoutItem;
+ ctxMenu.DataContext = SingleContentLayoutItem;
ctxMenu.IsOpen = true;
return true;
}
@@ -155,6 +201,196 @@ private bool OpenContextMenu()
return false;
}
+ protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
+ {
+ // TODO
+ if (CloseInitiatedByUser && !KeepContentVisibleOnClose)
+ {
+ e.Cancel = true;
+ //_model.Descendents().OfType().ToArray().ForEach((a) => a.Hide());
+ }
+
+ base.OnClosing(e);
+ }
+
+ bool IOverlayWindowHost.HitTest(Point dragPoint)
+ {
+ Rect detectionRect = new Rect(this.PointToScreenDPIWithoutFlowDirection(new Point()), this.TransformActualSizeToAncestor());
+ return detectionRect.Contains(dragPoint);
+ }
+
+ DockingManager IOverlayWindowHost.Manager
+ {
+ get { return _model.Root.Manager; }
+ }
+
+ OverlayWindow _overlayWindow = null;
+
+ void CreateOverlayWindow()
+ {
+ if (_overlayWindow == null)
+ _overlayWindow = new OverlayWindow(this);
+ Rect rectWindow = new Rect(this.PointToScreenDPIWithoutFlowDirection(new Point()), this.TransformActualSizeToAncestor());
+ _overlayWindow.Left = rectWindow.Left;
+ _overlayWindow.Top = rectWindow.Top;
+ _overlayWindow.Width = rectWindow.Width;
+ _overlayWindow.Height = rectWindow.Height;
+ }
+
+ IOverlayWindow IOverlayWindowHost.ShowOverlayWindow(LayoutFloatingWindowControl draggingWindow)
+ {
+ CreateOverlayWindow();
+ _overlayWindow.Owner = draggingWindow;
+ _overlayWindow.EnableDropTargets();
+ _overlayWindow.Show();
+
+ return _overlayWindow;
+ }
+
+ public void HideOverlayWindow()
+ {
+ _dropAreas = null;
+ _overlayWindow.Owner = null;
+ _overlayWindow.HideDropTargets();
+ }
+
+ List _dropAreas = null;
+ public IEnumerable GetDropAreas(LayoutFloatingWindowControl draggingWindow)
+ {
+ if (_dropAreas != null)
+ return _dropAreas;
+
+ _dropAreas = new List();
+
+ var rootVisual = (Content as FloatingWindowContentHost).RootVisual;
+
+ foreach (var areaHost in rootVisual.FindVisualChildren())
+ {
+ _dropAreas.Add(new DropArea(
+ areaHost,
+ DropAreaType.AnchorablePane));
+ }
+ foreach (var areaHost in rootVisual.FindVisualChildren())
+ {
+ _dropAreas.Add(new DropArea(
+ areaHost,
+ DropAreaType.DocumentPane));
+ }
+
+ return _dropAreas;
+ }
+
+ #region HideWindowCommand
+ public ICommand HideWindowCommand
+ {
+ get;
+ private set;
+ }
+
+ private bool CanExecuteHideWindowCommand(object parameter)
+ {
+ if (Model == null)
+ return false;
+
+ var root = Model.Root;
+ if (root == null)
+ return false;
+
+ var manager = root.Manager;
+ if (manager == null)
+ return false;
+
+ // TODO check CanHide of anchorables
+ bool canExecute = false;
+ foreach (var content in this.Model.Descendents().OfType().ToArray())
+ {
+ if ((content is LayoutAnchorable anchorable && !anchorable.CanHide) ||
+ !content.CanClose)
+ {
+ canExecute = false;
+ break;
+ }
+
+ //if (!(manager.GetLayoutItemFromModel(content) is LayoutAnchorableItem layoutAnchorableItem) ||
+ // layoutAnchorableItem.HideCommand == null ||
+ // !layoutAnchorableItem.HideCommand.CanExecute(parameter))
+ //{
+ // canExecute = false;
+ // break;
+ //}
+ if (!(manager.GetLayoutItemFromModel(content) is LayoutItem layoutItem) ||
+ layoutItem.CloseCommand == null ||
+ !layoutItem.CloseCommand.CanExecute(parameter))
+ {
+ canExecute = false;
+ break;
+ }
+
+ canExecute = true;
+ }
+
+ return canExecute;
+ }
+
+ private void OnExecuteHideWindowCommand(object parameter)
+ {
+ var manager = Model.Root.Manager;
+ foreach (var anchorable in this.Model.Descendents().OfType().ToArray())
+ {
+ //if (manager.GetLayoutItemFromModel(anchorable) is LayoutAnchorableItem layoutAnchorableItem) layoutAnchorableItem.HideCommand.Execute(parameter);
+ //else
+ if (manager.GetLayoutItemFromModel(anchorable) is LayoutItem layoutItem) layoutItem.CloseCommand.Execute(parameter);
+ }
+ }
+ #endregion
+
+ #region CloseWindowCommand
+ public ICommand CloseWindowCommand
+ {
+ get;
+ private set;
+ }
+
+ private bool CanExecuteCloseWindowCommand( object parameter )
+ {
+ var manager = Model?.Root?.Manager;
+ if( manager == null )
+ return false;
+
+ var canExecute = false;
+ foreach( var document in this.Model.Descendents().OfType().ToArray() )
+ {
+ if( !document.CanClose )
+ {
+ canExecute = false;
+ break;
+ }
+
+ if( !(manager.GetLayoutItemFromModel( document ) is LayoutDocumentItem documentLayoutItem) ||
+ documentLayoutItem.CloseCommand == null ||
+ !documentLayoutItem.CloseCommand.CanExecute( parameter ) )
+ {
+ canExecute = false;
+ break;
+ }
+ canExecute = true;
+ }
+
+ return canExecute;
+ }
+
+ private void OnExecuteCloseWindowCommand( object parameter )
+ {
+ var manager = Model.Root.Manager;
+ foreach( var document in this.Model.Descendents().OfType().ToArray() )
+ {
+ var documentLayoutItem = manager.GetLayoutItemFromModel( document ) as LayoutDocumentItem;
+ documentLayoutItem?.CloseCommand.Execute(parameter);
+ }
+ }
+
#endregion
- }
+
+ #endregion
+ }
}
diff --git a/source/Components/AvalonDock/Controls/LayoutDocumentPaneControl.cs b/source/Components/AvalonDock/Controls/LayoutDocumentPaneControl.cs
index 293d51aa..4e7563b4 100644
--- a/source/Components/AvalonDock/Controls/LayoutDocumentPaneControl.cs
+++ b/source/Components/AvalonDock/Controls/LayoutDocumentPaneControl.cs
@@ -20,7 +20,6 @@ public class LayoutDocumentPaneControl : TabControl, ILayoutControl//, ILogicalC
{
#region Members
- private List