diff --git a/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/DockingUtilitiesTest.cs b/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/DockingUtilitiesTest.cs new file mode 100644 index 00000000..8fd92dc7 --- /dev/null +++ b/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/DockingUtilitiesTest.cs @@ -0,0 +1,111 @@ +namespace Xceed.Wpf.AvalonDock.Test +{ + using System; + using System.Windows.Controls; + + using Microsoft.VisualStudio.TestTools.UnitTesting; + + using Xceed.Wpf.AvalonDock.Layout; + + [TestClass] + public sealed class DockingUtilitiesTest + { + [TestMethod] + public void CalculatedDockMinWidthHeightTest() + { + double defaultDockMinHeight = 25; + double defaultDockMinWidth = 25; + + const double documentPaneDockMinHeight = 200; + const double documentPaneDockMinWidth = 400; + LayoutDocumentPane layoutDocumentPane = new LayoutDocumentPane { DockMinHeight = documentPaneDockMinHeight, DockMinWidth = documentPaneDockMinWidth }; + layoutDocumentPane.InsertChildAt( 0, new LayoutDocument { ContentId = "Document" } ); + + LayoutDocumentPaneGroup layoutDocumentPaneGroup = new LayoutDocumentPaneGroup(); + layoutDocumentPaneGroup.InsertChildAt( 0, layoutDocumentPane ); + + const double anchorablePaneDockMinHeight = 80; + const double anchorablePaneDockMinWidth = 160; + LayoutAnchorablePane layoutAnchorablePane = new LayoutAnchorablePane { DockMinHeight = anchorablePaneDockMinHeight, DockMinWidth = anchorablePaneDockMinWidth }; + layoutAnchorablePane.InsertChildAt( 0, new LayoutAnchorable { ContentId = "Anchorable" } ); + + LayoutAnchorablePaneGroup layoutAnchorablePaneGroup = new LayoutAnchorablePaneGroup(); + layoutAnchorablePaneGroup.InsertChildAt( 0, layoutAnchorablePane ); + + LayoutPanel layoutPanel = new LayoutPanel(); + layoutPanel.InsertChildAt( 0, layoutDocumentPaneGroup ); + layoutPanel.InsertChildAt( 1, layoutAnchorablePaneGroup ); + + Assert.AreEqual( defaultDockMinWidth, layoutPanel.DockMinWidth ); + Assert.AreEqual( defaultDockMinHeight, layoutPanel.DockMinHeight ); + Assert.AreEqual( documentPaneDockMinWidth + anchorablePaneDockMinWidth, layoutPanel.CalculatedDockMinWidth() ); + Assert.AreEqual( Math.Max(documentPaneDockMinHeight, anchorablePaneDockMinHeight), layoutPanel.CalculatedDockMinHeight() ); + + Assert.AreEqual( documentPaneDockMinWidth, layoutDocumentPane.DockMinWidth ); + Assert.AreEqual( documentPaneDockMinHeight, layoutDocumentPane.DockMinHeight ); + Assert.AreEqual( layoutDocumentPane.DockMinWidth, layoutDocumentPane.CalculatedDockMinWidth() ); + Assert.AreEqual( layoutDocumentPane.DockMinHeight, layoutDocumentPane.CalculatedDockMinHeight() ); + + Assert.AreEqual( defaultDockMinWidth, layoutDocumentPaneGroup.DockMinWidth ); + Assert.AreEqual( defaultDockMinWidth, layoutDocumentPaneGroup.DockMinHeight ); + Assert.AreEqual( documentPaneDockMinWidth, layoutDocumentPaneGroup.CalculatedDockMinWidth() ); + Assert.AreEqual( documentPaneDockMinHeight, layoutDocumentPaneGroup.CalculatedDockMinHeight() ); + + Assert.AreEqual( anchorablePaneDockMinWidth, layoutAnchorablePane.DockMinWidth ); + Assert.AreEqual( anchorablePaneDockMinHeight, layoutAnchorablePane.DockMinHeight ); + Assert.AreEqual( layoutAnchorablePane.DockMinWidth, layoutAnchorablePane.CalculatedDockMinWidth() ); + Assert.AreEqual( layoutAnchorablePane.DockMinHeight, layoutAnchorablePane.CalculatedDockMinHeight() ); + + Assert.AreEqual( defaultDockMinWidth, layoutAnchorablePaneGroup.DockMinWidth ); + Assert.AreEqual( defaultDockMinWidth, layoutAnchorablePaneGroup.DockMinHeight ); + Assert.AreEqual( anchorablePaneDockMinWidth, layoutAnchorablePaneGroup.CalculatedDockMinWidth() ); + Assert.AreEqual( anchorablePaneDockMinHeight, layoutAnchorablePaneGroup.CalculatedDockMinHeight() ); + + layoutPanel.RemoveChild( layoutDocumentPaneGroup ); + Assert.AreEqual( anchorablePaneDockMinWidth, layoutPanel.CalculatedDockMinWidth() ); + Assert.AreEqual( anchorablePaneDockMinHeight, layoutPanel.CalculatedDockMinHeight() ); + } + + [TestMethod] + public void UpdateDocMinWidthHeightTest() + { + double documentPaneDockMinHeight = 100; + double documentPaneDockMinWidth = 101; + LayoutDocumentPane layoutDocumentPane = new LayoutDocumentPane { DockMinHeight = documentPaneDockMinHeight, DockMinWidth = documentPaneDockMinWidth }; + layoutDocumentPane.InsertChildAt( 0, new LayoutDocument { ContentId = "Document" } ); + + LayoutDocumentPaneGroup layoutDocumentPaneGroup = new LayoutDocumentPaneGroup(); + layoutDocumentPaneGroup.InsertChildAt( 0, layoutDocumentPane ); + + double anchorablePane1DockMinHeight = 150; + double anchorablePane1DockMinWidth = 151; + LayoutAnchorablePane layoutAnchorablePane1 = new LayoutAnchorablePane { DockMinHeight = anchorablePane1DockMinHeight, DockMinWidth = anchorablePane1DockMinWidth }; + layoutAnchorablePane1.InsertChildAt( 0, new LayoutAnchorable { ContentId = "Anchorable1" } ); + + double anchorablePane2DockMinHeight = 200; + double anchorablePane2DockMinWidth = 201; + LayoutAnchorablePane layoutAnchorablePane2 = new LayoutAnchorablePane { DockMinHeight = anchorablePane2DockMinHeight, DockMinWidth = anchorablePane2DockMinWidth }; + layoutAnchorablePane2.InsertChildAt( 0, new LayoutAnchorable { ContentId = "Anchorable2" } ); + + LayoutAnchorablePaneGroup layoutAnchorablePaneGroup = new LayoutAnchorablePaneGroup { Orientation = Orientation.Horizontal }; + layoutAnchorablePaneGroup.InsertChildAt( 0, layoutAnchorablePane1 ); + layoutAnchorablePaneGroup.InsertChildAt( 0, layoutAnchorablePane2 ); + + LayoutPanel layoutPanel = new LayoutPanel { Orientation = Orientation.Vertical }; + layoutPanel.InsertChildAt( 0, layoutDocumentPaneGroup ); + layoutPanel.InsertChildAt( 1, layoutAnchorablePaneGroup ); + + Assert.AreEqual( anchorablePane2DockMinWidth + anchorablePane1DockMinWidth, layoutAnchorablePaneGroup.CalculatedDockMinWidth() ); + Assert.AreEqual( Math.Max( anchorablePane2DockMinHeight, anchorablePane1DockMinHeight ), layoutAnchorablePaneGroup.CalculatedDockMinHeight() ); + + Assert.AreEqual( documentPaneDockMinWidth, layoutDocumentPaneGroup.CalculatedDockMinWidth() ); + Assert.AreEqual( documentPaneDockMinHeight, layoutDocumentPaneGroup.CalculatedDockMinHeight() ); + + Assert.AreEqual( + Math.Max( anchorablePane1DockMinWidth + anchorablePane2DockMinWidth, documentPaneDockMinWidth ), + layoutPanel.CalculatedDockMinWidth() ); + + Assert.AreEqual( documentPaneDockMinHeight + anchorablePane2DockMinHeight, layoutPanel.CalculatedDockMinHeight() ); + } + } +} diff --git a/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/LayoutAnchorableTest.cs b/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/LayoutAnchorableTest.cs new file mode 100644 index 00000000..e6e3b34e --- /dev/null +++ b/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/LayoutAnchorableTest.cs @@ -0,0 +1,65 @@ +using System.Linq; +using System.Reflection; +using System.Windows; +using System.Windows.Data; + +using Microsoft.VisualStudio.TestTools.UnitTesting; + +using Xceed.Wpf.AvalonDock.Controls; +using Xceed.Wpf.AvalonDock.Converters; +using Xceed.Wpf.AvalonDock.Layout; + +namespace Xceed.Wpf.AvalonDock.Test +{ + [TestClass] + public sealed class LayoutAnchorableTest + { + [TestMethod] + public void ClearBindingOfHiddenWindowTest() + { + LayoutAnchorable layoutAnchorable = new LayoutAnchorable + { + FloatingWidth = 50, + FloatingHeight = 100, + ContentId = "Test" + }; + + LayoutAnchorablePane layoutAnchorablePane = new LayoutAnchorablePane( layoutAnchorable ); + LayoutAnchorablePaneGroup layoutAnchorablePaneGroup = new LayoutAnchorablePaneGroup( layoutAnchorablePane ); + LayoutAnchorableFloatingWindow layoutFloatingWindow = new LayoutAnchorableFloatingWindow + { + RootPanel = layoutAnchorablePaneGroup + }; + + var ctor = typeof( LayoutAnchorableFloatingWindowControl ) + .GetTypeInfo() + .GetConstructors( BindingFlags.NonPublic | BindingFlags.Instance ) + .First( x => x.GetParameters().Length == 1 ); + + LayoutAnchorableFloatingWindowControl floatingWindowControl = ctor.Invoke( new object[] {layoutFloatingWindow} ) as LayoutAnchorableFloatingWindowControl; + floatingWindowControl.SetBinding( + UIElement.VisibilityProperty, + new Binding( "IsVisible" ) + { + Source = floatingWindowControl.Model, + Converter = new BoolToVisibilityConverter(), + Mode = BindingMode.OneWay, + ConverterParameter = Visibility.Hidden + } ); + + BindingExpression visibilityBinding = floatingWindowControl.GetBindingExpression( UIElement.VisibilityProperty ); + Assert.IsNotNull( visibilityBinding ); + + layoutAnchorable.Show(); + layoutAnchorable.Hide(); + + visibilityBinding = floatingWindowControl.GetBindingExpression( UIElement.VisibilityProperty ); + Assert.IsNotNull( visibilityBinding ); + + floatingWindowControl.Hide(); + + visibilityBinding = floatingWindowControl.GetBindingExpression( UIElement.VisibilityProperty ); + Assert.IsNull( visibilityBinding ); + } + } +} diff --git a/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/Xceed.Wpf.AvalonDock.Test.csproj b/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/Xceed.Wpf.AvalonDock.Test.csproj index 82a80bae..3a7d19b1 100644 --- a/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/Xceed.Wpf.AvalonDock.Test.csproj +++ b/source/AutomationTest/Xceed.Wpf.AvalonDock.Test/Xceed.Wpf.AvalonDock.Test.csproj @@ -52,10 +52,13 @@ + + + TestApp.xaml @@ -102,4 +105,4 @@ - + \ No newline at end of file diff --git a/source/Components/Xceed.Wpf.AvalonDock/Controls/LayoutAnchorableFloatingWindowControl.cs b/source/Components/Xceed.Wpf.AvalonDock/Controls/LayoutAnchorableFloatingWindowControl.cs index 3ffacc74..0c363a57 100644 --- a/source/Components/Xceed.Wpf.AvalonDock/Controls/LayoutAnchorableFloatingWindowControl.cs +++ b/source/Components/Xceed.Wpf.AvalonDock/Controls/LayoutAnchorableFloatingWindowControl.cs @@ -201,6 +201,8 @@ protected override void OnClosed( EventArgs e ) BindingOperations.ClearBinding(_model, VisibilityProperty); _model.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler( _model_PropertyChanged ); + + Activated -= LayoutAnchorableFloatingWindowControl_Activated; } protected override void OnClosing( System.ComponentModel.CancelEventArgs e ) @@ -329,7 +331,7 @@ private void SetVisibilityBinding() { SetBinding( VisibilityProperty, - new Binding("IsVisible") + new Binding( "IsVisible" ) { Source = _model, Converter = new BoolToVisibilityConverter(), diff --git a/source/Components/Xceed.Wpf.AvalonDock/Controls/LayoutFloatingWindowControl.cs b/source/Components/Xceed.Wpf.AvalonDock/Controls/LayoutFloatingWindowControl.cs index 7b72a153..b2bb064c 100644 --- a/source/Components/Xceed.Wpf.AvalonDock/Controls/LayoutFloatingWindowControl.cs +++ b/source/Components/Xceed.Wpf.AvalonDock/Controls/LayoutFloatingWindowControl.cs @@ -310,8 +310,8 @@ internal virtual void UpdateThemeResources( Theme oldTheme = null ) } } - var manager = _model.Root.Manager; - if( manager.Theme != null ) + var manager = _model.Root?.Manager; + if( manager?.Theme != null ) { if( manager.Theme is DictionaryTheme ) { diff --git a/source/Components/Xceed.Wpf.AvalonDock/Layout/LayoutAnchorable.cs b/source/Components/Xceed.Wpf.AvalonDock/Layout/LayoutAnchorable.cs index 5bbe0a1c..9a41987e 100644 --- a/source/Components/Xceed.Wpf.AvalonDock/Layout/LayoutAnchorable.cs +++ b/source/Components/Xceed.Wpf.AvalonDock/Layout/LayoutAnchorable.cs @@ -419,7 +419,7 @@ public void Hide( bool cancelable = true ) PreviousContainer = parentAsGroup; PreviousContainerIndex = parentAsGroup.IndexOfChild( this ); } - Root.Hidden.Add( this ); + Root?.Hidden?.Add( this ); RaisePropertyChanged( "IsVisible" ); RaisePropertyChanged( "IsHidden" ); NotifyIsVisibleChanged();