/************************************************************************************* 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.Controls; using System.Windows; using System.Collections.ObjectModel; using Xceed.Wpf.AvalonDock.Layout; namespace Xceed.Wpf.AvalonDock.Controls { public class LayoutAnchorSideControl : Control, ILayoutControl { static LayoutAnchorSideControl() { DefaultStyleKeyProperty.OverrideMetadata(typeof(LayoutAnchorSideControl), new FrameworkPropertyMetadata(typeof(LayoutAnchorSideControl))); } internal LayoutAnchorSideControl(LayoutAnchorSide model) { if (model == null) throw new ArgumentNullException("model"); _model = model; CreateChildrenViews(); _model.Children.CollectionChanged += (s, e) => OnModelChildrenCollectionChanged(e); UpdateSide(); } private void CreateChildrenViews() { var manager = _model.Root.Manager; foreach (var childModel in _model.Children) { _childViews.Add(manager.CreateUIElementForModel(childModel) as LayoutAnchorGroupControl); } } private void OnModelChildrenCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { if (e.OldItems != null && (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove || e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Replace)) { foreach (var childModel in e.OldItems) _childViews.Remove(_childViews.First(cv => cv.Model == childModel)); } if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Reset) _childViews.Clear(); if (e.NewItems != null && (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add || e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Replace)) { var manager = _model.Root.Manager; int insertIndex = e.NewStartingIndex; foreach (LayoutAnchorGroup childModel in e.NewItems) { _childViews.Insert(insertIndex++, manager.CreateUIElementForModel(childModel) as LayoutAnchorGroupControl); } } } LayoutAnchorSide _model = null; public ILayoutElement Model { get { return _model; } } ObservableCollection _childViews = new ObservableCollection(); public ObservableCollection Children { get { return _childViews; } } void UpdateSide() { switch (_model.Side) { case AnchorSide.Left: SetIsLeftSide(true); break; case AnchorSide.Top: SetIsTopSide(true); break; case AnchorSide.Right: SetIsRightSide(true); break; case AnchorSide.Bottom: SetIsBottomSide(true); break; } } #region IsLeftSide /// /// IsLeftSide Read-Only Dependency Property /// private static readonly DependencyPropertyKey IsLeftSidePropertyKey = DependencyProperty.RegisterReadOnly("IsLeftSide", typeof(bool), typeof(LayoutAnchorSideControl), new FrameworkPropertyMetadata((bool)false)); public static readonly DependencyProperty IsLeftSideProperty = IsLeftSidePropertyKey.DependencyProperty; /// /// Gets the IsLeftSide property. This dependency property /// indicates this control is anchored to left side. /// public bool IsLeftSide { get { return (bool)GetValue(IsLeftSideProperty); } } /// /// Provides a secure method for setting the IsLeftSide property. /// This dependency property indicates this control is anchored to left side. /// /// The new value for the property. protected void SetIsLeftSide(bool value) { SetValue(IsLeftSidePropertyKey, value); } #endregion #region IsTopSide /// /// IsTopSide Read-Only Dependency Property /// private static readonly DependencyPropertyKey IsTopSidePropertyKey = DependencyProperty.RegisterReadOnly("IsTopSide", typeof(bool), typeof(LayoutAnchorSideControl), new FrameworkPropertyMetadata((bool)false)); public static readonly DependencyProperty IsTopSideProperty = IsTopSidePropertyKey.DependencyProperty; /// /// Gets the IsTopSide property. This dependency property /// indicates this control is anchored to top side. /// public bool IsTopSide { get { return (bool)GetValue(IsTopSideProperty); } } /// /// Provides a secure method for setting the IsTopSide property. /// This dependency property indicates this control is anchored to top side. /// /// The new value for the property. protected void SetIsTopSide(bool value) { SetValue(IsTopSidePropertyKey, value); } #endregion #region IsRightSide /// /// IsRightSide Read-Only Dependency Property /// private static readonly DependencyPropertyKey IsRightSidePropertyKey = DependencyProperty.RegisterReadOnly("IsRightSide", typeof(bool), typeof(LayoutAnchorSideControl), new FrameworkPropertyMetadata((bool)false)); public static readonly DependencyProperty IsRightSideProperty = IsRightSidePropertyKey.DependencyProperty; /// /// Gets the IsRightSide property. This dependency property /// indicates this control is anchored to right side. /// public bool IsRightSide { get { return (bool)GetValue(IsRightSideProperty); } } /// /// Provides a secure method for setting the IsRightSide property. /// This dependency property indicates this control is anchored to right side. /// /// The new value for the property. protected void SetIsRightSide(bool value) { SetValue(IsRightSidePropertyKey, value); } #endregion #region IsBottomSide /// /// IsBottomSide Read-Only Dependency Property /// private static readonly DependencyPropertyKey IsBottomSidePropertyKey = DependencyProperty.RegisterReadOnly("IsBottomSide", typeof(bool), typeof(LayoutAnchorSideControl), new FrameworkPropertyMetadata((bool)false)); public static readonly DependencyProperty IsBottomSideProperty = IsBottomSidePropertyKey.DependencyProperty; /// /// Gets the IsBottomSide property. This dependency property /// indicates if this panel is anchored to bottom side. /// public bool IsBottomSide { get { return (bool)GetValue(IsBottomSideProperty); } } /// /// Provides a secure method for setting the IsBottomSide property. /// This dependency property indicates if this panel is anchored to bottom side. /// /// The new value for the property. protected void SetIsBottomSide(bool value) { SetValue(IsBottomSidePropertyKey, value); } #endregion } }