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)); }
/// <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); }
/// <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); }