You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
5.4 KiB
138 lines
5.4 KiB
/*************************************************************************************
|
|
|
|
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.IO;
|
|
using Xceed.Wpf.AvalonDock.Controls;
|
|
using System.Windows;
|
|
|
|
namespace Xceed.Wpf.AvalonDock.Layout.Serialization
|
|
{
|
|
public abstract class LayoutSerializer
|
|
{
|
|
DockingManager _manager;
|
|
|
|
public LayoutSerializer(DockingManager manager)
|
|
{
|
|
if (manager == null)
|
|
throw new ArgumentNullException("manager");
|
|
|
|
_manager = manager;
|
|
_previousAnchorables = _manager.Layout.Descendents().OfType<LayoutAnchorable>().ToArray();
|
|
_previousDocuments = _manager.Layout.Descendents().OfType<LayoutDocument>().ToArray();
|
|
}
|
|
|
|
LayoutAnchorable[] _previousAnchorables = null;
|
|
LayoutDocument[] _previousDocuments = null;
|
|
|
|
public DockingManager Manager
|
|
{
|
|
get { return _manager; }
|
|
}
|
|
|
|
public event EventHandler<LayoutSerializationCallbackEventArgs> LayoutSerializationCallback;
|
|
|
|
protected virtual void FixupLayout(LayoutRoot layout)
|
|
{
|
|
//fix container panes
|
|
foreach (var lcToAttach in layout.Descendents().OfType<ILayoutPreviousContainer>().Where(lc => lc.PreviousContainerId != null))
|
|
{
|
|
var paneContainerToAttach = layout.Descendents().OfType<ILayoutPaneSerializable>().FirstOrDefault(lps => lps.Id == lcToAttach.PreviousContainerId);
|
|
if (paneContainerToAttach == null)
|
|
throw new ArgumentException(string.Format("Unable to find a pane with id ='{0}'", lcToAttach.PreviousContainerId));
|
|
|
|
lcToAttach.PreviousContainer = paneContainerToAttach as ILayoutContainer;
|
|
}
|
|
|
|
|
|
//now fix the content of the layoutcontents
|
|
foreach (var lcToFix in layout.Descendents().OfType<LayoutAnchorable>().Where(lc => lc.Content == null).ToArray())
|
|
{
|
|
LayoutAnchorable previousAchorable = null;
|
|
if (lcToFix.ContentId != null)
|
|
{
|
|
//try find the content in replaced layout
|
|
previousAchorable = _previousAnchorables.FirstOrDefault(a => a.ContentId == lcToFix.ContentId);
|
|
}
|
|
|
|
if (LayoutSerializationCallback != null)
|
|
{
|
|
var args = new LayoutSerializationCallbackEventArgs(lcToFix, previousAchorable != null ? previousAchorable.Content : null);
|
|
LayoutSerializationCallback(this, args);
|
|
if (args.Cancel)
|
|
lcToFix.Close();
|
|
else if (args.Content != null)
|
|
lcToFix.Content = args.Content;
|
|
else if (args.Model.Content != null)
|
|
lcToFix.Hide(false);
|
|
}
|
|
else if (previousAchorable == null)
|
|
lcToFix.Hide(false);
|
|
else
|
|
{
|
|
lcToFix.Content = previousAchorable.Content;
|
|
lcToFix.IconSource = previousAchorable.IconSource;
|
|
}
|
|
}
|
|
|
|
|
|
foreach (var lcToFix in layout.Descendents().OfType<LayoutDocument>().Where(lc => lc.Content == null).ToArray())
|
|
{
|
|
LayoutDocument previousDocument = null;
|
|
if (lcToFix.ContentId != null)
|
|
{
|
|
//try find the content in replaced layout
|
|
previousDocument = _previousDocuments.FirstOrDefault(a => a.ContentId == lcToFix.ContentId);
|
|
}
|
|
|
|
if (LayoutSerializationCallback != null)
|
|
{
|
|
var args = new LayoutSerializationCallbackEventArgs(lcToFix, previousDocument != null ? previousDocument.Content : null);
|
|
LayoutSerializationCallback(this, args);
|
|
|
|
if (args.Cancel)
|
|
lcToFix.Close();
|
|
else if (args.Content != null)
|
|
lcToFix.Content = args.Content;
|
|
else if (args.Model.Content != null)
|
|
lcToFix.Close();
|
|
}
|
|
else if (previousDocument == null)
|
|
lcToFix.Close();
|
|
else
|
|
lcToFix.Content = previousDocument.Content;
|
|
}
|
|
|
|
|
|
layout.CollectGarbage();
|
|
}
|
|
|
|
protected void StartDeserialization()
|
|
{
|
|
Manager.SuspendDocumentsSourceBinding = true;
|
|
Manager.SuspendAnchorablesSourceBinding = true;
|
|
}
|
|
|
|
protected void EndDeserialization()
|
|
{
|
|
Manager.SuspendDocumentsSourceBinding = false;
|
|
Manager.SuspendAnchorablesSourceBinding = false;
|
|
}
|
|
}
|
|
}
|
|
|