public DockSplitter(DockPanel dockPanel, IDockLayout p1, IDockLayout p2, Orientation orientation) : this(dockPanel, orientation) { this._dock.Add(p1); this._dock.Add(p2); // GetSize(true); }
public void Undock(IDockContent content) { IDockLayout targetChild = null; foreach (IDockLayout child in m_children) { if (child.HasChild(content)) { targetChild = child; break; } } if (targetChild != null) { targetChild.Undock(content); } else { foreach (IDockLayout child in m_children) { if (child.HasDescendant(content)) { targetChild = child; break; } } if (targetChild != null) { targetChild.Undock(content); } } }
public void Remove(IDockLayout destination, bool removewidget) { if (removewidget) { destination?.RemoveWidget(); } this._dock.Remove(destination); }
/// <summary> /// When first child is added, it sets up first properties /// </summary> /// <param name="child">Child to add</param> private void AddFirstChild(IDockLayout child) { m_children.Add(child); Children.Add((FrameworkElement)child); ColumnDefinitions.Add(NewColumnDefinition(new GridLength(1, GridUnitType.Star), m_minGridSize.Width)); RowDefinitions.Add(NewRowDefinition(new GridLength(1, GridUnitType.Star), m_minGridSize.Height)); ((FrameworkElement)child).SetValue(Grid.ColumnProperty, 0); ((FrameworkElement)child).SetValue(Grid.RowProperty, 0); }
internal bool CheckConsistency() { IEnumerator <IDockLayout> layoutEn = m_children.GetEnumerator(); while (layoutEn.MoveNext()) { GridLayout layout = layoutEn.Current as GridLayout; if (layout != null) { if (!layout.CheckConsistency()) { layoutEn = m_children.GetEnumerator(); } } } if (m_children.Count == 0) { if (Parent != null) { ((IDockLayout)Parent).Undock(this); } else { ((IDockLayout)Root).Undock(this); } return(false); } else if (m_children.Count == 1) { if (Parent is IDockLayout || m_children[0] is IDockLayout) { IDockLayout lastChild = m_children[0]; if (!(lastChild is DockedWindow && Parent == null)) { m_children.Clear(); Children.Clear(); if (Parent != null) { ((IDockLayout)Parent).Replace(this, lastChild); } else { ((IDockLayout)Root).Replace(this, lastChild); } return(false); } } } else if (Parent is GridLayout && Orientation == ((GridLayout)Parent).Orientation) { ((GridLayout)Parent).MergeWith(this); return(false); } return(true); }
/// <summary> /// Undock given child layout</summary> /// <param name="child">Child layout to undock</param> public void Undock(IDockLayout child) { if (DockedContent == child) { DockedContent = null; Content = null; if (Parent is IDockLayout) { ((IDockLayout)Parent).Undock(this); } } }
private IEnumerable <IDockLayout> _AllLayouts(IDockLayout item) { yield return(item as IDockLayout); if (item is IDockSplitter) { foreach (var l in (item as IDockSplitter).Layouts.SelectMany(_l => _AllLayouts(_l))) { yield return(l); } } }
IDockLayout IDockLayout.FindParentLayout(IDockContent content) { foreach (IDockLayout child in m_children) { IDockLayout found = null; if ((found = child.FindParentLayout(content)) != null) { return(found); } } return(null); }
public void Replace(IDockLayout oldLayout, IDockLayout newLayout) { FrameworkElement element = (FrameworkElement)newLayout; element.SetValue(Grid.ColumnProperty, (oldLayout as FrameworkElement).GetValue(Grid.ColumnProperty)); element.SetValue(Grid.RowProperty, (oldLayout as FrameworkElement).GetValue(Grid.RowProperty)); m_children[m_children.IndexOf(oldLayout)] = newLayout; int index = Children.IndexOf((FrameworkElement)oldLayout); Children.RemoveAt(index); Children.Insert(index, (FrameworkElement)newLayout); }
private IDockSplitter FindSplitter(IDockLayout content, IDockPane searchfor, out int ind) { if (content is IDockSplitter) { int cnt = 0; foreach (var l in (content as IDockSplitter).Layouts) { if (object.ReferenceEquals(searchfor, l)) { ind = cnt; return(content as IDockSplitter); } var r = FindSplitter(l, searchfor, out ind); if (r != null) { return(r); } cnt++; } } ind = -1; return(null); }
public void Undock(IDockLayout child) { int index = m_children.IndexOf(child); if (Orientation == Orientation.Horizontal) { ColumnDefinitions.RemoveAt(index * 2); Children.RemoveAt(index * 2); if (m_children.Count > 1) { ColumnDefinitions.RemoveAt(index * 2 + (index == 0 ? 0 : -1)); Children.RemoveAt(index * 2 + (index == 0 ? 0 : -1)); for (int i = 0; i < Children.Count; i++) { Grid.SetColumn(Children[i], i); } } } else { RowDefinitions.RemoveAt(index * 2); Children.RemoveAt(index * 2); if (m_children.Count > 1) { RowDefinitions.RemoveAt(index * 2 + (index == 0 ? 0 : -1)); Children.RemoveAt(index * 2 + (index == 0 ? 0 : -1)); for (int i = 0; i < Children.Count; i++) { Grid.SetRow(Children[i], i); } } } m_children.RemoveAt(index); Root.CheckConsistency(); }
/// <summary> /// Replace the old layout with new layout child</summary> /// <param name="oldLayout">Old layout to be replaced</param> /// <param name="newLayout">New layout that replaces old layout</param> void IDockLayout.Replace(IDockLayout oldLayout, IDockLayout newLayout) { throw new NotImplementedException(); }
public DockLayout(Container container) : base(container != null ? container.Generator : Generator.Current, container, typeof (IDockLayout)) { inner = (IDockLayout)Handler; }
public DockLayout(Container container) : base(container != null ? container.Generator : Generator.Current, container, typeof(IDockLayout)) { inner = (IDockLayout)Handler; }
/// <summary> /// Undock given child layout</summary> /// <param name="child">Child layout to undock</param> void IDockLayout.Undock(IDockLayout child) { if (GridLayout == child) { GridLayout = null; } }
public void Insert(int ind, IDockLayout dockLayout) { this._dock.Insert(ind, dockLayout); }
public void Dock(IDockContent nextTo, IDockContent newContent, DockTo dockTo) { IDockLayout targetChild = null; if (nextTo != null) { foreach (IDockLayout child in m_children) { if (child.HasChild(nextTo)) { targetChild = child; break; } } } if (targetChild == null) { foreach (IDockLayout child in m_children) { if (child.HasDescendant(nextTo)) { child.Dock(nextTo, newContent, dockTo); // child was docked, nothing else is necessary return; } } } if (dockTo == DockTo.Center && m_children.Count == 1) { m_children[0].Dock(null, newContent, dockTo); } else if (m_children.Count < 2) { if (dockTo == DockTo.Center) { dockTo = DockTo.Right; } if (dockTo == DockTo.Top || dockTo == DockTo.Bottom) { m_orientation = Orientation.Vertical; } else { m_orientation = Orientation.Horizontal; } DockedWindow newChild = new DockedWindow(Root, newContent); if (Children.Count == 0) { AddFirstChild(newChild); } else { if (targetChild == null) { if (dockTo == DockTo.Top || dockTo == DockTo.Left) { targetChild = m_children[0]; } else { targetChild = m_children[m_children.Count - 1]; } } FrameworkElement control = (FrameworkElement)targetChild; int index = m_children.IndexOf(targetChild); if (dockTo == DockTo.Left || dockTo == DockTo.Right) { GridSplitter splitter = NewGridSplitter(Orientation.Horizontal); int column = (int)control.GetValue(Grid.ColumnProperty); ColumnDefinition oldColumn = ColumnDefinitions[index * 2]; ContentSettings contentSettings = (newContent is TabLayout) ? ((TabLayout)newContent).Children[0].Settings : ((DockContent)newContent).Settings; double totalWidth = ((FrameworkElement)targetChild).ActualWidth; double width = Math.Max(Math.Min(contentSettings.Size.Width, (totalWidth - splitter.Width) / 2), (totalWidth - splitter.Width) / 5); double ratioNew = width / totalWidth; double ratioOld = (totalWidth - width - splitter.Width) / totalWidth; if (dockTo == DockTo.Left) { ColumnDefinition leftColumn = NewColumnDefinition(new GridLength(oldColumn.Width.Value * ratioNew, oldColumn.Width.GridUnitType), m_minGridSize.Width); ColumnDefinition rightColumn = NewColumnDefinition(new GridLength(oldColumn.Width.Value * ratioOld, oldColumn.Width.GridUnitType), m_minGridSize.Width); ColumnDefinitions[index * 2] = leftColumn; ColumnDefinitions.Insert(index * 2 + 1, rightColumn); ColumnDefinitions.Insert(index * 2 + 1, NewColumnDefinition(new GridLength(1, GridUnitType.Auto), 0)); m_children.Insert(index, newChild); Children.Insert(index * 2, splitter); Children.Insert(index * 2, newChild); } else { ColumnDefinition leftColumn = NewColumnDefinition(new GridLength(oldColumn.Width.Value * ratioOld, oldColumn.Width.GridUnitType), m_minGridSize.Width); ColumnDefinition rightColumn = NewColumnDefinition(new GridLength(oldColumn.Width.Value * ratioNew, oldColumn.Width.GridUnitType), m_minGridSize.Width); ColumnDefinitions[index * 2] = leftColumn; ColumnDefinitions.Insert(index * 2 + 1, rightColumn); ColumnDefinitions.Insert(index * 2 + 1, NewColumnDefinition(new GridLength(1, GridUnitType.Auto), 0)); m_children.Insert(index + 1, newChild); Children.Insert(index * 2 + 1, newChild); Children.Insert(index * 2 + 1, splitter); } for (int i = index * 2; i < Children.Count; i++) { Grid.SetColumn(Children[i], i); } } else { GridSplitter splitter = NewGridSplitter(Orientation.Vertical); int row = (int)control.GetValue(Grid.RowProperty); RowDefinition oldRow = RowDefinitions[index * 2]; ContentSettings contentSettings = (newContent is TabLayout) ? ((TabLayout)newContent).Children[0].Settings : ((DockContent)newContent).Settings; double totalHeight = ((FrameworkElement)targetChild).ActualHeight; double height = Math.Max(Math.Min(contentSettings.Size.Height, (totalHeight - splitter.Height) / 2), (totalHeight - splitter.Height) / 5); double ratioNew = height / totalHeight; double ratioOld = (totalHeight - height - splitter.Height) / totalHeight; if (dockTo == DockTo.Top) { RowDefinition topRow = NewRowDefinition(new GridLength(oldRow.Height.Value * ratioNew, oldRow.Height.GridUnitType), m_minGridSize.Height); RowDefinition bottomRow = NewRowDefinition(new GridLength(oldRow.Height.Value * ratioOld, oldRow.Height.GridUnitType), m_minGridSize.Height); RowDefinitions[index * 2] = topRow; RowDefinitions.Insert(index * 2 + 1, bottomRow); RowDefinitions.Insert(index * 2 + 1, NewRowDefinition(new GridLength(1, GridUnitType.Auto), 0)); m_children.Insert(index, newChild); Children.Insert(index * 2, splitter); Children.Insert(index * 2, newChild); } else { RowDefinition topRow = NewRowDefinition(new GridLength(oldRow.Height.Value * ratioOld, oldRow.Height.GridUnitType), m_minGridSize.Height); RowDefinition bottomRow = NewRowDefinition(new GridLength(oldRow.Height.Value * ratioNew, oldRow.Height.GridUnitType), m_minGridSize.Height); RowDefinitions[index * 2] = topRow; RowDefinitions.Insert(index * 2 + 1, bottomRow); RowDefinitions.Insert(index * 2 + 1, NewRowDefinition(new GridLength(1, GridUnitType.Auto), 0)); m_children.Insert(index + 1, newChild); Children.Insert(index * 2 + 1, newChild); Children.Insert(index * 2 + 1, splitter); } for (int i = index * 2; i < Children.Count; i++) { Grid.SetRow(Children[i], i); } } } } else if (dockTo == DockTo.Left || dockTo == DockTo.Right || dockTo == DockTo.Top || dockTo == DockTo.Bottom) { DockedWindow dockedWindow = (DockedWindow)targetChild; int index = m_children.IndexOf(targetChild); GridLayout gridLayout = new GridLayout(Root); gridLayout.SetValue(Grid.ColumnProperty, dockedWindow.GetValue(Grid.ColumnProperty)); gridLayout.SetValue(Grid.RowProperty, dockedWindow.GetValue(Grid.RowProperty)); Children.Remove(dockedWindow); IDockContent content = dockedWindow.DockedContent; dockedWindow.Undock(content); m_children[index] = gridLayout; Children.Insert(index * 2, gridLayout); gridLayout.Dock(null, content, DockTo.Center); UpdateLayout(); gridLayout.Dock(content, newContent, dockTo); } else if (targetChild != null) { targetChild.Dock(nextTo, newContent, dockTo); } }
/// <summary> /// Undock given child layout</summary> /// <param name="child">Child layout to undock</param> public void Undock(IDockLayout child) { throw new NotImplementedException(); }
public void ReadXml(System.Xml.XmlReader reader) { if (reader.ReadToFollowing(this.GetType().Name)) { String s = reader.GetAttribute(Orientation.GetType().Name); m_orientation = (Orientation)(Enum.Parse(Orientation.GetType(), s)); switch (m_orientation) { case Orientation.Horizontal: if (reader.ReadToDescendant("Column")) { RowDefinitions.Add(NewRowDefinition(new GridLength(1, GridUnitType.Star), m_minGridSize.Height)); do { double width = double.Parse(reader.GetAttribute("Width")); IDockLayout layout = null; reader.ReadStartElement(); if (reader.LocalName == typeof(DockedWindow).Name) { DockedWindow dockedWindow = new DockedWindow(Root, reader.ReadSubtree()); layout = dockedWindow.DockedContent.Children.Count != 0 ? dockedWindow : null; reader.ReadEndElement(); } else if (reader.LocalName == typeof(GridLayout).Name) { GridLayout gridLayout = new GridLayout(Root, reader.ReadSubtree()); layout = gridLayout.Layouts.Count > 0 ? gridLayout : null; reader.ReadEndElement(); } if (layout != null) { if (Children.Count > 0) { ColumnDefinitions.Add(NewColumnDefinition(new GridLength(1, GridUnitType.Auto), 0)); Children.Add(NewGridSplitter(Orientation)); } ColumnDefinitions.Add(NewColumnDefinition(new GridLength(width, GridUnitType.Star), m_minGridSize.Width)); m_children.Add(layout); Children.Add((FrameworkElement)layout); } } while (reader.ReadToNextSibling("Column")); } break; case Orientation.Vertical: if (reader.ReadToDescendant("Row")) { ColumnDefinitions.Add(NewColumnDefinition(new GridLength(1, GridUnitType.Star), m_minGridSize.Width)); do { double height = double.Parse(reader.GetAttribute("Height")); IDockLayout layout = null; reader.ReadStartElement(); if (reader.LocalName == typeof(DockedWindow).Name) { DockedWindow dockedWindow = new DockedWindow(Root, reader.ReadSubtree()); layout = dockedWindow.DockedContent.Children.Count != 0 ? dockedWindow : null; reader.ReadEndElement(); } else if (reader.LocalName == typeof(GridLayout).Name) { GridLayout gridLayout = new GridLayout(Root, reader.ReadSubtree()); layout = gridLayout.Layouts.Count > 0 ? gridLayout : null; reader.ReadEndElement(); } if (layout != null) { if (Children.Count > 0) { RowDefinitions.Add(NewRowDefinition(new GridLength(1, GridUnitType.Auto), 0)); Children.Add(NewGridSplitter(Orientation)); } RowDefinitions.Add(NewRowDefinition(new GridLength(height, GridUnitType.Star), m_minGridSize.Height)); m_children.Add(layout); Children.Add((FrameworkElement)layout); } } while (reader.ReadToNextSibling("Row")); } break; } for (int i = 0; i < Children.Count; i++) { Grid.SetColumn(Children[i], Orientation == Orientation.Horizontal ? i : 0); Grid.SetRow(Children[i], Orientation == Orientation.Vertical ? i : 0); } reader.ReadEndElement(); } }
/// <summary> /// Constructor /// </summary> /// <param name="dockPanel">Parent dock panel</param> /// <param name="child">First child</param> public GridLayout(DockPanel dockPanel, IDockLayout child) : this(dockPanel) { AddFirstChild(child); }
/// <summary> /// Start dragging the given content. This includes undocking it from the UI, /// creating new window with the content, and then start dragging it.</summary> /// <param name="source"></param> /// <param name="content">Content to drag</param> internal void Drag(IDockLayout source, IDockContent content) { FrameworkElement sourceElement = (FrameworkElement)source; ContentSettings settings = (content is TabLayout) ? ((TabLayout)content).Children[0].Settings : ((DockContent)content).Settings; Size size = new Size(sourceElement.ActualWidth, sourceElement.ActualHeight); Point offset = new Point(settings.Size.Width / 2, 3); Point position = Mouse.GetPosition(this); position = PointToScreen(position); Matrix m = PresentationSource.FromVisual(Window.GetWindow(this)).CompositionTarget.TransformToDevice; if (m != Matrix.Identity) { m.Invert(); position = m.Transform(position); } offset = Mouse.GetPosition(sourceElement); offset.Y = offset.Y > 20 ? 10 : offset.Y; position = (Point)(position - offset); if (Mouse.LeftButton == MouseButtonState.Pressed) { source.Undock(content); FloatingWindow wnd = new FloatingWindow(this, content, position, size); wnd.Closing += ChildWindowClosing; m_windows.Add(wnd); wnd.Owner = Window.GetWindow(this); wnd.Show(); wnd.DragMove(); } }
/// <summary> /// Replace the old layout with new layout child</summary> /// <param name="oldLayout">Old layout to be replaced</param> /// <param name="newLayout">New layout that replaces old layout</param> public void Replace(IDockLayout oldLayout, IDockLayout newLayout) { }
/// <summary> /// Replace the old layout with new layout child</summary> /// <param name="oldLayout">Old layout to be replaced</param> /// <param name="newLayout">New layout that replaces old layout</param> void IDockLayout.Replace(IDockLayout oldLayout, IDockLayout newLayout) { if (GridLayout == oldLayout) { GridLayout = (GridLayout)newLayout; } }
/// <summary> /// Replace the old layout with new layout child</summary> /// <param name="oldLayout">Old layout to be replaced</param> /// <param name="newLayout">New layout that replaces old layout</param> public void Replace(IDockLayout oldLayout, IDockLayout newLayout) { throw new NotImplementedException(); }