protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics g = e.Graphics; TabWindow tabWindow = Parent as DocumentWindow; if (tabWindow == null) { return; } if (Dock == DockStyle.Left) { Rectangle rectTabStrip = ClientRectangle; rectTabStrip.Height = tabWindow.TabStripRectangle.Height; g.FillRectangle(SystemBrushes.ControlLightLight, rectTabStrip); Point ptRightTop = new Point(ClientRectangle.Right - 1, ClientRectangle.Top); Point ptRightBottom = new Point(ClientRectangle.Right - 1, ClientRectangle.Bottom); g.DrawLine(SystemPens.ControlDark, ptRightTop, ptRightBottom); } else if (Dock == DockStyle.Top) { Point ptLeftBottom = new Point(ClientRectangle.Left, ClientRectangle.Bottom - 1); Point ptRightBottom = new Point(ClientRectangle.Right, ClientRectangle.Bottom - 1); g.DrawLine(SystemPens.ControlDark, ptLeftBottom, ptRightBottom); } }
internal void RemoveContent(Content c) { if (!Contents.Contains(c)) { return; } int index = GetIndexOfVisibleContents(c); Contents.Remove(c); if (TabWindow != null) { if (TabWindow.Contains(c)) { c.SetParent(null); } } SetDockState(); ValidateActiveContent(); if (Contents.Count == 0) { Close(); } if (index != -1) { Refresh(); } }
public void BeginDragContentWindow(TabWindow tabWindow, Point captionLocation) { if (!InitDrag(tabWindow, DragSources.ContentWindow)) { return; } ContentWindow_BeginDrag(captionLocation); }
public void BeginDragContent(TabWindow tabWindow, Rectangle rectTabWindow) { if (!InitDrag(tabWindow, DragSources.Content)) { return; } Content_BeginDrag(rectTabWindow); }
public void BeginDragTabWindowSplitter(TabWindow tabWindow, Point splitterLocation) { if (!InitDrag(tabWindow, DragSources.TabWindowSplitter)) { return; } TabWindowSplitter_BeginDrag(splitterLocation); }
protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if (e.Button != MouseButtons.Left) { return; } TabWindow tabWindow = Parent as TabWindow; if (tabWindow == null) { return; } tabWindow.DockManager.DragHandler.BeginDragTabWindowSplitter(tabWindow, tabWindow.SplitterLocation); }
private void Content_BeginDrag(Rectangle rectTabWindow) { TabWindow tabWindow = (TabWindow)DragControl; Point pt; if (tabWindow is DocumentWindow) { pt = new Point(rectTabWindow.Top, rectTabWindow.Left); } else { pt = new Point(rectTabWindow.Left, rectTabWindow.Bottom); } pt = DragControl.PointToScreen(pt); m_mouseOffset.X = pt.X - StartMousePosition.X; m_mouseOffset.Y = pt.Y - StartMousePosition.Y; }
internal void SetParent(Control control) { TabWindow tabWindow = TabWindow; if (TabWindowDock != null) { TabWindowDock.SetParent(null); } if (TabWindowDocument != null) { TabWindowDocument.SetParent(null); } if (TabWindowFloat != null) { TabWindowFloat.SetParent(null); } if (tabWindow != null) { tabWindow.SetParent(control); } }
public void Refresh() { if (DockState == DockState.Unknown || DockState == DockState.Hidden) { return; } if (IsAutoHide) { DockManager.Invalidate(); } if (TabWindow != null) { TabWindow.Invalidate(); PerformLayout(); if (TabWindow is DockWindow) { ((DockWindow)TabWindow).OnAutoHide(DockManager.ActiveAutoHideContent == ActiveContent); } } }
public void SetDropTarget(TabWindow tabWindow, DockStyle dock) { m_dropTo = tabWindow; m_dock = dock; m_contentIndex = -1; }
private Rectangle TabWindowSplitter_GetDragRectangle() { TabWindow tabWindow = DragControl as TabWindow; DockManager dockManager = tabWindow.DockManager; DockStyle splitterDockStyle = tabWindow.SplitterDockStyle; Rectangle rectParentClient; if (tabWindow.IsTopLevel) { rectParentClient = dockManager.ClientRectangle; if (splitterDockStyle == DockStyle.Left || splitterDockStyle == DockStyle.Right) { rectParentClient.X += dockManager.DockPadding.Left + MeasureContentWindow.MinSize; rectParentClient.Width -= dockManager.DockPadding.Left + dockManager.DockPadding.Right + 2 * MeasureContentWindow.MinSize; } else if (splitterDockStyle == DockStyle.Top || splitterDockStyle == DockStyle.Bottom) { rectParentClient.Y += dockManager.DockPadding.Top + MeasureContentWindow.MinSize; rectParentClient.Height -= dockManager.DockPadding.Top + dockManager.DockPadding.Bottom + 2 * MeasureContentWindow.MinSize; } rectParentClient.Location = dockManager.PointToScreen(rectParentClient.Location); } else { TabWindow tabWindowPrev = tabWindow.Previous; rectParentClient = tabWindowPrev.ClientRectangle; rectParentClient.Location = tabWindowPrev.PointToScreen(rectParentClient.Location); if (tabWindowPrev.LayoutStyle == LayoutStyles.Horizontal) { rectParentClient.X += MeasureContentWindow.MinSize; rectParentClient.Width -= 2 * MeasureContentWindow.MinSize; } else { rectParentClient.Y += MeasureContentWindow.MinSize; rectParentClient.Height -= 2 * MeasureContentWindow.MinSize; } } Point ptMouse = Control.MousePosition; Point pt = m_splitterLocation; Rectangle rect = Rectangle.Empty; if (splitterDockStyle == DockStyle.Left || splitterDockStyle == DockStyle.Right) { rect.X = ptMouse.X + m_mouseOffset.X; rect.Y = pt.Y; rect.Width = DragBorderWidth; rect.Height = DragControl.ClientRectangle.Height; } else if (splitterDockStyle == DockStyle.Top || splitterDockStyle == DockStyle.Bottom) { rect.X = pt.X; rect.Y = ptMouse.Y + m_mouseOffset.Y; rect.Width = DragControl.ClientRectangle.Width; rect.Height = DragBorderWidth; } if (rectParentClient.Width <= 0 || rectParentClient.Height <= 0) { rect.X = pt.X; rect.Y = pt.Y; return(rect); } if (rect.Left < rectParentClient.Left) { rect.X = rectParentClient.X; } if (rect.Top < rectParentClient.Top) { rect.Y = rectParentClient.Y; } if (rect.Right > rectParentClient.Right) { rect.X -= rect.Right - rectParentClient.Right; } if (rect.Bottom > rectParentClient.Bottom) { rect.Y -= rect.Bottom - rectParentClient.Bottom; } return(rect); }
private void TabWindowSplitter_OnEndDrag(bool abort) { if (abort) { return; } Point pt = m_splitterLocation; Rectangle rect = TabWindowSplitter_GetDragRectangle(); TabWindow tabWindow = DragControl as TabWindow; DockManager dockManager = tabWindow.DockManager; DockState state = tabWindow.DockState; if (tabWindow.IsTopLevel) { Rectangle rectDockArea = dockManager.DockArea; Content c = dockManager.ActiveAutoHideContent; if (state == DockState.DockLeft && rectDockArea.Width > 0) { dockManager.DockLeftPortion += ((double)rect.X - (double)pt.X) / (double)rectDockArea.Width; } else if (state == DockState.DockRight && rectDockArea.Width > 0) { dockManager.DockRightPortion += ((double)pt.X - (double)rect.X) / (double)rectDockArea.Width; } else if (state == DockState.DockBottom && rectDockArea.Height > 0) { dockManager.DockBottomPortion += ((double)pt.Y - (double)rect.Y) / (double)rectDockArea.Height; } else if (state == DockState.DockTop && rectDockArea.Height > 0) { dockManager.DockTopPortion += ((double)rect.Y - (double)pt.Y) / (double)rectDockArea.Height; } else if (state == DockState.DockLeftAutoHide && rectDockArea.Width > 0) { c.AutoHidePortion += ((double)rect.X - (double)pt.X) / (double)rectDockArea.Width; } else if (state == DockState.DockRightAutoHide && rectDockArea.Width > 0) { c.AutoHidePortion += ((double)pt.X - (double)rect.X) / (double)rectDockArea.Width; } else if (state == DockState.DockBottomAutoHide && rectDockArea.Height > 0) { c.AutoHidePortion += ((double)pt.Y - (double)rect.Y) / (double)rectDockArea.Height; } else if (state == DockState.DockTopAutoHide && rectDockArea.Height > 0) { c.AutoHidePortion += ((double)rect.Y - (double)pt.Y) / (double)rectDockArea.Height; } } else { TabWindow tabWindowPrev = tabWindow.Previous; double sizeAdjust; if (tabWindowPrev.LayoutStyle == LayoutStyles.Horizontal && tabWindowPrev.ClientRectangle.Width > 0) { sizeAdjust = ((double)rect.X - (double)pt.X) / (double)tabWindowPrev.ClientRectangle.Width; } else { sizeAdjust = ((double)rect.Y - (double)pt.Y) / (double)tabWindowPrev.ClientRectangle.Height; } tabWindowPrev.LayoutSize += sizeAdjust; tabWindowPrev.Invalidate(); tabWindowPrev.PerformLayout(); } }
private void ContentWindow_OnEndDrag(bool abort) { User32.SetCursor(DragControl.Cursor.Handle); if (abort) { return; } ContentWindow cw = ((TabWindow)DragControl).ContentWindow; if (DropTarget.DropTo is TabWindow) { TabWindow tabWindow = DropTarget.DropTo as TabWindow; if (DropTarget.Dock == DockStyle.Fill) { for (int i = cw.Contents.Count - 1; i >= 0; i--) { Content c = cw.Contents[i]; c.ContentWindow = tabWindow.ContentWindow; if (DropTarget.ContentIndex != -1) { tabWindow.ContentWindow.SetContentIndex(c, DropTarget.ContentIndex); } c.Activate(); } } else { if (DropTarget.Dock == DockStyle.Left) { tabWindow.InsertContentWindowBefore(cw, LayoutStyles.Horizontal, 0.5); } else if (DropTarget.Dock == DockStyle.Right) { tabWindow.InsertContentWindowAfter(cw, LayoutStyles.Horizontal, 0.5); } else if (DropTarget.Dock == DockStyle.Top) { tabWindow.InsertContentWindowBefore(cw, LayoutStyles.Vertical, 0.5); } else if (DropTarget.Dock == DockStyle.Bottom) { tabWindow.InsertContentWindowAfter(cw, LayoutStyles.Vertical, 0.5); } cw.Activate(); } } else if (DropTarget.DropTo is DockManager) { if (DropTarget.Dock == DockStyle.Top) { cw.VisibleState = DockState.DockTop; } else if (DropTarget.Dock == DockStyle.Bottom) { cw.VisibleState = DockState.DockBottom; } else if (DropTarget.Dock == DockStyle.Left) { cw.VisibleState = DockState.DockLeft; } else if (DropTarget.Dock == DockStyle.Right) { cw.VisibleState = DockState.DockRight; } else if (DropTarget.Dock == DockStyle.Fill) { cw.VisibleState = DockState.Document; } cw.DockManager.SetContentWindowIndex(cw, 0); cw.Activate(); } else if (IsDockStateValid(DockState.Float)) { Point ptMouse = Control.MousePosition; Point location = new Point(ptMouse.X + m_mouseOffset.X, ptMouse.Y + m_mouseOffset.Y); Size size; bool createFloatWindow = true; if (cw.FloatWindow == null) { size = FloatWindow.DefaultWindowSize; } else if (cw.FloatWindow.ContentWindows.Count == 1) { size = ((TabWindow)DragControl).ContentWindow.FloatWindow.Size; createFloatWindow = false; } else { size = FloatWindow.DefaultWindowSize; } if (ptMouse.X > location.X + size.Width) { location.X += ptMouse.X - (location.X + size.Width) + DragBorderWidth; } if (createFloatWindow) { cw.FloatWindow = new FloatWindow(cw.DockManager, cw, new Rectangle(location, size)); } else { cw.FloatWindow.Bounds = new Rectangle(location, size); } cw.VisibleState = DockState.Float; cw.Activate(); } }
private void Content_OnEndDrag(bool abort) { User32.SetCursor(DragControl.Cursor.Handle); if (abort) { return; } Content content = ((TabWindow)DragControl).ActiveContent; if (DropTarget.DropTo is TabWindow) { TabWindow tabWindow = DropTarget.DropTo as TabWindow; if (DropTarget.Dock == DockStyle.Fill) { bool sameContentWindow = (content.ContentWindow == tabWindow.ContentWindow); if (!sameContentWindow) { content.ContentWindow = tabWindow.ContentWindow; } if (DropTarget.ContentIndex == -1 || !sameContentWindow) { tabWindow.ContentWindow.SetContentIndex(content, DropTarget.ContentIndex); } else { ContentCollection contents = content.ContentWindow.Contents; int oldIndex = contents.IndexOf(content); int newIndex = DropTarget.ContentIndex; if (oldIndex < newIndex) { newIndex += 1; if (newIndex > contents.Count - 1) { newIndex = -1; } } tabWindow.ContentWindow.SetContentIndex(content, newIndex); } content.Activate(); } else { ContentWindow cw = new ContentWindow(content, tabWindow.DockState); if (!tabWindow.ContentWindow.IsDisposed) { if (DropTarget.Dock == DockStyle.Left) { tabWindow.InsertContentWindowBefore(cw, LayoutStyles.Horizontal, 0.5); } else if (DropTarget.Dock == DockStyle.Right) { tabWindow.InsertContentWindowAfter(cw, LayoutStyles.Horizontal, 0.5); } else if (DropTarget.Dock == DockStyle.Top) { tabWindow.InsertContentWindowBefore(cw, LayoutStyles.Vertical, 0.5); } else if (DropTarget.Dock == DockStyle.Bottom) { tabWindow.InsertContentWindowAfter(cw, LayoutStyles.Vertical, 0.5); } } cw.Activate(); } } else if (DropTarget.DropTo is DockManager) { ContentWindow cw; if (DropTarget.Dock == DockStyle.Top) { cw = new ContentWindow(content, DockState.DockTop); } else if (DropTarget.Dock == DockStyle.Bottom) { cw = new ContentWindow(content, DockState.DockBottom); } else if (DropTarget.Dock == DockStyle.Left) { cw = new ContentWindow(content, DockState.DockLeft); } else if (DropTarget.Dock == DockStyle.Right) { cw = new ContentWindow(content, DockState.DockRight); } else if (DropTarget.Dock == DockStyle.Fill) { cw = new ContentWindow(content, DockState.Document); } else { return; } cw.DockManager.SetContentWindowIndex(cw, 0); cw.Activate(); } else if (IsDockStateValid(DockState.Float)) { Point ptMouse = Control.MousePosition; ContentWindow cw = content.ContentWindow; Size size = FloatWindow.DefaultWindowSize; Point location; if (cw.DockState == DockState.Document) { location = new Point(ptMouse.X + m_mouseOffset.X, ptMouse.Y + m_mouseOffset.Y); } else { location = new Point(ptMouse.X + m_mouseOffset.X, ptMouse.Y + m_mouseOffset.Y - size.Height); } if (ptMouse.X > location.X + size.Width) { location.X += ptMouse.X - (location.X + size.Width) + DragBorderWidth; } cw = new ContentWindow(content, new Rectangle(location, size)); cw.Activate(); } }
public void PerformLayout() { TabWindow.PerformLayout(); }
private void FloatWindow_OnEndDrag(bool abort) { if (abort) { return; } FloatWindow floatWindow = (FloatWindow)DragControl; if (DropTarget.DropTo == null) { Rectangle rect = DragControl.Bounds; rect.X = Control.MousePosition.X + m_mouseOffset.X; rect.Y = Control.MousePosition.Y + m_mouseOffset.Y; DragControl.Bounds = rect; } else if (DropTarget.DropTo is TabWindow) { TabWindow tabWindow = DropTarget.DropTo as TabWindow; if (DropTarget.Dock == DockStyle.Fill) { for (int i = floatWindow.ContentWindows.Count - 1; i >= 0; i--) { ContentWindow cw = floatWindow.ContentWindows[i]; for (int j = cw.Contents.Count - 1; j >= 0; j--) { Content c = cw.Contents[j]; c.ContentWindow = tabWindow.ContentWindow; if (DropTarget.ContentIndex != -1) { tabWindow.ContentWindow.SetContentIndex(c, DropTarget.ContentIndex); } c.Activate(); } } } else { TabWindow lastTabWindow = null; for (int i = floatWindow.ContentWindows.Count - 1; i >= 0; i--) { ContentWindow cw = floatWindow.ContentWindows[i]; if (i == floatWindow.ContentWindows.Count - 1) { if (DropTarget.Dock == DockStyle.Left) { tabWindow.InsertContentWindowBefore(cw, LayoutStyles.Horizontal, 0.5); } else if (DropTarget.Dock == DockStyle.Right) { tabWindow.InsertContentWindowAfter(cw, LayoutStyles.Horizontal, 0.5); } else if (DropTarget.Dock == DockStyle.Top) { tabWindow.InsertContentWindowBefore(cw, LayoutStyles.Vertical, 0.5); } else if (DropTarget.Dock == DockStyle.Bottom) { tabWindow.InsertContentWindowAfter(cw, LayoutStyles.Vertical, 0.5); } } else { lastTabWindow.InsertContentWindowBefore(cw, cw.TabWindow.LayoutStyle, cw.TabWindow.LayoutSize); } lastTabWindow = cw.TabWindow; } } } else if (DropTarget.DropTo is DockManager) { for (int i = floatWindow.ContentWindows.Count - 1; i >= 0; i--) { ContentWindow cw = floatWindow.ContentWindows[i]; if (DropTarget.Dock == DockStyle.Top) { cw.VisibleState = DockState.DockTop; } else if (DropTarget.Dock == DockStyle.Bottom) { cw.VisibleState = DockState.DockBottom; } else if (DropTarget.Dock == DockStyle.Left) { cw.VisibleState = DockState.DockLeft; } else if (DropTarget.Dock == DockStyle.Right) { cw.VisibleState = DockState.DockRight; } else if (DropTarget.Dock == DockStyle.Fill) { cw.VisibleState = DockState.Document; } cw.DockManager.SetContentWindowIndex(cw, 0); cw.LayoutDock = cw.LayoutFloat; cw.SizeDock = cw.SizeFloat; floatWindow.ContentWindows[i].Activate(); } } }
public void SetDropTarget(TabWindow tabWindow, int contentIndex) { m_dropTo = tabWindow; m_dock = DockStyle.Fill; m_contentIndex = contentIndex; }
public bool Contains(TabWindow tabWindow) { return(tabWindow == null ? false : ContentWindow.Contains(tabWindow.ContentWindow)); }