| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353 |
- /*************************************************************************************
- 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.Runtime.InteropServices;
- using System.Windows.Interop;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Media;
- using System.Windows.Input;
- using Xceed.Wpf.AvalonDock.Layout;
- using Xceed.Wpf.AvalonDock.Converters;
- using System.Diagnostics;
- using System.Windows.Controls.Primitives;
- using Xceed.Wpf.AvalonDock.Commands;
- using Microsoft.Windows.Shell;
- namespace Xceed.Wpf.AvalonDock.Controls
- {
- public class LayoutAnchorableFloatingWindowControl : LayoutFloatingWindowControl, IOverlayWindowHost
- {
- static LayoutAnchorableFloatingWindowControl()
- {
- DefaultStyleKeyProperty.OverrideMetadata(typeof(LayoutAnchorableFloatingWindowControl), new FrameworkPropertyMetadata(typeof(LayoutAnchorableFloatingWindowControl)));
- }
- internal LayoutAnchorableFloatingWindowControl(LayoutAnchorableFloatingWindow model)
- :base(model)
- {
- _model = model;
- HideWindowCommand = new RelayCommand((p) => OnExecuteHideWindowCommand(p), (p) => CanExecuteHideWindowCommand(p));
- }
- internal override void UpdateThemeResources( Xceed.Wpf.AvalonDock.Themes.Theme oldTheme = null )
- {
- base.UpdateThemeResources(oldTheme);
- if (_overlayWindow != null)
- _overlayWindow.UpdateThemeResources(oldTheme);
- }
- LayoutAnchorableFloatingWindow _model;
- public override ILayoutElement Model
- {
- get { return _model; }
- }
- #region SingleContentLayoutItem
- /// <summary>
- /// SingleContentLayoutItem Dependency Property
- /// </summary>
- public static readonly DependencyProperty SingleContentLayoutItemProperty =
- DependencyProperty.Register("SingleContentLayoutItem", typeof(LayoutItem), typeof(LayoutAnchorableFloatingWindowControl),
- new FrameworkPropertyMetadata((LayoutItem)null,
- new PropertyChangedCallback(OnSingleContentLayoutItemChanged)));
- /// <summary>
- /// Gets or sets the SingleContentLayoutItem property. This dependency property
- /// indicates the layout item of the selected content when is shown a single anchorable pane.
- /// </summary>
- public LayoutItem SingleContentLayoutItem
- {
- get { return (LayoutItem)GetValue(SingleContentLayoutItemProperty); }
- set { SetValue(SingleContentLayoutItemProperty, value); }
- }
- /// <summary>
- /// Handles changes to the SingleContentLayoutItem property.
- /// </summary>
- private static void OnSingleContentLayoutItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
- {
- ((LayoutAnchorableFloatingWindowControl)d).OnSingleContentLayoutItemChanged(e);
- }
- /// <summary>
- /// Provides derived classes an opportunity to handle changes to the SingleContentLayoutItem property.
- /// </summary>
- protected virtual void OnSingleContentLayoutItemChanged(DependencyPropertyChangedEventArgs e)
- {
- }
- #endregion
- protected override void OnInitialized(EventArgs e)
- {
- base.OnInitialized(e);
- var manager = _model.Root.Manager;
- Content = manager.CreateUIElementForModel(_model.RootPanel);
- //SetBinding(VisibilityProperty, new Binding("IsVisible") { Source = _model, Converter = new BoolToVisibilityConverter(), Mode = BindingMode.OneWay, ConverterParameter = Visibility.Hidden });
- //Issue: http://avalondock.codeplex.com/workitem/15036
- IsVisibleChanged += (s, args) =>
- {
- var visibilityBinding = GetBindingExpression(VisibilityProperty);
- if (IsVisible && (visibilityBinding == null))
- {
- SetBinding(VisibilityProperty, new Binding("IsVisible") { Source = _model, Converter = new BoolToVisibilityConverter(), Mode = BindingMode.OneWay, ConverterParameter = Visibility.Hidden });
- }
- };
- SetBinding(SingleContentLayoutItemProperty, new Binding("Model.SinglePane.SelectedContent") { Source = this, Converter = new LayoutItemFromLayoutModelConverter() });
- _model.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(_model_PropertyChanged);
- }
- void _model_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
- {
- if (e.PropertyName == "RootPanel" &&
- _model.RootPanel == null)
- {
- InternalClose();
- }
- }
- bool IOverlayWindowHost.HitTest(Point dragPoint)
- {
- Rect detectionRect = new Rect(this.PointToScreenDPIWithoutFlowDirection(new Point()), this.TransformActualSizeToAncestor());
- return detectionRect.Contains(dragPoint);
- }
- DockingManager IOverlayWindowHost.Manager
- {
- get { return _model.Root.Manager; }
- }
- OverlayWindow _overlayWindow = null;
- void CreateOverlayWindow()
- {
- if (_overlayWindow == null)
- _overlayWindow = new OverlayWindow(this);
- Rect rectWindow = new Rect(this.PointToScreenDPIWithoutFlowDirection(new Point()), this.TransformActualSizeToAncestor());
- _overlayWindow.Left = rectWindow.Left;
- _overlayWindow.Top = rectWindow.Top;
- _overlayWindow.Width = rectWindow.Width;
- _overlayWindow.Height = rectWindow.Height;
- }
- IOverlayWindow IOverlayWindowHost.ShowOverlayWindow(LayoutFloatingWindowControl draggingWindow)
- {
- CreateOverlayWindow();
- _overlayWindow.Owner = draggingWindow;
- _overlayWindow.EnableDropTargets();
- _overlayWindow.Show();
- return _overlayWindow;
- }
- void IOverlayWindowHost.HideOverlayWindow()
- {
- _dropAreas = null;
- _overlayWindow.Owner = null;
- _overlayWindow.HideDropTargets();
- }
- List<IDropArea> _dropAreas = null;
- IEnumerable<IDropArea> IOverlayWindowHost.GetDropAreas(LayoutFloatingWindowControl draggingWindow)
- {
- if (_dropAreas != null)
- return _dropAreas;
- _dropAreas = new List<IDropArea>();
- if (draggingWindow.Model is LayoutDocumentFloatingWindow)
- return _dropAreas;
- var rootVisual = (Content as FloatingWindowContentHost).RootVisual;
- foreach (var areaHost in rootVisual.FindVisualChildren<LayoutAnchorablePaneControl>())
- {
- _dropAreas.Add(new DropArea<LayoutAnchorablePaneControl>(
- areaHost,
- DropAreaType.AnchorablePane));
- }
- foreach (var areaHost in rootVisual.FindVisualChildren<LayoutDocumentPaneControl>())
- {
- _dropAreas.Add(new DropArea<LayoutDocumentPaneControl>(
- areaHost,
- DropAreaType.DocumentPane));
- }
- return _dropAreas;
- }
- protected override void OnClosed(EventArgs e)
- {
- var root = Model.Root;
- root.Manager.RemoveFloatingWindow(this);
- root.CollectGarbage();
- if (_overlayWindow != null)
- {
- _overlayWindow.Close();
- _overlayWindow = null;
- }
- base.OnClosed(e);
- if (!CloseInitiatedByUser)
- {
- root.FloatingWindows.Remove(_model);
- }
- _model.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(_model_PropertyChanged);
- }
- protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
- {
- if (CloseInitiatedByUser && !KeepContentVisibleOnClose)
- {
- e.Cancel = true;
- _model.Descendents().OfType<LayoutAnchorable>().ToArray().ForEach<LayoutAnchorable>((a) => a.Hide());
- }
- base.OnClosing(e);
- }
- protected override IntPtr FilterMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
- {
- switch (msg)
- {
- case Win32Helper.WM_NCLBUTTONDOWN: //Left button down on title -> start dragging over docking manager
- if (wParam.ToInt32() == Win32Helper.HT_CAPTION)
- {
- _model.Descendents().OfType<LayoutAnchorablePane>().First(p => p.ChildrenCount > 0 && p.SelectedContent != null).SelectedContent.IsActive = true;
- handled = true;
- }
- break;
- case Win32Helper.WM_NCRBUTTONUP:
- if (wParam.ToInt32() == Win32Helper.HT_CAPTION)
- {
- if (OpenContextMenu())
- handled = true;
- if (_model.Root.Manager.ShowSystemMenu)
- WindowChrome.GetWindowChrome(this).ShowSystemMenu = !handled;
- else
- WindowChrome.GetWindowChrome(this).ShowSystemMenu = false;
- }
- break;
- }
- return base.FilterMessage(hwnd, msg, wParam, lParam, ref handled);
- }
- bool OpenContextMenu()
- {
- var ctxMenu = _model.Root.Manager.AnchorableContextMenu;
- if (ctxMenu != null && SingleContentLayoutItem != null)
- {
- ctxMenu.PlacementTarget = null;
- ctxMenu.Placement = PlacementMode.MousePoint;
- ctxMenu.DataContext = SingleContentLayoutItem;
- ctxMenu.IsOpen = true;
- return true;
- }
- return false;
- }
- bool IsContextMenuOpen()
- {
- var ctxMenu = _model.Root.Manager.AnchorableContextMenu;
- if (ctxMenu != null && SingleContentLayoutItem != null)
- {
- return ctxMenu.IsOpen;
- }
- return false;
- }
- #region HideWindowCommand
- public ICommand HideWindowCommand
- {
- get;
- private set;
- }
- private bool CanExecuteHideWindowCommand(object parameter)
- {
- if (Model == null)
- return false;
- var root = Model.Root;
- if (root == null)
- return false;
- var manager = root.Manager;
- if (manager == null)
- return false;
- bool canExecute = false;
- foreach (var anchorable in this.Model.Descendents().OfType<LayoutAnchorable>().ToArray())
- {
- if (!anchorable.CanHide)
- {
- canExecute = false;
- break;
- }
- var anchorableLayoutItem = manager.GetLayoutItemFromModel(anchorable) as LayoutAnchorableItem;
- if (anchorableLayoutItem == null ||
- anchorableLayoutItem.HideCommand == null ||
- !anchorableLayoutItem.HideCommand.CanExecute(parameter))
- {
- canExecute = false;
- break;
- }
- canExecute = true;
- }
- return canExecute;
- }
- private void OnExecuteHideWindowCommand(object parameter)
- {
- var manager = Model.Root.Manager;
- foreach (var anchorable in this.Model.Descendents().OfType<LayoutAnchorable>().ToArray())
- {
- var anchorableLayoutItem = manager.GetLayoutItemFromModel(anchorable) as LayoutAnchorableItem;
- anchorableLayoutItem.HideCommand.Execute(parameter);
- }
- }
- #endregion
- }
- }
|