DockPanel.Persistor.cs 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940
  1. /*******************************************************************************
  2. * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential
  3. * 类的信息:
  4. * 1.程序名称:DockPanel.cs
  5. * 2.功能描述:类文件
  6. * 编辑履历:
  7. * 作者 日期 版本 修改内容
  8. * 陈晓野 2014/09/01 1.00 新建
  9. *******************************************************************************/
  10. using System;
  11. using System.ComponentModel;
  12. using System.Drawing;
  13. using System.Globalization;
  14. using System.IO;
  15. using System.Text;
  16. using System.Xml;
  17. namespace Dongke.IBOSS.PRD.Basics.DockPanel
  18. {
  19. /// <summary>
  20. /// 类文件
  21. /// </summary>
  22. partial class DockPanel
  23. {
  24. private static class Persistor
  25. {
  26. private const string ConfigFileVersion = "1.0";
  27. private static string[] CompatibleConfigFileVersions = new string[] { };
  28. private class DummyContent : DockContent
  29. {
  30. }
  31. private struct DockPanelStruct
  32. {
  33. private double m_dockLeftPortion;
  34. public double DockLeftPortion
  35. {
  36. get
  37. {
  38. return m_dockLeftPortion;
  39. }
  40. set
  41. {
  42. m_dockLeftPortion = value;
  43. }
  44. }
  45. private double m_dockRightPortion;
  46. public double DockRightPortion
  47. {
  48. get
  49. {
  50. return m_dockRightPortion;
  51. }
  52. set
  53. {
  54. m_dockRightPortion = value;
  55. }
  56. }
  57. private double m_dockTopPortion;
  58. public double DockTopPortion
  59. {
  60. get
  61. {
  62. return m_dockTopPortion;
  63. }
  64. set
  65. {
  66. m_dockTopPortion = value;
  67. }
  68. }
  69. private double m_dockBottomPortion;
  70. public double DockBottomPortion
  71. {
  72. get
  73. {
  74. return m_dockBottomPortion;
  75. }
  76. set
  77. {
  78. m_dockBottomPortion = value;
  79. }
  80. }
  81. private int m_indexActiveDocumentPane;
  82. public int IndexActiveDocumentPane
  83. {
  84. get
  85. {
  86. return m_indexActiveDocumentPane;
  87. }
  88. set
  89. {
  90. m_indexActiveDocumentPane = value;
  91. }
  92. }
  93. private int m_indexActivePane;
  94. public int IndexActivePane
  95. {
  96. get
  97. {
  98. return m_indexActivePane;
  99. }
  100. set
  101. {
  102. m_indexActivePane = value;
  103. }
  104. }
  105. }
  106. private struct ContentStruct
  107. {
  108. private string m_persistString;
  109. public string PersistString
  110. {
  111. get
  112. {
  113. return m_persistString;
  114. }
  115. set
  116. {
  117. m_persistString = value;
  118. }
  119. }
  120. private double m_autoHidePortion;
  121. public double AutoHidePortion
  122. {
  123. get
  124. {
  125. return m_autoHidePortion;
  126. }
  127. set
  128. {
  129. m_autoHidePortion = value;
  130. }
  131. }
  132. private bool m_isHidden;
  133. public bool IsHidden
  134. {
  135. get
  136. {
  137. return m_isHidden;
  138. }
  139. set
  140. {
  141. m_isHidden = value;
  142. }
  143. }
  144. private bool m_isFloat;
  145. public bool IsFloat
  146. {
  147. get
  148. {
  149. return m_isFloat;
  150. }
  151. set
  152. {
  153. m_isFloat = value;
  154. }
  155. }
  156. }
  157. private struct PaneStruct
  158. {
  159. private DockState m_dockState;
  160. public DockState DockState
  161. {
  162. get
  163. {
  164. return m_dockState;
  165. }
  166. set
  167. {
  168. m_dockState = value;
  169. }
  170. }
  171. private int m_indexActiveContent;
  172. public int IndexActiveContent
  173. {
  174. get
  175. {
  176. return m_indexActiveContent;
  177. }
  178. set
  179. {
  180. m_indexActiveContent = value;
  181. }
  182. }
  183. private int[] m_indexContents;
  184. public int[] IndexContents
  185. {
  186. get
  187. {
  188. return m_indexContents;
  189. }
  190. set
  191. {
  192. m_indexContents = value;
  193. }
  194. }
  195. private int m_zOrderIndex;
  196. public int ZOrderIndex
  197. {
  198. get
  199. {
  200. return m_zOrderIndex;
  201. }
  202. set
  203. {
  204. m_zOrderIndex = value;
  205. }
  206. }
  207. }
  208. private struct NestedPane
  209. {
  210. private int m_indexPane;
  211. public int IndexPane
  212. {
  213. get
  214. {
  215. return m_indexPane;
  216. }
  217. set
  218. {
  219. m_indexPane = value;
  220. }
  221. }
  222. private int m_indexPrevPane;
  223. public int IndexPrevPane
  224. {
  225. get
  226. {
  227. return m_indexPrevPane;
  228. }
  229. set
  230. {
  231. m_indexPrevPane = value;
  232. }
  233. }
  234. private DockAlignment m_alignment;
  235. public DockAlignment Alignment
  236. {
  237. get
  238. {
  239. return m_alignment;
  240. }
  241. set
  242. {
  243. m_alignment = value;
  244. }
  245. }
  246. private double m_proportion;
  247. public double Proportion
  248. {
  249. get
  250. {
  251. return m_proportion;
  252. }
  253. set
  254. {
  255. m_proportion = value;
  256. }
  257. }
  258. }
  259. private struct DockWindowStruct
  260. {
  261. private DockState m_dockState;
  262. public DockState DockState
  263. {
  264. get
  265. {
  266. return m_dockState;
  267. }
  268. set
  269. {
  270. m_dockState = value;
  271. }
  272. }
  273. private int m_zOrderIndex;
  274. public int ZOrderIndex
  275. {
  276. get
  277. {
  278. return m_zOrderIndex;
  279. }
  280. set
  281. {
  282. m_zOrderIndex = value;
  283. }
  284. }
  285. private NestedPane[] m_nestedPanes;
  286. public NestedPane[] NestedPanes
  287. {
  288. get
  289. {
  290. return m_nestedPanes;
  291. }
  292. set
  293. {
  294. m_nestedPanes = value;
  295. }
  296. }
  297. }
  298. private struct FloatWindowStruct
  299. {
  300. private Rectangle m_bounds;
  301. public Rectangle Bounds
  302. {
  303. get
  304. {
  305. return m_bounds;
  306. }
  307. set
  308. {
  309. m_bounds = value;
  310. }
  311. }
  312. private int m_zOrderIndex;
  313. public int ZOrderIndex
  314. {
  315. get
  316. {
  317. return m_zOrderIndex;
  318. }
  319. set
  320. {
  321. m_zOrderIndex = value;
  322. }
  323. }
  324. private NestedPane[] m_nestedPanes;
  325. public NestedPane[] NestedPanes
  326. {
  327. get
  328. {
  329. return m_nestedPanes;
  330. }
  331. set
  332. {
  333. m_nestedPanes = value;
  334. }
  335. }
  336. }
  337. public static void SaveAsXml(DockPanel dockPanel, string fileName)
  338. {
  339. SaveAsXml(dockPanel, fileName, Encoding.Unicode);
  340. }
  341. public static void SaveAsXml(DockPanel dockPanel, string fileName, Encoding encoding)
  342. {
  343. FileStream fs = new FileStream(fileName, FileMode.Create);
  344. try
  345. {
  346. SaveAsXml(dockPanel, fs, encoding);
  347. }
  348. finally
  349. {
  350. fs.Close();
  351. }
  352. }
  353. public static void SaveAsXml(DockPanel dockPanel, Stream stream, Encoding encoding)
  354. {
  355. SaveAsXml(dockPanel, stream, encoding, false);
  356. }
  357. public static void SaveAsXml(DockPanel dockPanel, Stream stream, Encoding encoding, bool upstream)
  358. {
  359. XmlTextWriter xmlOut = new XmlTextWriter(stream, encoding);
  360. // Use indenting for readability
  361. xmlOut.Formatting = Formatting.Indented;
  362. if (!upstream)
  363. xmlOut.WriteStartDocument();
  364. // Always begin file with identification and warning
  365. xmlOut.WriteComment(Strings.DockPanel_Persistor_XmlFileComment1);
  366. xmlOut.WriteComment(Strings.DockPanel_Persistor_XmlFileComment2);
  367. // Associate a version number with the root element so that future version of the code
  368. // will be able to be backwards compatible or at least recognise out of date versions
  369. xmlOut.WriteStartElement("DockPanel");
  370. xmlOut.WriteAttributeString("FormatVersion", ConfigFileVersion);
  371. xmlOut.WriteAttributeString("DockLeftPortion", dockPanel.DockLeftPortion.ToString(CultureInfo.InvariantCulture));
  372. xmlOut.WriteAttributeString("DockRightPortion", dockPanel.DockRightPortion.ToString(CultureInfo.InvariantCulture));
  373. xmlOut.WriteAttributeString("DockTopPortion", dockPanel.DockTopPortion.ToString(CultureInfo.InvariantCulture));
  374. xmlOut.WriteAttributeString("DockBottomPortion", dockPanel.DockBottomPortion.ToString(CultureInfo.InvariantCulture));
  375. if (!Win32Helper.IsRunningOnMono)
  376. {
  377. xmlOut.WriteAttributeString("ActiveDocumentPane", dockPanel.Panes.IndexOf(dockPanel.ActiveDocumentPane).ToString(CultureInfo.InvariantCulture));
  378. xmlOut.WriteAttributeString("ActivePane", dockPanel.Panes.IndexOf(dockPanel.ActivePane).ToString(CultureInfo.InvariantCulture));
  379. }
  380. // Contents
  381. xmlOut.WriteStartElement("Contents");
  382. xmlOut.WriteAttributeString("Count", dockPanel.Contents.Count.ToString(CultureInfo.InvariantCulture));
  383. foreach (IDockContent content in dockPanel.Contents)
  384. {
  385. xmlOut.WriteStartElement("Content");
  386. xmlOut.WriteAttributeString("ID", dockPanel.Contents.IndexOf(content).ToString(CultureInfo.InvariantCulture));
  387. xmlOut.WriteAttributeString("PersistString", content.DockHandler.PersistString);
  388. xmlOut.WriteAttributeString("AutoHidePortion", content.DockHandler.AutoHidePortion.ToString(CultureInfo.InvariantCulture));
  389. xmlOut.WriteAttributeString("IsHidden", content.DockHandler.IsHidden.ToString(CultureInfo.InvariantCulture));
  390. xmlOut.WriteAttributeString("IsFloat", content.DockHandler.IsFloat.ToString(CultureInfo.InvariantCulture));
  391. xmlOut.WriteEndElement();
  392. }
  393. xmlOut.WriteEndElement();
  394. // Panes
  395. xmlOut.WriteStartElement("Panes");
  396. xmlOut.WriteAttributeString("Count", dockPanel.Panes.Count.ToString(CultureInfo.InvariantCulture));
  397. foreach (DockPane pane in dockPanel.Panes)
  398. {
  399. xmlOut.WriteStartElement("Pane");
  400. xmlOut.WriteAttributeString("ID", dockPanel.Panes.IndexOf(pane).ToString(CultureInfo.InvariantCulture));
  401. xmlOut.WriteAttributeString("DockState", pane.DockState.ToString());
  402. xmlOut.WriteAttributeString("ActiveContent", dockPanel.Contents.IndexOf(pane.ActiveContent).ToString(CultureInfo.InvariantCulture));
  403. xmlOut.WriteStartElement("Contents");
  404. xmlOut.WriteAttributeString("Count", pane.Contents.Count.ToString(CultureInfo.InvariantCulture));
  405. foreach (IDockContent content in pane.Contents)
  406. {
  407. xmlOut.WriteStartElement("Content");
  408. xmlOut.WriteAttributeString("ID", pane.Contents.IndexOf(content).ToString(CultureInfo.InvariantCulture));
  409. xmlOut.WriteAttributeString("RefID", dockPanel.Contents.IndexOf(content).ToString(CultureInfo.InvariantCulture));
  410. xmlOut.WriteEndElement();
  411. }
  412. xmlOut.WriteEndElement();
  413. xmlOut.WriteEndElement();
  414. }
  415. xmlOut.WriteEndElement();
  416. // DockWindows
  417. xmlOut.WriteStartElement("DockWindows");
  418. int dockWindowId = 0;
  419. foreach (DockWindow dw in dockPanel.DockWindows)
  420. {
  421. xmlOut.WriteStartElement("DockWindow");
  422. xmlOut.WriteAttributeString("ID", dockWindowId.ToString(CultureInfo.InvariantCulture));
  423. dockWindowId++;
  424. xmlOut.WriteAttributeString("DockState", dw.DockState.ToString());
  425. xmlOut.WriteAttributeString("ZOrderIndex", dockPanel.Controls.IndexOf(dw).ToString(CultureInfo.InvariantCulture));
  426. xmlOut.WriteStartElement("NestedPanes");
  427. xmlOut.WriteAttributeString("Count", dw.NestedPanes.Count.ToString(CultureInfo.InvariantCulture));
  428. foreach (DockPane pane in dw.NestedPanes)
  429. {
  430. xmlOut.WriteStartElement("Pane");
  431. xmlOut.WriteAttributeString("ID", dw.NestedPanes.IndexOf(pane).ToString(CultureInfo.InvariantCulture));
  432. xmlOut.WriteAttributeString("RefID", dockPanel.Panes.IndexOf(pane).ToString(CultureInfo.InvariantCulture));
  433. NestedDockingStatus status = pane.NestedDockingStatus;
  434. xmlOut.WriteAttributeString("PrevPane", dockPanel.Panes.IndexOf(status.PreviousPane).ToString(CultureInfo.InvariantCulture));
  435. xmlOut.WriteAttributeString("Alignment", status.Alignment.ToString());
  436. xmlOut.WriteAttributeString("Proportion", status.Proportion.ToString(CultureInfo.InvariantCulture));
  437. xmlOut.WriteEndElement();
  438. }
  439. xmlOut.WriteEndElement();
  440. xmlOut.WriteEndElement();
  441. }
  442. xmlOut.WriteEndElement();
  443. // FloatWindows
  444. RectangleConverter rectConverter = new RectangleConverter();
  445. xmlOut.WriteStartElement("FloatWindows");
  446. xmlOut.WriteAttributeString("Count", dockPanel.FloatWindows.Count.ToString(CultureInfo.InvariantCulture));
  447. foreach (FloatWindow fw in dockPanel.FloatWindows)
  448. {
  449. xmlOut.WriteStartElement("FloatWindow");
  450. xmlOut.WriteAttributeString("ID", dockPanel.FloatWindows.IndexOf(fw).ToString(CultureInfo.InvariantCulture));
  451. xmlOut.WriteAttributeString("Bounds", rectConverter.ConvertToInvariantString(fw.Bounds));
  452. xmlOut.WriteAttributeString("ZOrderIndex", fw.DockPanel.FloatWindows.IndexOf(fw).ToString(CultureInfo.InvariantCulture));
  453. xmlOut.WriteStartElement("NestedPanes");
  454. xmlOut.WriteAttributeString("Count", fw.NestedPanes.Count.ToString(CultureInfo.InvariantCulture));
  455. foreach (DockPane pane in fw.NestedPanes)
  456. {
  457. xmlOut.WriteStartElement("Pane");
  458. xmlOut.WriteAttributeString("ID", fw.NestedPanes.IndexOf(pane).ToString(CultureInfo.InvariantCulture));
  459. xmlOut.WriteAttributeString("RefID", dockPanel.Panes.IndexOf(pane).ToString(CultureInfo.InvariantCulture));
  460. NestedDockingStatus status = pane.NestedDockingStatus;
  461. xmlOut.WriteAttributeString("PrevPane", dockPanel.Panes.IndexOf(status.PreviousPane).ToString(CultureInfo.InvariantCulture));
  462. xmlOut.WriteAttributeString("Alignment", status.Alignment.ToString());
  463. xmlOut.WriteAttributeString("Proportion", status.Proportion.ToString(CultureInfo.InvariantCulture));
  464. xmlOut.WriteEndElement();
  465. }
  466. xmlOut.WriteEndElement();
  467. xmlOut.WriteEndElement();
  468. }
  469. xmlOut.WriteEndElement(); // </FloatWindows>
  470. xmlOut.WriteEndElement();
  471. if (!upstream)
  472. {
  473. xmlOut.WriteEndDocument();
  474. xmlOut.Close();
  475. }
  476. else
  477. xmlOut.Flush();
  478. }
  479. public static void LoadFromXml(DockPanel dockPanel, string fileName, DeserializeDockContent deserializeContent)
  480. {
  481. FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
  482. try
  483. {
  484. LoadFromXml(dockPanel, fs, deserializeContent);
  485. }
  486. finally
  487. {
  488. fs.Close();
  489. }
  490. }
  491. public static void LoadFromXml(DockPanel dockPanel, Stream stream, DeserializeDockContent deserializeContent)
  492. {
  493. LoadFromXml(dockPanel, stream, deserializeContent, true);
  494. }
  495. private static ContentStruct[] LoadContents(XmlTextReader xmlIn)
  496. {
  497. int countOfContents = Convert.ToInt32(xmlIn.GetAttribute("Count"), CultureInfo.InvariantCulture);
  498. ContentStruct[] contents = new ContentStruct[countOfContents];
  499. MoveToNextElement(xmlIn);
  500. for (int i = 0; i < countOfContents; i++)
  501. {
  502. int id = Convert.ToInt32(xmlIn.GetAttribute("ID"), CultureInfo.InvariantCulture);
  503. if (xmlIn.Name != "Content" || id != i)
  504. throw new ArgumentException(Strings.DockPanel_LoadFromXml_InvalidXmlFormat);
  505. contents[i].PersistString = xmlIn.GetAttribute("PersistString");
  506. contents[i].AutoHidePortion = Convert.ToDouble(xmlIn.GetAttribute("AutoHidePortion"), CultureInfo.InvariantCulture);
  507. contents[i].IsHidden = Convert.ToBoolean(xmlIn.GetAttribute("IsHidden"), CultureInfo.InvariantCulture);
  508. contents[i].IsFloat = Convert.ToBoolean(xmlIn.GetAttribute("IsFloat"), CultureInfo.InvariantCulture);
  509. MoveToNextElement(xmlIn);
  510. }
  511. return contents;
  512. }
  513. private static PaneStruct[] LoadPanes(XmlTextReader xmlIn)
  514. {
  515. EnumConverter dockStateConverter = new EnumConverter(typeof(DockState));
  516. int countOfPanes = Convert.ToInt32(xmlIn.GetAttribute("Count"), CultureInfo.InvariantCulture);
  517. PaneStruct[] panes = new PaneStruct[countOfPanes];
  518. MoveToNextElement(xmlIn);
  519. for (int i = 0; i < countOfPanes; i++)
  520. {
  521. int id = Convert.ToInt32(xmlIn.GetAttribute("ID"), CultureInfo.InvariantCulture);
  522. if (xmlIn.Name != "Pane" || id != i)
  523. throw new ArgumentException(Strings.DockPanel_LoadFromXml_InvalidXmlFormat);
  524. panes[i].DockState = (DockState)dockStateConverter.ConvertFrom(xmlIn.GetAttribute("DockState"));
  525. panes[i].IndexActiveContent = Convert.ToInt32(xmlIn.GetAttribute("ActiveContent"), CultureInfo.InvariantCulture);
  526. panes[i].ZOrderIndex = -1;
  527. MoveToNextElement(xmlIn);
  528. if (xmlIn.Name != "Contents")
  529. throw new ArgumentException(Strings.DockPanel_LoadFromXml_InvalidXmlFormat);
  530. int countOfPaneContents = Convert.ToInt32(xmlIn.GetAttribute("Count"), CultureInfo.InvariantCulture);
  531. panes[i].IndexContents = new int[countOfPaneContents];
  532. MoveToNextElement(xmlIn);
  533. for (int j = 0; j < countOfPaneContents; j++)
  534. {
  535. int id2 = Convert.ToInt32(xmlIn.GetAttribute("ID"), CultureInfo.InvariantCulture);
  536. if (xmlIn.Name != "Content" || id2 != j)
  537. throw new ArgumentException(Strings.DockPanel_LoadFromXml_InvalidXmlFormat);
  538. panes[i].IndexContents[j] = Convert.ToInt32(xmlIn.GetAttribute("RefID"), CultureInfo.InvariantCulture);
  539. MoveToNextElement(xmlIn);
  540. }
  541. }
  542. return panes;
  543. }
  544. private static DockWindowStruct[] LoadDockWindows(XmlTextReader xmlIn, DockPanel dockPanel)
  545. {
  546. EnumConverter dockStateConverter = new EnumConverter(typeof(DockState));
  547. EnumConverter dockAlignmentConverter = new EnumConverter(typeof(DockAlignment));
  548. int countOfDockWindows = dockPanel.DockWindows.Count;
  549. DockWindowStruct[] dockWindows = new DockWindowStruct[countOfDockWindows];
  550. MoveToNextElement(xmlIn);
  551. for (int i = 0; i < countOfDockWindows; i++)
  552. {
  553. int id = Convert.ToInt32(xmlIn.GetAttribute("ID"), CultureInfo.InvariantCulture);
  554. if (xmlIn.Name != "DockWindow" || id != i)
  555. throw new ArgumentException(Strings.DockPanel_LoadFromXml_InvalidXmlFormat);
  556. dockWindows[i].DockState = (DockState)dockStateConverter.ConvertFrom(xmlIn.GetAttribute("DockState"));
  557. dockWindows[i].ZOrderIndex = Convert.ToInt32(xmlIn.GetAttribute("ZOrderIndex"), CultureInfo.InvariantCulture);
  558. MoveToNextElement(xmlIn);
  559. if (xmlIn.Name != "DockList" && xmlIn.Name != "NestedPanes")
  560. throw new ArgumentException(Strings.DockPanel_LoadFromXml_InvalidXmlFormat);
  561. int countOfNestedPanes = Convert.ToInt32(xmlIn.GetAttribute("Count"), CultureInfo.InvariantCulture);
  562. dockWindows[i].NestedPanes = new NestedPane[countOfNestedPanes];
  563. MoveToNextElement(xmlIn);
  564. for (int j = 0; j < countOfNestedPanes; j++)
  565. {
  566. int id2 = Convert.ToInt32(xmlIn.GetAttribute("ID"), CultureInfo.InvariantCulture);
  567. if (xmlIn.Name != "Pane" || id2 != j)
  568. throw new ArgumentException(Strings.DockPanel_LoadFromXml_InvalidXmlFormat);
  569. dockWindows[i].NestedPanes[j].IndexPane = Convert.ToInt32(xmlIn.GetAttribute("RefID"), CultureInfo.InvariantCulture);
  570. dockWindows[i].NestedPanes[j].IndexPrevPane = Convert.ToInt32(xmlIn.GetAttribute("PrevPane"), CultureInfo.InvariantCulture);
  571. dockWindows[i].NestedPanes[j].Alignment = (DockAlignment)dockAlignmentConverter.ConvertFrom(xmlIn.GetAttribute("Alignment"));
  572. dockWindows[i].NestedPanes[j].Proportion = Convert.ToDouble(xmlIn.GetAttribute("Proportion"), CultureInfo.InvariantCulture);
  573. MoveToNextElement(xmlIn);
  574. }
  575. }
  576. return dockWindows;
  577. }
  578. private static FloatWindowStruct[] LoadFloatWindows(XmlTextReader xmlIn)
  579. {
  580. EnumConverter dockAlignmentConverter = new EnumConverter(typeof(DockAlignment));
  581. RectangleConverter rectConverter = new RectangleConverter();
  582. int countOfFloatWindows = Convert.ToInt32(xmlIn.GetAttribute("Count"), CultureInfo.InvariantCulture);
  583. FloatWindowStruct[] floatWindows = new FloatWindowStruct[countOfFloatWindows];
  584. MoveToNextElement(xmlIn);
  585. for (int i = 0; i < countOfFloatWindows; i++)
  586. {
  587. int id = Convert.ToInt32(xmlIn.GetAttribute("ID"), CultureInfo.InvariantCulture);
  588. if (xmlIn.Name != "FloatWindow" || id != i)
  589. throw new ArgumentException(Strings.DockPanel_LoadFromXml_InvalidXmlFormat);
  590. floatWindows[i].Bounds = (Rectangle)rectConverter.ConvertFromInvariantString(xmlIn.GetAttribute("Bounds"));
  591. floatWindows[i].ZOrderIndex = Convert.ToInt32(xmlIn.GetAttribute("ZOrderIndex"), CultureInfo.InvariantCulture);
  592. MoveToNextElement(xmlIn);
  593. if (xmlIn.Name != "DockList" && xmlIn.Name != "NestedPanes")
  594. throw new ArgumentException(Strings.DockPanel_LoadFromXml_InvalidXmlFormat);
  595. int countOfNestedPanes = Convert.ToInt32(xmlIn.GetAttribute("Count"), CultureInfo.InvariantCulture);
  596. floatWindows[i].NestedPanes = new NestedPane[countOfNestedPanes];
  597. MoveToNextElement(xmlIn);
  598. for (int j = 0; j < countOfNestedPanes; j++)
  599. {
  600. int id2 = Convert.ToInt32(xmlIn.GetAttribute("ID"), CultureInfo.InvariantCulture);
  601. if (xmlIn.Name != "Pane" || id2 != j)
  602. throw new ArgumentException(Strings.DockPanel_LoadFromXml_InvalidXmlFormat);
  603. floatWindows[i].NestedPanes[j].IndexPane = Convert.ToInt32(xmlIn.GetAttribute("RefID"), CultureInfo.InvariantCulture);
  604. floatWindows[i].NestedPanes[j].IndexPrevPane = Convert.ToInt32(xmlIn.GetAttribute("PrevPane"), CultureInfo.InvariantCulture);
  605. floatWindows[i].NestedPanes[j].Alignment = (DockAlignment)dockAlignmentConverter.ConvertFrom(xmlIn.GetAttribute("Alignment"));
  606. floatWindows[i].NestedPanes[j].Proportion = Convert.ToDouble(xmlIn.GetAttribute("Proportion"), CultureInfo.InvariantCulture);
  607. MoveToNextElement(xmlIn);
  608. }
  609. }
  610. return floatWindows;
  611. }
  612. public static void LoadFromXml(DockPanel dockPanel, Stream stream, DeserializeDockContent deserializeContent, bool closeStream)
  613. {
  614. if (dockPanel.Contents.Count != 0)
  615. throw new InvalidOperationException(Strings.DockPanel_LoadFromXml_AlreadyInitialized);
  616. XmlTextReader xmlIn = new XmlTextReader(stream);
  617. xmlIn.WhitespaceHandling = WhitespaceHandling.None;
  618. xmlIn.MoveToContent();
  619. while (!xmlIn.Name.Equals("DockPanel"))
  620. {
  621. if (!MoveToNextElement(xmlIn))
  622. throw new ArgumentException(Strings.DockPanel_LoadFromXml_InvalidXmlFormat);
  623. }
  624. string formatVersion = xmlIn.GetAttribute("FormatVersion");
  625. if (!IsFormatVersionValid(formatVersion))
  626. throw new ArgumentException(Strings.DockPanel_LoadFromXml_InvalidFormatVersion);
  627. DockPanelStruct dockPanelStruct = new DockPanelStruct();
  628. dockPanelStruct.DockLeftPortion = Convert.ToDouble(xmlIn.GetAttribute("DockLeftPortion"), CultureInfo.InvariantCulture);
  629. dockPanelStruct.DockRightPortion = Convert.ToDouble(xmlIn.GetAttribute("DockRightPortion"), CultureInfo.InvariantCulture);
  630. dockPanelStruct.DockTopPortion = Convert.ToDouble(xmlIn.GetAttribute("DockTopPortion"), CultureInfo.InvariantCulture);
  631. dockPanelStruct.DockBottomPortion = Convert.ToDouble(xmlIn.GetAttribute("DockBottomPortion"), CultureInfo.InvariantCulture);
  632. dockPanelStruct.IndexActiveDocumentPane = Convert.ToInt32(xmlIn.GetAttribute("ActiveDocumentPane"), CultureInfo.InvariantCulture);
  633. dockPanelStruct.IndexActivePane = Convert.ToInt32(xmlIn.GetAttribute("ActivePane"), CultureInfo.InvariantCulture);
  634. // Load Contents
  635. MoveToNextElement(xmlIn);
  636. if (xmlIn.Name != "Contents")
  637. throw new ArgumentException(Strings.DockPanel_LoadFromXml_InvalidXmlFormat);
  638. ContentStruct[] contents = LoadContents(xmlIn);
  639. // Load Panes
  640. if (xmlIn.Name != "Panes")
  641. throw new ArgumentException(Strings.DockPanel_LoadFromXml_InvalidXmlFormat);
  642. PaneStruct[] panes = LoadPanes(xmlIn);
  643. // Load DockWindows
  644. if (xmlIn.Name != "DockWindows")
  645. throw new ArgumentException(Strings.DockPanel_LoadFromXml_InvalidXmlFormat);
  646. DockWindowStruct[] dockWindows = LoadDockWindows(xmlIn, dockPanel);
  647. // Load FloatWindows
  648. if (xmlIn.Name != "FloatWindows")
  649. throw new ArgumentException(Strings.DockPanel_LoadFromXml_InvalidXmlFormat);
  650. FloatWindowStruct[] floatWindows = LoadFloatWindows(xmlIn);
  651. if (closeStream)
  652. xmlIn.Close();
  653. dockPanel.SuspendLayout(true);
  654. dockPanel.DockLeftPortion = dockPanelStruct.DockLeftPortion;
  655. dockPanel.DockRightPortion = dockPanelStruct.DockRightPortion;
  656. dockPanel.DockTopPortion = dockPanelStruct.DockTopPortion;
  657. dockPanel.DockBottomPortion = dockPanelStruct.DockBottomPortion;
  658. // Set DockWindow ZOrders
  659. int prevMaxDockWindowZOrder = int.MaxValue;
  660. for (int i = 0; i < dockWindows.Length; i++)
  661. {
  662. int maxDockWindowZOrder = -1;
  663. int index = -1;
  664. for (int j = 0; j < dockWindows.Length; j++)
  665. {
  666. if (dockWindows[j].ZOrderIndex > maxDockWindowZOrder && dockWindows[j].ZOrderIndex < prevMaxDockWindowZOrder)
  667. {
  668. maxDockWindowZOrder = dockWindows[j].ZOrderIndex;
  669. index = j;
  670. }
  671. }
  672. dockPanel.DockWindows[dockWindows[index].DockState].BringToFront();
  673. prevMaxDockWindowZOrder = maxDockWindowZOrder;
  674. }
  675. // Create Contents
  676. for (int i = 0; i < contents.Length; i++)
  677. {
  678. IDockContent content = deserializeContent(contents[i].PersistString);
  679. if (content == null)
  680. content = new DummyContent();
  681. content.DockHandler.DockPanel = dockPanel;
  682. content.DockHandler.AutoHidePortion = contents[i].AutoHidePortion;
  683. content.DockHandler.IsHidden = true;
  684. content.DockHandler.IsFloat = contents[i].IsFloat;
  685. }
  686. // Create panes
  687. for (int i = 0; i < panes.Length; i++)
  688. {
  689. DockPane pane = null;
  690. for (int j = 0; j < panes[i].IndexContents.Length; j++)
  691. {
  692. IDockContent content = dockPanel.Contents[panes[i].IndexContents[j]];
  693. if (j == 0)
  694. pane = dockPanel.DockPaneFactory.CreateDockPane(content, panes[i].DockState, false);
  695. else if (panes[i].DockState == DockState.Float)
  696. content.DockHandler.FloatPane = pane;
  697. else
  698. content.DockHandler.PanelPane = pane;
  699. }
  700. }
  701. // Assign Panes to DockWindows
  702. for (int i = 0; i < dockWindows.Length; i++)
  703. {
  704. for (int j = 0; j < dockWindows[i].NestedPanes.Length; j++)
  705. {
  706. DockWindow dw = dockPanel.DockWindows[dockWindows[i].DockState];
  707. int indexPane = dockWindows[i].NestedPanes[j].IndexPane;
  708. DockPane pane = dockPanel.Panes[indexPane];
  709. int indexPrevPane = dockWindows[i].NestedPanes[j].IndexPrevPane;
  710. DockPane prevPane = (indexPrevPane == -1) ? dw.NestedPanes.GetDefaultPreviousPane(pane) : dockPanel.Panes[indexPrevPane];
  711. DockAlignment alignment = dockWindows[i].NestedPanes[j].Alignment;
  712. double proportion = dockWindows[i].NestedPanes[j].Proportion;
  713. pane.DockTo(dw, prevPane, alignment, proportion);
  714. if (panes[indexPane].DockState == dw.DockState)
  715. panes[indexPane].ZOrderIndex = dockWindows[i].ZOrderIndex;
  716. }
  717. }
  718. // Create float windows
  719. for (int i = 0; i < floatWindows.Length; i++)
  720. {
  721. FloatWindow fw = null;
  722. for (int j = 0; j < floatWindows[i].NestedPanes.Length; j++)
  723. {
  724. int indexPane = floatWindows[i].NestedPanes[j].IndexPane;
  725. DockPane pane = dockPanel.Panes[indexPane];
  726. if (j == 0)
  727. fw = dockPanel.FloatWindowFactory.CreateFloatWindow(dockPanel, pane, floatWindows[i].Bounds);
  728. else
  729. {
  730. int indexPrevPane = floatWindows[i].NestedPanes[j].IndexPrevPane;
  731. DockPane prevPane = indexPrevPane == -1 ? null : dockPanel.Panes[indexPrevPane];
  732. DockAlignment alignment = floatWindows[i].NestedPanes[j].Alignment;
  733. double proportion = floatWindows[i].NestedPanes[j].Proportion;
  734. pane.DockTo(fw, prevPane, alignment, proportion);
  735. }
  736. if (panes[indexPane].DockState == fw.DockState)
  737. panes[indexPane].ZOrderIndex = floatWindows[i].ZOrderIndex;
  738. }
  739. }
  740. // sort IDockContent by its Pane's ZOrder
  741. int[] sortedContents = null;
  742. if (contents.Length > 0)
  743. {
  744. sortedContents = new int[contents.Length];
  745. for (int i = 0; i < contents.Length; i++)
  746. sortedContents[i] = i;
  747. int lastDocument = contents.Length;
  748. for (int i = 0; i < contents.Length - 1; i++)
  749. {
  750. for (int j = i + 1; j < contents.Length; j++)
  751. {
  752. DockPane pane1 = dockPanel.Contents[sortedContents[i]].DockHandler.Pane;
  753. int ZOrderIndex1 = pane1 == null ? 0 : panes[dockPanel.Panes.IndexOf(pane1)].ZOrderIndex;
  754. DockPane pane2 = dockPanel.Contents[sortedContents[j]].DockHandler.Pane;
  755. int ZOrderIndex2 = pane2 == null ? 0 : panes[dockPanel.Panes.IndexOf(pane2)].ZOrderIndex;
  756. if (ZOrderIndex1 > ZOrderIndex2)
  757. {
  758. int temp = sortedContents[i];
  759. sortedContents[i] = sortedContents[j];
  760. sortedContents[j] = temp;
  761. }
  762. }
  763. }
  764. }
  765. // show non-document IDockContent first to avoid screen flickers
  766. for (int i = 0; i < contents.Length; i++)
  767. {
  768. IDockContent content = dockPanel.Contents[sortedContents[i]];
  769. if (content.DockHandler.Pane != null && content.DockHandler.Pane.DockState != DockState.Document)
  770. content.DockHandler.IsHidden = contents[sortedContents[i]].IsHidden;
  771. }
  772. // after all non-document IDockContent, show document IDockContent
  773. for (int i = 0; i < contents.Length; i++)
  774. {
  775. IDockContent content = dockPanel.Contents[sortedContents[i]];
  776. if (content.DockHandler.Pane != null && content.DockHandler.Pane.DockState == DockState.Document)
  777. content.DockHandler.IsHidden = contents[sortedContents[i]].IsHidden;
  778. }
  779. for (int i = 0; i < panes.Length; i++)
  780. dockPanel.Panes[i].ActiveContent = panes[i].IndexActiveContent == -1 ? null : dockPanel.Contents[panes[i].IndexActiveContent];
  781. if (dockPanelStruct.IndexActiveDocumentPane != -1)
  782. dockPanel.Panes[dockPanelStruct.IndexActiveDocumentPane].Activate();
  783. if (dockPanelStruct.IndexActivePane != -1)
  784. dockPanel.Panes[dockPanelStruct.IndexActivePane].Activate();
  785. for (int i = dockPanel.Contents.Count - 1; i >= 0; i--)
  786. if (dockPanel.Contents[i] is DummyContent)
  787. dockPanel.Contents[i].DockHandler.Form.Close();
  788. dockPanel.ResumeLayout(true, true);
  789. }
  790. private static bool MoveToNextElement(XmlTextReader xmlIn)
  791. {
  792. if (!xmlIn.Read())
  793. return false;
  794. while (xmlIn.NodeType == XmlNodeType.EndElement)
  795. {
  796. if (!xmlIn.Read())
  797. return false;
  798. }
  799. return true;
  800. }
  801. private static bool IsFormatVersionValid(string formatVersion)
  802. {
  803. if (formatVersion == ConfigFileVersion)
  804. return true;
  805. foreach (string s in CompatibleConfigFileVersions)
  806. if (s == formatVersion)
  807. return true;
  808. return false;
  809. }
  810. }
  811. public void SaveAsXml(string fileName)
  812. {
  813. Persistor.SaveAsXml(this, fileName);
  814. }
  815. public void SaveAsXml(string fileName, Encoding encoding)
  816. {
  817. Persistor.SaveAsXml(this, fileName, encoding);
  818. }
  819. public void SaveAsXml(Stream stream, Encoding encoding)
  820. {
  821. Persistor.SaveAsXml(this, stream, encoding);
  822. }
  823. public void SaveAsXml(Stream stream, Encoding encoding, bool upstream)
  824. {
  825. Persistor.SaveAsXml(this, stream, encoding, upstream);
  826. }
  827. public void LoadFromXml(string fileName, DeserializeDockContent deserializeContent)
  828. {
  829. Persistor.LoadFromXml(this, fileName, deserializeContent);
  830. }
  831. public void LoadFromXml(Stream stream, DeserializeDockContent deserializeContent)
  832. {
  833. Persistor.LoadFromXml(this, stream, deserializeContent);
  834. }
  835. public void LoadFromXml(Stream stream, DeserializeDockContent deserializeContent, bool closeStream)
  836. {
  837. Persistor.LoadFromXml(this, stream, deserializeContent, closeStream);
  838. }
  839. }
  840. }