/*************************************************************************************
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.Windows;
using System.ComponentModel;
using System.Xml.Serialization;
namespace Xceed.Wpf.AvalonDock.Layout
{
[Serializable]
public abstract class LayoutElement : DependencyObject, ILayoutElement
{
internal LayoutElement()
{ }
#region Parent
[NonSerialized]
private ILayoutContainer _parent = null;
[NonSerialized]
private ILayoutRoot _root = null;
[XmlIgnore]
public ILayoutContainer Parent
{
get { return _parent; }
set
{
if (_parent != value)
{
ILayoutContainer oldValue = _parent;
ILayoutRoot oldRoot = _root;
RaisePropertyChanging("Parent");
OnParentChanging(oldValue, value);
_parent = value;
OnParentChanged(oldValue, value);
_root = Root;
if (oldRoot != _root)
OnRootChanged(oldRoot, _root);
RaisePropertyChanged("Parent");
var root = Root as LayoutRoot;
if (root != null)
root.FireLayoutUpdated();
}
}
}
///
/// Provides derived classes an opportunity to handle execute code before to the Parent property changes.
///
protected virtual void OnParentChanging(ILayoutContainer oldValue, ILayoutContainer newValue)
{
}
///
/// Provides derived classes an opportunity to handle changes to the Parent property.
///
protected virtual void OnParentChanged(ILayoutContainer oldValue, ILayoutContainer newValue)
{
}
protected virtual void OnRootChanged(ILayoutRoot oldRoot, ILayoutRoot newRoot)
{
if (oldRoot != null)
((LayoutRoot)oldRoot).OnLayoutElementRemoved(this);
if (newRoot != null)
((LayoutRoot)newRoot).OnLayoutElementAdded(this);
}
#endregion
[field: NonSerialized]
[field: XmlIgnore]
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
[field: NonSerialized]
[field: XmlIgnore]
public event PropertyChangingEventHandler PropertyChanging;
protected virtual void RaisePropertyChanging(string propertyName)
{
if (PropertyChanging != null)
PropertyChanging(this, new System.ComponentModel.PropertyChangingEventArgs(propertyName));
}
public ILayoutRoot Root
{
get
{
var parent = Parent;
while (parent != null && (!(parent is ILayoutRoot)))
{
parent = parent.Parent;
}
return parent as ILayoutRoot;
}
}
#if TRACE
public virtual void ConsoleDump(int tab)
{
System.Diagnostics.Trace.Write( new String( ' ', tab * 4 ) );
System.Diagnostics.Trace.WriteLine( this.ToString() );
}
#endif
}
}