/// <summary>
        /// Saves the specified <see cref="IDockTabItem"/>.
        /// </summary>
        /// <param name="context">The serialization context.</param>
        /// <param name="dockTabItem">The <see cref="IDockTabItem"/>.</param>
        /// <param name="onlyReference">
        /// If set to <see langword="true"/>, only the dock ID is written.
        /// </param>
        /// <returns>
        /// The XML element representing <paramref name="dockTabItem"/>.
        /// </returns>
        private static XElement Save(SerializationContext context, IDockTabItem dockTabItem, bool onlyReference)
        {
            if (dockTabItem == null)
            {
                return(null);
            }
            if (!context.SaveNonPersistentItems && !dockTabItem.IsPersistent)
            {
                return(null);
            }

            var xElement = new XElement("DockTabItem");

            xElement.Add(new XAttribute("DockId", dockTabItem.DockId));

            if (onlyReference)
            {
                return(xElement);
            }

            if (context.DockControl.ActiveDockTabItem == dockTabItem)
            {
                xElement.Add(new XAttribute("IsActive", true));
            }

            xElement.Add(new XAttribute("DockState", dockTabItem.DockState));
            xElement.Add(new XAttribute("LastDockState", dockTabItem.LastDockState));
            xElement.Add(new XAttribute("DockWidth", ConvertToString(dockTabItem.DockWidth)));
            xElement.Add(new XAttribute("DockHeight", ConvertToString(dockTabItem.DockHeight)));
            xElement.Add(new XAttribute("AutoHideWidth", dockTabItem.AutoHideWidth));
            xElement.Add(new XAttribute("AutoHideHeight", dockTabItem.AutoHideHeight));
            xElement.Add(new XAttribute("LastActivation", dockTabItem.LastActivation));

            return(xElement);
        }
示例#2
0
        /// <summary>
        /// Resets all fields.
        /// </summary>
        private void Reset()
        {
            Debug.Assert(Mouse.Captured == null);
            Debug.Assert(_borderDockIndicators == null);
            Debug.Assert(_paneDockIndicators == null);
            Debug.Assert(
                _dockStrategy == null || !_dockStrategy.DockControl.GetDockElements().OfType <DockTabItemProxy>().Any(),
                "All item proxies should have been removed.");

            _dockStrategy = null;
            _draggedItems.Clear();
            _activeItem           = null;
            _floatWindow          = null;
            _targetDockTabPane    = null;
            _layoutChanged        = false;
            _initialMousePosition = new Point(double.NaN, double.NaN);
            _dragDeltaExceeded    = false;
            _mouseOffset          = new Vector(double.NaN, double.NaN);
            _initialSize          = new Size(double.NaN, double.NaN);
            _canFloat             = true;
            _originalDockState    = DockState.Hide;
            _originalFloatWindow  = null;
            _originalFloatLeft    = 0;
            _originalFloatTop     = 0;
        }
示例#3
0
 private void ShowAutoHidePane(IDockTabPane dockTabPane, IDockTabItem dockTabItem)
 {
     CloseAutoHidePanesExcept(dockTabPane);
     foreach (var autoHideBar in _autoHideBars)
     {
         var autoHidePane = autoHideBar.ShowAutoHidePane(dockTabPane, dockTabItem, true);
         if (autoHidePane != null)
         {
             break;
         }
     }
 }
示例#4
0
        /// <summary>
        /// Gets the view for a view model.
        /// </summary>
        /// <param name="viewModel">The view model.</param>
        /// <returns>The <see cref="DockTabItem"/>.</returns>
        public DockTabItem GetView(IDockTabItem viewModel)
        {
            for (int i = 0; i < _dockTabItems.Count; i++)
            {
                if (_dockTabItems[i].DataContext == viewModel)
                {
                    return(_dockTabItems[i]);
                }
            }

            return(null);
        }
        /// <inheritdoc/>
        public override bool CanClose(IDockTabItem dockTabItem)
        {
            // Screen conduction: IGuardClose
            var guardClose = dockTabItem as IGuardClose;

            if (guardClose != null)
            {
                var canClose = guardClose.CanCloseAsync();
                Debug.Assert(canClose.IsCompleted, "CanCloseAsync expected to be synchronous operation.");
                return(canClose.Result);
            }

            return(base.CanClose(dockTabItem));
        }
        protected override void OnClose(IDockTabItem dockTabItem)
        {
            base.OnClose(dockTabItem);

            // Screen conduction: IActivatable
            (dockTabItem as IActivatable)?.OnDeactivate(true);

            // Screen conduction: IScreen
            var screen = dockTabItem as IScreen;

            if (screen != null)
            {
                screen.Conductor = null;
            }
        }
示例#7
0
        internal AutoHidePane ShowAutoHidePane(IDockTabPane dockTabPane, IDockTabItem dockTabItem, bool focus)
        {
            if (dockTabPane == null || !Items.Contains(dockTabPane))
            {
                return(null);
            }

            var dockControl = DockHelper.GetDockControl(this);

            // Ensure that correct item is selected.
            if (dockTabItem != null)
            {
                Debug.Assert(dockTabPane.Items.Contains(dockTabItem));
                dockTabPane.SelectedItem = dockTabItem;
            }

            // Get or create AutoHidePane that shows the DockTabItem.
            var autoHidePane = GetAutoHidePane(dockTabPane);

            if (autoHidePane == null)
            {
                // Create a new AutoHidePane if necessary.
                autoHidePane = new AutoHidePane
                {
                    Content = dockTabPane,
                    Dock    = Dock,
                };
                var autoHideOverlay = new AutoHideOverlay(dockControl, TargetArea)
                {
                    Content = autoHidePane
                };
                autoHideOverlay.Show();
                _autoHideOverlays.Add(autoHideOverlay);
            }

            // Slide-in AutoHidePane.
            autoHidePane.Show();

            if (focus)
            {
                dockControl?.DockStrategy?.Activate(dockTabPane);
            }

            return(autoHidePane);
        }
示例#8
0
        /// <summary>
        /// Starts a drag operation.
        /// </summary>
        /// <param name="floatWindow">The <see cref="FloatWindow"/> to be dragged.</param>
        /// <param name="dockTabPane">The <see cref="DockTabPane"/> to be dragged.</param>
        /// <param name="dockTabItem">The <see cref="DockTabItem"/> to be dragged.</param>
        /// <returns>
        /// <see langword="true" /> if the drag operation has been started; otherwise,
        /// <see langword="false" /> if the drag operation could not be started (e.g. because the
        /// mouse could not be captured).
        /// </returns>
        private bool BeginDrag(FloatWindow floatWindow, DockTabPane dockTabPane, DockTabItem dockTabItem)
        {
            _dockStrategy = _dockControl.GetViewModel()?.DockStrategy;
            if (_dockStrategy == null || _dockStrategy.DockControl.IsLocked)
            {
                Reset();
                return(false);
            }

            FrameworkElement element     = null;
            IDockTabPane     draggedPane = null;
            IDockTabItem     draggedItem = null;

            if (floatWindow != null)
            {
                // User is dragging a FloatWindow.
                // (Note: Dragging of FloatWindows with nested layouts is not supported.)
                draggedPane  = floatWindow.GetViewModel()?.RootPane as IDockTabPane;
                element      = floatWindow;
                _floatWindow = floatWindow;
                _initialSize = floatWindow.RenderSize;

                // Start dragging immediately.
                _dragDeltaExceeded = true;
            }
            else if (dockTabItem != null)
            {
                // User is dragging a DockTabItem in a DockTabPanel.
                draggedItem        = dockTabItem.GetViewModel();
                element            = dockTabItem;
                _targetDockTabPane = dockTabPane;
                _initialSize       = dockTabPane.RenderSize;

                // Start dragging when threshold is exceeded.
                _initialMousePosition = WindowsHelper.GetMousePosition(_dockControl);
                _dragDeltaExceeded    = false;
            }
            else if (dockTabPane != null)
            {
                // User is dragging a DockTabPane.
                draggedPane           = dockTabPane.GetViewModel();
                element               = dockTabPane;
                _initialSize          = dockTabPane.RenderSize;
                _initialMousePosition = WindowsHelper.GetMousePosition(_dockControl);

                // Start dragging when threshold is exceeded.
                _initialMousePosition = WindowsHelper.GetMousePosition(_dockControl);
                _dragDeltaExceeded    = false;
            }

            if (draggedPane == null && draggedItem == null)
            {
                Reset();
                return(false);
            }

            // When the user is dragging the FloatWindow, the mouse is captured by Win32 move window
            // loop. When dragging a DockTabPane or DockTabItem, the mouse needs to be
            // captured to receive mouse events.
            if (_floatWindow == null)
            {
                if (!_dockControl.CaptureMouse())
                {
                    // Failed to capture the mouse.
                    Reset();
                    return(false);
                }

                _dockControl.LostMouseCapture  += OnLostMouseCapture;
                _dockControl.MouseLeftButtonUp += OnMouseLeftButtonUp;
                _dockControl.MouseMove         += OnMouseMove;
                _dockControl.PreviewKeyDown    += OnPreviewKeyDown;
                if (_targetDockTabPane != null)
                {
                    _targetDockTabPane.PreviewKeyDown += OnPreviewKeyDown;
                }
            }

            _dockStrategy.Begin();

            if (draggedPane != null)
            {
                _dockStrategy.Activate(draggedPane);
                _activeItem = draggedPane.SelectedItem;
                foreach (var item in draggedPane.Items)
                {
                    if (item.DockState == draggedPane.DockState)
                    {
                        _draggedItems.Add(item);
                    }
                }
            }
            else
            {
                Debug.Assert(draggedItem != null);

                _dockStrategy.Activate(draggedItem);
                _activeItem = draggedItem;
                _draggedItems.Add(draggedItem);
            }

            Debug.Assert(_draggedItems.Count > 0);

            // Determine whether dragged items may end in a FloatWindow.
            _canFloat = CanFloat();

            // Store the mouse offset relative to the dragged element.
            _mouseOffset = (Vector)WindowsHelper.GetMousePosition(element);

            // Remember information needed for a rollback.
            ReplaceItemsWithProxies(draggedPane ?? _targetDockTabPane.GetViewModel());
            _originalDockState = _draggedItems[0].DockState;
            BackupFloatWindowPosition();

            // Override mouse cursors. (Mouse cursor should not change to caret over text editor.)
            Mouse.OverrideCursor = Cursors.Arrow;

            return(true);
        }
        public DockTabItemProxy(IDockTabItem item)
        {
            Debug.Assert(item != null);

            Item = item;
        }
示例#10
0
        internal AutoHidePane ShowAutoHidePane(IDockTabPane dockTabPane, IDockTabItem dockTabItem, bool focus)
        {
            if (dockTabPane == null || !Items.Contains(dockTabPane))
                return null;

            var dockControl = DockHelper.GetDockControl(this);

            // Ensure that correct item is selected.
            if (dockTabItem != null)
            {
                Debug.Assert(dockTabPane.Items.Contains(dockTabItem));
                dockTabPane.SelectedItem = dockTabItem;
            }

            // Get or create AutoHidePane that shows the DockTabItem.
            var autoHidePane = GetAutoHidePane(dockTabPane);
            if (autoHidePane == null)
            {
                // Create a new AutoHidePane if necessary.
                autoHidePane = new AutoHidePane
                {
                    Content = dockTabPane,
                    Dock = Dock,
                };
                var autoHideOverlay = new AutoHideOverlay(dockControl, TargetArea)
                {
                    Content = autoHidePane
                };
                autoHideOverlay.Show();
                _autoHideOverlays.Add(autoHideOverlay);
            }

            // Slide-in AutoHidePane.
            autoHidePane.Show();

            if (focus)
                dockControl?.DockStrategy?.Activate(dockTabPane);

            return autoHidePane;
        }
示例#11
0
        /// <summary>
        /// Saves the specified <see cref="IDockTabItem"/>.
        /// </summary>
        /// <param name="context">The serialization context.</param>
        /// <param name="dockTabItem">The <see cref="IDockTabItem"/>.</param>
        /// <param name="onlyReference">
        /// If set to <see langword="true"/>, only the dock ID is written.
        /// </param>
        /// <returns>
        /// The XML element representing <paramref name="dockTabItem"/>.
        /// </returns>
        private static XElement Save(SerializationContext context, IDockTabItem dockTabItem, bool onlyReference)
        {
            if (dockTabItem == null)
                return null;
            if (!context.SaveNonPersistentItems && !dockTabItem.IsPersistent)
                return null;

            var xElement = new XElement("DockTabItem");
            xElement.Add(new XAttribute("DockId", dockTabItem.DockId));

            if (onlyReference)
                return xElement;

            if (context.DockControl.ActiveDockTabItem == dockTabItem)
                xElement.Add(new XAttribute("IsActive", true));

            xElement.Add(new XAttribute("DockState", dockTabItem.DockState));
            xElement.Add(new XAttribute("LastDockState", dockTabItem.LastDockState));
            xElement.Add(new XAttribute("DockWidth", ConvertToString(dockTabItem.DockWidth)));
            xElement.Add(new XAttribute("DockHeight", ConvertToString(dockTabItem.DockHeight)));
            xElement.Add(new XAttribute("AutoHideWidth", dockTabItem.AutoHideWidth));
            xElement.Add(new XAttribute("AutoHideHeight", dockTabItem.AutoHideHeight));
            xElement.Add(new XAttribute("LastActivation", dockTabItem.LastActivation));

            return xElement;
        }
示例#12
0
        //--------------------------------------------------------------
        /// <summary>
        /// Resets all fields.
        /// </summary>
        private void Reset()
        {
            Debug.Assert(Mouse.Captured == null);
            Debug.Assert(_borderDockIndicators == null);
            Debug.Assert(_paneDockIndicators == null);
            Debug.Assert(
                _dockStrategy == null || !_dockStrategy.DockControl.GetDockElements().OfType<DockTabItemProxy>().Any(),
                "All item proxies should have been removed.");

            _dockStrategy = null;
            _draggedItems.Clear();
            _activeItem = null;
            _floatWindow = null;
            _targetDockTabPane = null;
            _layoutChanged = false;
            _initialMousePosition = new Point(double.NaN, double.NaN);
            _dragDeltaExceeded = false;
            _mouseOffset = new Vector(double.NaN, double.NaN);
            _initialSize = new Size(double.NaN, double.NaN);
            _canFloat = true;
            _originalDockState = DockState.Hide;
            _originalFloatWindow = null;
            _originalFloatLeft = 0;
            _originalFloatTop = 0;
        }
示例#13
0
        /// <summary>
        /// Starts a drag operation.
        /// </summary>
        /// <param name="floatWindow">The <see cref="FloatWindow"/> to be dragged.</param>
        /// <param name="dockTabPane">The <see cref="DockTabPane"/> to be dragged.</param>
        /// <param name="dockTabItem">The <see cref="DockTabItem"/> to be dragged.</param>
        /// <returns>
        /// <see langword="true" /> if the drag operation has been started; otherwise,
        /// <see langword="false" /> if the drag operation could not be started (e.g. because the
        /// mouse could not be captured).
        /// </returns>
        private bool BeginDrag(FloatWindow floatWindow, DockTabPane dockTabPane, DockTabItem dockTabItem)
        {
            _dockStrategy = _dockControl.GetViewModel()?.DockStrategy;
            if (_dockStrategy == null || _dockStrategy.DockControl.IsLocked)
            {
                Reset();
                return false;
            }

            FrameworkElement element = null;
            IDockTabPane draggedPane = null;
            IDockTabItem draggedItem = null;
            if (floatWindow != null)
            {
                // User is dragging a FloatWindow.
                // (Note: Dragging of FloatWindows with nested layouts is not supported.)
                draggedPane = floatWindow.GetViewModel()?.RootPane as IDockTabPane;
                element = floatWindow;
                _floatWindow = floatWindow;
                _initialSize = floatWindow.RenderSize;

                // Start dragging immediately.
                _dragDeltaExceeded = true;
            }
            else if (dockTabItem != null)
            {
                // User is dragging a DockTabItem in a DockTabPanel.
                draggedItem = dockTabItem.GetViewModel();
                element = dockTabItem;
                _targetDockTabPane = dockTabPane;
                _initialSize = dockTabPane.RenderSize;

                // Start dragging when threshold is exceeded.
                _initialMousePosition = WindowsHelper.GetMousePosition(_dockControl);
                _dragDeltaExceeded = false;
            }
            else if (dockTabPane != null)
            {
                // User is dragging a DockTabPane.
                draggedPane = dockTabPane.GetViewModel();
                element = dockTabPane;
                _initialSize = dockTabPane.RenderSize;
                _initialMousePosition = WindowsHelper.GetMousePosition(_dockControl);

                // Start dragging when threshold is exceeded.
                _initialMousePosition = WindowsHelper.GetMousePosition(_dockControl);
                _dragDeltaExceeded = false;
            }

            if (draggedPane == null && draggedItem == null)
            {
                Reset();
                return false;
            }

            // When the user is dragging the FloatWindow, the mouse is captured by Win32 move window
            // loop. When dragging a DockTabPane or DockTabItem, the mouse needs to be
            // captured to receive mouse events.
            if (_floatWindow == null)
            {
                if (!_dockControl.CaptureMouse())
                {
                    // Failed to capture the mouse.
                    Reset();
                    return false;
                }

                _dockControl.LostMouseCapture += OnLostMouseCapture;
                _dockControl.MouseLeftButtonUp += OnMouseLeftButtonUp;
                _dockControl.MouseMove += OnMouseMove;
                _dockControl.PreviewKeyDown += OnPreviewKeyDown;
                if (_targetDockTabPane != null)
                    _targetDockTabPane.PreviewKeyDown += OnPreviewKeyDown;
            }

            _dockStrategy.Begin();

            if (draggedPane != null)
            {
                _dockStrategy.Activate(draggedPane);
                _activeItem = draggedPane.SelectedItem;
                foreach (var item in draggedPane.Items)
                    if (item.DockState == draggedPane.DockState)
                        _draggedItems.Add(item);
            }
            else
            {
                Debug.Assert(draggedItem != null);

                _dockStrategy.Activate(draggedItem);
                _activeItem = draggedItem;
                _draggedItems.Add(draggedItem);
            }

            Debug.Assert(_draggedItems.Count > 0);

            // Determine whether dragged items may end in a FloatWindow.
            _canFloat = CanFloat();

            // Store the mouse offset relative to the dragged element.
            _mouseOffset = (Vector)WindowsHelper.GetMousePosition(element);

            // Remember information needed for a rollback.
            ReplaceItemsWithProxies(draggedPane ?? _targetDockTabPane.GetViewModel());
            _originalDockState = _draggedItems[0].DockState;
            BackupFloatWindowPosition();

            // Override mouse cursors. (Mouse cursor should not change to caret over text editor.)
            Mouse.OverrideCursor = Cursors.Arrow;

            return true;
        }
示例#14
0
 private void ShowAutoHidePane(IDockTabPane dockTabPane, IDockTabItem dockTabItem)
 {
     CloseAutoHidePanesExcept(dockTabPane);
     foreach (var autoHideBar in _autoHideBars)
     {
         var autoHidePane = autoHideBar.ShowAutoHidePane(dockTabPane, dockTabItem, true);
         if (autoHidePane != null)
             break;
     }
 }
示例#15
0
        //--------------------------------------------------------------
        /// <summary>
        /// Gets the view for a view model.
        /// </summary>
        /// <param name="viewModel">The view model.</param>
        /// <returns>The <see cref="DockTabItem"/>.</returns>
        public DockTabItem GetView(IDockTabItem viewModel)
        {
            for (int i = 0; i < _dockTabItems.Count; i++)
                if (_dockTabItems[i].DataContext == viewModel)
                    return _dockTabItems[i];

            return null;
        }
示例#16
0
        public DockTabItemProxy(IDockTabItem item)
        {
            Debug.Assert(item != null);

            Item = item;
        }