Beispiel #1
0
        /// <summary>
        /// Loads the docking layout.
        /// </summary>
        /// <param name="storedLayout">The stored layout.</param>
        /// <inheritdoc cref="DockSerializer.Load"/>
        public void LoadLayout(XElement storedLayout)
        {
            try
            {
                DockStrategy.Begin();

                var oldItems = Items.ToList();
                DockSerializer.Load(this, storedLayout);
                var newItems = Items.ToList();

                // Screen conduction for items closed in Load().
                foreach (var dockTabItem in oldItems.Except(newItems))
                {
                    // IActivatable
                    (dockTabItem as IActivatable)?.OnDeactivate(true);

                    // IScreen
                    var screen = dockTabItem as IScreen;
                    if (screen != null)
                    {
                        screen.Conductor = null;
                    }
                }
            }
            finally
            {
                DockStrategy.End();
            }
        }
Beispiel #2
0
 /// <summary>
 /// Saves the docking layout.
 /// </summary>
 /// <param name="excludeNonPersistentItems">
 /// <see langword="true"/> to exclude non-persistent <see cref="IDockTabItem"/>s.
 /// <see langword="false"/> to store the layout of all (persistent and non-persistent)
 /// <see cref="IDockTabItem"/>s.
 /// </param>
 /// <returns>The <see cref="XElement"/> with the serialized layout.</returns>
 /// <inheritdoc cref="DockSerializer.Save(IDockControl,bool)"/>
 public XElement SaveLayout(bool excludeNonPersistentItems = false)
 {
     try
     {
         DockStrategy.Begin();
         return(DockSerializer.Save(this, excludeNonPersistentItems));
     }
     finally
     {
         DockStrategy.End();
     }
 }
Beispiel #3
0
        public MainViewModel()
        {
            Themes = new List <string>
            {
                "Default",
                "System",
                "Light",
                "Gray",
                "Dark",
            };
            SelectedThemeIndex = 3;

            // Build dock layout directly.
            //var dockTabPaneViewModel = new DockTabPaneViewModel();
            //dockTabPaneViewModel.Items.Add(new SystemViewModel { DockState = DockState.Dock });
            //dockTabPaneViewModel.Items.Add(new SystemViewModel { DockState = DockState.Dock });
            //dockTabPaneViewModel.Items.Add(new DigitalRuneViewModel { DockState = DockState.Dock });
            //dockTabPaneViewModel.Items.Add(new DigitalRuneViewModel { DockState = DockState.Dock });
            //dockTabPaneViewModel.Items.Add(new PropertyGridViewModel { DockState = DockState.Dock });
            //dockTabPaneViewModel.Items.Add(new PropertyGridViewModel { DockState = DockState.Dock });
            //dockTabPaneViewModel.Items.Add(new ICSharpDevelopViewModel { DockState = DockState.Dock });
            //dockTabPaneViewModel.Items.Add(new ICSharpDevelopViewModel { DockState = DockState.Dock });

            //var dockAnchorPaneViewModel = new DockAnchorPaneViewModel
            //{
            //    ChildPane = dockTabPaneViewModel
            //};

            //DockControlViewModel = new DockControlViewModel(new DockStrategy())
            //{
            //    RootPane = dockAnchorPaneViewModel
            //};

            // Or use DockStrategy to do the same.
            var dockStrategy = new DockStrategy();

            DockControlViewModel = new DockControlViewModel(dockStrategy)
            {
                RootPane = new DockAnchorPaneViewModel(),
            };
            dockStrategy.Begin();
            dockStrategy.Dock(new SystemViewModel());
            dockStrategy.Dock(new SystemViewModel());
            dockStrategy.Dock(new DigitalRuneViewModel());
            dockStrategy.Dock(new DigitalRuneViewModel());
            dockStrategy.Dock(new PropertyGridViewModel());
            dockStrategy.Dock(new PropertyGridViewModel());
            dockStrategy.Dock(new ICSharpDevelopViewModel());
            dockStrategy.Dock(new ICSharpDevelopViewModel());
            dockStrategy.End();
        }
Beispiel #4
0
        public MainViewModel()
        {
            Themes = new List<string>
            {
                "Default",
                "System",
                "Light",
                "Gray",
                "Dark",
            };
            SelectedThemeIndex = 3;

            // Build dock layout directly.
            //var dockTabPaneViewModel = new DockTabPaneViewModel();
            //dockTabPaneViewModel.Items.Add(new SystemViewModel { DockState = DockState.Dock });
            //dockTabPaneViewModel.Items.Add(new SystemViewModel { DockState = DockState.Dock });
            //dockTabPaneViewModel.Items.Add(new DigitalRuneViewModel { DockState = DockState.Dock });
            //dockTabPaneViewModel.Items.Add(new DigitalRuneViewModel { DockState = DockState.Dock });
            //dockTabPaneViewModel.Items.Add(new PropertyGridViewModel { DockState = DockState.Dock });
            //dockTabPaneViewModel.Items.Add(new PropertyGridViewModel { DockState = DockState.Dock });
            //dockTabPaneViewModel.Items.Add(new ICSharpDevelopViewModel { DockState = DockState.Dock });
            //dockTabPaneViewModel.Items.Add(new ICSharpDevelopViewModel { DockState = DockState.Dock });

            //var dockAnchorPaneViewModel = new DockAnchorPaneViewModel
            //{
            //    ChildPane = dockTabPaneViewModel
            //};

            //DockControlViewModel = new DockControlViewModel(new DockStrategy())
            //{
            //    RootPane = dockAnchorPaneViewModel
            //};

            // Or use DockStrategy to do the same.
            var dockStrategy = new DockStrategy();
            DockControlViewModel = new DockControlViewModel(dockStrategy)
            {
                RootPane = new DockAnchorPaneViewModel(),
            };
            dockStrategy.Begin();
            dockStrategy.Dock(new SystemViewModel());
            dockStrategy.Dock(new SystemViewModel());
            dockStrategy.Dock(new DigitalRuneViewModel());
            dockStrategy.Dock(new DigitalRuneViewModel());
            dockStrategy.Dock(new PropertyGridViewModel());
            dockStrategy.Dock(new PropertyGridViewModel());
            dockStrategy.Dock(new ICSharpDevelopViewModel());
            dockStrategy.Dock(new ICSharpDevelopViewModel());
            dockStrategy.End();
        }
Beispiel #5
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);
        }
Beispiel #6
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;
        }