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

C#编程

开发平台:

C#

  1. using System;
  2. using System.Windows.Forms;
  3. using System.Drawing;
  4. using System.ComponentModel;
  5. using System.Diagnostics.CodeAnalysis;
  6. namespace WeifenLuo.WinFormsUI.Docking
  7. {
  8. public delegate string GetPersistStringCallback();
  9. public class DockContentHandler : IDisposable, IDockDragSource
  10. {
  11. public DockContentHandler(Form form) : this(form, null)
  12. {
  13. }
  14. public DockContentHandler(Form form, GetPersistStringCallback getPersistStringCallback)
  15. {
  16. if (!(form is IDockContent))
  17. throw new ArgumentException(Strings.DockContent_Constructor_InvalidForm, "form");
  18. m_form = form;
  19. m_getPersistStringCallback = getPersistStringCallback;
  20. m_events = new EventHandlerList();
  21. Form.Disposed +=new EventHandler(Form_Disposed);
  22. Form.TextChanged += new EventHandler(Form_TextChanged);
  23. }
  24. public void Dispose()
  25. {
  26. Dispose(true);
  27. GC.SuppressFinalize(this);
  28. }
  29. protected virtual void Dispose(bool disposing)
  30. {
  31. if(disposing)
  32. {
  33. lock(this)
  34. {
  35. DockPanel = null;
  36. if (m_autoHideTab != null)
  37. m_autoHideTab.Dispose();
  38. if (m_tab != null)
  39. m_tab.Dispose();
  40. Form.Disposed -= new EventHandler(Form_Disposed);
  41. Form.TextChanged -= new EventHandler(Form_TextChanged);
  42. m_events.Dispose();
  43. }
  44. }
  45. }
  46. private Form m_form;
  47. public Form Form
  48. {
  49. get { return m_form; }
  50. }
  51. public IDockContent Content
  52. {
  53. get { return Form as IDockContent; }
  54. }
  55.         private IDockContent m_previousActive = null;
  56.         public IDockContent PreviousActive
  57.         {
  58.             get { return m_previousActive; }
  59.             internal set { m_previousActive = value; }
  60.         }
  61.         private IDockContent m_nextActive = null;
  62.         public IDockContent NextActive
  63.         {
  64.             get { return m_nextActive; }
  65.             internal set { m_nextActive = value; }
  66.         }
  67. private EventHandlerList m_events;
  68. private EventHandlerList Events
  69. {
  70. get { return m_events; }
  71. }
  72. private bool m_allowEndUserDocking = true;
  73. public bool AllowEndUserDocking
  74. {
  75. get { return m_allowEndUserDocking; }
  76. set { m_allowEndUserDocking = value; }
  77. }
  78. private double m_autoHidePortion = 0.25;
  79. public double AutoHidePortion
  80. {
  81. get { return m_autoHidePortion; }
  82. set
  83. {
  84. if (value <= 0)
  85. throw(new ArgumentOutOfRangeException(Strings.DockContentHandler_AutoHidePortion_OutOfRange));
  86. if (m_autoHidePortion == value)
  87. return;
  88. m_autoHidePortion = value;
  89. if (DockPanel == null)
  90. return;
  91. if (DockPanel.ActiveAutoHideContent == Content)
  92. DockPanel.PerformLayout();
  93. }
  94. }
  95. private bool m_closeButton = true;
  96. public bool CloseButton
  97. {
  98. get { return m_closeButton; }
  99. set
  100. {
  101. if (m_closeButton == value)
  102. return;
  103. m_closeButton = value;
  104. if (Pane != null)
  105. if (Pane.ActiveContent.DockHandler == this)
  106. Pane.RefreshChanges();
  107. }
  108. }
  109.         private bool m_closeButtonVisible = true;
  110.         /// <summary>
  111.         /// Determines whether the close button is visible on the content
  112.         /// </summary>
  113.         public bool CloseButtonVisible
  114.         {
  115.             get { return m_closeButtonVisible; }
  116.             set { m_closeButtonVisible = value; }
  117.         }
  118. private DockState DefaultDockState
  119. {
  120. get
  121. {
  122. if (ShowHint != DockState.Unknown && ShowHint != DockState.Hidden)
  123. return ShowHint;
  124. if ((DockAreas & DockAreas.Document) != 0)
  125. return DockState.Document;
  126. if ((DockAreas & DockAreas.DockRight) != 0)
  127. return DockState.DockRight;
  128. if ((DockAreas & DockAreas.DockLeft) != 0)
  129. return DockState.DockLeft;
  130. if ((DockAreas & DockAreas.DockBottom) != 0)
  131. return DockState.DockBottom;
  132. if ((DockAreas & DockAreas.DockTop) != 0)
  133. return DockState.DockTop;
  134. return DockState.Unknown;
  135. }
  136. }
  137. private DockState DefaultShowState
  138. {
  139. get
  140. {
  141. if (ShowHint != DockState.Unknown)
  142. return ShowHint;
  143. if ((DockAreas & DockAreas.Document) != 0)
  144. return DockState.Document;
  145. if ((DockAreas & DockAreas.DockRight) != 0)
  146. return DockState.DockRight;
  147. if ((DockAreas & DockAreas.DockLeft) != 0)
  148. return DockState.DockLeft;
  149. if ((DockAreas & DockAreas.DockBottom) != 0)
  150. return DockState.DockBottom;
  151. if ((DockAreas & DockAreas.DockTop) != 0)
  152. return DockState.DockTop;
  153. if ((DockAreas & DockAreas.Float) != 0)
  154. return DockState.Float;
  155. return DockState.Unknown;
  156. }
  157. }
  158. private DockAreas m_allowedAreas = DockAreas.DockLeft | DockAreas.DockRight | DockAreas.DockTop | DockAreas.DockBottom | DockAreas.Document | DockAreas.Float;
  159. public DockAreas DockAreas
  160. {
  161. get { return m_allowedAreas; }
  162. set
  163. {
  164. if (m_allowedAreas == value)
  165. return;
  166. if (!DockHelper.IsDockStateValid(DockState, value))
  167. throw(new InvalidOperationException(Strings.DockContentHandler_DockAreas_InvalidValue));
  168. m_allowedAreas = value;
  169. if (!DockHelper.IsDockStateValid(ShowHint, m_allowedAreas))
  170. ShowHint = DockState.Unknown;
  171. }
  172. }
  173. private DockState m_dockState = DockState.Unknown;
  174. public DockState DockState
  175. {
  176. get { return m_dockState; }
  177. set
  178. {
  179. if (m_dockState == value)
  180. return;
  181.                 DockPanel.SuspendLayout(true);
  182. if (value == DockState.Hidden)
  183. IsHidden = true;
  184. else
  185. SetDockState(false, value, Pane);
  186.                 DockPanel.ResumeLayout(true, true);
  187. }
  188. }
  189. private DockPanel m_dockPanel = null;
  190. public DockPanel DockPanel
  191. {
  192. get { return m_dockPanel; }
  193. set
  194. {
  195. if (m_dockPanel == value)
  196. return;
  197. Pane = null;
  198. if (m_dockPanel != null)
  199. m_dockPanel.RemoveContent(Content);
  200. if (m_tab != null)
  201. {
  202. m_tab.Dispose();
  203. m_tab = null;
  204. }
  205. if (m_autoHideTab != null)
  206. {
  207. m_autoHideTab.Dispose();
  208. m_autoHideTab = null;
  209. }
  210. m_dockPanel = value;
  211. if (m_dockPanel != null)
  212. {
  213. m_dockPanel.AddContent(Content);
  214. Form.TopLevel = false;
  215. Form.FormBorderStyle = FormBorderStyle.None;
  216. Form.ShowInTaskbar = false;
  217.                     Form.WindowState = FormWindowState.Normal;
  218. NativeMethods.SetWindowPos(Form.Handle, IntPtr.Zero, 0, 0, 0, 0,
  219. Win32.FlagsSetWindowPos.SWP_NOACTIVATE |
  220. Win32.FlagsSetWindowPos.SWP_NOMOVE |
  221. Win32.FlagsSetWindowPos.SWP_NOSIZE |
  222. Win32.FlagsSetWindowPos.SWP_NOZORDER |
  223. Win32.FlagsSetWindowPos.SWP_NOOWNERZORDER |
  224. Win32.FlagsSetWindowPos.SWP_FRAMECHANGED);
  225. }
  226. }
  227. }
  228. public Icon Icon
  229. {
  230. get { return Form.Icon; }
  231. }
  232. public DockPane Pane
  233. {
  234. get { return IsFloat ? FloatPane : PanelPane; }
  235. set
  236. {
  237. if (Pane == value)
  238. return;
  239.                 DockPanel.SuspendLayout(true);
  240. DockPane oldPane = Pane;
  241. SuspendSetDockState();
  242. FloatPane = (value == null ? null : (value.IsFloat ? value : FloatPane));
  243. PanelPane = (value == null ? null : (value.IsFloat ? PanelPane : value));
  244. ResumeSetDockState(IsHidden, value != null ? value.DockState : DockState.Unknown, oldPane);
  245.                 DockPanel.ResumeLayout(true, true);
  246. }
  247. }
  248. private bool m_isHidden = true;
  249. public bool IsHidden
  250. {
  251. get { return m_isHidden; }
  252. set
  253. {
  254. if (m_isHidden == value)
  255. return;
  256. SetDockState(value, VisibleState, Pane);
  257. }
  258. }
  259. private string m_tabText = null;
  260. public string TabText
  261. {
  262.             get { return m_tabText == null || m_tabText == "" ? Form.Text : m_tabText; }
  263. set
  264. {
  265. if (m_tabText == value)
  266. return;
  267. m_tabText = value;
  268. if (Pane != null)
  269. Pane.RefreshChanges();
  270. }
  271. }
  272. private DockState m_visibleState = DockState.Unknown;
  273. public DockState VisibleState
  274. {
  275. get { return m_visibleState; }
  276. set
  277. {
  278. if (m_visibleState == value)
  279. return;
  280. SetDockState(IsHidden, value, Pane);
  281. }
  282. }
  283. private bool m_isFloat = false;
  284. public bool IsFloat
  285. {
  286. get { return m_isFloat; }
  287. set
  288. {
  289. if (m_isFloat == value)
  290. return;
  291.                 DockState visibleState = CheckDockState(value);
  292. if (visibleState == DockState.Unknown)
  293. throw new InvalidOperationException(Strings.DockContentHandler_IsFloat_InvalidValue);
  294. SetDockState(IsHidden, visibleState, Pane);
  295. }
  296. }
  297.         [SuppressMessage("Microsoft.Naming", "CA1720:AvoidTypeNamesInParameters")]
  298.         public DockState CheckDockState(bool isFloat)
  299.         {
  300.             DockState dockState;
  301.             if (isFloat)
  302.             {
  303.                 if (!IsDockStateValid(DockState.Float))
  304.                     dockState = DockState.Unknown;
  305.                 else
  306.                     dockState = DockState.Float;
  307.             }
  308.             else
  309.             {
  310.                 dockState = (PanelPane != null) ? PanelPane.DockState : DefaultDockState;
  311.                 if (dockState != DockState.Unknown && !IsDockStateValid(dockState))
  312.                     dockState = DockState.Unknown;
  313.             }
  314.             return dockState;
  315.         }
  316. private DockPane m_panelPane = null;
  317. public DockPane PanelPane
  318. {
  319. get { return m_panelPane; }
  320. set
  321. {
  322. if (m_panelPane == value)
  323. return;
  324. if (value != null)
  325. {
  326. if (value.IsFloat || value.DockPanel != DockPanel)
  327. throw new InvalidOperationException(Strings.DockContentHandler_DockPane_InvalidValue);
  328. }
  329. DockPane oldPane = Pane;
  330.                 if (m_panelPane != null)
  331.                     RemoveFromPane(m_panelPane);
  332. m_panelPane = value;
  333. if (m_panelPane != null)
  334. {
  335. m_panelPane.AddContent(Content);
  336. SetDockState(IsHidden, IsFloat ? DockState.Float : m_panelPane.DockState, oldPane);
  337. }
  338. else
  339. SetDockState(IsHidden, DockState.Unknown, oldPane);
  340. }
  341. }
  342.         private void RemoveFromPane(DockPane pane)
  343.         {
  344.             pane.RemoveContent(Content);
  345.             SetPane(null);
  346.             if (pane.Contents.Count == 0)
  347.                 pane.Dispose();
  348.         }
  349. private DockPane m_floatPane = null;
  350. public DockPane FloatPane
  351. {
  352. get { return m_floatPane; }
  353. set
  354. {
  355. if (m_floatPane == value)
  356. return;
  357. if (value != null)
  358. {
  359. if (!value.IsFloat || value.DockPanel != DockPanel)
  360. throw new InvalidOperationException(Strings.DockContentHandler_FloatPane_InvalidValue);
  361. }
  362. DockPane oldPane = Pane;
  363.                 if (m_floatPane != null)
  364.                     RemoveFromPane(m_floatPane);
  365. m_floatPane = value;
  366. if (m_floatPane != null)
  367. {
  368. m_floatPane.AddContent(Content);
  369. SetDockState(IsHidden, IsFloat ? DockState.Float : VisibleState, oldPane);
  370. }
  371. else
  372. SetDockState(IsHidden, DockState.Unknown, oldPane);
  373. }
  374. }
  375. private int m_countSetDockState = 0;
  376. private void SuspendSetDockState()
  377. {
  378. m_countSetDockState ++;
  379. }
  380. private void ResumeSetDockState()
  381. {
  382. m_countSetDockState --;
  383. if (m_countSetDockState < 0)
  384. m_countSetDockState = 0;
  385. }
  386. internal bool IsSuspendSetDockState
  387. {
  388. get { return m_countSetDockState != 0; }
  389. }
  390. private void ResumeSetDockState(bool isHidden, DockState visibleState, DockPane oldPane)
  391. {
  392. ResumeSetDockState();
  393. SetDockState(isHidden, visibleState, oldPane);
  394. }
  395. internal void SetDockState(bool isHidden, DockState visibleState, DockPane oldPane)
  396. {
  397. if (IsSuspendSetDockState)
  398. return;
  399. if (DockPanel == null && visibleState != DockState.Unknown)
  400. throw new InvalidOperationException(Strings.DockContentHandler_SetDockState_NullPanel);
  401. if (visibleState == DockState.Hidden || (visibleState != DockState.Unknown && !IsDockStateValid(visibleState)))
  402. throw new InvalidOperationException(Strings.DockContentHandler_SetDockState_InvalidState);
  403.             DockPanel dockPanel = DockPanel;
  404.             if (dockPanel != null)
  405.                 dockPanel.SuspendLayout(true);
  406. SuspendSetDockState();
  407. DockState oldDockState = DockState;
  408. if (m_isHidden != isHidden || oldDockState == DockState.Unknown)
  409. {
  410. m_isHidden = isHidden;
  411. }
  412. m_visibleState = visibleState;
  413. m_dockState = isHidden ? DockState.Hidden : visibleState;
  414.             if (visibleState == DockState.Unknown)
  415.                 Pane = null;
  416.             else
  417.             {
  418.                 m_isFloat = (m_visibleState == DockState.Float);
  419.                 if (Pane == null)
  420.                     Pane = DockPanel.DockPaneFactory.CreateDockPane(Content, visibleState, true);
  421.                 else if (Pane.DockState != visibleState)
  422.                 {
  423.                     if (Pane.Contents.Count == 1)
  424.                         Pane.SetDockState(visibleState);
  425.                     else
  426.                         Pane = DockPanel.DockPaneFactory.CreateDockPane(Content, visibleState, true);
  427.                 }
  428.             }
  429.             if (Form.ContainsFocus)
  430.                 if (DockState == DockState.Hidden || DockState == DockState.Unknown)
  431.                     DockPanel.ContentFocusManager.GiveUpFocus(Content);
  432.             SetPaneAndVisible(Pane);
  433. if (oldPane != null && !oldPane.IsDisposed && oldDockState == oldPane.DockState)
  434. RefreshDockPane(oldPane);
  435. if (Pane != null && DockState == Pane.DockState)
  436. {
  437. if ((Pane != oldPane) ||
  438. (Pane == oldPane && oldDockState != oldPane.DockState))
  439. // Avoid early refresh of hidden AutoHide panes
  440. if ((Pane.DockWindow == null || Pane.DockWindow.Visible || Pane.IsHidden) && !Pane.IsAutoHide)
  441. RefreshDockPane(Pane);
  442. }
  443.             if (oldDockState != DockState)
  444.             {
  445.                 if (DockState == DockState.Hidden || DockState == DockState.Unknown ||
  446.                     DockHelper.IsDockStateAutoHide(DockState))
  447.                     DockPanel.ContentFocusManager.RemoveFromList(Content);
  448.                 else
  449.                     DockPanel.ContentFocusManager.AddToList(Content);
  450.                 OnDockStateChanged(EventArgs.Empty);
  451.             }
  452. ResumeSetDockState();
  453.             if (dockPanel != null)
  454.                 dockPanel.ResumeLayout(true, true);
  455. }
  456. private static void RefreshDockPane(DockPane pane)
  457. {
  458. pane.RefreshChanges();
  459. pane.ValidateActiveContent();
  460. }
  461. internal string PersistString
  462. {
  463. get { return GetPersistStringCallback == null ? Form.GetType().ToString() : GetPersistStringCallback(); }
  464. }
  465. private GetPersistStringCallback m_getPersistStringCallback = null;
  466. public GetPersistStringCallback GetPersistStringCallback
  467. {
  468. get { return m_getPersistStringCallback; }
  469. set { m_getPersistStringCallback = value; }
  470. }
  471. private bool m_hideOnClose = false;
  472. public bool HideOnClose
  473. {
  474. get { return m_hideOnClose; }
  475. set { m_hideOnClose = value; }
  476. }
  477. private DockState m_showHint = DockState.Unknown;
  478. public DockState ShowHint
  479. {
  480. get { return m_showHint; }
  481. set
  482. {
  483. if (!DockHelper.IsDockStateValid(value, DockAreas))
  484. throw (new InvalidOperationException(Strings.DockContentHandler_ShowHint_InvalidValue));
  485. if (m_showHint == value)
  486. return;
  487. m_showHint = value;
  488. }
  489. }
  490. private bool m_isActivated = false;
  491. public bool IsActivated
  492. {
  493. get { return m_isActivated; }
  494.     internal set
  495.     {
  496.             if (m_isActivated == value)
  497.             return;
  498.             m_isActivated = value;
  499.     }
  500. }
  501. public bool IsDockStateValid(DockState dockState)
  502. {
  503. if (DockPanel != null && dockState == DockState.Document && DockPanel.DocumentStyle == DocumentStyle.SystemMdi)
  504. return false;
  505. else
  506. return DockHelper.IsDockStateValid(dockState, DockAreas);
  507. }
  508. private ContextMenu m_tabPageContextMenu = null;
  509. public ContextMenu TabPageContextMenu
  510. {
  511. get { return m_tabPageContextMenu; }
  512. set { m_tabPageContextMenu = value; }
  513. }
  514. private string m_toolTipText = null;
  515. public string ToolTipText
  516. {
  517. get { return m_toolTipText; }
  518. set { m_toolTipText = value; }
  519. }
  520. public void Activate()
  521. {
  522. if (DockPanel == null)
  523. Form.Activate();
  524. else if (Pane == null)
  525. Show(DockPanel);
  526. else
  527. {
  528. IsHidden = false;
  529. Pane.ActiveContent = Content;
  530.                 if (DockState == DockState.Document && DockPanel.DocumentStyle == DocumentStyle.SystemMdi)
  531.                 {
  532.                     Form.Activate();
  533.                     return;
  534.                 }
  535.                 else if (DockHelper.IsDockStateAutoHide(DockState))
  536.                     DockPanel.ActiveAutoHideContent = Content;
  537.                 if (!Form.ContainsFocus)
  538.                     DockPanel.ContentFocusManager.Activate(Content);
  539. }
  540. }
  541.         public void GiveUpFocus()
  542.         {
  543.             DockPanel.ContentFocusManager.GiveUpFocus(Content);
  544.         }
  545. private IntPtr m_activeWindowHandle = IntPtr.Zero;
  546. internal IntPtr ActiveWindowHandle
  547. {
  548. get { return m_activeWindowHandle; }
  549. set { m_activeWindowHandle = value; }
  550. }
  551. public void Hide()
  552. {
  553. IsHidden = true;
  554. }
  555.         internal void SetPaneAndVisible(DockPane pane)
  556.         {
  557.             SetPane(pane);
  558.             SetVisible();
  559.         }
  560. private void SetPane(DockPane pane)
  561. {
  562. if (pane != null && pane.DockState == DockState.Document && DockPanel.DocumentStyle == DocumentStyle.DockingMdi)
  563. {
  564. if (Form.Parent is DockPane)
  565. SetParent(null);
  566. if (Form.MdiParent != DockPanel.ParentForm)
  567. {
  568. FlagClipWindow = true;
  569. Form.MdiParent = DockPanel.ParentForm;
  570. }
  571. }
  572. else
  573. {
  574. FlagClipWindow = true;
  575. if (Form.MdiParent != null)
  576. Form.MdiParent = null;
  577. if (Form.TopLevel)
  578. Form.TopLevel = false;
  579. SetParent(pane);
  580. }
  581. }
  582. internal void SetVisible()
  583. {
  584. bool visible;
  585. if (IsHidden)
  586. visible = false;
  587. else if (Pane != null && Pane.DockState == DockState.Document && DockPanel.DocumentStyle == DocumentStyle.DockingMdi)
  588. visible = true;
  589. else if (Pane != null && Pane.ActiveContent == Content)
  590. visible = true;
  591. else if (Pane != null && Pane.ActiveContent != Content)
  592. visible = false;
  593. else
  594. visible = Form.Visible;
  595.             if (Form.Visible != visible)
  596.                 Form.Visible = visible;
  597. }
  598. private void SetParent(Control value)
  599. {
  600. if (Form.Parent == value)
  601. return;
  602.             //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  603.             // Workaround of .Net Framework bug:
  604.             // Change the parent of a control with focus may result in the first
  605.             // MDI child form get activated. 
  606.             //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  607.             bool bRestoreFocus = false;
  608.             if (Form.ContainsFocus)
  609.             {
  610. //Suggested as a fix for a memory leak by bugreports
  611.                 if (value == null && !IsFloat)
  612.                     DockPanel.ContentFocusManager.GiveUpFocus(this.Content);
  613.                 else
  614.                 {
  615.                     DockPanel.SaveFocus();
  616.                     bRestoreFocus = true;
  617.                 }
  618.             }
  619.             //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  620.             Form.Parent = value;
  621.             //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  622.             // Workaround of .Net Framework bug:
  623.             // Change the parent of a control with focus may result in the first
  624.             // MDI child form get activated. 
  625.             //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  626.             if (bRestoreFocus)
  627.                 Activate();
  628.             //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  629.         }
  630. public void Show()
  631. {
  632. if (DockPanel == null)
  633. Form.Show();
  634. else
  635. Show(DockPanel);
  636. }
  637. public void Show(DockPanel dockPanel)
  638. {
  639. if (dockPanel == null)
  640. throw(new ArgumentNullException(Strings.DockContentHandler_Show_NullDockPanel));
  641. if (DockState == DockState.Unknown)
  642. Show(dockPanel, DefaultShowState);
  643. else
  644. Activate();
  645. }
  646. public void Show(DockPanel dockPanel, DockState dockState)
  647. {
  648. if (dockPanel == null)
  649. throw(new ArgumentNullException(Strings.DockContentHandler_Show_NullDockPanel));
  650. if (dockState == DockState.Unknown || dockState == DockState.Hidden)
  651. throw(new ArgumentException(Strings.DockContentHandler_Show_InvalidDockState));
  652.             dockPanel.SuspendLayout(true);
  653. DockPanel = dockPanel;
  654. if (dockState == DockState.Float && FloatPane == null)
  655. Pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.Float, true);
  656. else if (PanelPane == null)
  657. {
  658. DockPane paneExisting = null;
  659. foreach (DockPane pane in DockPanel.Panes)
  660. if (pane.DockState == dockState)
  661. {
  662. paneExisting = pane;
  663. break;
  664. }
  665. if (paneExisting == null)
  666. Pane = DockPanel.DockPaneFactory.CreateDockPane(Content, dockState, true);
  667. else
  668. Pane = paneExisting;
  669. }
  670. DockState = dockState;
  671.             dockPanel.ResumeLayout(true, true); //we'll resume the layout before activating to ensure that the position
  672.             Activate();                         //and size of the form are finally processed before the form is shown
  673. }
  674.         [SuppressMessage("Microsoft.Naming", "CA1720:AvoidTypeNamesInParameters")]
  675. public void Show(DockPanel dockPanel, Rectangle floatWindowBounds)
  676. {
  677. if (dockPanel == null)
  678. throw(new ArgumentNullException(Strings.DockContentHandler_Show_NullDockPanel));
  679.             dockPanel.SuspendLayout(true);
  680. DockPanel = dockPanel;
  681. if (FloatPane == null)
  682. {
  683. IsHidden = true; // to reduce the screen flicker
  684. FloatPane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.Float, false);
  685. FloatPane.FloatWindow.StartPosition = FormStartPosition.Manual;
  686. }
  687. FloatPane.FloatWindow.Bounds = floatWindowBounds;
  688. Show(dockPanel, DockState.Float);
  689. Activate();
  690.             dockPanel.ResumeLayout(true, true);
  691. }
  692. public void Show(DockPane pane, IDockContent beforeContent)
  693. {
  694. if (pane == null)
  695. throw(new ArgumentNullException(Strings.DockContentHandler_Show_NullPane));
  696. if (beforeContent != null && pane.Contents.IndexOf(beforeContent) == -1)
  697. throw(new ArgumentException(Strings.DockContentHandler_Show_InvalidBeforeContent));
  698.             pane.DockPanel.SuspendLayout(true);
  699. DockPanel = pane.DockPanel;
  700. Pane = pane;
  701. pane.SetContentIndex(Content, pane.Contents.IndexOf(beforeContent));
  702. Show();
  703.             pane.DockPanel.ResumeLayout(true, true);
  704. }
  705. public void Show(DockPane previousPane, DockAlignment alignment, double proportion)
  706. {
  707. if (previousPane == null)
  708. throw(new ArgumentException(Strings.DockContentHandler_Show_InvalidPrevPane));
  709. if (DockHelper.IsDockStateAutoHide(previousPane.DockState))
  710. throw(new ArgumentException(Strings.DockContentHandler_Show_InvalidPrevPane));
  711.             previousPane.DockPanel.SuspendLayout(true);
  712. DockPanel = previousPane.DockPanel;
  713. DockPanel.DockPaneFactory.CreateDockPane(Content, previousPane, alignment, proportion, true);
  714. Show();
  715.             previousPane.DockPanel.ResumeLayout(true, true);
  716. }
  717. public void Close()
  718. {
  719. DockPanel dockPanel = DockPanel;
  720.             if (dockPanel != null)
  721.                 dockPanel.SuspendLayout(true);
  722. Form.Close();
  723. if (dockPanel != null)
  724. dockPanel.ResumeLayout(true, true);
  725. }
  726. private DockPaneStripBase.Tab m_tab = null;
  727. internal DockPaneStripBase.Tab GetTab(DockPaneStripBase dockPaneStrip)
  728. {
  729.             if (m_tab == null)
  730.                 m_tab = dockPaneStrip.CreateTab(Content);
  731.             return m_tab;
  732. }
  733. private IDisposable m_autoHideTab = null;
  734. internal IDisposable AutoHideTab
  735. {
  736.             get { return m_autoHideTab; }
  737.             set { m_autoHideTab = value; }
  738. }
  739. #region Events
  740. private static readonly object DockStateChangedEvent = new object();
  741. public event EventHandler DockStateChanged
  742. {
  743. add { Events.AddHandler(DockStateChangedEvent, value); }
  744. remove { Events.RemoveHandler(DockStateChangedEvent, value); }
  745. }
  746. protected virtual void OnDockStateChanged(EventArgs e)
  747. {
  748. EventHandler handler = (EventHandler)Events[DockStateChangedEvent];
  749. if (handler != null)
  750. handler(this, e);
  751. }
  752. #endregion
  753. private void Form_Disposed(object sender, EventArgs e)
  754. {
  755. Dispose();
  756. }
  757. private void Form_TextChanged(object sender, EventArgs e)
  758. {
  759. if (DockHelper.IsDockStateAutoHide(DockState))
  760. DockPanel.RefreshAutoHideStrip();
  761. else if (Pane != null)
  762. {
  763. if (Pane.FloatWindow != null)
  764. Pane.FloatWindow.SetText();
  765. Pane.RefreshChanges();
  766. }
  767. }
  768. private bool m_flagClipWindow = false;
  769. internal bool FlagClipWindow
  770. {
  771. get { return m_flagClipWindow; }
  772. set
  773. {
  774. if (m_flagClipWindow == value)
  775. return;
  776. m_flagClipWindow = value;
  777. if (m_flagClipWindow)
  778. Form.Region = new Region(Rectangle.Empty);
  779. else
  780. Form.Region = null;
  781. }
  782. }
  783.         private ContextMenuStrip m_tabPageContextMenuStrip = null;
  784.         public ContextMenuStrip TabPageContextMenuStrip
  785.         {
  786.             get { return m_tabPageContextMenuStrip; }
  787.             set { m_tabPageContextMenuStrip = value; }
  788.         }
  789.         #region IDockDragSource Members
  790.         Control IDragSource.DragControl
  791.         {
  792.             get { return Form; }
  793.         }
  794.         bool IDockDragSource.CanDockTo(DockPane pane)
  795.         {
  796.             if (!IsDockStateValid(pane.DockState))
  797.                 return false;
  798.             if (Pane == pane && pane.DisplayingContents.Count == 1)
  799.                 return false;
  800.             return true;
  801.         }
  802.         Rectangle IDockDragSource.BeginDrag(Point ptMouse)
  803.         {
  804.             Size size;
  805.             DockPane floatPane = this.FloatPane;
  806.             if (DockState == DockState.Float || floatPane == null || floatPane.FloatWindow.NestedPanes.Count != 1)
  807.                 size = DockPanel.DefaultFloatWindowSize;
  808.             else
  809.                 size = floatPane.FloatWindow.Size;
  810.             Point location;
  811. Rectangle rectPane = Pane.ClientRectangle;
  812.             if (DockState == DockState.Document)
  813.             {
  814.                 if (Pane.DockPanel.DocumentTabStripLocation == DocumentTabStripLocation.Bottom)
  815.                     location = new Point(rectPane.Left, rectPane.Bottom - size.Height);
  816.                 else
  817.                     location = new Point(rectPane.Left, rectPane.Top);
  818.             }
  819.             else
  820.             {
  821.                 location = new Point(rectPane.Left, rectPane.Bottom);
  822.                 location.Y -= size.Height;
  823.             }
  824.             location = Pane.PointToScreen(location);
  825.             if (ptMouse.X > location.X + size.Width)
  826.                 location.X += ptMouse.X - (location.X + size.Width) + Measures.SplitterSize;
  827.             return new Rectangle(location, size);
  828.         }
  829.         public void FloatAt(Rectangle floatWindowBounds)
  830.         {
  831.             DockPane pane = DockPanel.DockPaneFactory.CreateDockPane(Content, floatWindowBounds, true);
  832.         }
  833.         public void DockTo(DockPane pane, DockStyle dockStyle, int contentIndex)
  834.         {
  835. if (dockStyle == DockStyle.Fill)
  836. {
  837. bool samePane = (Pane == pane);
  838. if (!samePane)
  839. Pane = pane;
  840. if (contentIndex == -1 || !samePane)
  841. pane.SetContentIndex(Content, contentIndex);
  842. else
  843. {
  844. DockContentCollection contents = pane.Contents;
  845. int oldIndex = contents.IndexOf(Content);
  846. int newIndex = contentIndex;
  847. if (oldIndex < newIndex)
  848. {
  849. newIndex += 1;
  850. if (newIndex > contents.Count -1)
  851. newIndex = -1;
  852. }
  853. pane.SetContentIndex(Content, newIndex);
  854. }
  855. }
  856. else
  857. {
  858. DockPane paneFrom = DockPanel.DockPaneFactory.CreateDockPane(Content, pane.DockState, true);
  859. INestedPanesContainer container = pane.NestedPanesContainer;
  860. if (dockStyle == DockStyle.Left)
  861. paneFrom.DockTo(container, pane, DockAlignment.Left, 0.5);
  862. else if (dockStyle == DockStyle.Right) 
  863. paneFrom.DockTo(container, pane, DockAlignment.Right, 0.5);
  864. else if (dockStyle == DockStyle.Top)
  865. paneFrom.DockTo(container, pane, DockAlignment.Top, 0.5);
  866. else if (dockStyle == DockStyle.Bottom) 
  867. paneFrom.DockTo(container, pane, DockAlignment.Bottom, 0.5);
  868. paneFrom.DockState = pane.DockState;
  869. }
  870.         }
  871.         public void DockTo(DockPanel panel, DockStyle dockStyle)
  872.         {
  873.             if (panel != DockPanel)
  874.                 throw new ArgumentException(Strings.IDockDragSource_DockTo_InvalidPanel, "panel");
  875.             DockPane pane;
  876.             if (dockStyle == DockStyle.Top)
  877.                 pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.DockTop, true);
  878.             else if (dockStyle == DockStyle.Bottom)
  879.                 pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.DockBottom, true);
  880.             else if (dockStyle == DockStyle.Left)
  881.                 pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.DockLeft, true);
  882.             else if (dockStyle == DockStyle.Right)
  883.                 pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.DockRight, true);
  884.             else if (dockStyle == DockStyle.Fill)
  885.                 pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.Document, true);
  886.             else
  887.                 return;
  888.         }
  889.         #endregion
  890.     }
  891. }