/************************************************************************************* 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.Windows.Input; using Xceed.Wpf.AvalonDock.Layout; namespace Xceed.Wpf.AvalonDock.Controls { public class AnchorablePaneTitle : Control { static AnchorablePaneTitle() { IsHitTestVisibleProperty.OverrideMetadata(typeof(AnchorablePaneTitle), new FrameworkPropertyMetadata(true)); FocusableProperty.OverrideMetadata(typeof(AnchorablePaneTitle), new FrameworkPropertyMetadata(false)); DefaultStyleKeyProperty.OverrideMetadata(typeof(AnchorablePaneTitle), new FrameworkPropertyMetadata(typeof(AnchorablePaneTitle))); } public AnchorablePaneTitle() { } #region Model /// /// Model Dependency Property /// public static readonly DependencyProperty ModelProperty = DependencyProperty.Register("Model", typeof(LayoutAnchorable), typeof(AnchorablePaneTitle), new FrameworkPropertyMetadata((LayoutAnchorable)null, new PropertyChangedCallback(_OnModelChanged))); /// /// Gets or sets the Model property. This dependency property /// indicates model attached to this view. /// public LayoutAnchorable Model { get { return (LayoutAnchorable)GetValue(ModelProperty); } set { SetValue(ModelProperty, value); } } static void _OnModelChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { ((AnchorablePaneTitle)sender).OnModelChanged(e); } /// /// Provides derived classes an opportunity to handle changes to the Model property. /// protected virtual void OnModelChanged(DependencyPropertyChangedEventArgs e) { if (Model != null) SetLayoutItem(Model.Root.Manager.GetLayoutItemFromModel(Model)); else SetLayoutItem(null); } #endregion #region LayoutItem /// /// LayoutItem Read-Only Dependency Property /// private static readonly DependencyPropertyKey LayoutItemPropertyKey = DependencyProperty.RegisterReadOnly("LayoutItem", typeof(LayoutItem), typeof(AnchorablePaneTitle), new FrameworkPropertyMetadata((LayoutItem)null)); public static readonly DependencyProperty LayoutItemProperty = LayoutItemPropertyKey.DependencyProperty; /// /// Gets the LayoutItem property. This dependency property /// indicates the LayoutItem attached to this tag item. /// public LayoutItem LayoutItem { get { return (LayoutItem)GetValue(LayoutItemProperty); } } /// /// Provides a secure method for setting the LayoutItem property. /// This dependency property indicates the LayoutItem attached to this tag item. /// /// The new value for the property. protected void SetLayoutItem(LayoutItem value) { SetValue(LayoutItemPropertyKey, value); } #endregion private void OnHide() { Model.Hide(); } private void OnToggleAutoHide() { Model.ToggleAutoHide(); } protected override void OnMouseMove(System.Windows.Input.MouseEventArgs e) { if (e.LeftButton != MouseButtonState.Pressed) { _isMouseDown = false; } base.OnMouseMove(e); } protected override void OnMouseLeave(System.Windows.Input.MouseEventArgs e) { base.OnMouseLeave(e); if (_isMouseDown && e.LeftButton == MouseButtonState.Pressed) { var pane = this.FindVisualAncestor(); if (pane != null) { var paneModel = pane.Model as LayoutAnchorablePane; var manager = paneModel.Root.Manager; manager.StartDraggingFloatingWindowForPane(paneModel); } } _isMouseDown = false; } bool _isMouseDown = false; protected override void OnMouseLeftButtonDown(System.Windows.Input.MouseButtonEventArgs e) { base.OnMouseLeftButtonDown(e); if (!e.Handled) { bool attachFloatingWindow = false; var parentFloatingWindow = Model.FindParent(); if (parentFloatingWindow != null) { attachFloatingWindow = parentFloatingWindow.Descendents().OfType().Count() == 1; } if (attachFloatingWindow) { //the pane is hosted inside a floating window that contains only an anchorable pane so drag the floating window itself var floatingWndControl = Model.Root.Manager.FloatingWindows.Single(fwc => fwc.Model == parentFloatingWindow); floatingWndControl.AttachDrag(false); } else _isMouseDown = true;//normal drag } } protected override void OnMouseLeftButtonUp(System.Windows.Input.MouseButtonEventArgs e) { _isMouseDown = false; base.OnMouseLeftButtonUp(e); if (Model != null) Model.IsActive = true;//FocusElementManager.SetFocusOnLastElement(Model); } } }