DockContentHandler.cs 38 KB

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