VisibleNestedPaneCollection.cs
上传用户:szlfmled
上传日期:2020-11-22
资源大小:978k
文件大小:6k
源码类别:

C#编程

开发平台:

C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Drawing;
  5. using System.Windows.Forms;
  6. namespace WeifenLuo.WinFormsUI.Docking
  7. {
  8. public sealed class VisibleNestedPaneCollection : ReadOnlyCollection<DockPane>
  9. {
  10. private NestedPaneCollection m_nestedPanes;
  11.         internal VisibleNestedPaneCollection(NestedPaneCollection nestedPanes)
  12.             : base(new List<DockPane>())
  13.         {
  14.             m_nestedPanes = nestedPanes;
  15.         }
  16. public NestedPaneCollection NestedPanes
  17. {
  18. get { return m_nestedPanes; }
  19. }
  20. public INestedPanesContainer Container
  21. {
  22. get { return NestedPanes.Container; }
  23. }
  24. public DockState DockState
  25. {
  26. get { return NestedPanes.DockState; }
  27. }
  28. public bool IsFloat
  29. {
  30. get { return NestedPanes.IsFloat; }
  31. }
  32. internal void Refresh()
  33. {
  34. Items.Clear();
  35. for (int i=0; i<NestedPanes.Count; i++)
  36. {
  37. DockPane pane = NestedPanes[i];
  38. NestedDockingStatus status = pane.NestedDockingStatus;
  39. status.SetDisplayingStatus(true, status.PreviousPane, status.Alignment, status.Proportion);
  40. Items.Add(pane);
  41. }
  42. foreach (DockPane pane in NestedPanes)
  43. if (pane.DockState != DockState || pane.IsHidden)
  44. {
  45. pane.Bounds = Rectangle.Empty;
  46. pane.SplitterBounds = Rectangle.Empty;
  47. Remove(pane);
  48. }
  49. CalculateBounds();
  50. foreach (DockPane pane in this)
  51. {
  52. NestedDockingStatus status = pane.NestedDockingStatus;
  53. pane.Bounds = status.PaneBounds;
  54. pane.SplitterBounds = status.SplitterBounds;
  55. pane.SplitterAlignment = status.Alignment;
  56. }
  57. }
  58. private void Remove(DockPane pane)
  59. {
  60. if (!Contains(pane))
  61. return;
  62. NestedDockingStatus statusPane = pane.NestedDockingStatus;
  63. DockPane lastNestedPane = null;
  64. for (int i=Count - 1; i> IndexOf(pane); i--)
  65. {
  66. if (this[i].NestedDockingStatus.PreviousPane == pane)
  67. {
  68. lastNestedPane = this[i];
  69. break;
  70. }
  71. }
  72. if (lastNestedPane != null)
  73. {
  74. int indexLastNestedPane = IndexOf(lastNestedPane);
  75. Items.Remove(lastNestedPane);
  76. Items[IndexOf(pane)] = lastNestedPane;
  77. NestedDockingStatus lastNestedDock = lastNestedPane.NestedDockingStatus;
  78. lastNestedDock.SetDisplayingStatus(true, statusPane.DisplayingPreviousPane, statusPane.DisplayingAlignment, statusPane.DisplayingProportion);
  79. for (int i=indexLastNestedPane - 1; i>IndexOf(lastNestedPane); i--)
  80. {
  81. NestedDockingStatus status = this[i].NestedDockingStatus;
  82. if (status.PreviousPane == pane)
  83. status.SetDisplayingStatus(true, lastNestedPane, status.DisplayingAlignment, status.DisplayingProportion);
  84. }
  85. }
  86. else
  87. Items.Remove(pane);
  88. statusPane.SetDisplayingStatus(false, null, DockAlignment.Left, 0.5);
  89. }
  90. private void CalculateBounds()
  91. {
  92. if (Count == 0)
  93. return;
  94. this[0].NestedDockingStatus.SetDisplayingBounds(Container.DisplayingRectangle, Container.DisplayingRectangle, Rectangle.Empty);
  95. for (int i=1; i<Count; i++)
  96. {
  97. DockPane pane = this[i];
  98. NestedDockingStatus status = pane.NestedDockingStatus;
  99. DockPane prevPane = status.DisplayingPreviousPane;
  100. NestedDockingStatus statusPrev = prevPane.NestedDockingStatus;
  101. Rectangle rect = statusPrev.PaneBounds;
  102. bool bVerticalSplitter = (status.DisplayingAlignment == DockAlignment.Left || status.DisplayingAlignment == DockAlignment.Right);
  103. Rectangle rectThis = rect;
  104. Rectangle rectPrev = rect;
  105. Rectangle rectSplitter = rect;
  106. if (status.DisplayingAlignment == DockAlignment.Left)
  107. {
  108. rectThis.Width = (int)((double)rect.Width * status.DisplayingProportion) - (Measures.SplitterSize / 2);
  109. rectSplitter.X = rectThis.X + rectThis.Width;
  110. rectSplitter.Width = Measures.SplitterSize;
  111. rectPrev.X = rectSplitter.X + rectSplitter.Width;
  112. rectPrev.Width = rect.Width - rectThis.Width - rectSplitter.Width;
  113. }
  114. else if (status.DisplayingAlignment == DockAlignment.Right)
  115. {
  116. rectPrev.Width = (rect.Width - (int)((double)rect.Width * status.DisplayingProportion)) - (Measures.SplitterSize / 2);
  117. rectSplitter.X = rectPrev.X + rectPrev.Width;
  118. rectSplitter.Width = Measures.SplitterSize;
  119. rectThis.X = rectSplitter.X + rectSplitter.Width;
  120. rectThis.Width = rect.Width - rectPrev.Width - rectSplitter.Width;
  121. }
  122. else if (status.DisplayingAlignment == DockAlignment.Top)
  123. {
  124. rectThis.Height = (int)((double)rect.Height * status.DisplayingProportion) - (Measures.SplitterSize / 2);
  125. rectSplitter.Y = rectThis.Y + rectThis.Height;
  126. rectSplitter.Height = Measures.SplitterSize;
  127. rectPrev.Y = rectSplitter.Y + rectSplitter.Height;
  128. rectPrev.Height = rect.Height - rectThis.Height - rectSplitter.Height;
  129. }
  130. else if (status.DisplayingAlignment == DockAlignment.Bottom)
  131. {
  132. rectPrev.Height = (rect.Height - (int)((double)rect.Height * status.DisplayingProportion)) - (Measures.SplitterSize / 2);
  133. rectSplitter.Y = rectPrev.Y + rectPrev.Height;
  134. rectSplitter.Height = Measures.SplitterSize;
  135. rectThis.Y = rectSplitter.Y + rectSplitter.Height;
  136. rectThis.Height = rect.Height - rectPrev.Height - rectSplitter.Height;
  137. }
  138. else
  139. rectThis = Rectangle.Empty;
  140. rectSplitter.Intersect(rect);
  141. rectThis.Intersect(rect);
  142. rectPrev.Intersect(rect);
  143. status.SetDisplayingBounds(rect, rectThis, rectSplitter);
  144. statusPrev.SetDisplayingBounds(statusPrev.LogicalBounds, rectPrev, statusPrev.SplitterBounds);
  145. }
  146. }
  147. }
  148. }