Enhanced saving and loading functionality to support more Accessors and advanced selection of DataFormat/ObjectModel

This commit is contained in:
Michael Becker 2014-06-15 00:01:56 -04:00
parent a28da99fc2
commit adb4f9e9c8
13 changed files with 981 additions and 132 deletions

View File

@ -0,0 +1,114 @@
namespace UniversalEditor.UserInterface.WindowsForms.Dialogs
{
partial class DataFormatBrowserPopup
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.txtSearch = new System.Windows.Forms.TextBox();
this.lv = new System.Windows.Forms.ListView();
this.chTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.chFilters = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.cmdClear = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// txtSearch
//
this.txtSearch.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtSearch.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.txtSearch.Location = new System.Drawing.Point(6, 7);
this.txtSearch.Name = "txtSearch";
this.txtSearch.Size = new System.Drawing.Size(277, 13);
this.txtSearch.TabIndex = 0;
this.txtSearch.TextChanged += new System.EventHandler(this.txtSearch_TextChanged);
this.txtSearch.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtSearch_KeyDown);
//
// lv
//
this.lv.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.lv.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.chTitle,
this.chFilters});
this.lv.FullRowSelect = true;
this.lv.GridLines = true;
this.lv.HideSelection = false;
this.lv.Location = new System.Drawing.Point(0, 26);
this.lv.MultiSelect = false;
this.lv.Name = "lv";
this.lv.Size = new System.Drawing.Size(364, 183);
this.lv.TabIndex = 1;
this.lv.UseCompatibleStateImageBehavior = false;
this.lv.View = System.Windows.Forms.View.Details;
this.lv.ItemActivate += new System.EventHandler(this.lv_ItemActivate);
this.lv.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtSearch_KeyDown);
//
// chTitle
//
this.chTitle.Text = "Title";
//
// chFilters
//
this.chFilters.Text = "Filters";
//
// cmdClear
//
this.cmdClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.cmdClear.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.cmdClear.Location = new System.Drawing.Point(289, 2);
this.cmdClear.Name = "cmdClear";
this.cmdClear.Size = new System.Drawing.Size(75, 23);
this.cmdClear.TabIndex = 5;
this.cmdClear.Text = "&Clear";
this.cmdClear.UseVisualStyleBackColor = false;
this.cmdClear.Click += new System.EventHandler(this.cmdClear_Click);
//
// DataFormatBrowserPopup
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.Window;
this.ClientSize = new System.Drawing.Size(364, 213);
this.ControlBox = false;
this.Controls.Add(this.cmdClear);
this.Controls.Add(this.lv);
this.Controls.Add(this.txtSearch);
this.Name = "DataFormatBrowserPopup";
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox txtSearch;
private System.Windows.Forms.ListView lv;
private System.Windows.Forms.ColumnHeader chTitle;
private System.Windows.Forms.ColumnHeader chFilters;
private System.Windows.Forms.Button cmdClear;
}
}

View File

@ -0,0 +1,159 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace UniversalEditor.UserInterface.WindowsForms.Dialogs
{
public partial class DataFormatBrowserPopup : Form
{
public event EventHandler SelectionChanged;
public DataFormatBrowserPopup()
{
InitializeComponent();
Font = SystemFonts.MenuFont;
}
protected override void OnDeactivate(EventArgs e)
{
base.OnDeactivate(e);
this.Close();
}
private System.Collections.ObjectModel.Collection<DataFormat> mvarDataFormats = new System.Collections.ObjectModel.Collection<DataFormat>();
public System.Collections.ObjectModel.Collection<DataFormat> DataFormats { get { return mvarDataFormats; } }
private DataFormat mvarDataFormat = null;
public DataFormat DataFormat { get { return mvarDataFormat; } set { mvarDataFormat = value; } }
private string DataFormatFilterCollectionToString(DataFormatFilter.DataFormatFilterCollection collection)
{
StringBuilder sb = new StringBuilder();
foreach (DataFormatFilter filter in collection)
{
sb.Append(StringArrayToString(filter.FileNameFilters));
if (collection.IndexOf(filter) < collection.Count - 1)
{
sb.Append("; ");
}
}
return sb.ToString();
}
private string StringArrayToString(System.Collections.Specialized.StringCollection collection)
{
StringBuilder sb = new StringBuilder();
foreach (string s in collection)
{
sb.Append(s);
if (collection.IndexOf(s) < collection.Count - 1)
{
sb.Append(", ");
}
}
return sb.ToString();
}
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
UpdateSearch();
}
private void UpdateSearch()
{
lv.Items.Clear();
foreach (DataFormat df in mvarDataFormats)
{
DataFormatReference dfr = df.MakeReference();
if (txtSearch.Text == String.Empty)
{
AddDataFormatToList(dfr);
}
else
{
if (dfr.Title.ToLower().Contains(txtSearch.Text.ToLower()))
{
AddDataFormatToList(dfr);
}
else
{
bool nextDFR = false;
foreach (DataFormatFilter filter in dfr.Filters)
{
foreach (string s in filter.FileNameFilters)
{
if (s.ToLower().Contains(txtSearch.Text.ToLower()))
{
AddDataFormatToList(dfr);
nextDFR = true;
break;
}
}
if (nextDFR) break;
}
if (nextDFR) continue;
}
}
}
if (lv.Items.Count == 1)
{
lv.Items[0].Selected = true;
}
lv.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
}
private void AddDataFormatToList(DataFormatReference dfr)
{
ListViewItem lvi = new ListViewItem();
lvi.Text = dfr.Title;
lvi.Tag = dfr;
lvi.SubItems.Add(DataFormatFilterCollectionToString(dfr.Filters));
lv.Items.Add(lvi);
}
private void txtSearch_TextChanged(object sender, EventArgs e)
{
UpdateSearch();
}
private void lv_ItemActivate(object sender, EventArgs e)
{
if (lv.SelectedItems.Count != 1) return;
mvarDataFormat = (lv.SelectedItems[0].Tag as DataFormatReference).Create();
if (SelectionChanged != null) SelectionChanged(this, e);
Close();
}
private void txtSearch_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
if (lv.SelectedItems.Count != 1) return;
mvarDataFormat = (lv.SelectedItems[0].Tag as DataFormatReference).Create();
if (SelectionChanged != null) SelectionChanged(this, e);
Close();
}
else if (e.KeyCode == Keys.Escape)
{
Close();
}
}
private void cmdClear_Click(object sender, EventArgs e)
{
mvarDataFormat = null;
if (SelectionChanged != null) SelectionChanged(this, e);
Close();
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -43,17 +43,7 @@
this.fTPServerToolStripMenuItem = new System.Windows.Forms.ToolStripSeparator();
this.hTTPServerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.fTPServerToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.mnuObjectModel = new System.Windows.Forms.ContextMenuStrip(this.components);
this.mnuObjectModelSep1 = new System.Windows.Forms.ToolStripSeparator();
this.mnuObjectModelSelect = new System.Windows.Forms.ToolStripMenuItem();
this.mnuObjectModelClear = new System.Windows.Forms.ToolStripMenuItem();
this.mnuDataFormat = new System.Windows.Forms.ContextMenuStrip(this.components);
this.mnuDataFormatSep1 = new System.Windows.Forms.ToolStripSeparator();
this.mnuDataFormatSelect = new System.Windows.Forms.ToolStripMenuItem();
this.mnuDataFormatClear = new System.Windows.Forms.ToolStripMenuItem();
this.mnuAccessor.SuspendLayout();
this.mnuObjectModel.SuspendLayout();
this.mnuDataFormat.SuspendLayout();
this.SuspendLayout();
//
// txtObjectModel
@ -166,86 +156,32 @@
this.hTTPServerToolStripMenuItem,
this.fTPServerToolStripMenuItem1});
this.mnuAccessor.Name = "mnuAccessor";
this.mnuAccessor.Size = new System.Drawing.Size(153, 98);
this.mnuAccessor.Size = new System.Drawing.Size(135, 76);
//
// mnuAccessorLocalFile
//
this.mnuAccessorLocalFile.Name = "mnuAccessorLocalFile";
this.mnuAccessorLocalFile.Size = new System.Drawing.Size(152, 22);
this.mnuAccessorLocalFile.Size = new System.Drawing.Size(134, 22);
this.mnuAccessorLocalFile.Text = "&Local File";
this.mnuAccessorLocalFile.Click += new System.EventHandler(this.mnuAccessorLocalFile_Click);
//
// fTPServerToolStripMenuItem
//
this.fTPServerToolStripMenuItem.Name = "fTPServerToolStripMenuItem";
this.fTPServerToolStripMenuItem.Size = new System.Drawing.Size(149, 6);
this.fTPServerToolStripMenuItem.Size = new System.Drawing.Size(131, 6);
//
// hTTPServerToolStripMenuItem
//
this.hTTPServerToolStripMenuItem.Name = "hTTPServerToolStripMenuItem";
this.hTTPServerToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.hTTPServerToolStripMenuItem.Size = new System.Drawing.Size(134, 22);
this.hTTPServerToolStripMenuItem.Text = "&HTTP Server";
//
// fTPServerToolStripMenuItem1
//
this.fTPServerToolStripMenuItem1.Name = "fTPServerToolStripMenuItem1";
this.fTPServerToolStripMenuItem1.Size = new System.Drawing.Size(152, 22);
this.fTPServerToolStripMenuItem1.Size = new System.Drawing.Size(134, 22);
this.fTPServerToolStripMenuItem1.Text = "&FTP Server";
//
// mnuObjectModel
//
this.mnuObjectModel.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuObjectModelSep1,
this.mnuObjectModelSelect,
this.mnuObjectModelClear});
this.mnuObjectModel.Name = "mnuObjectModel";
this.mnuObjectModel.Size = new System.Drawing.Size(148, 54);
//
// mnuObjectModelSep1
//
this.mnuObjectModelSep1.Name = "mnuObjectModelSep1";
this.mnuObjectModelSep1.Size = new System.Drawing.Size(144, 6);
//
// mnuObjectModelSelect
//
this.mnuObjectModelSelect.Name = "mnuObjectModelSelect";
this.mnuObjectModelSelect.Size = new System.Drawing.Size(147, 22);
this.mnuObjectModelSelect.Text = "&Select from List";
this.mnuObjectModelSelect.Click += new System.EventHandler(this.mnuObjectModelSelect_Click);
//
// mnuObjectModelClear
//
this.mnuObjectModelClear.Name = "mnuObjectModelClear";
this.mnuObjectModelClear.Size = new System.Drawing.Size(147, 22);
this.mnuObjectModelClear.Text = "&Clear Selection";
this.mnuObjectModelClear.Click += new System.EventHandler(this.mnuObjectModelClear_Click);
//
// mnuDataFormat
//
this.mnuDataFormat.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuDataFormatSep1,
this.mnuDataFormatSelect,
this.mnuDataFormatClear});
this.mnuDataFormat.Name = "mnuDataFormat";
this.mnuDataFormat.Size = new System.Drawing.Size(148, 54);
//
// mnuDataFormatSep1
//
this.mnuDataFormatSep1.Name = "mnuDataFormatSep1";
this.mnuDataFormatSep1.Size = new System.Drawing.Size(144, 6);
//
// mnuDataFormatSelect
//
this.mnuDataFormatSelect.Name = "mnuDataFormatSelect";
this.mnuDataFormatSelect.Size = new System.Drawing.Size(147, 22);
this.mnuDataFormatSelect.Text = "&Select from List";
//
// mnuDataFormatClear
//
this.mnuDataFormatClear.Name = "mnuDataFormatClear";
this.mnuDataFormatClear.Size = new System.Drawing.Size(147, 22);
this.mnuDataFormatClear.Text = "&Clear Selection";
//
// DocumentPropertiesDialogBase
//
this.AcceptButton = this.cmdOK;
@ -266,8 +202,6 @@
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Document Properties";
this.mnuAccessor.ResumeLayout(false);
this.mnuObjectModel.ResumeLayout(false);
this.mnuDataFormat.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
@ -289,14 +223,6 @@
private System.Windows.Forms.ToolStripSeparator fTPServerToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem hTTPServerToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem fTPServerToolStripMenuItem1;
private System.Windows.Forms.ContextMenuStrip mnuObjectModel;
private System.Windows.Forms.ToolStripSeparator mnuObjectModelSep1;
private System.Windows.Forms.ToolStripMenuItem mnuObjectModelSelect;
private System.Windows.Forms.ToolStripMenuItem mnuObjectModelClear;
private System.Windows.Forms.ContextMenuStrip mnuDataFormat;
private System.Windows.Forms.ToolStripSeparator mnuDataFormatSep1;
private System.Windows.Forms.ToolStripMenuItem mnuDataFormatSelect;
private System.Windows.Forms.ToolStripMenuItem mnuDataFormatClear;
}
}

View File

@ -19,14 +19,26 @@ namespace UniversalEditor.UserInterface.WindowsForms.Dialogs
private DocumentPropertiesDialogMode mvarMode = DocumentPropertiesDialogMode.Open;
public DocumentPropertiesDialogMode Mode { get { return mvarMode; } set { mvarMode = value; } }
private ObjectModel mvarInitialObjectModel = null;
private ObjectModel mvarObjectModel = null;
public ObjectModel ObjectModel { get { return mvarObjectModel; } set { mvarObjectModel = value; } }
public ObjectModel ObjectModel { get { return mvarObjectModel; } set { mvarObjectModel = value; mvarInitialObjectModel = value; } }
private DataFormat mvarInitialDataFormat = null;
private DataFormat mvarDataFormat = null;
public DataFormat DataFormat { get { return mvarDataFormat; } set { mvarDataFormat = value; } }
public DataFormat DataFormat { get { return mvarDataFormat; } set { mvarDataFormat = value; mvarInitialDataFormat = value; } }
private Accessor mvarInitialAccesor = null;
private Accessor mvarAccessor = null;
public Accessor Accessor { get { return mvarAccessor; } set { mvarAccessor = value; } }
public Accessor Accessor { get { return mvarAccessor; } set { mvarAccessor = value; mvarInitialAccesor = value; } }
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
RefreshButtons();
}
private void cmdOK_Click(object sender, EventArgs e)
{
@ -58,12 +70,86 @@ namespace UniversalEditor.UserInterface.WindowsForms.Dialogs
private void cmdObjectModel_Click(object sender, EventArgs e)
{
ShowContextMenuBelow(mnuObjectModel, cmdObjectModel);
ObjectModelBrowserPopup dlg = new ObjectModelBrowserPopup();
dlg.ObjectModel = mvarObjectModel;
Point loc = PointToScreen(cmdObjectModel.Location);
dlg.Location = new Point(loc.X, loc.Y + cmdObjectModel.Height);
dlg.Size = new Size(Width, 200);
ObjectModelReference[] omrs = new ObjectModelReference[0];
if (mvarMode == DocumentPropertiesDialogMode.Save)
{
// show all dataformats for the current object model
omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(mvarDataFormat.MakeReference());
}
else if (mvarMode == DocumentPropertiesDialogMode.Open)
{
if (mvarAccessor != null)
{
// show all dataformats for the current accessor
omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels((mvarAccessor as FileAccessor).FileName);
}
else
{
omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels();
}
}
foreach (ObjectModelReference dfr in omrs)
{
dlg.ObjectModels.Add(dfr.Create());
}
dlg.SelectionChanged += dlgObjectModel_SelectionChanged;
dlg.Show();
}
private void cmdDataFormat_Click(object sender, EventArgs e)
{
ShowContextMenuBelow(mnuDataFormat, cmdDataFormat);
DataFormatBrowserPopup dlg = new DataFormatBrowserPopup();
dlg.DataFormat = mvarDataFormat;
Point loc = PointToScreen(cmdDataFormat.Location);
dlg.Location = new Point(loc.X, loc.Y + cmdDataFormat.Height);
dlg.Size = new Size(Width, 200);
DataFormatReference[] dfrs = new DataFormatReference[0];
if (mvarMode == DocumentPropertiesDialogMode.Save)
{
// show all dataformats for the current object model
dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(mvarObjectModel.MakeReference());
}
else if (mvarMode == DocumentPropertiesDialogMode.Open)
{
if (mvarAccessor != null)
{
// show all dataformats for the current accessor
dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats((mvarAccessor as FileAccessor).FileName);
}
else
{
dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats();
}
}
foreach (DataFormatReference dfr in dfrs)
{
dlg.DataFormats.Add(dfr.Create());
}
dlg.SelectionChanged += dlgDataFormat_SelectionChanged;
dlg.Show();
}
private void dlgObjectModel_SelectionChanged(object sender, EventArgs e)
{
ObjectModelBrowserPopup dlg = (sender as ObjectModelBrowserPopup);
mvarObjectModel = dlg.ObjectModel;
RefreshButtons();
}
private void dlgDataFormat_SelectionChanged(object sender, EventArgs e)
{
DataFormatBrowserPopup dlg = (sender as DataFormatBrowserPopup);
mvarDataFormat = dlg.DataFormat;
RefreshButtons();
}
private void cmdAccessor_Click(object sender, EventArgs e)
@ -91,57 +177,50 @@ namespace UniversalEditor.UserInterface.WindowsForms.Dialogs
private void RefreshButtons()
{
if (mvarAccessor is FileAccessor)
if (mvarMode == DocumentPropertiesDialogMode.Save)
{
string filename = (mvarAccessor as FileAccessor).FileName;
DataFormatReference[] dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(filename);
if (mvarDataFormat == null)
if (!System.IO.File.Exists(filename))
{
if (dfrs.Length > 0)
{
mvarDataFormat = dfrs[0].Create();
}
filename = (mvarInitialAccesor as FileAccessor).FileName;
}
mnuDataFormat.Items.Clear();
foreach (DataFormatReference dfr in dfrs)
{
ToolStripMenuItem tsmi = new ToolStripMenuItem();
tsmi.Text = DataFormatReferenceToString(dfr);
tsmi.Tag = dfr;
tsmi.Click += tsmi_Click;
if (mvarDataFormat != null)
{
if (mvarDataFormat.GetType() == dfr.DataFormatType)
{
tsmi.Checked = true;
}
}
mnuDataFormat.Items.Add(tsmi);
}
mnuDataFormat.Items.Add(mnuDataFormatSep1);
mnuDataFormat.Items.Add(mnuDataFormatSelect);
mnuDataFormat.Items.Add(mnuDataFormatClear);
}
if (mvarObjectModel == null)
else if (mvarMode == DocumentPropertiesDialogMode.Open)
{
if (mvarDataFormat != null)
{
ObjectModelReference[] omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(mvarDataFormat.MakeReference());
if (omrs.Length > 0)
{
mvarObjectModel = omrs[0].Create();
}
}
else if (mvarAccessor is FileAccessor)
if (mvarAccessor is FileAccessor)
{
string filename = (mvarAccessor as FileAccessor).FileName;
ObjectModelReference[] omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(filename);
if (omrs.Length == 1)
DataFormatReference[] dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(filename);
if (mvarDataFormat == null)
{
mvarObjectModel = omrs[0].Create();
if (dfrs.Length > 0)
{
mvarDataFormat = dfrs[0].Create();
}
}
else
{
}
}
if (mvarObjectModel == null)
{
if (mvarDataFormat != null)
{
ObjectModelReference[] omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(mvarDataFormat.MakeReference());
if (omrs.Length > 0)
{
mvarObjectModel = omrs[0].Create();
}
}
else if (mvarAccessor is FileAccessor)
{
string filename = (mvarAccessor as FileAccessor).FileName;
ObjectModelReference[] omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(filename);
if (omrs.Length == 1)
{
mvarObjectModel = omrs[0].Create();
}
}
}
}
@ -167,6 +246,13 @@ namespace UniversalEditor.UserInterface.WindowsForms.Dialogs
cmdOK.Enabled = (mvarObjectModel != null && mvarDataFormat != null && mvarAccessor != null);
}
void tsmiObjectModel_Click(object sender, EventArgs e)
{
ToolStripMenuItem tsmi = (sender as ToolStripMenuItem);
mvarObjectModel = (tsmi.Tag as ObjectModelReference).Create();
RefreshButtons();
}
private void tsmi_Click(object sender, EventArgs e)
{
ToolStripMenuItem tsmi = (sender as ToolStripMenuItem);

View File

@ -120,10 +120,4 @@
<metadata name="mnuAccessor.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="mnuObjectModel.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>134, 17</value>
</metadata>
<metadata name="mnuDataFormat.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>269, 17</value>
</metadata>
</root>

View File

@ -0,0 +1,115 @@
namespace UniversalEditor.UserInterface.WindowsForms.Dialogs
{
partial class ObjectModelBrowserPopup
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.lv = new System.Windows.Forms.ListView();
this.chTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.chDescription = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.txtSearch = new System.Windows.Forms.TextBox();
this.cmdClear = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// lv
//
this.lv.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.lv.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.chTitle,
this.chDescription});
this.lv.FullRowSelect = true;
this.lv.GridLines = true;
this.lv.HideSelection = false;
this.lv.Location = new System.Drawing.Point(0, 26);
this.lv.MultiSelect = false;
this.lv.Name = "lv";
this.lv.Size = new System.Drawing.Size(364, 183);
this.lv.TabIndex = 3;
this.lv.UseCompatibleStateImageBehavior = false;
this.lv.View = System.Windows.Forms.View.Details;
this.lv.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtSearch_KeyDown);
//
// chTitle
//
this.chTitle.Text = "Title";
//
// chDescription
//
this.chDescription.Text = "Description";
//
// txtSearch
//
this.txtSearch.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtSearch.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.txtSearch.Location = new System.Drawing.Point(6, 7);
this.txtSearch.Name = "txtSearch";
this.txtSearch.Size = new System.Drawing.Size(277, 13);
this.txtSearch.TabIndex = 2;
this.txtSearch.TextChanged += new System.EventHandler(this.txtSearch_TextChanged);
this.txtSearch.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtSearch_KeyDown);
//
// cmdClear
//
this.cmdClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.cmdClear.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.cmdClear.Location = new System.Drawing.Point(289, 2);
this.cmdClear.Name = "cmdClear";
this.cmdClear.Size = new System.Drawing.Size(75, 23);
this.cmdClear.TabIndex = 4;
this.cmdClear.Text = "&Clear";
this.cmdClear.UseVisualStyleBackColor = false;
this.cmdClear.Click += new System.EventHandler(this.cmdClear_Click);
//
// ObjectModelBrowserPopup
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.Window;
this.ClientSize = new System.Drawing.Size(364, 213);
this.ControlBox = false;
this.Controls.Add(this.cmdClear);
this.Controls.Add(this.lv);
this.Controls.Add(this.txtSearch);
this.Name = "ObjectModelBrowserPopup";
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ListView lv;
private System.Windows.Forms.ColumnHeader chTitle;
private System.Windows.Forms.ColumnHeader chDescription;
private System.Windows.Forms.TextBox txtSearch;
private System.Windows.Forms.Button cmdClear;
}
}

View File

@ -0,0 +1,169 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace UniversalEditor.UserInterface.WindowsForms.Dialogs
{
public partial class ObjectModelBrowserPopup : Form
{
public event EventHandler SelectionChanged;
public ObjectModelBrowserPopup()
{
InitializeComponent();
Font = SystemFonts.MenuFont;
}
protected override void OnDeactivate(EventArgs e)
{
base.OnDeactivate(e);
this.Close();
}
private System.Collections.ObjectModel.Collection<ObjectModel> mvarObjectModels = new System.Collections.ObjectModel.Collection<ObjectModel>();
public System.Collections.ObjectModel.Collection<ObjectModel> ObjectModels { get { return mvarObjectModels; } }
private ObjectModel mvarObjectModel = null;
public ObjectModel ObjectModel { get { return mvarObjectModel; } set { mvarObjectModel = value; } }
/*
private void documentTypeSelector1_SelectionFinalized(object sender, EventArgs e)
{
if (documentTypeSelector1.SelectedObject == null) return;
mvarObjectModel = (documentTypeSelector1.SelectedObject as ObjectModelReference).Create();
Close();
if (SelectionChanged != null) SelectionChanged(this, e);
}
private void documentTypeSelector1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
mvarObjectModel = (documentTypeSelector1.SelectedObject as ObjectModel);
Close();
if (SelectionChanged != null) SelectionChanged(this, e);
}
else if (e.KeyCode == Keys.Escape)
{
Close();
}
}
*/
private string DataFormatFilterCollectionToString(DataFormatFilter.DataFormatFilterCollection collection)
{
StringBuilder sb = new StringBuilder();
foreach (DataFormatFilter filter in collection)
{
sb.Append(StringArrayToString(filter.FileNameFilters));
if (collection.IndexOf(filter) < collection.Count - 1)
{
sb.Append("; ");
}
}
return sb.ToString();
}
private string StringArrayToString(System.Collections.Specialized.StringCollection collection)
{
StringBuilder sb = new StringBuilder();
foreach (string s in collection)
{
sb.Append(s);
if (collection.IndexOf(s) < collection.Count - 1)
{
sb.Append(", ");
}
}
return sb.ToString();
}
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
UpdateSearch();
}
private void UpdateSearch()
{
lv.Items.Clear();
foreach (ObjectModel df in mvarObjectModels)
{
ObjectModelReference dfr = df.MakeReference();
if (txtSearch.Text == String.Empty)
{
AddObjectModelToList(dfr);
}
else
{
if ((dfr.Title.ToLower().Contains(txtSearch.Text.ToLower()))
|| (dfr.Description.ToLower().Contains(txtSearch.Text.ToLower())))
{
AddObjectModelToList(dfr);
}
}
}
if (lv.Items.Count == 1)
{
lv.Items[0].Selected = true;
}
lv.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
}
private void AddObjectModelToList(ObjectModelReference dfr)
{
ListViewItem lvi = new ListViewItem();
lvi.Text = dfr.Title;
lvi.SubItems.Add(dfr.Description);
lvi.Tag = dfr;
lv.Items.Add(lvi);
}
private void txtSearch_TextChanged(object sender, EventArgs e)
{
UpdateSearch();
}
private void lv_ItemActivate(object sender, EventArgs e)
{
if (lv.SelectedItems.Count != 1) return;
mvarObjectModel = (lv.SelectedItems[0].Tag as ObjectModelReference).Create();
if (SelectionChanged != null) SelectionChanged(this, e);
Close();
}
private void txtSearch_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
if (lv.SelectedItems.Count != 1) return;
mvarObjectModel = (lv.SelectedItems[0].Tag as ObjectModelReference).Create();
if (SelectionChanged != null) SelectionChanged(this, e);
Close();
}
else if (e.KeyCode == Keys.Escape)
{
Close();
}
}
private void cmdClear_Click(object sender, EventArgs e)
{
mvarObjectModel = null;
if (SelectionChanged != null) SelectionChanged(this, e);
Close();
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -1012,9 +1012,21 @@ namespace UniversalEditor.UserInterface.WindowsForms
if (FileName == null)
{
DocumentPropertiesDialog dlg = new DocumentPropertiesDialog();
dlg.ObjectModel = doc.ObjectModel;
dlg.DataFormat = doc.DataFormat;
dlg.Accessor = doc.Accessor;
dlg.Mode = DocumentPropertiesDialogMode.Save;
if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
dfr = dlg.DataFormat.MakeReference();
// TODO: Rewrite Save code to make everything use Accessor instead
// of FileName to support multiple types of accessors
FileName = (dlg.Accessor as FileAccessor).FileName;
}
else
{
return false;
}
/*

View File

@ -53,6 +53,18 @@
<Compile Include="Controls\OutputWindow.Designer.cs">
<DependentUpon>OutputWindow.cs</DependentUpon>
</Compile>
<Compile Include="Dialogs\ObjectModelBrowserPopup.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Dialogs\ObjectModelBrowserPopup.Designer.cs">
<DependentUpon>ObjectModelBrowserPopup.cs</DependentUpon>
</Compile>
<Compile Include="Dialogs\DataFormatBrowserPopup.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Dialogs\DataFormatBrowserPopup.Designer.cs">
<DependentUpon>DataFormatBrowserPopup.cs</DependentUpon>
</Compile>
<Compile Include="Dialogs\DocumentPropertiesDialog.cs">
<SubType>Form</SubType>
</Compile>
@ -210,9 +222,15 @@
<EmbeddedResource Include="Dialogs\AboutDialog.resx">
<DependentUpon>AboutDialog.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Dialogs\ObjectModelBrowserPopup.resx">
<DependentUpon>ObjectModelBrowserPopup.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Dialogs\DataFormatAboutDialog.resx">
<DependentUpon>DataFormatAboutDialog.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Dialogs\DataFormatBrowserPopup.resx">
<DependentUpon>DataFormatBrowserPopup.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Dialogs\DataFormatOptionsDialog.resx">
<DependentUpon>DataFormatOptionsDialog.cs</DependentUpon>
</EmbeddedResource>

View File

@ -103,6 +103,7 @@
this.tvObjectModels.AfterCollapse += new System.Windows.Forms.TreeViewEventHandler(this.tvObjectModels_AfterCollapse);
this.tvObjectModels.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.tvObjectModels_AfterExpand);
this.tvObjectModels.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvObjectModels_AfterSelect);
this.tvObjectModels.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.tvObjectModels_MouseDoubleClick);
//
// DocumentTypeSelector
//

View File

@ -10,6 +10,7 @@ namespace UniversalEditor.UserInterface.WindowsForms.Controls
[DefaultEvent("SelectionChanged")]
public partial class DocumentTypeSelector : UserControl
{
public event EventHandler SelectionFinalized;
public event EventHandler SelectionChanged;
public DocumentTypeSelector()
@ -223,6 +224,12 @@ namespace UniversalEditor.UserInterface.WindowsForms.Controls
}
protected void OnSelectionFinalized(EventArgs e)
{
OnSelectionChanged(e);
if (SelectionFinalized != null) SelectionFinalized(this, e);
}
private void txtSearch_TextChanged(object sender, EventArgs e)
{
RefreshList();
@ -263,6 +270,14 @@ namespace UniversalEditor.UserInterface.WindowsForms.Controls
e.Node.SelectedImageKey = "generic-folder-open";
}
}
private void tvObjectModels_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (tvObjectModels.SelectedNode != null)
{
OnSelectionFinalized(e);
}
}
}
[Flags()]