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

C#编程

开发平台:

C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Drawing;
  5. namespace WeifenLuo.WinFormsUI.Docking
  6. {
  7. public sealed class NestedPaneCollection : ReadOnlyCollection<DockPane>
  8. {
  9. private INestedPanesContainer m_container;
  10. private VisibleNestedPaneCollection m_visibleNestedPanes;
  11. internal NestedPaneCollection(INestedPanesContainer container)
  12.             : base(new List<DockPane>())
  13. {
  14. m_container = container;
  15. m_visibleNestedPanes = new VisibleNestedPaneCollection(this);
  16. }
  17. public INestedPanesContainer Container
  18. {
  19. get { return m_container; }
  20. }
  21. public VisibleNestedPaneCollection VisibleNestedPanes
  22. {
  23. get { return m_visibleNestedPanes; }
  24. }
  25. public DockState DockState
  26. {
  27. get { return Container.DockState; }
  28. }
  29. public bool IsFloat
  30. {
  31. get { return DockState == DockState.Float; }
  32. }
  33. internal void Add(DockPane pane)
  34. {
  35. if (pane == null)
  36. return;
  37. NestedPaneCollection oldNestedPanes = (pane.NestedPanesContainer == null) ? null : pane.NestedPanesContainer.NestedPanes;
  38. if (oldNestedPanes != null)
  39. oldNestedPanes.InternalRemove(pane);
  40. Items.Add(pane);
  41. if (oldNestedPanes != null)
  42. oldNestedPanes.CheckFloatWindowDispose();
  43. }
  44. private void CheckFloatWindowDispose()
  45. {
  46. if (Count == 0 && Container.DockState == DockState.Float)
  47. {
  48. FloatWindow floatWindow = (FloatWindow)Container;
  49. if (!floatWindow.Disposing && !floatWindow.IsDisposed)
  50. NativeMethods.PostMessage(((FloatWindow)Container).Handle, FloatWindow.WM_CHECKDISPOSE, 0, 0);
  51. }
  52. }
  53. internal void Remove(DockPane pane)
  54. {
  55. InternalRemove(pane);
  56. CheckFloatWindowDispose();
  57. }
  58. private void InternalRemove(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.SetStatus(this, statusPane.PreviousPane, statusPane.Alignment, statusPane.Proportion);
  79. for (int i=indexLastNestedPane - 1; i>IndexOf(lastNestedPane); i--)
  80. {
  81. NestedDockingStatus status = this[i].NestedDockingStatus;
  82. if (status.PreviousPane == pane)
  83. status.SetStatus(this, lastNestedPane, status.Alignment, status.Proportion);
  84. }
  85. }
  86. else
  87. Items.Remove(pane);
  88. statusPane.SetStatus(null, null, DockAlignment.Left, 0.5);
  89. statusPane.SetDisplayingStatus(false, null, DockAlignment.Left, 0.5);
  90. statusPane.SetDisplayingBounds(Rectangle.Empty, Rectangle.Empty, Rectangle.Empty);
  91. }
  92. public DockPane GetDefaultPreviousPane(DockPane pane)
  93. {
  94. for (int i=Count-1; i>=0; i--)
  95. if (this[i] != pane)
  96. return this[i];
  97. return null;
  98. }
  99. }
  100. }