コード例 #1
0
        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 <LayoutDocumentPane>().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));
        }
コード例 #2
0
        /// <summary>
        /// Method is invoked to complete a drag & drop operation with a (new) docking position
        /// by docking of the LayoutDocument <paramref name="floatingWindow"/> into this drop target.
        /// </summary>
        /// <param name="floatingWindow"></param>
        protected override void Drop(LayoutDocumentFloatingWindow floatingWindow)
        {
            ILayoutDocumentPane targetModel    = _targetPane.Model as ILayoutDocumentPane;
            LayoutDocument      documentActive = floatingWindow.Descendents().OfType <LayoutDocument>().FirstOrDefault();

            switch (Type)
            {
            case DropTargetType.DocumentPaneDockBottom:
                #region DropTargetType.DocumentPaneDockBottom
            {
                var parentModel           = targetModel.Parent as ILayoutGroup;
                var parentModelOrientable = targetModel.Parent as ILayoutOrientableGroup;
                int insertToIndex         = parentModel.IndexOfChild(targetModel);

                if (parentModelOrientable.Orientation != System.Windows.Controls.Orientation.Vertical &&
                    parentModel.ChildrenCount == 1)
                {
                    parentModelOrientable.Orientation = System.Windows.Controls.Orientation.Vertical;
                }

                if (parentModelOrientable.Orientation == System.Windows.Controls.Orientation.Vertical)
                {
                    var layoutDocumentPaneGroup = floatingWindow.RootPanel as LayoutDocumentPaneGroup;
                    if (layoutDocumentPaneGroup != null &&
                        (layoutDocumentPaneGroup.Children.Count == 1 ||
                         layoutDocumentPaneGroup.Orientation == System.Windows.Controls.Orientation.Vertical))
                    {
                        var documentsToMove = layoutDocumentPaneGroup.Children.ToArray();
                        for (int i = 0; i < documentsToMove.Length; i++)
                        {
                            parentModel.InsertChildAt(insertToIndex + 1 + i, documentsToMove[i]);
                        }
                    }
                    else
                    {
                        parentModel.InsertChildAt(insertToIndex + 1, floatingWindow.RootPanel);
                    }
                }
                else
                {
                    var targetModelAsPositionableElement = targetModel as ILayoutPositionableElement;
                    var newOrientedPanel = new LayoutDocumentPaneGroup()
                    {
                        Orientation = System.Windows.Controls.Orientation.Vertical,
                        DockWidth   = targetModelAsPositionableElement.DockWidth,
                        DockHeight  = targetModelAsPositionableElement.DockHeight,
                    };

                    parentModel.InsertChildAt(insertToIndex, newOrientedPanel);
                    newOrientedPanel.Children.Add(targetModel);
                    newOrientedPanel.Children.Add(floatingWindow.RootPanel);
                }
            }
            break;
                #endregion DropTargetType.DocumentPaneDockBottom

            case DropTargetType.DocumentPaneDockTop:
                #region DropTargetType.DocumentPaneDockTop
            {
                var parentModel           = targetModel.Parent as ILayoutGroup;
                var parentModelOrientable = targetModel.Parent as ILayoutOrientableGroup;
                int insertToIndex         = parentModel.IndexOfChild(targetModel);

                if (parentModelOrientable.Orientation != System.Windows.Controls.Orientation.Vertical &&
                    parentModel.ChildrenCount == 1)
                {
                    parentModelOrientable.Orientation = System.Windows.Controls.Orientation.Vertical;
                }

                if (parentModelOrientable.Orientation == System.Windows.Controls.Orientation.Vertical)
                {
                    var layoutDocumentPaneGroup = floatingWindow.RootPanel as LayoutDocumentPaneGroup;
                    if (layoutDocumentPaneGroup != null &&
                        (layoutDocumentPaneGroup.Children.Count == 1 ||
                         layoutDocumentPaneGroup.Orientation == System.Windows.Controls.Orientation.Vertical))
                    {
                        var documentsToMove = layoutDocumentPaneGroup.Children.ToArray();
                        for (int i = 0; i < documentsToMove.Length; i++)
                        {
                            parentModel.InsertChildAt(insertToIndex + i, documentsToMove[i]);
                        }
                    }
                    else
                    {
                        parentModel.InsertChildAt(insertToIndex, floatingWindow.RootPanel);
                    }
                }
                else
                {
                    var targetModelAsPositionableElement = targetModel as ILayoutPositionableElement;
                    var newOrientedPanel = new LayoutDocumentPaneGroup()
                    {
                        Orientation = System.Windows.Controls.Orientation.Vertical,
                        DockWidth   = targetModelAsPositionableElement.DockWidth,
                        DockHeight  = targetModelAsPositionableElement.DockHeight,
                    };

                    parentModel.InsertChildAt(insertToIndex, newOrientedPanel);
                    //the floating window must be added after the target modal as it could be raise a CollectGarbage call
                    newOrientedPanel.Children.Add(targetModel);
                    newOrientedPanel.Children.Insert(0, floatingWindow.RootPanel);
                }
            }
            break;
                #endregion DropTargetType.DocumentPaneDockTop

            case DropTargetType.DocumentPaneDockLeft:
                #region DropTargetType.DocumentPaneDockLeft
            {
                var parentModel           = targetModel.Parent as ILayoutGroup;
                var parentModelOrientable = targetModel.Parent as ILayoutOrientableGroup;
                int insertToIndex         = parentModel.IndexOfChild(targetModel);

                if (parentModelOrientable.Orientation != System.Windows.Controls.Orientation.Horizontal &&
                    parentModel.ChildrenCount == 1)
                {
                    parentModelOrientable.Orientation = System.Windows.Controls.Orientation.Horizontal;
                }

                if (parentModelOrientable.Orientation == System.Windows.Controls.Orientation.Horizontal)
                {
                    var layoutDocumentPaneGroup = floatingWindow.RootPanel as LayoutDocumentPaneGroup;
                    if (layoutDocumentPaneGroup != null &&
                        (layoutDocumentPaneGroup.Children.Count == 1 ||
                         layoutDocumentPaneGroup.Orientation == System.Windows.Controls.Orientation.Horizontal))
                    {
                        var documentsToMove = layoutDocumentPaneGroup.Children.ToArray();
                        for (int i = 0; i < documentsToMove.Length; i++)
                        {
                            parentModel.InsertChildAt(insertToIndex + i, documentsToMove[i]);
                        }
                    }
                    else
                    {
                        parentModel.InsertChildAt(insertToIndex, floatingWindow.RootPanel);
                    }
                }
                else
                {
                    var targetModelAsPositionableElement = targetModel as ILayoutPositionableElement;
                    var newOrientedPanel = new LayoutDocumentPaneGroup()
                    {
                        Orientation = System.Windows.Controls.Orientation.Horizontal,
                        DockWidth   = targetModelAsPositionableElement.DockWidth,
                        DockHeight  = targetModelAsPositionableElement.DockHeight,
                    };

                    parentModel.InsertChildAt(insertToIndex, newOrientedPanel);
                    //the floating window must be added after the target modal as it could be raise a CollectGarbage call
                    newOrientedPanel.Children.Add(targetModel);
                    newOrientedPanel.Children.Insert(0, floatingWindow.RootPanel);
                }
            }
            break;
                #endregion DropTargetType.DocumentPaneDockLeft

            case DropTargetType.DocumentPaneDockRight:
                #region DropTargetType.DocumentPaneDockRight
            {
                var parentModel           = targetModel.Parent as ILayoutGroup;
                var parentModelOrientable = targetModel.Parent as ILayoutOrientableGroup;
                int insertToIndex         = parentModel.IndexOfChild(targetModel);

                if (parentModelOrientable.Orientation != System.Windows.Controls.Orientation.Horizontal &&
                    parentModel.ChildrenCount == 1)
                {
                    parentModelOrientable.Orientation = System.Windows.Controls.Orientation.Horizontal;
                }

                if (parentModelOrientable.Orientation == System.Windows.Controls.Orientation.Horizontal)
                {
                    var layoutDocumentPaneGroup = floatingWindow.RootPanel as LayoutDocumentPaneGroup;
                    if (layoutDocumentPaneGroup != null &&
                        (layoutDocumentPaneGroup.Children.Count == 1 ||
                         layoutDocumentPaneGroup.Orientation == System.Windows.Controls.Orientation.Horizontal))
                    {
                        var documentToMove = layoutDocumentPaneGroup.Children.ToArray();
                        for (int i = 0; i < documentToMove.Length; i++)
                        {
                            parentModel.InsertChildAt(insertToIndex + 1 + i, documentToMove[i]);
                        }
                    }
                    else
                    {
                        parentModel.InsertChildAt(insertToIndex + 1, floatingWindow.RootPanel);
                    }
                }
                else
                {
                    var targetModelAsPositionableElement = targetModel as ILayoutPositionableElement;
                    var newOrientedPanel = new LayoutDocumentPaneGroup()
                    {
                        Orientation = System.Windows.Controls.Orientation.Horizontal,
                        DockWidth   = targetModelAsPositionableElement.DockWidth,
                        DockHeight  = targetModelAsPositionableElement.DockHeight,
                    };

                    parentModel.InsertChildAt(insertToIndex, newOrientedPanel);
                    newOrientedPanel.Children.Add(targetModel);
                    newOrientedPanel.Children.Add(floatingWindow.RootPanel);
                }
            }
            break;
                #endregion DropTargetType.DocumentPaneDockRight

            case DropTargetType.DocumentPaneDockInside:
                #region DropTargetType.DocumentPaneDockInside
            {
                var paneModel = targetModel as LayoutDocumentPane;
                var layoutDocumentPaneGroup = floatingWindow.RootPanel as LayoutDocumentPaneGroup;

                // A LayoutFloatingDocumentWindow can contain multiple instances of both Anchorables or Documents
                // and we should drop these back into the DocumentPane if they are available
                var allowedDropTypes = new[] { typeof(LayoutDocument), typeof(LayoutAnchorable) };

                int i = _tabIndex == -1 ? 0 : _tabIndex;
                foreach (var anchorableToImport in
                         layoutDocumentPaneGroup.Descendents().OfType <LayoutContent>()
                         .Where(item => allowedDropTypes.Contains(item.GetType())).ToArray())
                {
                    paneModel.Children.Insert(i, anchorableToImport);
                    i++;
                }
            }
            break;
                #endregion DropTargetType.DocumentPaneDockInside
            }

            if (documentActive != null)
            {
                documentActive.IsActive = true;
            }

            base.Drop(floatingWindow);
        }
コード例 #3
0
        /// <summary>
        /// Method is invoked to complete a drag & drop operation with a (new) docking position
        /// by docking of the LayoutDocument <paramref name="floatingWindow"/> into this drop target.
        /// </summary>
        /// <param name="floatingWindow"></param>
        protected override void Drop(LayoutDocumentFloatingWindow floatingWindow)
        {
            ILayoutDocumentPane targetModel    = _targetPane.Model as ILayoutDocumentPane;
            LayoutDocument      documentActive = floatingWindow.Descendents().OfType <LayoutDocument>().FirstOrDefault();

            // ensure paneGroup
            var paneGroup = targetModel.Parent as LayoutDocumentPaneGroup;

            if (paneGroup == null)
            {
                var targetModelAsPositionableElement = targetModel as ILayoutPositionableElement;
                var layoutGroup = targetModel.Parent as ILayoutGroup;
                paneGroup = new LayoutDocumentPaneGroup()
                {
                    Orientation = System.Windows.Controls.Orientation.Vertical,
                    DockWidth   = targetModelAsPositionableElement.DockWidth,
                    DockHeight  = targetModelAsPositionableElement.DockHeight,
                };

                paneGroup.Children.Add(targetModel);
                layoutGroup.InsertChildAt(0, paneGroup);
            }
            var paneGroupOrientaion = paneGroup as ILayoutOrientableGroup;


            switch (Type)
            {
            case DropTargetType.DocumentPaneDockBottom:

                #region DropTargetType.DocumentPaneDockBottom

            {
                if (paneGroupOrientaion.Orientation != System.Windows.Controls.Orientation.Vertical)
                {
                    paneGroup.Orientation = System.Windows.Controls.Orientation.Vertical;
                }

                var insertToIndex = paneGroup.IndexOfChild(targetModel);
                if (insertToIndex == (paneGroup.Children.Count - 1))
                {
                    insertToIndex = paneGroup.Children.Count;
                }
                var documentsToMove = floatingWindow.Children.ToArray();
                for (int i = 0; i < documentsToMove.Length; i++)
                {
                    var floatingChild = documentsToMove[i];
                    paneGroup.InsertChildAt(insertToIndex + i, floatingChild);
                }
            }
            break;

                #endregion DropTargetType.DocumentPaneDockBottom

            case DropTargetType.DocumentPaneDockTop:

                #region DropTargetType.DocumentPaneDockTop

            {
                if (paneGroupOrientaion.Orientation != System.Windows.Controls.Orientation.Vertical)
                {
                    paneGroup.Orientation = System.Windows.Controls.Orientation.Vertical;
                }

                var insertToIndex = paneGroup.IndexOfChild(targetModel);
                if (insertToIndex < 0)
                {
                    insertToIndex = 0;
                }
                var documentsToMove = floatingWindow.Children.ToArray();
                for (int i = 0; i < documentsToMove.Length; i++)
                {
                    var floatingChild = documentsToMove[i];
                    paneGroup.InsertChildAt(insertToIndex + i, floatingChild);
                }
            }
            break;

                #endregion DropTargetType.DocumentPaneDockTop

            case DropTargetType.DocumentPaneDockLeft:

                #region DropTargetType.DocumentPaneDockLeft

            {
                if (paneGroupOrientaion.Orientation != System.Windows.Controls.Orientation.Horizontal)
                {
                    paneGroup.Orientation = System.Windows.Controls.Orientation.Horizontal;
                }

                var insertToIndex = paneGroup.IndexOfChild(targetModel);
                if (insertToIndex < 0)
                {
                    insertToIndex = 0;
                }
                var documentsToMove = floatingWindow.Children.ToArray();
                for (int i = 0; i < documentsToMove.Length; i++)
                {
                    var floatingChild = documentsToMove[i];
                    paneGroup.InsertChildAt(insertToIndex + i, floatingChild);
                }
            }
            break;

                #endregion DropTargetType.DocumentPaneDockLeft

            case DropTargetType.DocumentPaneDockRight:

                #region DropTargetType.DocumentPaneDockRight

            {
                if (paneGroupOrientaion.Orientation != System.Windows.Controls.Orientation.Horizontal)
                {
                    paneGroup.Orientation = System.Windows.Controls.Orientation.Horizontal;
                }

                var insertToIndex = paneGroup.IndexOfChild(targetModel);
                if (insertToIndex == (paneGroup.Children.Count - 1))
                {
                    insertToIndex = paneGroup.Children.Count;
                }
                var documentsToMove = floatingWindow.Children.ToArray();
                for (int i = 0; i < documentsToMove.Length; i++)
                {
                    var floatingChild = documentsToMove[i];
                    paneGroup.InsertChildAt(insertToIndex + i, floatingChild);
                }
            }
            break;

                #endregion DropTargetType.DocumentPaneDockRight

            case DropTargetType.DocumentPaneDockInside:

                #region DropTargetType.DocumentPaneDockInside

            {
                var paneModel = targetModel as LayoutDocumentPane;
                var layoutDocumentPaneGroup = floatingWindow.RootPanel as LayoutDocumentPaneGroup;

                // A LayoutFloatingDocumentWindow can contain multiple instances of both Anchorables or Documents
                // and we should drop these back into the DocumentPane if they are available
                var allowedDropTypes = new[] { typeof(LayoutDocument), typeof(LayoutAnchorable) };

                int i = _tabIndex == -1 ? 0 : _tabIndex;
                foreach (var anchorableToImport in
                         layoutDocumentPaneGroup.Descendents().OfType <LayoutContent>()
                         .Where(item => allowedDropTypes.Any(dropType => dropType.IsInstanceOfType(item))).ToArray())
                {
                    paneModel.Children.Insert(i, anchorableToImport);
                    i++;
                }
            }
            break;

                #endregion DropTargetType.DocumentPaneDockInside
            }

            if (documentActive != null)
            {
                documentActive.IsActive = true;
            }

            base.Drop(floatingWindow);
        }