void DockCont::AddFrom(DockCont &cont, int except) { bool all = except < 0 || except >= cont.GetCount(); for (int i = cont.GetCount() - 1; i >= 0; i--) if (i != except) { Ctrl *c = cont.GetCtrl(i); c->Remove(); Add(*c); } if (all) cont.tabbar.Clear(); }
void DockWindow::ContainerDragEnd(DockCont &dc) { KillTimeCallback(TIMEID_ANIMATE_DELAY); if (!dc.IsFloating()) return; HighlightCtrl &hl = GetHighlightCtrl(); Ctrl *p = hl.GetParent(); int align = DOCK_NONE; if (p) for (int i = 0; i < 4; i++) if (p == &dockpane[i]) align = i; if (animatewnd && (p || align != DOCK_NONE)) { FloatAnimate(dc, hl.GetScreenRect()); } if (align != DOCK_NONE) { Unfloat(dc); dc.StateDocked(*this); dockpane[align].Swap(hl, dc); } else if (DockCont *target = dynamic_cast<DockCont *>(p)) { StopHighlight(false); bool nest = (GetMouseFlags() & NestedToggleKey()) ? !IsNestedTabs() : IsNestedTabs(); DockContainerAsTab(*target, dc, nest && dc.GetCount() > 1); } else StopHighlight(false); if (dc.GetParent()) dc.SetFocus(); }
void DockWindow::Close(DockableCtrl &dc) { DockCont *c = GetContainer(dc); if (c && c->GetCount() > 1) { dc.Remove(); c->Layout(); c = NULL; } if (c) CloseContainer(*c); }
void DockWindow::Highlight(int align, DockCont &cont, DockCont *target) { HighlightCtrl &hl = GetHighlightCtrl(); DockableCtrl &dc = cont.GetCurrent(); ASSERT(&hl != (Ctrl *)&cont); hl.SizeHint(cont.GetMinSize(), cont.GetMaxSize(), cont.GetStdSize()).Show(); if (align != DOCK_NONE) { hl.SetHighlight(dc.GetStyle().highlight[0], false, 0); hl.oldframesize = dockframe[align].GetSize(); int pos = target ? dockpane[align].FindIndex(*target) : -1; Dock0(align, hl, pos, IsAnimatedHighlight(), true); } else if (target && IsTabbing()) { hl.Title(cont.GetTitle(true)).Icon(dc.GetIcon()); hl.SetHighlight(dc.GetStyle().highlight[1], IsNestedTabs() && (cont.GetCount() > 1), (cont.GetCount() > 1) ? NestedToggleKey() : 0, target->GetHighlightImage()); DockAsTab(*target, hl); } }
void DockWindow::DockAsTab(DockCont &target, DockableCtrl &dc) { DockCont *c = GetContainer(dc); if (c) { if (c->GetCount() == 1) CloseContainer(*c); else { Ctrl *c = dc.GetParent(); dc.Remove(); c->Layout(); } } target.Add(dc); }
DockCont *DockWindow::GetReleasedContainer(DockableCtrl &dc) { DockCont *c = GetContainer(dc); if (c && c->GetCount() > 1) { dc.Remove(); c->RefreshLayout(); c = NULL; } if (c) Detach(*c); else c = CreateContainer(dc); return c; }
void DockWindow::AutoHideContainer(int align, DockCont &c) { while (c.GetCount() && !c.IsAutoHide()) AutoHide(align, c.Get(0)); }