📄 dockpanelpersist.cs
字号:
// *****************************************************************************
//
// 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 WeifenLuo.WinFormsUI;
using System.IO;
using System.Text;
using System.Xml;
using System.Globalization;
namespace WeifenLuo.WinFormsUI
{
internal class DockPanelPersist
{
private const string ConfigFileVersion = "0.9.3";
private static readonly string[] SupportedVersions = {"0.9.2", "0.9.3"};
// all version numbers for backward compatibility here are the indices in the SupportedVersions array
private const int PaneDockStateVersionIndex = 1; // from 0.9.3 on, Pane uses DockState instead of VisibleState
private class DummyContent : DockContent
{
}
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(DockPanel dockPanel, string filename)
{
SaveAsXml(dockPanel, filename, Encoding.Unicode);
}
public static void SaveAsXml(DockPanel dockPanel, string filename, Encoding encoding)
{
FileStream fs = new FileStream(filename, FileMode.Create);
try
{
SaveAsXml(dockPanel, fs, encoding);
}
finally
{
fs.Close();
}
}
public static void SaveAsXml(DockPanel dockPanel, Stream stream, Encoding encoding)
{
XmlTextWriter xmlOut = new XmlTextWriter(stream, encoding);
// Use indenting for readability
xmlOut.Formatting = Formatting.Indented;
// Always begin file with identification and warning
xmlOut.WriteStartDocument();
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 (DockContent content in dockPanel.Contents)
{
xmlOut.WriteStartElement("Content");
xmlOut.WriteAttributeString("ID", dockPanel.Contents.IndexOf(content).ToString());
xmlOut.WriteAttributeString("PersistString", content.PersistString);
xmlOut.WriteAttributeString("AutoHidePortion", content.AutoHidePortion.ToString(CultureInfo.InvariantCulture));
xmlOut.WriteAttributeString("IsHidden", content.IsHidden.ToString());
xmlOut.WriteAttributeString("IsFloat", content.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 (DockContent 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 count = 0;
foreach (DockWindow dw in dockPanel.DockWindows)
if (dw.DockList.Count > 0)
count++;
xmlOut.WriteAttributeString("Count", count.ToString());
int i = 0;
foreach (DockWindow dw in dockPanel.DockWindows)
{
if (dw.DockList.Count == 0)
continue;
xmlOut.WriteStartElement("DockWindow");
xmlOut.WriteAttributeString("ID", i.ToString());
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();
i++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -