Browse Source

Merge 666b9aa4be into cb3f9e1972

pull/1271/merge
KaeTar 9 years ago
committed by GitHub
parent
commit
c0c8c310c4
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 468
      ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Layout/LayoutRoot.cs

468
ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Layout/LayoutRoot.cs

@ -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;
@ -334,7 +331,7 @@ namespace Xceed.Wpf.AvalonDock.Layout
#region ActiveContent #region ActiveContent
[field:NonSerialized] [field: NonSerialized]
private WeakReference _activeContent = null; private WeakReference _activeContent = null;
private bool _activeContentSet = false; private bool _activeContentSet = false;
@ -662,288 +659,283 @@ 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();
} FloatingWindows.Clear();
RightSide = ( LayoutAnchorSide )ReadElement( reader ); var floatingWindows = ReadElementList(reader);
if( RightSide != null ) foreach (var floatingWindow in floatingWindows)
{ {
RightSide.Children.Add( ( LayoutAnchorGroup )ReadElement( reader ) ); FloatingWindows.Add((LayoutFloatingWindow)floatingWindow);
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(); Hidden.Clear();
var floatingWindows = ReadElementList( reader ); var hidden = ReadElementList(reader);
foreach( var floatingWindow in floatingWindows ) foreach (var hiddenObject in hidden)
{ {
FloatingWindows.Add( ( LayoutFloatingWindow )floatingWindow );
}
Hidden.Clear(); Hidden.Add((LayoutAnchorable)hiddenObject);
var hidden = ReadElementList( reader ); }
foreach( var hiddenObject in hidden )
{
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 ) if (reader.IsEmptyElement)
{ {
reader.Read(); reader.Read();
return resultList; return resultList;
} }
var startElementName = reader.LocalName;
reader.Read();
if( reader.LocalName.Equals(startElementName) && (reader.NodeType == XmlNodeType.EndElement) )
{
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;
}
reader.ReadEndElement(); resultList.Add(result);
}
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)
{
writer.WriteStartElement(layoutAnchorable.GetType().Name);
layoutAnchorable.WriteXml(writer);
writer.WriteEndElement();
}
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

Loading…
Cancel
Save