internal bool ValidateTab(ITabDock sourceTab, IView targetView, DragAction action, DockOperation operation, bool bExecute) { switch (targetView) { case IRootDock targetRoot: { return(DockIntoWindow(sourceTab, targetView, action, operation, bExecute)); } case IToolTab sourceToolTab: { return(false); } case IDocumentTab sourceDocumentTab: { return(false); } case ILayoutDock targetLayout: { return(false); } case ITabDock targetTab: { return(false); } default: { #if DEBUG Console.WriteLine($"Not supported type {targetView.GetType()}: {sourceTab} -> {targetView}"); #endif return(false); } } }
internal bool DockIntoTab(ITab sourceTab, ITabDock targetTabParent, DragAction action, DockOperation operation, bool bExecute) { #if DEBUG Console.WriteLine($"{nameof(DockIntoTab)}: {sourceTab.Title} -> {targetTabParent.Title}"); #endif if (sourceTab.Parent is ITabDock sourceTabParent) { IView targetTab = targetTabParent.Views.LastOrDefault(); switch (action) { case DragAction.Copy: { if (bExecute) { // TODO: Clone item. } return(true); } case DragAction.Move: { switch (operation) { case DockOperation.Fill: { if (sourceTabParent.Factory is IDockFactory factory) { if (bExecute) { factory.MoveView(sourceTabParent, targetTabParent, sourceTab, targetTab); } return(true); } return(false); } case DockOperation.Left: case DockOperation.Right: case DockOperation.Top: case DockOperation.Bottom: { switch (sourceTab) { case IToolTab toolTab: { if (bExecute) { if (targetTabParent.Factory is IDockFactory factory) { factory.RemoveView(sourceTab); IDock tool = factory.CreateToolDock(); tool.Id = nameof(IToolDock); tool.Title = nameof(IToolDock); tool.CurrentView = sourceTab; tool.Views = factory.CreateList <IView>(); tool.Views.Add(sourceTab); factory.Split(targetTabParent, tool, operation); } } return(true); } case IDocumentTab documentTab: { if (bExecute) { if (targetTabParent.Factory is IDockFactory factory) { factory.RemoveView(sourceTab); IDock document = factory.CreateDocumentDock(); document.Id = nameof(IDocumentDock); document.Title = nameof(IDocumentDock); document.CurrentView = sourceTab; document.Views = factory.CreateList <IView>(); document.Views.Add(sourceTab); factory.Split(targetTabParent, document, operation); } } return(true); } default: { #if DEBUG Console.WriteLine($"Not supported tab type {sourceTab.GetType().Name} to splitting : {sourceTab} -> {targetTabParent}"); #endif return(false); } } } case DockOperation.Window: { return(false); } } return(false); } case DragAction.Link: { if (bExecute) { if (sourceTabParent.Factory is IDockFactory factory) { factory.SwapView(sourceTabParent, targetTabParent, sourceTab, targetTab); } } return(true); } } return(false); } return(false); }
internal bool ValidateTab(ITabDock sourceTab, IView targetView, DragAction action, DockOperation operation, bool bExecute) { switch (targetView) { case IRootDock targetRoot: { return(DockIntoWindow(sourceTab, targetView, action, operation, bExecute)); } case IToolTab sourceToolTab: { return(false); } case IDocumentTab sourceDocumentTab: { return(false); } case ILayoutDock targetLayout: { return(false); } case ITabDock targetTab: { if (bExecute) { switch (operation) { case DockOperation.Fill: foreach (var tab in sourceTab.Views.OfType <ITab>().ToList()) { DockIntoTab(tab, targetTab, action, operation, bExecute); } return(true); case DockOperation.Window: { return(DockIntoWindow(sourceTab, targetView, action, operation, bExecute)); } default: { // when we are splitting. var toMove = sourceTab.Views.OfType <ITab>().ToList(); if (toMove.Count == 1) { DockIntoTab(toMove.First(), targetTab, action, operation, bExecute); } else { DockIntoTab(toMove.First(), targetTab, action, operation, bExecute); foreach (var tab in toMove.Skip(1)) { DockIntoTab(tab, toMove.First(), action, DockOperation.Fill, bExecute); } } } return(true); } } return(true); } default: { Logger.Log($"Not supported type {targetView.GetType()}: {sourceTab} -> {targetView}"); return(false); } } }