@ -17,12 +17,9 @@
using System ;
using System ;
using System.Collections.Generic ;
using System.Collections.Generic ;
using System.Linq ;
using System.Linq ;
using System.Text ;
using System.Windows ;
using System.Collections.ObjectModel ;
using System.Collections.ObjectModel ;
using System.Windows.Markup ;
using System.Windows.Markup ;
using System.Xml.Serialization ;
using System.Xml.Serialization ;
using Standard ;
using System.Xml ;
using System.Xml ;
using System.Xml.Schema ;
using System.Xml.Schema ;
@ -33,7 +30,7 @@ namespace Xceed.Wpf.AvalonDock.Layout
public class LayoutRoot : LayoutElement , ILayoutContainer , ILayoutRoot , IXmlSerializable
public class LayoutRoot : LayoutElement , ILayoutContainer , ILayoutRoot , IXmlSerializable
{
{
public LayoutRoot ( )
public LayoutRoot ( )
{
{
RightSide = new LayoutAnchorSide ( ) ;
RightSide = new LayoutAnchorSide ( ) ;
LeftSide = new LayoutAnchorSide ( ) ;
LeftSide = new LayoutAnchorSide ( ) ;
TopSide = new LayoutAnchorSide ( ) ;
TopSide = new LayoutAnchorSide ( ) ;
@ -159,7 +156,7 @@ namespace Xceed.Wpf.AvalonDock.Layout
public ObservableCollection < LayoutFloatingWindow > FloatingWindows
public ObservableCollection < LayoutFloatingWindow > FloatingWindows
{
{
get
get
{
{
if ( _f loatingWindows = = null )
if ( _f loatingWindows = = null )
{
{
@ -167,7 +164,7 @@ namespace Xceed.Wpf.AvalonDock.Layout
_f loatingWindows . CollectionChanged + = new System . Collections . Specialized . NotifyCollectionChangedEventHandler ( _f loatingWindows_CollectionChanged ) ;
_f loatingWindows . CollectionChanged + = new System . Collections . Specialized . NotifyCollectionChangedEventHandler ( _f loatingWindows_CollectionChanged ) ;
}
}
return _f loatingWindows ;
return _f loatingWindows ;
}
}
}
}
@ -181,7 +178,7 @@ namespace Xceed.Wpf.AvalonDock.Layout
if ( element . Parent = = this )
if ( element . Parent = = this )
element . Parent = null ;
element . Parent = null ;
}
}
}
}
if ( e . NewItems ! = null & & ( e . Action = = System . Collections . Specialized . NotifyCollectionChangedAction . Add | |
if ( e . NewItems ! = null & & ( e . Action = = System . Collections . Specialized . NotifyCollectionChangedAction . Add | |
e . Action = = System . Collections . Specialized . NotifyCollectionChangedAction . Replace ) )
e . Action = = System . Collections . Specialized . NotifyCollectionChangedAction . Replace ) )
@ -326,15 +323,15 @@ namespace Xceed.Wpf.AvalonDock.Layout
get
get
{
{
return 5 +
return 5 +
( _f loatingWindows ! = null ? _f loatingWindows . Count : 0 ) +
( _f loatingWindows ! = null ? _f loatingWindows . Count : 0 ) +
( _ hiddenAnchorables ! = null ? _ hiddenAnchorables . Count : 0 ) ;
( _ hiddenAnchorables ! = null ? _ hiddenAnchorables . Count : 0 ) ;
}
}
}
}
#endregion
#endregion
#region ActiveContent
#region ActiveContent
[field:NonSerialized]
[field: NonSerialized]
private WeakReference _ activeContent = null ;
private WeakReference _ activeContent = null ;
private bool _ activeContentSet = false ;
private bool _ activeContentSet = false ;
@ -452,7 +449,7 @@ namespace Xceed.Wpf.AvalonDock.Layout
exitFlag = true ;
exitFlag = true ;
//for each content that references via PreviousContainer a disconnected Pane set the property to null
//for each content that references via PreviousContainer a disconnected Pane set the property to null
foreach ( var content in this . Descendents ( ) . OfType < ILayoutPreviousContainer > ( ) . Where ( c = > c . PreviousContainer ! = null & &
foreach ( var content in this . Descendents ( ) . OfType < ILayoutPreviousContainer > ( ) . Where ( c = > c . PreviousContainer ! = null & &
( c . PreviousContainer . Parent = = null | | c . PreviousContainer . Parent . Root ! = this ) ) )
( c . PreviousContainer . Parent = = null | | c . PreviousContainer . Parent . Root ! = this ) ) )
{
{
content . PreviousContainer = null ;
content . PreviousContainer = null ;
@ -662,288 +659,280 @@ namespace Xceed.Wpf.AvalonDock.Layout
public event EventHandler < LayoutElementEventArgs > ElementRemoved ;
public event EventHandler < LayoutElementEventArgs > ElementRemoved ;
#endregion
#endregion
public XmlSchema GetSchema ( )
public XmlSchema GetSchema ( )
{
{
return null ;
return null ;
}
}
public void ReadXml ( XmlReader reader )
public void ReadXml ( XmlReader reader )
{
{
reader . MoveToContent ( ) ;
reader . MoveToContent ( ) ;
if ( reader . IsEmptyElement )
if ( reader . IsEmptyElement )
{
{
reader . Read ( ) ;
reader . Read ( ) ;
return ;
return ;
}
}
var layoutPanelElements = ReadRootPanel ( reader ) ;
var layoutPanelElements = ReadRootPanel ( reader ) ;
if ( layoutPanelElements ! = null )
if ( layoutPanelElements ! = null )
{
//Create the RootPanel with the first child
RootPanel = new LayoutPanel ( layoutPanelElements . First ( ) ) ;
//Add all children to RootPanel
for ( int i = 1 ; i < layoutPanelElements . Count ; + + i )
{
{
RootPanel . Children . Add ( layoutPanelElements [ i ] ) ;
//Create the RootPanel with the first child
RootPanel = new LayoutPanel ( layoutPanelElements . First ( ) ) ;
//Add all children to RootPanel
for ( int i = 1 ; i < layoutPanelElements . Count ; + + i )
{
RootPanel . Children . Add ( layoutPanelElements [ i ] ) ;
}
}
}
}
TopSide = ( LayoutAnchorSide ) ReadElement ( reader ) ;
TopSide = GetLayoutAnchorSide ( reader ) ;
if ( TopSide ! = null )
RightSide = GetLayoutAnchorSide ( reader ) ;
{
LeftSide = GetLayoutAnchorSide ( reader ) ;
TopSide . Children . Add ( ( LayoutAnchorGroup ) ReadElement ( reader ) ) ;
BottomSide = GetLayoutAnchorSide ( reader ) ;
reader . Read ( ) ;
}
RightSide = ( LayoutAnchorSide ) ReadElement ( reader ) ;
if ( RightSide ! = null )
{
RightSide . Children . Add ( ( LayoutAnchorGroup ) ReadElement ( reader ) ) ;
reader . Read ( ) ;
}
LeftSide = ( LayoutAnchorSide ) ReadElement ( reader ) ;
if ( LeftSide ! = null )
{
LeftSide . Children . Add ( ( LayoutAnchorGroup ) ReadElement ( reader ) ) ;
reader . Read ( ) ;
}
BottomSide = ( LayoutAnchorSide ) ReadElement ( reader ) ;
if ( BottomSide ! = null )
{
BottomSide . Children . Add ( ( LayoutAnchorGroup ) ReadElement ( reader ) ) ;
reader . Read ( ) ;
}
FloatingWindows . Clear ( ) ;
FloatingWindows . Clear ( ) ;
var floatingWindows = ReadElementList ( reader ) ;
var floatingWindows = ReadElementList ( reader ) ;
foreach ( var floatingWindow in floatingWindows )
foreach ( var floatingWindow in floatingWindows )
{
{
FloatingWindows . Add ( ( LayoutFloatingWindow ) floatingWindow ) ;
FloatingWindows . Add ( ( LayoutFloatingWindow ) floatingWindow ) ;
}
}
Hidden . Clear ( ) ;
Hidden . Clear ( ) ;
var hidden = ReadElementList ( reader ) ;
var hidden = ReadElementList ( reader ) ;
foreach ( var hiddenObject in hidden )
foreach ( var hiddenObject in hidden )
{
{
Hidden . Add ( ( LayoutAnchorable ) hiddenObject ) ;
Hidden . Add ( ( LayoutAnchorable ) hiddenObject ) ;
}
}
}
}
private List < ILayoutPanelElement > ReadRootPanel ( XmlReader reader )
private LayoutAnchorSide GetLayoutAnchorSide ( XmlReader reader )
{
{
var result = new List < ILayoutPanelElement > ( ) ;
var side = ( LayoutAnchorSide ) ReadElement ( reader ) ;
if ( side ! = null )
{
side . Children . Add ( ( LayoutAnchorGroup ) ReadElement ( reader ) ) ;
reader . Read ( ) ;
}
var startElementName = reader . LocalName ;
return side ? ? new LayoutAnchorSide ( ) ;
reader . Read ( ) ;
}
if ( reader . LocalName . Equals ( startElementName ) & & ( reader . NodeType = = XmlNodeType . EndElement ) )
{
return null ;
}
while ( reader . NodeType = = XmlNodeType . Whitespace )
private List < ILayoutPanelElement > ReadRootPanel ( XmlReader reader )
{
{
reader . Read ( ) ;
var result = new List < ILayoutPanelElement > ( ) ;
}
if ( reader . LocalName . Equals ( "RootPanel" ) )
var startElementName = reader . LocalName ;
{
reader . Read ( ) ;
reader . Read ( ) ;
if ( reader . LocalName . Equals ( startElementName ) & & ( reader . NodeType = = XmlNodeType . EndElement ) )
{
return null ;
}
while ( true )
while ( reader . NodeType = = XmlNodeType . Whitespace )
{
{
//Read all RootPanel children
reader . Read ( ) ;
var element = ReadElement ( reader ) as ILayoutPanelElement ;
if ( element ! = null )
{
result . Add ( element ) ;
}
else if ( reader . NodeType = = XmlNodeType . EndElement )
{
break ;
}
}
}
}
reader . ReadEndElement ( ) ;
if ( reader . LocalName . Equals ( "RootPanel" ) )
{
reader . Read ( ) ;
return result ;
while ( true )
{
//Read all RootPanel children
var element = ReadElement ( reader ) as ILayoutPanelElement ;
if ( element ! = null )
{
result . Add ( element ) ;
}
else if ( reader . NodeType = = XmlNodeType . EndElement )
{
break ;
}
}
}
reader . ReadEndElement ( ) ;
return result ;
}
}
private List < object > ReadElementList ( XmlReader reader )
private List < object > ReadElementList ( XmlReader reader )
{
{
var resultList = new List < object > ( ) ;
var resultList = new List < object > ( ) ;
if ( reader . IsEmptyElement )
{
reader . Read ( ) ;
return resultList ;
}
var startElementName = reader . LocalName ;
if ( reader . IsEmptyElement )
reader . Read ( ) ;
{
if ( reader . LocalName . Equals ( startElementName ) & & ( reader . NodeType = = XmlNodeType . EndElement ) )
reader . Read ( ) ;
{
return resultList ;
return null ;
}
}
while ( reader . NodeType = = XmlNodeType . Whitespace )
var startElementName = reader . LocalName ;
{
reader . Read ( ) ;
reader . Read ( ) ;
}
if ( reader . LocalName . Equals ( startElementName ) & & ( reader . NodeType = = XmlNodeType . EndElement ) )
{
return null ;
}
while ( true )
while ( reader . NodeType = = XmlNodeType . Whitespace )
{
var result = ReadElement ( reader ) as LayoutFloatingWindow ;
if ( result = = null )
{
{
break ;
reader . Read ( ) ;
}
}
resultList . Add ( result ) ;
while ( true )
}
{
var result = ReadElement ( reader ) as LayoutFloatingWindow ;
if ( result = = null )
{
break ;
}
resultList . Add ( result ) ;
}
reader . ReadEndElement ( ) ;
reader . ReadEndElement ( ) ;
return resultList ;
return resultList ;
}
}
private object ReadElement ( XmlReader reader )
private object ReadElement ( XmlReader reader )
{
{
if ( reader . NodeType = = XmlNodeType . EndElement )
if ( reader . NodeType = = XmlNodeType . EndElement )
{
{
return null ;
return null ;
}
}
while ( reader . NodeType = = XmlNodeType . Whitespace )
while ( reader . NodeType = = XmlNodeType . Whitespace )
{
{
reader . Read ( ) ;
}
XmlSerializer serializer ;
switch ( reader . LocalName )
{
case "LayoutAnchorablePaneGroup" :
serializer = new XmlSerializer ( typeof ( LayoutAnchorablePaneGroup ) ) ;
break ;
case "LayoutAnchorablePane" :
serializer = new XmlSerializer ( typeof ( LayoutAnchorablePane ) ) ;
break ;
case "LayoutAnchorable" :
serializer = new XmlSerializer ( typeof ( LayoutAnchorable ) ) ;
break ;
case "LayoutDocumentPaneGroup" :
serializer = new XmlSerializer ( typeof ( LayoutDocumentPaneGroup ) ) ;
break ;
case "LayoutDocumentPane" :
serializer = new XmlSerializer ( typeof ( LayoutDocumentPane ) ) ;
break ;
case "LayoutDocument" :
serializer = new XmlSerializer ( typeof ( LayoutDocument ) ) ;
break ;
case "LayoutAnchorGroup" :
serializer = new XmlSerializer ( typeof ( LayoutAnchorGroup ) ) ;
break ;
case "LayoutPanel" :
serializer = new XmlSerializer ( typeof ( LayoutPanel ) ) ;
break ;
case "LayoutDocumentFloatingWindow" :
serializer = new XmlSerializer ( typeof ( LayoutDocumentFloatingWindow ) ) ;
break ;
case "LayoutAnchorableFloatingWindow" :
serializer = new XmlSerializer ( typeof ( LayoutAnchorableFloatingWindow ) ) ;
break ;
case "LeftSide" :
case "RightSide" :
case "TopSide" :
case "BottomSide" :
if ( reader . IsEmptyElement )
{
reader . Read ( ) ;
reader . Read ( ) ;
return null ;
}
}
reader . Read ( ) ;
XmlSerializer serializer ;
return new LayoutAnchorSide ( ) ;
switch ( reader . LocalName )
default :
{
var type = LayoutRoot . FindType ( reader . LocalName ) ;
case "LayoutAnchorablePaneGroup" :
if ( type = = null )
serializer = new XmlSerializer ( typeof ( LayoutAnchorablePaneGroup ) ) ;
{
break ;
throw new ArgumentException ( "AvalonDock.LayoutRoot doesn't know how to deserialize " + reader . LocalName ) ;
case "LayoutAnchorablePane" :
}
serializer = new XmlSerializer ( typeof ( LayoutAnchorablePane ) ) ;
serializer = new XmlSerializer ( type ) ;
break ;
break ;
case "LayoutAnchorable" :
}
serializer = new XmlSerializer ( typeof ( LayoutAnchorable ) ) ;
break ;
return serializer . Deserialize ( reader ) ;
case "LayoutDocumentPaneGroup" :
}
serializer = new XmlSerializer ( typeof ( LayoutDocumentPaneGroup ) ) ;
break ;
public void WriteXml ( XmlWriter writer )
case "LayoutDocumentPane" :
{
serializer = new XmlSerializer ( typeof ( LayoutDocumentPane ) ) ;
writer . WriteStartElement ( "RootPanel" ) ;
break ;
if ( RootPanel ! = null )
case "LayoutDocument" :
{
serializer = new XmlSerializer ( typeof ( LayoutDocument ) ) ;
RootPanel . WriteXml ( writer ) ;
break ;
}
case "LayoutAnchorGroup" :
writer . WriteEndElement ( ) ;
serializer = new XmlSerializer ( typeof ( LayoutAnchorGroup ) ) ;
break ;
writer . WriteStartElement ( "TopSide" ) ;
case "LayoutPanel" :
if ( TopSide ! = null )
serializer = new XmlSerializer ( typeof ( LayoutPanel ) ) ;
{
break ;
TopSide . WriteXml ( writer ) ;
case "LayoutDocumentFloatingWindow" :
}
serializer = new XmlSerializer ( typeof ( LayoutDocumentFloatingWindow ) ) ;
writer . WriteEndElement ( ) ;
break ;
case "LayoutAnchorableFloatingWindow" :
writer . WriteStartElement ( "RightSide" ) ;
serializer = new XmlSerializer ( typeof ( LayoutAnchorableFloatingWindow ) ) ;
if ( RightSide ! = null )
break ;
{
case "LeftSide" :
RightSide . WriteXml ( writer ) ;
case "RightSide" :
}
case "TopSide" :
writer . WriteEndElement ( ) ;
case "BottomSide" :
if ( reader . IsEmptyElement )
writer . WriteStartElement ( "LeftSide" ) ;
{
if ( LeftSide ! = null )
reader . Read ( ) ;
{
return null ;
LeftSide . WriteXml ( writer ) ;
}
}
reader . Read ( ) ;
writer . WriteEndElement ( ) ;
return new LayoutAnchorSide ( ) ;
default :
writer . WriteStartElement ( "BottomSide" ) ;
var type = LayoutRoot . FindType ( reader . LocalName ) ;
if ( BottomSide ! = null )
if ( type = = null )
{
{
BottomSide . WriteXml ( writer ) ;
throw new ArgumentException ( "AvalonDock.LayoutRoot doesn't know how to deserialize " + reader . LocalName ) ;
}
}
writer . WriteEndElement ( ) ;
serializer = new XmlSerializer ( type ) ;
break ;
// Write all floating windows (can be LayoutDocumentFloatingWindow or LayoutAnchorableFloatingWindow).
}
// To prevent "can not create instance of abstract type", the type is retrieved with GetType().Name
writer . WriteStartElement ( "FloatingWindows" ) ;
return serializer . Deserialize ( reader ) ;
foreach ( var layoutFloatingWindow in FloatingWindows )
}
{
writer . WriteStartElement ( layoutFloatingWindow . GetType ( ) . Name ) ;
public void WriteXml ( XmlWriter writer )
layoutFloatingWindow . WriteXml ( writer ) ;
{
writer . WriteStartElement ( "RootPanel" ) ;
if ( RootPanel ! = null )
{
RootPanel . WriteXml ( writer ) ;
}
writer . WriteEndElement ( ) ;
writer . WriteStartElement ( "TopSide" ) ;
if ( TopSide ! = null )
{
TopSide . WriteXml ( writer ) ;
}
writer . WriteEndElement ( ) ;
writer . WriteStartElement ( "RightSide" ) ;
if ( RightSide ! = null )
{
RightSide . WriteXml ( writer ) ;
}
writer . WriteEndElement ( ) ;
writer . WriteStartElement ( "LeftSide" ) ;
if ( LeftSide ! = null )
{
LeftSide . WriteXml ( writer ) ;
}
writer . WriteEndElement ( ) ;
writer . WriteEndElement ( ) ;
}
writer . WriteEndElement ( ) ;
writer . WriteStartElement ( "Hidden" ) ;
writer . WriteStartElement ( "BottomSide" ) ;
foreach ( var layoutAnchorable in Hidden )
if ( BottomSide ! = null )
{
{
layoutAnchorable . WriteXml ( writer ) ;
BottomSide . WriteXml ( writer ) ;
}
}
writer . WriteEndElement ( ) ;
writer . WriteEndElement ( ) ;
// Write all floating windows (can be LayoutDocumentFloatingWindow or LayoutAnchorableFloatingWindow).
// To prevent "can not create instance of abstract type", the type is retrieved with GetType().Name
writer . WriteStartElement ( "FloatingWindows" ) ;
foreach ( var layoutFloatingWindow in FloatingWindows )
{
writer . WriteStartElement ( layoutFloatingWindow . GetType ( ) . Name ) ;
layoutFloatingWindow . WriteXml ( writer ) ;
writer . WriteEndElement ( ) ;
}
writer . WriteEndElement ( ) ;
writer . WriteStartElement ( "Hidden" ) ;
foreach ( var layoutAnchorable in Hidden )
{
layoutAnchorable . WriteXml ( writer ) ;
}
writer . WriteEndElement ( ) ;
}
}
internal static Type FindType ( string name )
internal static Type FindType ( string name )
{
{
foreach ( var assembly in AppDomain . CurrentDomain . GetAssemblies ( ) )
foreach ( var assembly in AppDomain . CurrentDomain . GetAssemblies ( ) )
{
foreach ( var type in assembly . GetTypes ( ) )
{
{
if ( type . Name . Equals ( name ) )
foreach ( var type in assembly . GetTypes ( ) )
return type ;
{
if ( type . Name . Equals ( name ) )
return type ;
}
}
}
}
return null ;
return null ;
}
}
#if TRACE
#if TRACE