⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dockpanelpersist.cs

📁 Fireball.CodeEditor is an source code editor control derived from the best compona SyntaxBox Control
💻 CS
📖 第 1 页 / 共 2 页
字号:
// *****************************************************************************
// 
//  Copyright 2004, Weifen Luo
//  All rights reserved. The software and associated documentation 
//  supplied hereunder are the proprietary information of Weifen Luo
//  and are supplied subject to licence terms.
// 
//  WinFormsUI Library Version 1.0
// *****************************************************************************

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing;
using Fireball.Docking;
using System.IO;
using System.Text;
using System.Xml;
using System.Globalization;

namespace Fireball.Docking
{
	internal class DockPanelPersist
	{
		private const string ConfigFileVersion = "1.0";
		private static string[] CompatibleConfigFileVersions = new string[] { };

		private class DummyContent : DockableWindow
		{
		}

		private struct DockPanelStruct
		{
			private double m_dockLeftPortion;
			public double DockLeftPortion
			{
				get	{	return m_dockLeftPortion;	}
				set	{	m_dockLeftPortion = value;	}
			}

			private double m_dockRightPortion;
			public double DockRightPortion
			{
				get	{	return m_dockRightPortion;	}
				set	{	m_dockRightPortion = value;	}
			}

			private double m_dockTopPortion;
			public double DockTopPortion
			{
				get	{	return m_dockTopPortion;	}
				set	{	m_dockTopPortion = value;	}
			}

			private double m_dockBottomPortion;
			public double DockBottomPortion
			{
				get	{	return m_dockBottomPortion;	}
				set	{	m_dockBottomPortion = value;	}
			}

			private int m_indexActiveDocumentPane;
			public int IndexActiveDocumentPane
			{
				get	{	return m_indexActiveDocumentPane;	}
				set	{	m_indexActiveDocumentPane = value;	}
			}

			private int m_indexActivePane;
			public int IndexActivePane
			{
				get	{	return m_indexActivePane;	}
				set	{	m_indexActivePane = value;	}
			}
		}

		private struct ContentStruct
		{
			private string m_persistString;
			public string PersistString
			{
				get	{	return m_persistString;	}
				set	{	m_persistString = value;	}
			}

			private double m_autoHidePortion;
			public double AutoHidePortion
			{
				get	{	return m_autoHidePortion;	}
				set	{	m_autoHidePortion = value;	}
			}

			private bool m_isHidden;
			public bool IsHidden
			{
				get	{	return m_isHidden;	}
				set	{	m_isHidden = value;	}
			}

			private bool m_isFloat;
			public bool IsFloat
			{
				get	{	return m_isFloat;	}
				set	{	m_isFloat = value;	}
			}
		}

		private struct PaneStruct
		{
			private DockState m_dockState;
			public DockState DockState
			{
				get	{	return m_dockState;	}
				set	{	m_dockState = value;	}
			}

			private int m_indexActiveContent;
			public int IndexActiveContent
			{
				get	{	return m_indexActiveContent;	}
				set	{	m_indexActiveContent = value;	}
			}

			private int[] m_indexContents;
			public int[] IndexContents
			{
				get	{	return m_indexContents;	}
				set	{	m_indexContents = value;	}
			}

			private int m_zOrderIndex;
			public int ZOrderIndex
			{
				get	{	return m_zOrderIndex;	}
				set	{	m_zOrderIndex = value;	}
			}
		}

		private struct DockListItem
		{
			private int m_indexPane;
			public int IndexPane
			{
				get	{	return m_indexPane;	}
				set	{	m_indexPane = value;	}
			}

			private int m_indexPrevPane;
			public int IndexPrevPane
			{
				get	{	return m_indexPrevPane;	}
				set	{	m_indexPrevPane = value;	}
			}

			private DockAlignment m_alignment;
			public DockAlignment Alignment
			{
				get	{	return m_alignment;	}
				set	{	m_alignment = value;	}
			}

			private double m_proportion;
			public double Proportion
			{
				get	{	return m_proportion;	}
				set	{	m_proportion = value;	}
			}
		}

		private struct DockWindowStruct
		{
			private DockState m_dockState;
			public DockState DockState
			{
				get	{	return m_dockState;	}
				set	{	m_dockState = value;	}
			}

			private int m_zOrderIndex;
			public int ZOrderIndex
			{
				get	{	return m_zOrderIndex;	}
				set	{	m_zOrderIndex = value;	}
			}

			private DockListItem[] m_dockList;
			public DockListItem[] DockList
			{
				get	{	return m_dockList;	}
				set	{	m_dockList = value;	}
			}
		}

		private struct FloatWindowStruct
		{
			private Rectangle m_bounds;
			public Rectangle Bounds
			{
				get	{	return m_bounds;	}
				set	{	m_bounds = value;	}
			}
			
			private bool m_allowRedocking;
			public bool AllowRedocking
			{
				get	{	return m_allowRedocking;	}
				set	{	m_allowRedocking = value;	}
			}

			private int m_zOrderIndex;
			public int ZOrderIndex
			{
				get	{	return m_zOrderIndex;	}
				set	{	m_zOrderIndex = value;	}
			}

			private DockListItem[] m_dockList;
			public DockListItem[] DockList
			{
				get	{	return m_dockList;	}
				set	{	m_dockList = value;	}
			}
		}

		public DockPanelPersist()
		{
		}

		public static void SaveAsXml(DockContainer dockPanel, string filename)
		{
			SaveAsXml(dockPanel, filename, Encoding.Unicode);
		}

		public static void SaveAsXml(DockContainer dockPanel, string filename, Encoding encoding)
		{
			FileStream fs = new FileStream(filename, FileMode.Create);
			try
			{
				SaveAsXml(dockPanel, fs, encoding);
			}
			finally
			{
				fs.Close();
			}
		}

		public static void SaveAsXml(DockContainer dockPanel, Stream stream, Encoding encoding)
		{
			SaveAsXml(dockPanel, stream, encoding, false);
		}

		public static void SaveAsXml(DockContainer dockPanel, Stream stream, Encoding encoding, bool upstream)
		{
			XmlTextWriter xmlOut = new XmlTextWriter(stream, encoding); 

			// Use indenting for readability
			xmlOut.Formatting = Formatting.Indented;

			if (!upstream)
				xmlOut.WriteStartDocument();

			// Always begin file with identification and warning
			xmlOut.WriteComment(" DockPanel configuration file. Author: Weifen Luo, all rights reserved. ");
			xmlOut.WriteComment(" !!! AUTOMATICALLY GENERATED FILE. DO NOT MODIFY !!! ");

			// Associate a version number with the root element so that future version of the code
			// will be able to be backwards compatible or at least recognise out of date versions
			xmlOut.WriteStartElement("DockPanel");
			xmlOut.WriteAttributeString("FormatVersion", ConfigFileVersion);
			xmlOut.WriteAttributeString("DockLeftPortion", dockPanel.DockLeftPortion.ToString(CultureInfo.InvariantCulture));
			xmlOut.WriteAttributeString("DockRightPortion", dockPanel.DockRightPortion.ToString(CultureInfo.InvariantCulture));
			xmlOut.WriteAttributeString("DockTopPortion", dockPanel.DockTopPortion.ToString(CultureInfo.InvariantCulture));
			xmlOut.WriteAttributeString("DockBottomPortion", dockPanel.DockBottomPortion.ToString(CultureInfo.InvariantCulture));
			xmlOut.WriteAttributeString("ActiveDocumentPane", dockPanel.Panes.IndexOf(dockPanel.ActiveDocumentPane).ToString());
			xmlOut.WriteAttributeString("ActivePane", dockPanel.Panes.IndexOf(dockPanel.ActivePane).ToString());

			// Contents
			xmlOut.WriteStartElement("Contents");
			xmlOut.WriteAttributeString("Count", dockPanel.Contents.Count.ToString());
			foreach (IDockableWindow content in dockPanel.Contents)
			{
				xmlOut.WriteStartElement("Content");
				xmlOut.WriteAttributeString("ID", dockPanel.Contents.IndexOf(content).ToString());
				xmlOut.WriteAttributeString("PersistString", content.DockHandler.PersistString);
				xmlOut.WriteAttributeString("AutoHidePortion", content.DockHandler.AutoHidePortion.ToString(CultureInfo.InvariantCulture));
				xmlOut.WriteAttributeString("IsHidden", content.DockHandler.IsHidden.ToString());
				xmlOut.WriteAttributeString("IsFloat", content.DockHandler.IsFloat.ToString());
				xmlOut.WriteEndElement();
			}
			xmlOut.WriteEndElement();

			// Panes
			xmlOut.WriteStartElement("Panes");
			xmlOut.WriteAttributeString("Count", dockPanel.Panes.Count.ToString());
			foreach (DockPane pane in dockPanel.Panes)
			{
				xmlOut.WriteStartElement("Pane");
				xmlOut.WriteAttributeString("ID", dockPanel.Panes.IndexOf(pane).ToString());
				xmlOut.WriteAttributeString("DockState", pane.DockState.ToString());
				xmlOut.WriteAttributeString("ActiveContent", dockPanel.Contents.IndexOf(pane.ActiveContent).ToString());
				xmlOut.WriteStartElement("Contents");
				xmlOut.WriteAttributeString("Count", pane.Contents.Count.ToString());
				foreach (IDockableWindow content in pane.Contents)
				{
					xmlOut.WriteStartElement("Content");
					xmlOut.WriteAttributeString("ID", pane.Contents.IndexOf(content).ToString());
					xmlOut.WriteAttributeString("RefID", dockPanel.Contents.IndexOf(content).ToString());
					xmlOut.WriteEndElement();
				}
				xmlOut.WriteEndElement();
				xmlOut.WriteEndElement();
			}
			xmlOut.WriteEndElement();

			// DockWindows
			xmlOut.WriteStartElement("DockWindows");
			int dockWindowId = 0;
			foreach (DockWindow dw in dockPanel.DockWindows)
			{
				xmlOut.WriteStartElement("DockWindow");
				xmlOut.WriteAttributeString("ID", dockWindowId.ToString());
				dockWindowId++;
				xmlOut.WriteAttributeString("DockState", dw.DockState.ToString());
				xmlOut.WriteAttributeString("ZOrderIndex", dockPanel.Controls.IndexOf(dw).ToString());
				xmlOut.WriteStartElement("DockList");
				xmlOut.WriteAttributeString("Count", dw.DockList.Count.ToString());
				foreach (DockPane pane in dw.DockList)
				{
					xmlOut.WriteStartElement("Pane");
					xmlOut.WriteAttributeString("ID", dw.DockList.IndexOf(pane).ToString());
					xmlOut.WriteAttributeString("RefID", dockPanel.Panes.IndexOf(pane).ToString());
					NestedDockingStatus status = pane.NestedDockingStatus;
					xmlOut.WriteAttributeString("PrevPane", dockPanel.Panes.IndexOf(status.PrevPane).ToString());
					xmlOut.WriteAttributeString("Alignment", status.Alignment.ToString());
					xmlOut.WriteAttributeString("Proportion", status.Proportion.ToString(CultureInfo.InvariantCulture));
					xmlOut.WriteEndElement();
				}
				xmlOut.WriteEndElement();
				xmlOut.WriteEndElement();
			}
			xmlOut.WriteEndElement();

			// FloatWindows
			RectangleConverter rectConverter = new RectangleConverter();
			xmlOut.WriteStartElement("FloatWindows");
			xmlOut.WriteAttributeString("Count", dockPanel.FloatWindows.Count.ToString());
			foreach (FloatWindow fw in dockPanel.FloatWindows)
			{
				xmlOut.WriteStartElement("FloatWindow");
				xmlOut.WriteAttributeString("ID", dockPanel.FloatWindows.IndexOf(fw).ToString());
				xmlOut.WriteAttributeString("Bounds", rectConverter.ConvertToInvariantString(fw.Bounds));
				xmlOut.WriteAttributeString("AllowRedocking", fw.AllowRedocking.ToString());
				xmlOut.WriteAttributeString("ZOrderIndex", fw.DockPanel.FloatWindows.IndexOf(fw).ToString());
				xmlOut.WriteStartElement("DockList");
				xmlOut.WriteAttributeString("Count", fw.DockList.Count.ToString());
				foreach (DockPane pane in fw.DockList)
				{
					xmlOut.WriteStartElement("Pane");
					xmlOut.WriteAttributeString("ID", fw.DockList.IndexOf(pane).ToString());
					xmlOut.WriteAttributeString("RefID", dockPanel.Panes.IndexOf(pane).ToString());
					NestedDockingStatus status = pane.NestedDockingStatus;
					xmlOut.WriteAttributeString("PrevPane", dockPanel.Panes.IndexOf(status.PrevPane).ToString());
					xmlOut.WriteAttributeString("Alignment", status.Alignment.ToString());
					xmlOut.WriteAttributeString("Proportion", status.Proportion.ToString(CultureInfo.InvariantCulture));
					xmlOut.WriteEndElement();
				}
				xmlOut.WriteEndElement();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -