diff --git a/CSharp/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.Designer.cs b/CSharp/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.Designer.cs
new file mode 100644
index 00000000..1a2b95f7
--- /dev/null
+++ b/CSharp/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.Designer.cs
@@ -0,0 +1,356 @@
+namespace UniversalEditor.Editors
+{
+ partial class ShortcutEditor
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.label1 = new System.Windows.Forms.Label();
+ this.cboTargetType = new System.Windows.Forms.ComboBox();
+ this.txtTarget = new System.Windows.Forms.TextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.cmdBrowseTarget = new System.Windows.Forms.Button();
+ this.txtStartIn = new System.Windows.Forms.TextBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.txtShortcutKey = new System.Windows.Forms.TextBox();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.cboWindowSize = new System.Windows.Forms.ComboBox();
+ this.txtComment = new System.Windows.Forms.TextBox();
+ this.label6 = new System.Windows.Forms.Label();
+ this.fraShortcutInformation = new System.Windows.Forms.GroupBox();
+ this.fraAdvancedOptions = new System.Windows.Forms.GroupBox();
+ this.chkRunInSeparateMemorySpace = new System.Windows.Forms.CheckBox();
+ this.chkRunWithDifferentCredentials = new System.Windows.Forms.CheckBox();
+ this.fraIcon = new System.Windows.Forms.GroupBox();
+ this.lvIcons = new System.Windows.Forms.ListView();
+ this.txtIconFileName = new System.Windows.Forms.TextBox();
+ this.button1 = new System.Windows.Forms.Button();
+ this.label7 = new System.Windows.Forms.Label();
+ this.fraShortcutInformation.SuspendLayout();
+ this.fraAdvancedOptions.SuspendLayout();
+ this.fraIcon.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.label1.Location = new System.Drawing.Point(18, 25);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(64, 13);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "Target type:";
+ //
+ // cboTargetType
+ //
+ this.cboTargetType.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.cboTargetType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cboTargetType.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.cboTargetType.FormattingEnabled = true;
+ this.cboTargetType.Items.AddRange(new object[] {
+ "Local file/directory",
+ "Shell namespace extension"});
+ this.cboTargetType.Location = new System.Drawing.Point(94, 22);
+ this.cboTargetType.Name = "cboTargetType";
+ this.cboTargetType.Size = new System.Drawing.Size(383, 21);
+ this.cboTargetType.TabIndex = 1;
+ this.cboTargetType.SelectedIndexChanged += new System.EventHandler(this.cboTargetType_SelectedIndexChanged);
+ //
+ // txtTarget
+ //
+ this.txtTarget.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtTarget.Location = new System.Drawing.Point(94, 49);
+ this.txtTarget.Name = "txtTarget";
+ this.txtTarget.Size = new System.Drawing.Size(383, 20);
+ this.txtTarget.TabIndex = 2;
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.label2.Location = new System.Drawing.Point(18, 52);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(41, 13);
+ this.label2.TabIndex = 3;
+ this.label2.Text = "Target:";
+ //
+ // cmdBrowseTarget
+ //
+ this.cmdBrowseTarget.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.cmdBrowseTarget.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.cmdBrowseTarget.Location = new System.Drawing.Point(402, 75);
+ this.cmdBrowseTarget.Name = "cmdBrowseTarget";
+ this.cmdBrowseTarget.Size = new System.Drawing.Size(75, 23);
+ this.cmdBrowseTarget.TabIndex = 4;
+ this.cmdBrowseTarget.Text = "&Browse...";
+ this.cmdBrowseTarget.UseVisualStyleBackColor = true;
+ this.cmdBrowseTarget.Click += new System.EventHandler(this.cmdBrowseTarget_Click);
+ //
+ // txtStartIn
+ //
+ this.txtStartIn.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtStartIn.Location = new System.Drawing.Point(94, 104);
+ this.txtStartIn.Name = "txtStartIn";
+ this.txtStartIn.Size = new System.Drawing.Size(383, 20);
+ this.txtStartIn.TabIndex = 2;
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.label3.Location = new System.Drawing.Point(18, 107);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(43, 13);
+ this.label3.TabIndex = 3;
+ this.label3.Text = "Start in:";
+ //
+ // txtShortcutKey
+ //
+ this.txtShortcutKey.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtShortcutKey.Location = new System.Drawing.Point(94, 130);
+ this.txtShortcutKey.Name = "txtShortcutKey";
+ this.txtShortcutKey.Size = new System.Drawing.Size(383, 20);
+ this.txtShortcutKey.TabIndex = 2;
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.label4.Location = new System.Drawing.Point(18, 133);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(70, 13);
+ this.label4.TabIndex = 3;
+ this.label4.Text = "Shortcut key:";
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.label5.Location = new System.Drawing.Point(18, 159);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(70, 13);
+ this.label5.TabIndex = 0;
+ this.label5.Text = "Window size:";
+ //
+ // cboWindowSize
+ //
+ this.cboWindowSize.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.cboWindowSize.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.cboWindowSize.FormattingEnabled = true;
+ this.cboWindowSize.Location = new System.Drawing.Point(94, 156);
+ this.cboWindowSize.Name = "cboWindowSize";
+ this.cboWindowSize.Size = new System.Drawing.Size(383, 21);
+ this.cboWindowSize.TabIndex = 1;
+ //
+ // txtComment
+ //
+ this.txtComment.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtComment.Location = new System.Drawing.Point(94, 183);
+ this.txtComment.Name = "txtComment";
+ this.txtComment.Size = new System.Drawing.Size(383, 20);
+ this.txtComment.TabIndex = 2;
+ //
+ // label6
+ //
+ this.label6.AutoSize = true;
+ this.label6.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.label6.Location = new System.Drawing.Point(18, 186);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(54, 13);
+ this.label6.TabIndex = 3;
+ this.label6.Text = "Comment:";
+ //
+ // fraShortcutInformation
+ //
+ this.fraShortcutInformation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.fraShortcutInformation.Controls.Add(this.label1);
+ this.fraShortcutInformation.Controls.Add(this.cmdBrowseTarget);
+ this.fraShortcutInformation.Controls.Add(this.cboTargetType);
+ this.fraShortcutInformation.Controls.Add(this.label4);
+ this.fraShortcutInformation.Controls.Add(this.label5);
+ this.fraShortcutInformation.Controls.Add(this.label3);
+ this.fraShortcutInformation.Controls.Add(this.cboWindowSize);
+ this.fraShortcutInformation.Controls.Add(this.label6);
+ this.fraShortcutInformation.Controls.Add(this.txtTarget);
+ this.fraShortcutInformation.Controls.Add(this.label2);
+ this.fraShortcutInformation.Controls.Add(this.txtComment);
+ this.fraShortcutInformation.Controls.Add(this.txtShortcutKey);
+ this.fraShortcutInformation.Controls.Add(this.txtStartIn);
+ this.fraShortcutInformation.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.fraShortcutInformation.Location = new System.Drawing.Point(3, 3);
+ this.fraShortcutInformation.Name = "fraShortcutInformation";
+ this.fraShortcutInformation.Size = new System.Drawing.Size(483, 224);
+ this.fraShortcutInformation.TabIndex = 5;
+ this.fraShortcutInformation.TabStop = false;
+ this.fraShortcutInformation.Text = "Shortcut information";
+ //
+ // fraAdvancedOptions
+ //
+ this.fraAdvancedOptions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.fraAdvancedOptions.Controls.Add(this.chkRunInSeparateMemorySpace);
+ this.fraAdvancedOptions.Controls.Add(this.chkRunWithDifferentCredentials);
+ this.fraAdvancedOptions.Location = new System.Drawing.Point(3, 233);
+ this.fraAdvancedOptions.Name = "fraAdvancedOptions";
+ this.fraAdvancedOptions.Size = new System.Drawing.Size(483, 43);
+ this.fraAdvancedOptions.TabIndex = 6;
+ this.fraAdvancedOptions.TabStop = false;
+ this.fraAdvancedOptions.Text = "Advanced options";
+ //
+ // chkRunInSeparateMemorySpace
+ //
+ this.chkRunInSeparateMemorySpace.AutoSize = true;
+ this.chkRunInSeparateMemorySpace.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.chkRunInSeparateMemorySpace.Location = new System.Drawing.Point(196, 19);
+ this.chkRunInSeparateMemorySpace.Name = "chkRunInSeparateMemorySpace";
+ this.chkRunInSeparateMemorySpace.Size = new System.Drawing.Size(178, 18);
+ this.chkRunInSeparateMemorySpace.TabIndex = 0;
+ this.chkRunInSeparateMemorySpace.Text = "Run in separate memory space";
+ this.chkRunInSeparateMemorySpace.UseVisualStyleBackColor = true;
+ //
+ // chkRunWithDifferentCredentials
+ //
+ this.chkRunWithDifferentCredentials.AutoSize = true;
+ this.chkRunWithDifferentCredentials.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.chkRunWithDifferentCredentials.Location = new System.Drawing.Point(21, 19);
+ this.chkRunWithDifferentCredentials.Name = "chkRunWithDifferentCredentials";
+ this.chkRunWithDifferentCredentials.Size = new System.Drawing.Size(169, 18);
+ this.chkRunWithDifferentCredentials.TabIndex = 0;
+ this.chkRunWithDifferentCredentials.Text = "Run with different credentials";
+ this.chkRunWithDifferentCredentials.UseVisualStyleBackColor = true;
+ //
+ // fraIcon
+ //
+ this.fraIcon.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.fraIcon.Controls.Add(this.lvIcons);
+ this.fraIcon.Controls.Add(this.txtIconFileName);
+ this.fraIcon.Controls.Add(this.button1);
+ this.fraIcon.Controls.Add(this.label7);
+ this.fraIcon.Location = new System.Drawing.Point(3, 282);
+ this.fraIcon.Name = "fraIcon";
+ this.fraIcon.Size = new System.Drawing.Size(483, 114);
+ this.fraIcon.TabIndex = 7;
+ this.fraIcon.TabStop = false;
+ this.fraIcon.Text = "Icon";
+ //
+ // lvIcons
+ //
+ this.lvIcons.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.lvIcons.Location = new System.Drawing.Point(94, 47);
+ this.lvIcons.Name = "lvIcons";
+ this.lvIcons.Size = new System.Drawing.Size(383, 61);
+ this.lvIcons.TabIndex = 5;
+ this.lvIcons.UseCompatibleStateImageBehavior = false;
+ //
+ // txtIconFileName
+ //
+ this.txtIconFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtIconFileName.Location = new System.Drawing.Point(94, 21);
+ this.txtIconFileName.Name = "txtIconFileName";
+ this.txtIconFileName.ReadOnly = true;
+ this.txtIconFileName.Size = new System.Drawing.Size(302, 20);
+ this.txtIconFileName.TabIndex = 0;
+ //
+ // button1
+ //
+ this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.button1.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.button1.Location = new System.Drawing.Point(402, 19);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(75, 23);
+ this.button1.TabIndex = 4;
+ this.button1.Text = "&Browse...";
+ this.button1.UseVisualStyleBackColor = true;
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.label7.Location = new System.Drawing.Point(18, 24);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(55, 13);
+ this.label7.TabIndex = 3;
+ this.label7.Text = "File name:";
+ //
+ // WindowsShortcutEditor
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.fraIcon);
+ this.Controls.Add(this.fraAdvancedOptions);
+ this.Controls.Add(this.fraShortcutInformation);
+ this.Name = "WindowsShortcutEditor";
+ this.Size = new System.Drawing.Size(489, 399);
+ this.fraShortcutInformation.ResumeLayout(false);
+ this.fraShortcutInformation.PerformLayout();
+ this.fraAdvancedOptions.ResumeLayout(false);
+ this.fraAdvancedOptions.PerformLayout();
+ this.fraIcon.ResumeLayout(false);
+ this.fraIcon.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.ComboBox cboTargetType;
+ private System.Windows.Forms.TextBox txtTarget;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Button cmdBrowseTarget;
+ private System.Windows.Forms.TextBox txtStartIn;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.TextBox txtShortcutKey;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.ComboBox cboWindowSize;
+ private System.Windows.Forms.TextBox txtComment;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.GroupBox fraShortcutInformation;
+ private System.Windows.Forms.GroupBox fraAdvancedOptions;
+ private System.Windows.Forms.CheckBox chkRunWithDifferentCredentials;
+ private System.Windows.Forms.CheckBox chkRunInSeparateMemorySpace;
+ private System.Windows.Forms.GroupBox fraIcon;
+ private System.Windows.Forms.ListView lvIcons;
+ private System.Windows.Forms.TextBox txtIconFileName;
+ private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.Label label7;
+
+ }
+}
diff --git a/CSharp/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.cs b/CSharp/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.cs
new file mode 100644
index 00000000..5536a1c1
--- /dev/null
+++ b/CSharp/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.cs
@@ -0,0 +1,81 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using UniversalEditor.UserInterface.WindowsForms;
+
+namespace UniversalEditor.Editors
+{
+ public partial class ShortcutEditor : Editor
+ {
+ public ShortcutEditor()
+ {
+ InitializeComponent();
+
+ base.SupportedObjectModels.Add(typeof(ShortcutObjectModel));
+ cboTargetType.SelectedIndex = 0;
+ }
+
+ private void cboTargetType_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ txtTarget.ReadOnly = (cboTargetType.SelectedIndex == 1);
+ }
+
+ protected override void OnObjectModelChanged(EventArgs e)
+ {
+ base.OnObjectModelChanged(e);
+
+ ShortcutObjectModel doc = (base.ObjectModel as ShortcutObjectModel);
+ if (doc == null) return;
+
+ if (doc.Type == ShortcutType.Normal)
+ {
+ cboTargetType.SelectedIndex = 0;
+ }
+ else
+ {
+ cboTargetType.SelectedIndex = 1;
+ switch (doc.Type)
+ {
+ case ShortcutType.Computer:
+ txtTarget.Text = "My Computer";
+ break;
+ case ShortcutType.Documents:
+ txtTarget.Text = "My Documents";
+ break;
+ case ShortcutType.Network:
+ txtTarget.Text = "My Network Places";
+ break;
+ case ShortcutType.Trash:
+ txtTarget.Text = "Recycle Bin";
+ break;
+ case ShortcutType.Unknown:
+ txtTarget.Text = Common.Methods.ArrayToString(doc.ShellTarget);
+ break;
+ case ShortcutType.Normal:
+ txtTarget.Text = doc.Target;
+ break;
+ }
+ }
+
+ if (doc.IconFileName != "")
+ {
+ txtIconFileName.Text = doc.IconFileName;
+
+ // Read the icons from the file, through Resource Viewer
+ }
+ }
+
+ private void cmdBrowseTarget_Click(object sender, EventArgs e)
+ {
+ switch (cboTargetType.SelectedIndex)
+ {
+ case 0:
+ break;
+ case 1:
+ break;
+ }
+ }
+ }
+}
diff --git a/CSharp/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.resx b/CSharp/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.resx
new file mode 100644
index 00000000..19dc0dd8
--- /dev/null
+++ b/CSharp/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/CSharp/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/UniversalEditor.UserInterface.WindowsForms.csproj b/CSharp/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/UniversalEditor.UserInterface.WindowsForms.csproj
index 678a6b8b..5ae08226 100644
--- a/CSharp/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/UniversalEditor.UserInterface.WindowsForms.csproj
+++ b/CSharp/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/UniversalEditor.UserInterface.WindowsForms.csproj
@@ -105,6 +105,12 @@
PlainTextEditor.cs
+
+ UserControl
+
+
+ ShortcutEditor.cs
+
UserControl
@@ -181,6 +187,9 @@
PlainTextEditor.cs
+
+ ShortcutEditor.cs
+
ResXFileCodeGenerator
Resources.Designer.cs
diff --git a/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Synthesized/SynthesizedAudioEditor.cs b/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Synthesized/SynthesizedAudioEditor.cs
index 06d7f8f7..d61139d8 100644
--- a/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Synthesized/SynthesizedAudioEditor.cs
+++ b/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Synthesized/SynthesizedAudioEditor.cs
@@ -23,96 +23,96 @@ namespace UniversalEditor.Editors.Multimedia.Audio.Synthesized
InitializeComponent();
base.SupportedObjectModels.Add(typeof(SynthesizedAudioObjectModel));
- #region Menu Bar
- #region View
- ActionMenuItem mnuView = base.MenuBar.Items.Add("mnuView", "&View");
- mnuView.Items.Add("mnuViewTrackOverlay", "Track &Overlay", mnuViewTrackOverlay_Click, 3);
- mnuView.Items.AddSeparator(4);
- #endregion
- #region Job
- ActionMenuItem mnuJob = base.MenuBar.Items.Add("mnuJob", "&Job", 4);
- mnuJob.Items.Add("mnuJobNormalizeNotes", "&Normalize Overlapping Notes...", mnuJobNormalizeNotes_Click);
- mnuJob.Items.AddSeparator();
- mnuJob.Items.Add("mnuJobInsertBars", "&Insert Measures...", mnuJobInsertBars_Click);
- mnuJob.Items.Add("mnuJobDeleteBars", "&Delete Measures...", mnuJobDeleteBars_Click);
- mnuJob.Items.AddSeparator();
- mnuJob.Items.Add("mnuJobRandomize", "Insert &Random Notes...", mnuJobRandomize_Click);
- mnuJob.Items.Add("mnuJobConnect", "&Connect Notes...", mnuJobConnect_Click);
- mnuJob.Items.AddSeparator();
- mnuJob.Items.Add("mnuJobInsertLyrics", "Insert &Lyrics...", mnuJobInsertLyrics_Click);
- #endregion
- #region Track
- ActionMenuItem mnuTrack = base.MenuBar.Items.Add("mnuTrack", "Trac&k", 5);
- mnuTrack.Items.Add("mnuTrackEnable", "Enable Trac&k", mnuTrackEnable_Click);
- mnuTrack.Items.AddSeparator();
- mnuTrack.Items.Add("mnuTrackAdd", "&Add Track", mnuTrackAdd_Click);
- mnuTrack.Items.Add("mnuTrackDuplicate", "Dupli&cate Track", mnuTrackDuplicate_Click);
- mnuTrack.Items.Add("mnuTrackRename", "&Rename Track", mnuTrackRename_Click);
- mnuTrack.Items.Add("mnuTrackDelete", "&Delete Track", mnuTrackDelete_Click);
- mnuTrack.Items.AddSeparator();
- mnuTrack.Items.Add("mnuTrackRenderCurrent", "Render Current &Track", mnuTrackRenderCurrent_Click);
- mnuTrack.Items.Add("mnuTrackRenderAll", "Render All Track&s", mnuTrackRenderAll_Click);
- #endregion
- ActionMenuItem mnuPart = base.MenuBar.Items.Add("mnuPart", "Pa&rt", 6);
+ #region Menu Bar
+ #region View
+ ActionMenuItem mnuView = base.MenuBar.Items.Add("mnuView", "&View");
+ mnuView.Items.Add("mnuViewTrackOverlay", "Track &Overlay", mnuViewTrackOverlay_Click, 3);
+ mnuView.Items.AddSeparator(4);
+ #endregion
+ #region Job
+ ActionMenuItem mnuJob = base.MenuBar.Items.Add("mnuJob", "&Job", 4);
+ mnuJob.Items.Add("mnuJobNormalizeNotes", "&Normalize Overlapping Notes...", mnuJobNormalizeNotes_Click);
+ mnuJob.Items.AddSeparator();
+ mnuJob.Items.Add("mnuJobInsertBars", "&Insert Measures...", mnuJobInsertBars_Click);
+ mnuJob.Items.Add("mnuJobDeleteBars", "&Delete Measures...", mnuJobDeleteBars_Click);
+ mnuJob.Items.AddSeparator();
+ mnuJob.Items.Add("mnuJobRandomize", "Insert &Random Notes...", mnuJobRandomize_Click);
+ mnuJob.Items.Add("mnuJobConnect", "&Connect Notes...", mnuJobConnect_Click);
+ mnuJob.Items.AddSeparator();
+ mnuJob.Items.Add("mnuJobInsertLyrics", "Insert &Lyrics...", mnuJobInsertLyrics_Click);
+ #endregion
+ #region Track
+ ActionMenuItem mnuTrack = base.MenuBar.Items.Add("mnuTrack", "Trac&k", 5);
+ mnuTrack.Items.Add("mnuTrackEnable", "Enable Trac&k", mnuTrackEnable_Click);
+ mnuTrack.Items.AddSeparator();
+ mnuTrack.Items.Add("mnuTrackAdd", "&Add Track", mnuTrackAdd_Click);
+ mnuTrack.Items.Add("mnuTrackDuplicate", "Dupli&cate Track", mnuTrackDuplicate_Click);
+ mnuTrack.Items.Add("mnuTrackRename", "&Rename Track", mnuTrackRename_Click);
+ mnuTrack.Items.Add("mnuTrackDelete", "&Delete Track", mnuTrackDelete_Click);
+ mnuTrack.Items.AddSeparator();
+ mnuTrack.Items.Add("mnuTrackRenderCurrent", "Render Current &Track", mnuTrackRenderCurrent_Click);
+ mnuTrack.Items.Add("mnuTrackRenderAll", "Render All Track&s", mnuTrackRenderAll_Click);
+ #endregion
+ ActionMenuItem mnuPart = base.MenuBar.Items.Add("mnuPart", "Pa&rt", 6);
ActionMenuItem mnuLyrics = base.MenuBar.Items.Add("mnuLyrics", "&Lyrics", 7);
ActionMenuItem mnuTransport = base.MenuBar.Items.Add("mnuTransport", "Tra&nsport", 8);
- #endregion
- }
+ #endregion
+ }
- #region Event Handlers
- #region Menu Bar
- #region View
- private void mnuViewTrackOverlay_Click(object sender, EventArgs e)
- {
- }
- #endregion
- #region Job
- private void mnuJobNormalizeNotes_Click(object sender, EventArgs e)
- {
- }
- private void mnuJobInsertBars_Click(object sender, EventArgs e)
- {
- }
- private void mnuJobDeleteBars_Click(object sender, EventArgs e)
- {
- }
- private void mnuJobRandomize_Click(object sender, EventArgs e)
- {
- }
- private void mnuJobConnect_Click(object sender, EventArgs e)
- {
- }
- private void mnuJobInsertLyrics_Click(object sender, EventArgs e)
- {
- }
- #endregion
- #region Track
- private void mnuTrackEnable_Click(object sender, EventArgs e)
- {
- }
- private void mnuTrackAdd_Click(object sender, EventArgs e)
- {
- }
- private void mnuTrackDuplicate_Click(object sender, EventArgs e)
- {
- }
- private void mnuTrackRename_Click(object sender, EventArgs e)
- {
- }
- private void mnuTrackDelete_Click(object sender, EventArgs e)
- {
- }
- private void mnuTrackRenderCurrent_Click(object sender, EventArgs e)
- {
- }
- private void mnuTrackRenderAll_Click(object sender, EventArgs e)
- {
- }
- #endregion
- #endregion
- #endregion
+ #region Event Handlers
+ #region Menu Bar
+ #region View
+ private void mnuViewTrackOverlay_Click(object sender, EventArgs e)
+ {
+ }
+ #endregion
+ #region Job
+ private void mnuJobNormalizeNotes_Click(object sender, EventArgs e)
+ {
+ }
+ private void mnuJobInsertBars_Click(object sender, EventArgs e)
+ {
+ }
+ private void mnuJobDeleteBars_Click(object sender, EventArgs e)
+ {
+ }
+ private void mnuJobRandomize_Click(object sender, EventArgs e)
+ {
+ }
+ private void mnuJobConnect_Click(object sender, EventArgs e)
+ {
+ }
+ private void mnuJobInsertLyrics_Click(object sender, EventArgs e)
+ {
+ }
+ #endregion
+ #region Track
+ private void mnuTrackEnable_Click(object sender, EventArgs e)
+ {
+ }
+ private void mnuTrackAdd_Click(object sender, EventArgs e)
+ {
+ }
+ private void mnuTrackDuplicate_Click(object sender, EventArgs e)
+ {
+ }
+ private void mnuTrackRename_Click(object sender, EventArgs e)
+ {
+ }
+ private void mnuTrackDelete_Click(object sender, EventArgs e)
+ {
+ }
+ private void mnuTrackRenderCurrent_Click(object sender, EventArgs e)
+ {
+ }
+ private void mnuTrackRenderAll_Click(object sender, EventArgs e)
+ {
+ }
+ #endregion
+ #endregion
+ #endregion
- protected override void OnObjectModelChanged(EventArgs e)
+ protected override void OnObjectModelChanged(EventArgs e)
{
base.OnObjectModelChanged(e);
}
diff --git a/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.cs b/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.cs
new file mode 100644
index 00000000..67766d02
--- /dev/null
+++ b/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.cs
@@ -0,0 +1,152 @@
+// one line to give the program's name and an idea of what it does.
+// Copyright (C) yyyy name of author
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+using UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank;
+using UniversalEditor.UserInterface;
+using UniversalEditor.UserInterface.WindowsForms;
+
+namespace UniversalEditor.Editors.Multimedia.Audio.Voicebank
+{
+ // TODO: Create a file-format-independent explorer listview.
+
+ // The VoiceDatabaseEditor uses an Explorer listview interface. This means that
+ // PhonemeGroups are represented as folders, and Phonemes within those PhonemeGroups
+ // are represented as files. This makes it easy for a user to add/delete these kinds
+ // of items without having to learn complex interfaces.
+
+ // Where practical, I'd like to implement this interface in editors. If there is more
+ // than one editor that can be used to edit a particular type of file (for example,
+ // VoiceDatabaseProgrammerEditor and VoiceDatabaseExplorerEditor), the different
+ // editors will be listed when GetAvailableEditors (...) is called.
+
+ // For our test case (EDSEdit), these editors will be listed as tabs near the bottom
+ // of the screen. The upside to this model of course is that there will be a common
+ // editor for these types of files.
+
+ // The ExplorerEditorBase will expose a Folders collection and a Files collection.
+ // The ExplorerEditorBase will also have a built-in search box (which can be hidden
+ // if developing an app that has its own search methods) and a built-in search
+ // function Search(string text) (which can be used when developing aformentioned app)
+
+ // When user clicks on a folder (or a file), the ExplorerView will fire an ItemClick
+ // event (or for double-clicks, an ItemDoubleClick event) that the author of the Editor
+ // will handle by overriding the OnItemClick (or OnItemDoubleClick) event. The item
+ // that had been clicked will automatically go into the navigation stack (so a Back/Up
+ // button can be implemented without too much difficulty) and the author will be
+ // responsible for populating the next set of items in the hierarchy.
+
+ // Of course, the entire idea behind this is that EDS will become a drop-in replacement
+ // for any explorer on any system, and will be able to read and edit any files without
+ // difficulty.
+
+ ///
+ /// Description of VoiceDatabaseEditor.
+ ///
+ public partial class VoicebankEditor : Editor
+ {
+ public VoicebankEditor()
+ {
+ //
+ // The InitializeComponent() call is required for Windows Forms designer support.
+ //
+ InitializeComponent();
+
+ //
+ // TODO: Add constructor code after the InitializeComponent() call.
+ //
+ base.SupportedObjectModels.Add(typeof(VoicebankObjectModel));
+
+ // Select "Explorer" view by default, it looks nice~
+ tabControl1.SelectedIndex = 1;
+ }
+
+ /*
+ public override bool NavigateImaginaryPath(string path)
+ {
+ if (base.ObjectModel is VoicebankObjectModel)
+ {
+ VoicebankObjectModel ddi = (base.ObjectModel as VoicebankObjectModel);
+ PhonemeGroup pg = ddi.PhonemeGroups[path];
+ if (pg != null)
+ {
+ lvGroups.Items[ddi.PhonemeGroups.IndexOf(pg)].Selected = true;
+ }
+ else
+ {
+ MessageBox.Show("Phoneme group " + path + " does not exist in this file!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ return false;
+ }
+ */
+
+
+ protected override void OnObjectModelChanged(EventArgs e)
+ {
+ base.OnObjectModelChanged(e);
+
+ if (base.ObjectModel is VoicebankObjectModel)
+ {
+ VoicebankObjectModel ddi = (base.ObjectModel as VoicebankObjectModel);
+ lvGroups.Items.Clear();
+ lvPhonemes.Items.Clear();
+
+ foreach(PhonemeGroup pg in ddi.PhonemeGroups)
+ {
+ ListViewItem lvi = new ListViewItem();
+ lvi.Text = pg.Title;
+ lvi.SubItems.Add(pg.Phonemes.Count.ToString());
+ // lvi.SubItems.Add(pg.Data1.ToString());
+ // lvi.SubItems.Add(pg.Data2.ToString());
+ lvGroups.Items.Add(lvi);
+
+ ListViewItem lvie = new ListViewItem();
+ lvie.Text = pg.Title;
+ lvie.SubItems.Add(pg.Phonemes.Count.ToString());
+ // lvie.SubItems.Add(pg.Data1.ToString());
+ // lvie.SubItems.Add(pg.Data2.ToString());
+ lvie.ImageKey = "folder_closed";
+ lvExplorer.Items.Add(lvie);
+ }
+ }
+ }
+
+ void lvGroups_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ if (base.ObjectModel is VoicebankObjectModel)
+ {
+ VoicebankObjectModel ddi = (base.ObjectModel as VoicebankObjectModel);
+ lvPhonemes.Items.Clear();
+ if (lvGroups.SelectedIndices.Count == 1)
+ {
+ foreach (Phoneme p in ddi.PhonemeGroups[lvGroups.SelectedIndices[0]].Phonemes)
+ {
+ ListViewItem lvi = new ListViewItem();
+ lvi.Text = p.Title;
+ // lvi.SubItems.Add(p.Data.ToString());
+ lvPhonemes.Items.Add(lvi);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.designer.cs b/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.designer.cs
new file mode 100644
index 00000000..d40895ab
--- /dev/null
+++ b/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.designer.cs
@@ -0,0 +1,286 @@
+// one line to give the program's name and an idea of what it does.
+// Copyright (C) yyyy name of author
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+namespace UniversalEditor.Editors.Multimedia.Audio.Voicebank
+{
+ partial class VoicebankEditor
+ {
+ ///
+ /// Designer variable used to keep track of non-visual components.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Disposes resources used by the control.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing) {
+ if (components != null) {
+ components.Dispose();
+ }
+ }
+ base.Dispose(disposing);
+ }
+
+ ///
+ /// This method is required for Windows Forms designer support.
+ /// Do not change the method contents inside the source code editor. The Forms designer might
+ /// not be able to load this method if it was changed manually.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(VoiceDatabaseEditor));
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.button2 = new System.Windows.Forms.Button();
+ this.lvPhonemes = new System.Windows.Forms.ListView();
+ this.chPhonemeName = new System.Windows.Forms.ColumnHeader();
+ this.chPhonemeData = new System.Windows.Forms.ColumnHeader();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.button1 = new System.Windows.Forms.Button();
+ this.lvGroups = new System.Windows.Forms.ListView();
+ this.chPhonemeGroupName = new System.Windows.Forms.ColumnHeader();
+ this.chPhonemeGroupPhonemeCount = new System.Windows.Forms.ColumnHeader();
+ this.chPhonemeGroupData1 = new System.Windows.Forms.ColumnHeader();
+ this.chPhonemeGroupData2 = new System.Windows.Forms.ColumnHeader();
+ this.tabControl1 = new System.Windows.Forms.TabControl();
+ this.tabPage1 = new System.Windows.Forms.TabPage();
+ this.tabPage2 = new System.Windows.Forms.TabPage();
+ this.lvExplorer = new System.Windows.Forms.ListView();
+ this.imlExplorerLargeIcons = new System.Windows.Forms.ImageList(this.components);
+ this.imlExplorerSmallIcons = new System.Windows.Forms.ImageList(this.components);
+ this.groupBox1.SuspendLayout();
+ this.groupBox2.SuspendLayout();
+ this.tabControl1.SuspendLayout();
+ this.tabPage1.SuspendLayout();
+ this.tabPage2.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // groupBox1
+ //
+ this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.groupBox1.Controls.Add(this.button2);
+ this.groupBox1.Controls.Add(this.lvPhonemes);
+ this.groupBox1.Location = new System.Drawing.Point(3, 123);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(400, 175);
+ this.groupBox1.TabIndex = 1;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Phoneme List";
+ //
+ // button2
+ //
+ this.button2.Location = new System.Drawing.Point(6, 19);
+ this.button2.Name = "button2";
+ this.button2.Size = new System.Drawing.Size(75, 23);
+ this.button2.TabIndex = 0;
+ this.button2.Text = "button1";
+ this.button2.UseVisualStyleBackColor = true;
+ //
+ // lvPhonemes
+ //
+ this.lvPhonemes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.lvPhonemes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.chPhonemeName,
+ this.chPhonemeData});
+ this.lvPhonemes.FullRowSelect = true;
+ this.lvPhonemes.GridLines = true;
+ this.lvPhonemes.HideSelection = false;
+ this.lvPhonemes.Location = new System.Drawing.Point(6, 48);
+ this.lvPhonemes.Name = "lvPhonemes";
+ this.lvPhonemes.Size = new System.Drawing.Size(388, 121);
+ this.lvPhonemes.TabIndex = 1;
+ this.lvPhonemes.UseCompatibleStateImageBehavior = false;
+ this.lvPhonemes.View = System.Windows.Forms.View.Details;
+ //
+ // chPhonemeName
+ //
+ this.chPhonemeName.Text = "Name";
+ this.chPhonemeName.Width = 285;
+ //
+ // chPhonemeData
+ //
+ this.chPhonemeData.Text = "Data";
+ this.chPhonemeData.Width = 94;
+ //
+ // groupBox2
+ //
+ this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.groupBox2.Controls.Add(this.button1);
+ this.groupBox2.Controls.Add(this.lvGroups);
+ this.groupBox2.Location = new System.Drawing.Point(3, 3);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(397, 114);
+ this.groupBox2.TabIndex = 0;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "Phoneme Groups";
+ //
+ // button1
+ //
+ this.button1.Location = new System.Drawing.Point(6, 19);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(75, 23);
+ this.button1.TabIndex = 0;
+ this.button1.Text = "button1";
+ this.button1.UseVisualStyleBackColor = true;
+ //
+ // lvGroups
+ //
+ this.lvGroups.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.lvGroups.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.chPhonemeGroupName,
+ this.chPhonemeGroupPhonemeCount,
+ this.chPhonemeGroupData1,
+ this.chPhonemeGroupData2});
+ this.lvGroups.FullRowSelect = true;
+ this.lvGroups.GridLines = true;
+ this.lvGroups.HideSelection = false;
+ this.lvGroups.Location = new System.Drawing.Point(6, 48);
+ this.lvGroups.Name = "lvGroups";
+ this.lvGroups.Size = new System.Drawing.Size(385, 60);
+ this.lvGroups.TabIndex = 1;
+ this.lvGroups.UseCompatibleStateImageBehavior = false;
+ this.lvGroups.View = System.Windows.Forms.View.Details;
+ this.lvGroups.SelectedIndexChanged += new System.EventHandler(this.lvGroups_SelectedIndexChanged);
+ //
+ // chPhonemeGroupName
+ //
+ this.chPhonemeGroupName.Text = "Name";
+ this.chPhonemeGroupName.Width = 190;
+ //
+ // chPhonemeGroupPhonemeCount
+ //
+ this.chPhonemeGroupPhonemeCount.Text = "Phonemes";
+ this.chPhonemeGroupPhonemeCount.Width = 82;
+ //
+ // chPhonemeGroupData1
+ //
+ this.chPhonemeGroupData1.Text = "Data 1";
+ //
+ // chPhonemeGroupData2
+ //
+ this.chPhonemeGroupData2.Text = "Data 2";
+ //
+ // tabControl1
+ //
+ this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tabControl1.Controls.Add(this.tabPage1);
+ this.tabControl1.Controls.Add(this.tabPage2);
+ this.tabControl1.Location = new System.Drawing.Point(3, 3);
+ this.tabControl1.Name = "tabControl1";
+ this.tabControl1.SelectedIndex = 0;
+ this.tabControl1.Size = new System.Drawing.Size(414, 327);
+ this.tabControl1.TabIndex = 3;
+ //
+ // tabPage1
+ //
+ this.tabPage1.Controls.Add(this.groupBox2);
+ this.tabPage1.Controls.Add(this.groupBox1);
+ this.tabPage1.Location = new System.Drawing.Point(4, 22);
+ this.tabPage1.Name = "tabPage1";
+ this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPage1.Size = new System.Drawing.Size(406, 301);
+ this.tabPage1.TabIndex = 0;
+ this.tabPage1.Text = "Programmer";
+ this.tabPage1.UseVisualStyleBackColor = true;
+ //
+ // tabPage2
+ //
+ this.tabPage2.Controls.Add(this.lvExplorer);
+ this.tabPage2.Location = new System.Drawing.Point(4, 22);
+ this.tabPage2.Name = "tabPage2";
+ this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPage2.Size = new System.Drawing.Size(406, 301);
+ this.tabPage2.TabIndex = 1;
+ this.tabPage2.Text = "Explorer";
+ this.tabPage2.UseVisualStyleBackColor = true;
+ //
+ // lvExplorer
+ //
+ this.lvExplorer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.lvExplorer.FullRowSelect = true;
+ this.lvExplorer.GridLines = true;
+ this.lvExplorer.HideSelection = false;
+ this.lvExplorer.LargeImageList = this.imlExplorerLargeIcons;
+ this.lvExplorer.Location = new System.Drawing.Point(3, 3);
+ this.lvExplorer.Name = "lvExplorer";
+ this.lvExplorer.Size = new System.Drawing.Size(400, 295);
+ this.lvExplorer.SmallImageList = this.imlExplorerSmallIcons;
+ this.lvExplorer.TabIndex = 1;
+ this.lvExplorer.UseCompatibleStateImageBehavior = false;
+ //
+ // imlExplorerLargeIcons
+ //
+ this.imlExplorerLargeIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imlExplorerLargeIcons.ImageStream")));
+ this.imlExplorerLargeIcons.TransparentColor = System.Drawing.Color.Transparent;
+ this.imlExplorerLargeIcons.Images.SetKeyName(0, "folder_closed");
+ this.imlExplorerLargeIcons.Images.SetKeyName(1, "folder_open");
+ //
+ // imlExplorerSmallIcons
+ //
+ this.imlExplorerSmallIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imlExplorerSmallIcons.ImageStream")));
+ this.imlExplorerSmallIcons.TransparentColor = System.Drawing.Color.Transparent;
+ this.imlExplorerSmallIcons.Images.SetKeyName(0, "folder_closed");
+ this.imlExplorerSmallIcons.Images.SetKeyName(1, "folder_open");
+ //
+ // VoiceDatabaseEditor
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.tabControl1);
+ this.Name = "VoiceDatabaseEditor";
+ this.Size = new System.Drawing.Size(420, 333);
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox2.ResumeLayout(false);
+ this.tabControl1.ResumeLayout(false);
+ this.tabPage1.ResumeLayout(false);
+ this.tabPage2.ResumeLayout(false);
+ this.ResumeLayout(false);
+ }
+ private System.Windows.Forms.ImageList imlExplorerSmallIcons;
+ private System.Windows.Forms.ImageList imlExplorerLargeIcons;
+ private System.Windows.Forms.ListView lvExplorer;
+ private System.Windows.Forms.TabPage tabPage2;
+ private System.Windows.Forms.TabPage tabPage1;
+ private System.Windows.Forms.TabControl tabControl1;
+ private System.Windows.Forms.ColumnHeader chPhonemeGroupData2;
+ private System.Windows.Forms.ColumnHeader chPhonemeGroupData1;
+ private System.Windows.Forms.ListView lvPhonemes;
+ private System.Windows.Forms.ColumnHeader chPhonemeGroupPhonemeCount;
+ private System.Windows.Forms.ColumnHeader chPhonemeGroupName;
+ private System.Windows.Forms.ColumnHeader chPhonemeData;
+ private System.Windows.Forms.ColumnHeader chPhonemeName;
+ private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.Button button2;
+ private System.Windows.Forms.ListView lvGroups;
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.GroupBox groupBox1;
+ }
+}
diff --git a/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.resx b/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.resx
new file mode 100644
index 00000000..2009534e
--- /dev/null
+++ b/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.resx
@@ -0,0 +1,273 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 9, 8
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
+ LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACC
+ GAAAAk1TRnQBSQFMAgEBAgEAAQQBAAEEAQABIAEAASABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAGA
+ AwABIAMAAQEBAAEgBgABQP8A/wD/AP8A/wD/AKgAAwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMB
+ Af8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMB
+ Af8DAQH/AwEB/wMBAf8DAQH//wAJAAMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMB
+ Af8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMB
+ Af8DAQH/AwEB/wMBAf8DAQH/AwEB/xAAA4EB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEB
+ AoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEB
+ AoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEB
+ AoEB/wEBAoEB/wMBAf//AAEAA4EB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEB
+ AoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEB
+ AoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEB
+ AoEB/wEBAoEB/wEBAoEB/wEBAoEB/wMBAf8MAAOBAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBAoEB/wMBAf//AAEAA4EF/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB
+ A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA
+ Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQKBAf8DAQH/DAADgQH/A8AB/wEBA/8DwAH/AQED/wPA
+ Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB
+ A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8BAQKBAf8DAQH//wABAAOBBf8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/AQECgQH/AwEB/wgAA4EB/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wMBAf8DAQH//wABAAOBBf8BAQP/
+ A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQECgQH/AwEB/wgA
+ A4EB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/A8AB/wMBAf8DAQH/
+ /wABAAOBBf8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ AQECgQH/AwEB/wgAA4EB/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A4EB/wMBAf8DAQH//wABAAOBBf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/AQECgQH/AwEB/wgAA4EB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/A4EB/wMBAf8DAQH//wABAAOBBf8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/AQECgQH/AwEB/wQAA4EB/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wMBAf8BAQKBAf8DAQH//wABAAOBBf8BAQP/A8AB/wEB
+ A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA
+ Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQECgQH/AwEB/wQAA4EB/wPA
+ Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB
+ A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wMBAf8BAQKBAf8DAQH/
+ /wABAAOBBf8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ AQECgQH/AwEB/wQAA4EB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ A4EB/wMBAf8BAQKBAf8DAQH//wABAAOBBf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB
+ A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA
+ Af8BAQP/A8AB/wEBA/8DwAH/AQECgQH/AwEB/wQAA4EB/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA
+ Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB
+ A/8DwAH/AQED/wPAAf8BAQP/A4EB/wMBAf8BAQKBAf8DAQH//wABAAOBBf8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/AQECgQH/AwEB/wOBAf8DwAH/AQED/wPA
+ Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB
+ A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8DAQH/A4EB/wEBAoEB/wMBAf//AAEA
+ A4EF/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQKB
+ Af8DAQH/A4EB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB
+ A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wMB
+ Af8DgQH/AQECgQH/AwEB//8AAQADgQX/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/AQED/wEBAoEB/wMBAf8DgQH/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB
+ A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA
+ Af8BAQP/A8AB/wEBA/8DgQH/AwEB/wEBA/8BAQKBAf8DAQH//wABAAOBBf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQECgQH/AwEB/wOBAf8BAQP/A8AB/wEB
+ A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA
+ Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wOBAf8DAQH/A8AB/wEBAoEB/wMBAf//AAEA
+ A4EF/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8BAQKB
+ Af8DAQH/A4Fp/wMBAf8DgQH/AQED/wEBAoEB/wMBAf//AAEAA4EF/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQKBAf8DAQH/BAADgQH/A4EB/wPAAf8DwAH/
+ A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/
+ A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/A8AB/wPAAf8BAQP/A8AB/wEBAoEB/wMBAf//AAEAA4EF/wPA
+ Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB
+ A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8BAQKBAf8DAQH/
+ DAADgQX/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA
+ Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wEBAoEB/wMBAf//AAEA
+ A4EF/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQKB
+ Af8DAQH/DAADgQX/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBAoEB/wMB
+ Af//AAEAA4EF/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA
+ Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB
+ A/8BAQKBAf8DAQH/DAADgQX/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB
+ A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wEB
+ AoEB/wMBAf//AAEAA4EF/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQKBAf8DAQH/DAADgQX/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/
+ AQED/wPAAf8BAQP/A8AB/wEBL/8DAQH//wAFAAOBdf8BAQKBAf8DAQH/DAADgQX/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8DgQH/A4EB/wOBAf8DgQH/
+ A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB//8ACQADgQH/A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/
+ A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/
+ A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DAQH/FAADgQX/AQED/wPAAf8BAQP/A8AB/wEB
+ A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/A4EB//8AOQADgQX/AQED/wPAAf8BAQP/A8AB/wEB
+ A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/A4EB/1QAA4EF/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/AQED/wPAAf8DgQH//wBBAAOBBf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/A4EB/1wAA4El/wOBAf//AEkAA4El/wOBAf9kAAOBAf8DgQH/A4EB/wOBAf8DgQH/
+ A4EB/wOBAf8DgQH/A4EB//8AUQADgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf//AP8A
+ /wDPAAFCAU0BPgcAAT4DAAEoAwABgAMAASADAAEBAQABAQYAAQIWAAP/AQAI/wgACP8IAAj/CAAE/wHw
+ AgABAQgAAYACAAEBAeAPAAHgDwAB4A8AAcAPAAHADwABwA8AAcAPAAGADwABgA8AAYAPAAGAXwABgA8A
+ AeAPAAHgDwAB4A8AAeACAAEBDAAB4AIAAQMLAAEBAfABAAEfAf8IAAGAAQAC/wH4AQABPwH/CAABwAEB
+ Av8B/AEAAX8B/wgAAeABAwL/Af4BAAL/CAAB8AEHBv8IAAj/CAAL
+
+
+
+ 162, 10
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
+ LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADI
+ BQAAAk1TRnQBSQFMAgEBAgEAAQUBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+ AwABEAMAAQEBAAEgBgABEP8A/wAYAAMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMB
+ Af8DAQH/AwEB/wMBAf8DAQH/EAADAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/
+ AwEB/wMBAf8DAQH/gAADgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOB
+ Af8DgQH/A4EB/wMBAf8MAAOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/
+ A4EB/wMBAf8DAQH/gAADgQX/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB
+ A/8DgQH/AwEB/wwAA4EF/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wOBAf8DAQH/
+ AwEB/4AAA4EF/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/A4EB/wMB
+ Af8IAAOBBf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AwEB/wOBAf8DAQH/
+ gAADgQX/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DgQH/AwEB/wgA
+ A4EF/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wOBAf8DAQH/A4EB/wMBAf+AAAOB
+ Bf8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wOBAf8DAQH/BAADgQX/
+ A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wMBAf8DgQH/A4EB/wMBAf+AAAOB
+ Bf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wOBAf8DAQH/BAADgSn/
+ A4EB/wMBAf8DwAH/A4EB/wMBAf+AAAOBBf8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA
+ Af8BAQP/A8AB/wOBAf8DAQH/BAADgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/
+ A4EB/wOBAf8DgQH/AQED/wOBAf8DAQH/gAADgQX/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA
+ Af8BAQP/A8AB/wEBA/8DgQH/AwEB/wgAA4EF/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A8AB/wEBA/8DwAH/A4EB/wMBAf+AAAOBMf8DgQH/AwEB/wgAA4EF/wEBA/8DwAH/AQED/wPAAf8BAQP/
+ A8AV/wOBAf8DAQH/gAADgQH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wOBAf8DgQH/A4EB/wOB
+ Af8DgQH/A4EB/wwAA4EF/wPAAf8BAQP/A8AB/wEBA/8DwAX/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/
+ iAADgQH/AQED/wPAAf8BAQP/A8AB/wEBA/8DgQH/KAADgRX/A4EB/6QAA4EB/wOBAf8DgQH/A4EB/wOB
+ Af8wAAOBAf8DgQH/A4EB/wOBAf8DgQH//wChAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUA
+ AYAXAAP/AQAE/wQABP8EAAGAAQEB4AYAAQEBwAYAAQEBwAYAAQEBgAYAAQEBgAYAAQEHAAEBBwABAQcA
+ AQEBgAYAAQEBgAYAAQMBgAEBBAABgAH/AcABfwQAAcEB/wHgAf8EAAT/BAAL
+
+
+
+ 37
+
+
\ No newline at end of file
diff --git a/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms.csproj b/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms.csproj
index eeada1e9..f7eb8fbb 100644
--- a/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms.csproj
+++ b/CSharp/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms.csproj
@@ -100,6 +100,12 @@
SynthesizedAudioEditor.cs
+
+ UserControl
+
+
+ VoicebankEditor.cs
+
UserControl
@@ -166,6 +172,9 @@
SynthesizedAudioEditor.cs
+
+ VoicebankEditor.cs
+
WaveformAudioEditor.cs
diff --git a/CSharp/Plugins/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutAction.cs b/CSharp/Plugins/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutAction.cs
new file mode 100644
index 00000000..343302fe
--- /dev/null
+++ b/CSharp/Plugins/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutAction.cs
@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace UniversalEditor.DataFormats.Shortcut.FreeDesktop
+{
+ public class DesktopShortcutAction
+ {
+ public class DesktopShortcutActionCollection
+ : System.Collections.ObjectModel.Collection
+ {
+
+ }
+
+ private string mvarName = String.Empty;
+ public string Name { get { return mvarName; } set { mvarName = value; } }
+
+ private string mvarTitle = String.Empty;
+ ///
+ /// Label that will be shown to the user. Since actions are always shown in the context of
+ /// a specific application (that is, as a submenu of a launcher), this only needs to be
+ /// unambiguous within one application and should not include the application name.
+ ///
+ public string Title { get { return mvarTitle; } set { mvarTitle = value; } }
+
+ private string mvarIconFileName = String.Empty;
+ ///
+ /// Icon to be shown togheter with the action. If the name is an absolute path, the given
+ /// file will be used. If the name is not an absolute path, the algorithm described in the
+ /// Icon Theme Specification will be used to locate the icon. Implementations may choose
+ /// to ignore it.
+ ///
+ public string IconFileName { get { return mvarIconFileName; } set { mvarIconFileName = value; } }
+
+ private string mvarExecutableFileName = String.Empty;
+ ///
+ /// Program to execute for this action. See the Exec key for details on how this key
+ /// works. The Exec key is required if DBusActivatable is not set to true in the main
+ /// desktop entry group. Even if DBusActivatable is true, Exec should be specified for
+ /// compatibility with implementations that do not understand DBusActivatable.
+ ///
+ public string ExecutableFileName { get { return mvarExecutableFileName; } set { mvarExecutableFileName = value; } }
+
+ private System.Collections.Specialized.StringCollection mvarExecutableArguments = new System.Collections.Specialized.StringCollection();
+ ///
+ /// Arguments passed into the associated program when it is executed.
+ ///
+ public System.Collections.Specialized.StringCollection ExecutableArguments { get { return mvarExecutableArguments; } }
+ }
+}
diff --git a/CSharp/Plugins/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutDataFormat.cs b/CSharp/Plugins/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutDataFormat.cs
new file mode 100644
index 00000000..3ee384ff
--- /dev/null
+++ b/CSharp/Plugins/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutDataFormat.cs
@@ -0,0 +1,418 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using UniversalEditor.ObjectModels.PropertyList;
+using UniversalEditor.DataFormats.PropertyList;
+using UniversalEditor.ObjectModels.Shortcut;
+
+namespace UniversalEditor.DataFormats.Shortcut.FreeDesktop
+{
+ public class DesktopShortcutDataFormat : WindowsConfigurationDataFormat
+ {
+ private static DataFormatReference _dfr = null;
+ public override DataFormatReference MakeReference()
+ {
+ if (_dfr == null)
+ {
+ _dfr = new DataFormatReference(GetType());
+ _dfr.Capabilities.Add(typeof(ShortcutObjectModel), DataFormatCapabilities.All);
+ _dfr.ExportOptions.Add(new CustomOptionText("ApplicationTitle", "&Application title: "));
+ _dfr.ExportOptions.Add(new CustomOptionText("GenericTitle", "&Generic title: "));
+ _dfr.ExportOptions.Add(new CustomOptionBoolean("HideFromMenus", "&Do not display this entry in menus"));
+ _dfr.ExportOptions.Add(new CustomOptionBoolean("Deleted", "&Mark this shortcut as being deleted by the user"));
+ _dfr.ExportOptions.Add(new CustomOptionBoolean("DBusActivatable", "&Enable DBus activation"));
+ _dfr.Sources.Add("http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html");
+ _dfr.Filters.Add("FreeDesktop.org desktop/directory shortcut entry", new string[] { "*.desktop", "*.directory" });
+ }
+ return _dfr;
+ }
+
+ private string mvarApplicationTitle = String.Empty;
+ ///
+ /// Specific name of the application, for example "Mozilla".
+ ///
+ public string ApplicationTitle { get { return mvarApplicationTitle; } set { mvarApplicationTitle = value; } }
+
+ private string mvarGenericTitle = String.Empty;
+ ///
+ /// Generic name of the application, for example "Web Browser".
+ ///
+ public string GenericTitle { get { return mvarGenericTitle; } set { mvarGenericTitle = value; } }
+
+ private DesktopShortcutType mvarType = DesktopShortcutType.Application;
+ public DesktopShortcutType Type { get { return mvarType; } set { mvarType = value; } }
+
+ private bool mvarHideFromMenus = false;
+ ///
+ /// NoDisplay means "this application exists, but don't display it in the menus". This
+ /// can be useful to e.g. associate this application with MIME types, so that it gets
+ /// launched from a file manager (or other apps), without having a menu entry for it
+ /// (there are tons of good reasons for this, including e.g. the netscape -remote, or
+ /// kfmclient openURL kind of stuff).
+ ///
+ public bool HideFromMenus { get { return mvarHideFromMenus; } set { mvarHideFromMenus = value; } }
+
+ private bool mvarDeleted = false;
+ ///
+ /// Hidden should have been called Deleted. It means the user deleted (at his level)
+ /// something that was present (at an upper level, e.g. in the system dirs). It's strictly
+ /// equivalent to the .desktop file not existing at all, as far as that user is concerned.
+ /// This can also be used to "uninstall" existing files (e.g. due to a renaming) - by
+ /// letting make install install a file with Hidden=true in it.
+ ///
+ public bool Deleted { get { return mvarDeleted; } set { mvarDeleted = value; } }
+
+ private System.Collections.Specialized.StringCollection mvarRestrictedEnvironments = new System.Collections.Specialized.StringCollection();
+ ///
+ ///
+ /// A list of strings identifying the desktop environments that should display/not
+ /// display a given desktop entry.
+ ///
+ ///
+ /// By default, a desktop file should be shown, unless an
+ /// OnlyShowIn key is present, in which case, the default is for the file not to be
+ /// shown.
+ ///
+ ///
+ /// If $XDG_CURRENT_DIRECTORY is set then it contains a colon-separated list of strings.
+ /// In order, each string is considered. If a matching entry is found in OnlyShowIn then
+ /// the desktop file is shown. If an entry is found in NotShowIn then the desktop file is
+ /// not shown. If none of the strings match then the default action is taken (as above).
+ ///
+ ///
+ /// The same desktop name may not appear in both OnlyShowIn and NotShowIn of a group.
+ ///
+ ///
+ public System.Collections.Specialized.StringCollection RestrictedEnvironments { get { return mvarRestrictedEnvironments; } }
+
+ private System.Collections.Specialized.StringCollection mvarExcludedEnvironments = new System.Collections.Specialized.StringCollection();
+ ///
+ ///
+ /// A list of strings identifying the desktop environments that should display/not
+ /// display a given desktop entry.
+ ///
+ ///
+ /// By default, a desktop file should be shown, unless an
+ /// OnlyShowIn key is present, in which case, the default is for the file not to be
+ /// shown.
+ ///
+ ///
+ /// If $XDG_CURRENT_DIRECTORY is set then it contains a colon-separated list of strings.
+ /// In order, each string is considered. If a matching entry is found in OnlyShowIn then
+ /// the desktop file is shown. If an entry is found in NotShowIn then the desktop file is
+ /// not shown. If none of the strings match then the default action is taken (as above).
+ ///
+ ///
+ /// The same desktop name may not appear in both OnlyShowIn and NotShowIn of a group.
+ ///
+ ///
+ public System.Collections.Specialized.StringCollection ExcludedEnvironments { get { return mvarExcludedEnvironments; } }
+
+ private bool mvarDBusActivatable = false;
+ ///
+ /// A boolean value specifying if D-Bus activation is supported for this application. If
+ /// this key is missing, the default value is false. If the value is true then
+ /// implementations should ignore the Exec key and send a D-Bus message to launch the
+ /// application. See D-Bus Activation for more information on how this works.
+ /// Applications should still include Exec= lines in their desktop files for
+ /// compatibility with implementations that do not understand the DBusActivatable key.
+ ///
+ public bool DBusActivatable { get { return mvarDBusActivatable; } set { mvarDBusActivatable = value; } }
+
+ private string mvarTryExec = String.Empty;
+ ///
+ /// Path to an executable file on disk used to determine if the program is actually
+ /// installed. If the path is not an absolute path, the file is looked up in the $PATH
+ /// environment variable. If the file is not present or if it is not executable, the entry
+ /// may be ignored (not be used in menus, for example).
+ ///
+ public string TryExec { get { return mvarTryExec; } set { mvarTryExec = value; } }
+
+ private DesktopShortcutAction.DesktopShortcutActionCollection mvarActions = new DesktopShortcutAction.DesktopShortcutActionCollection();
+ ///
+ /// Identifiers for application actions. This can be used to tell the application to make
+ /// a specific action, different from the default behavior. The Application actions
+ /// section describes how actions work.
+ ///
+ public DesktopShortcutAction.DesktopShortcutActionCollection Actions { get { return mvarActions; } }
+
+ private System.Collections.Specialized.StringCollection mvarSupportedMimeTypes = new System.Collections.Specialized.StringCollection();
+ ///
+ /// The MIME type(s) supported by this application.
+ ///
+ public System.Collections.Specialized.StringCollection SupportedMimeTypes { get { return mvarSupportedMimeTypes; } }
+
+ private System.Collections.Specialized.StringCollection mvarCategories = new System.Collections.Specialized.StringCollection();
+ ///
+ /// Categories in which the entry should be shown in a menu (for possible values see the Desktop Menu Specification).
+ ///
+ public System.Collections.Specialized.StringCollection Categories { get { return mvarCategories; } }
+
+ private System.Collections.Specialized.StringCollection mvarKeywords = new System.Collections.Specialized.StringCollection();
+ ///
+ /// A list of strings which may be used in addition to other metadata to describe this
+ /// entry. This can be useful e.g. to facilitate searching through entries. The values
+ /// are not meant for display, and should not be redundant with the values of Name or
+ /// GenericName.
+ ///
+ public System.Collections.Specialized.StringCollection Keywords { get { return mvarKeywords; } }
+
+ private DesktopShortcutStartupNotifyBehavior mvarStartupNotify = DesktopShortcutStartupNotifyBehavior.Disabled;
+ ///
+ /// If set to , it is KNOWN
+ /// that the application will send a "remove" message when started with the
+ /// DESKTOP_STARTUP_ID environment variable set. If set to
+ /// , it is KNOWN that the
+ /// application does not work with startup notification at all (does not shown any window,
+ /// breaks even when using StartupWMClass, etc.). If set to
+ /// , a reasonable handling is
+ /// up to implementations (assuming false, using StartupWMClass, etc.). (See the Startup
+ /// Notification Protocol Specification for more details).
+ ///
+ public DesktopShortcutStartupNotifyBehavior StartupNotify { get { return mvarStartupNotify; } set { mvarStartupNotify = value; } }
+
+ private string mvarStartupWindowClass = String.Empty;
+ ///
+ /// If specified, it is known that the application will map at least one window with the
+ /// given string as its WM class or WM name hint (see the Startup Notification Protocol
+ /// Specification for more details).
+ ///
+ public string StartupWindowClass { get { return mvarStartupWindowClass; } set { mvarStartupWindowClass = value; } }
+
+ protected override void BeforeLoadInternal(Stack objectModels)
+ {
+ base.BeforeLoadInternal(objectModels);
+ objectModels.Push(new PropertyListObjectModel());
+ }
+ protected override void AfterLoadInternal(Stack objectModels)
+ {
+ base.AfterLoadInternal(objectModels);
+
+ PropertyListObjectModel plom = (objectModels.Pop() as PropertyListObjectModel);
+ ShortcutObjectModel shortcut = (objectModels.Pop() as ShortcutObjectModel);
+
+
+ }
+ protected override void BeforeSaveInternal(Stack objectModels)
+ {
+ base.BeforeSaveInternal(objectModels);
+ ShortcutObjectModel shortcut = (objectModels.Pop() as ShortcutObjectModel);
+ PropertyListObjectModel plom = new PropertyListObjectModel();
+
+ #region Desktop Entry
+ {
+ Group group = new Group("Desktop Entry");
+
+ // Version of the Desktop Entry Specification that the desktop entry conforms
+ // with. Entries that confirm with this version of the specification should use
+ // 1.0. Note that the version field is not required to be present.
+ group.Properties.Add("Version", "1.0");
+
+ if (!String.IsNullOrEmpty(mvarApplicationTitle))
+ {
+ group.Properties.Add("Name", mvarApplicationTitle);
+ }
+ if (!String.IsNullOrEmpty(mvarGenericTitle))
+ {
+ group.Properties.Add("GenericName", mvarGenericTitle);
+ }
+ if (mvarHideFromMenus)
+ {
+ group.Properties.Add("NoDisplay", "true");
+ }
+ if (!String.IsNullOrEmpty(shortcut.Comment))
+ {
+ group.Properties.Add("Comment", shortcut.Comment);
+ }
+ if (!String.IsNullOrEmpty(shortcut.IconFileName))
+ {
+ // Icon to display in file manager, menus, etc. If the name is an absolute
+ // path, the given file will be used. If the name is not an absolute path, the
+ // algorithm described in the Icon Theme Specification will be used to locate
+ // the icon.
+ group.Properties.Add("Icon", shortcut.IconFileName);
+ }
+ if (mvarDeleted)
+ {
+ group.Properties.Add("Hidden", true);
+ }
+ if (mvarRestrictedEnvironments.Count > 0)
+ {
+ StringBuilder sb = new StringBuilder();
+ foreach (string s in mvarRestrictedEnvironments)
+ {
+ sb.Append(s);
+ if (mvarRestrictedEnvironments.IndexOf(s) < mvarRestrictedEnvironments.Count - 1)
+ {
+ sb.Append(":");
+ }
+ }
+ group.Properties.Add("OnlyShowIn", sb.ToString());
+ }
+ if (mvarExcludedEnvironments.Count > 0)
+ {
+ StringBuilder sb = new StringBuilder();
+ foreach (string s in mvarExcludedEnvironments)
+ {
+ sb.Append(s);
+ if (mvarExcludedEnvironments.IndexOf(s) < mvarExcludedEnvironments.Count - 1)
+ {
+ sb.Append(":");
+ }
+ }
+ group.Properties.Add("NotShowIn", sb.ToString());
+ }
+
+ if (mvarDBusActivatable)
+ {
+ group.Properties.Add("DBusActivatable", true);
+ }
+
+ if (!String.IsNullOrEmpty(mvarTryExec))
+ {
+ group.Properties.Add("TryExec", mvarTryExec);
+ }
+ if (!String.IsNullOrEmpty(shortcut.ExecutableFileName))
+ {
+ // Program to execute, possibly with arguments. See the Exec key for details
+ // on how this key works. The Exec key is required if DBusActivatable is not
+ // set to true. Even if DBusActivatable is true, Exec should be specified for
+ // compatibility with implementations that do not understand DBusActivatable.
+
+ StringBuilder sb = new StringBuilder();
+ sb.Append(shortcut.ExecutableFileName);
+ foreach (string arg in shortcut.ExecutableArguments)
+ {
+ sb.Append(" ");
+ sb.Append(arg);
+ }
+ group.Properties.Add("Exec", sb.ToString());
+ }
+ if (!String.IsNullOrEmpty(shortcut.WorkingDirectory))
+ {
+ // If entry is of type Application, the working directory in which to run the
+ // program.
+ group.Properties.Add("Path", shortcut.WorkingDirectory);
+ }
+ if (shortcut.RunInTerminal)
+ {
+ // Whether the program runs in a terminal window.
+ group.Properties.Add("Terminal", true);
+ }
+ #region Desktop Actions
+ {
+ // Identifiers for application actions. This can be used to tell the
+ // application to make a specific action, different from the default
+ // behavior. The Application actions section describes how actions work.
+ StringBuilder sb = new StringBuilder();
+ foreach (DesktopShortcutAction action in mvarActions)
+ {
+ sb.Append(action.Name);
+ sb.Append(";");
+ }
+ group.Properties.Add("Actions", sb.ToString());
+ }
+ #endregion
+
+ if (mvarSupportedMimeTypes.Count > 0)
+ {
+ StringBuilder sb = new StringBuilder();
+ foreach (string s in mvarSupportedMimeTypes)
+ {
+ sb.Append(s);
+ sb.Append(";");
+ }
+ group.Properties.Add("MimeType", sb.ToString());
+ }
+ if (mvarCategories.Count > 0)
+ {
+ StringBuilder sb = new StringBuilder();
+ foreach (string s in mvarCategories)
+ {
+ sb.Append(s);
+ sb.Append(";");
+ }
+ group.Properties.Add("Categories", sb.ToString());
+ }
+ if (mvarKeywords.Count > 0)
+ {
+ StringBuilder sb = new StringBuilder();
+ foreach (string s in mvarKeywords)
+ {
+ sb.Append(s);
+ sb.Append(";");
+ }
+ group.Properties.Add("Keywords", sb.ToString());
+ }
+
+ switch (mvarStartupNotify)
+ {
+ case DesktopShortcutStartupNotifyBehavior.Disabled:
+ {
+ break;
+ }
+ case DesktopShortcutStartupNotifyBehavior.Supported:
+ {
+ group.Properties.Add("StartupNotify", true);
+ break;
+ }
+ case DesktopShortcutStartupNotifyBehavior.Unsupported:
+ {
+ group.Properties.Add("StartupNotify", false);
+ break;
+ }
+ }
+
+ if (!String.IsNullOrEmpty(mvarStartupWindowClass))
+ {
+ group.Properties.Add("StartupWMClass", mvarStartupWindowClass);
+ }
+
+ if (mvarType == DesktopShortcutType.InternetLink)
+ {
+ group.Properties.Add("URL", shortcut.ExecutableFileName);
+ }
+
+
+ // This specification defines 3 types of desktop entries: Application (type 1),
+ // Link (type 2) and Directory (type 3). To allow the addition of new types in the
+ // future, implementations should ignore desktop entries with an unknown type.
+ // group.Properties.Add("Type");
+
+ plom.Groups.Add(group);
+
+
+ #region Desktop Actions
+ {
+ // Identifiers for application actions. This can be used to tell the
+ // application to make a specific action, different from the default
+ // behavior. The Application actions section describes how actions work.
+ foreach (DesktopShortcutAction action in mvarActions)
+ {
+ Group group1 = new Group("Desktop Action " + action.Name);
+
+ StringBuilder sb = new StringBuilder();
+ sb.Append(action.ExecutableFileName);
+ foreach (string s in action.ExecutableArguments)
+ {
+ sb.Append(" ");
+ sb.Append(s);
+ }
+ group1.Properties.Add("Exec", sb.ToString());
+
+ group1.Properties.Add("Name", action.Title);
+ group1.Properties.Add("Icon", action.IconFileName);
+
+ plom.Groups.Add(group1);
+ }
+ }
+ #endregion
+ }
+ #endregion
+
+ objectModels.Push(plom);
+ }
+ }
+}
diff --git a/CSharp/Plugins/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutStartupNotifyBehavior.cs b/CSharp/Plugins/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutStartupNotifyBehavior.cs
new file mode 100644
index 00000000..8c4fc8d1
--- /dev/null
+++ b/CSharp/Plugins/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutStartupNotifyBehavior.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace UniversalEditor.DataFormats.Shortcut.FreeDesktop
+{
+ public enum DesktopShortcutStartupNotifyBehavior
+ {
+ Disabled = 0,
+ Supported = 1,
+ Unsupported = 2
+ }
+}
diff --git a/CSharp/Plugins/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutType.cs b/CSharp/Plugins/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutType.cs
new file mode 100644
index 00000000..5031a896
--- /dev/null
+++ b/CSharp/Plugins/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutType.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace UniversalEditor.DataFormats.Shortcut.FreeDesktop
+{
+ public enum DesktopShortcutType
+ {
+ InternetLink
+ }
+}
diff --git a/CSharp/Plugins/UniversalEditor.Essential/ObjectModels/Shortcut/ShortcutObjectModel.cs b/CSharp/Plugins/UniversalEditor.Essential/ObjectModels/Shortcut/ShortcutObjectModel.cs
new file mode 100644
index 00000000..0e2ab98d
--- /dev/null
+++ b/CSharp/Plugins/UniversalEditor.Essential/ObjectModels/Shortcut/ShortcutObjectModel.cs
@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace UniversalEditor.ObjectModels.Shortcut
+{
+ public class ShortcutObjectModel : ObjectModel
+ {
+ private static ObjectModelReference _omr = null;
+ public override ObjectModelReference MakeReference()
+ {
+ if (_omr == null)
+ {
+ _omr = base.MakeReference();
+ _omr.Title = "Shortcut";
+ }
+ return _omr;
+ }
+
+ public override void Clear()
+ {
+ }
+
+ public override void CopyTo(ObjectModel where)
+ {
+ }
+
+ private string mvarComment = String.Empty;
+ ///
+ /// Tooltip for the entry, for example "View sites on the Internet". The value should not
+ /// be redundant with the shortcut title.
+ ///
+ public string Comment { get { return mvarComment; } set { mvarComment = value; } }
+
+ private string mvarIconFileName = String.Empty;
+ ///
+ /// File name or known icon name of the icon to display in the file manager, menus, etc.
+ ///
+ public string IconFileName { get { return mvarIconFileName; } set { mvarIconFileName = value; } }
+
+ private string mvarExecutableFileName = String.Empty;
+ public string ExecutableFileName { get { return mvarExecutableFileName; } set { mvarExecutableFileName = value; } }
+
+ private System.Collections.Specialized.StringCollection mvarExecutableArguments = new System.Collections.Specialized.StringCollection();
+ public System.Collections.Specialized.StringCollection ExecutableArguments { get { return mvarExecutableArguments; } }
+
+ private string mvarWorkingDirectory = String.Empty;
+ ///
+ /// The directory in which to run the program, if different than the program's location.
+ ///
+ public string WorkingDirectory { get { return mvarWorkingDirectory; } set { mvarWorkingDirectory = value; } }
+
+ private bool mvarRunInTerminal = false;
+ ///
+ /// Whether the program runs in a terminal window.
+ ///
+ public bool RunInTerminal { get { return mvarRunInTerminal; } set { mvarRunInTerminal = value; } }
+ }
+}
diff --git a/CSharp/Plugins/UniversalEditor.Essential/UniversalEditor.Essential.csproj b/CSharp/Plugins/UniversalEditor.Essential/UniversalEditor.Essential.csproj
index 07fb80dd..bd273733 100644
--- a/CSharp/Plugins/UniversalEditor.Essential/UniversalEditor.Essential.csproj
+++ b/CSharp/Plugins/UniversalEditor.Essential/UniversalEditor.Essential.csproj
@@ -1,4 +1,4 @@
-
+
@@ -55,6 +55,10 @@
+
+
+
+
@@ -85,6 +89,7 @@
+
diff --git a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700DataFormat.cs b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700DataFormat.cs
index 7120f2ba..946ab6f7 100644
--- a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700DataFormat.cs
+++ b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700DataFormat.cs
@@ -1,6 +1,24 @@
+// Universal Editor DataFormat for loading SPC700 synthesized audio files
+// Copyright (C) 2014 Mike Becker's Software
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
using System;
using UniversalEditor.IO;
using UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized;
+
namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC
{
public class SPC700DataFormat : DataFormat
@@ -10,12 +28,12 @@ namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC
DataFormatReference dfr = base.MakeReference();
dfr.Filters.Add("SNES-SPC700 sound file", new byte?[][] { new byte?[] { (byte)'S', (byte)'N', (byte)'E', (byte)'S', (byte)'-', (byte)'S', (byte)'P', (byte)'C', (byte)'7', (byte)'0', (byte)'0', (byte)' ', (byte)'S', (byte)'o', (byte)'u', (byte)'n', (byte)'d', (byte)' ', (byte)'F', (byte)'i', (byte)'l', (byte)'e', (byte)' ', (byte)'D', (byte)'a', (byte)'t', (byte)'a' } }, new string[] { "*.spc" });
dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All);
-
- dfr.ExportOptions.Add(new CustomOptionChoice("Generator", "&Generator:", true,
- new CustomOptionFieldChoice("Unknown", SPC700Emulator.Unknown, true),
- new CustomOptionFieldChoice("ZSNES", SPC700Emulator.ZSNES),
- new CustomOptionFieldChoice("Snes9x", SPC700Emulator.Snes9x)
- ));
+
+ dfr.ExportOptions.Add(new CustomOptionChoice("Generator", "&Generator:", true,
+ new CustomOptionFieldChoice("Unknown", SPC700Emulator.Unknown, true),
+ new CustomOptionFieldChoice("ZSNES", SPC700Emulator.ZSNES),
+ new CustomOptionFieldChoice("Snes9x", SPC700Emulator.Snes9x)
+ ));
return dfr;
}
@@ -25,19 +43,19 @@ namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC
private byte mvarID666DefaultChannelDisables = 0;
public byte ID666DefaultChannelDisables { get { return mvarID666DefaultChannelDisables; } set { mvarID666DefaultChannelDisables = value; } }
- private SPC700Emulator mvarGenerator = SPC700Emulator.Unknown;
- ///
- /// The emulator that generated this file.
- ///
- public SPC700Emulator Generator { get { return mvarGenerator; } set { mvarGenerator = value; } }
+ private SPC700Emulator mvarGenerator = SPC700Emulator.Unknown;
+ ///
+ /// The emulator that generated this file.
+ ///
+ public SPC700Emulator Generator { get { return mvarGenerator; } set { mvarGenerator = value; } }
protected override void LoadInternal(ref ObjectModel objectModel)
{
SynthesizedAudioObjectModel au = (objectModel as SynthesizedAudioObjectModel);
- Reader br = base.Accessor.Reader;
+ Reader br = base.Accessor.Reader;
string fileHeader = br.ReadFixedLengthString(33);
- if (!fileHeader.StartsWith("SNES-SPC700 Sound File Data")) throw new InvalidDataFormatException("File does not begin with \"SNES-SPC700 Sound File Data\"");
+ if (!fileHeader.StartsWith("SNES-SPC700 Sound File Data")) throw new InvalidDataFormatException("File does not begin with \"SNES-SPC700 Sound File Data\"");
byte[] flags = br.ReadBytes(2u);
byte hasID666Value = br.ReadByte();
@@ -62,7 +80,7 @@ namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC
au.Information.FadeOutLength = int.Parse(br.ReadNullTerminatedString(5));
au.Information.SongArtist = br.ReadNullTerminatedString(32);
this.mvarID666DefaultChannelDisables = br.ReadByte();
- mvarGenerator = (SPC700Emulator)br.ReadByte();
+ mvarGenerator = (SPC700Emulator)br.ReadByte();
byte[] id666Reserved = br.ReadBytes(45u);
this.mvarID666Reserved = id666Reserved;
}
@@ -118,7 +136,7 @@ namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC
arg_17A_0.WriteFixedLengthString(num.ToString(), 5);
bw.WriteFixedLengthString(au.Information.SongArtist, 32);
bw.WriteByte(mvarID666DefaultChannelDisables);
- bw.WriteByte((byte)mvarGenerator);
+ bw.WriteByte((byte)mvarGenerator);
bw.WriteFixedLengthBytes(this.mvarID666Reserved, 45);
}
diff --git a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Emulator.cs b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Emulator.cs
index 36a00429..49297710 100644
--- a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Emulator.cs
+++ b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Emulator.cs
@@ -1,5 +1,5 @@
-// one line to give the program's name and an idea of what it does.
-// Copyright (C) yyyy name of author
+// Universal Editor DataFormat for loading SPC700 synthesized audio files
+// Copyright (C) 2014 Mike Becker's Software
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
diff --git a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700ExtendedID666Tag.cs b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700ExtendedID666Tag.cs
index 89f29a24..1740af0c 100644
--- a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700ExtendedID666Tag.cs
+++ b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700ExtendedID666Tag.cs
@@ -1,5 +1,5 @@
-// one line to give the program's name and an idea of what it does.
-// Copyright (C) 2010 Mike Becker
+// Universal Editor DataFormat for loading SPC700 synthesized audio files
+// Copyright (C) 2014 Mike Becker's Software
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
diff --git a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700ID666Tag.cs b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700ID666Tag.cs
index 580dfb45..b2e2bf26 100644
--- a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700ID666Tag.cs
+++ b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700ID666Tag.cs
@@ -1,5 +1,5 @@
-// one line to give the program's name and an idea of what it does.
-// Copyright (C) yyyy name of author
+// Universal Editor DataFormat for loading SPC700 synthesized audio files
+// Copyright (C) 2014 Mike Becker's Software
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
diff --git a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Memory.cs b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Memory.cs
index cc18a531..d64b29c1 100644
--- a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Memory.cs
+++ b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Memory.cs
@@ -1,5 +1,5 @@
-// one line to give the program's name and an idea of what it does.
-// Copyright (C) yyyy name of author
+// Universal Editor DataFormat for loading SPC700 synthesized audio files
+// Copyright (C) 2014 Mike Becker's Software
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
diff --git a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Registers.cs b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Registers.cs
index ad681119..c6d7375e 100644
--- a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Registers.cs
+++ b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Registers.cs
@@ -1,5 +1,5 @@
-// one line to give the program's name and an idea of what it does.
-// Copyright (C) yyyy name of author
+// Universal Editor DataFormat for loading SPC700 synthesized audio files
+// Copyright (C) 2014 Mike Becker's Software
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
diff --git a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/AudioCollection/Synthesized/SPC2/SPC2DataFormat.cs b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/AudioCollection/Synthesized/SPC2/SPC2DataFormat.cs
new file mode 100644
index 00000000..ecc914a0
--- /dev/null
+++ b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/AudioCollection/Synthesized/SPC2/SPC2DataFormat.cs
@@ -0,0 +1,143 @@
+// Universal Editor DataFormat for loading SPC2 synthesized audio files
+// Copyright (C) 2014 Mike Becker's Software
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC;
+using UniversalEditor.IO;
+using UniversalEditor.ObjectModels.FileSystem;
+using UniversalEditor.ObjectModels.Multimedia.AudioCollection.Synthesized;
+
+namespace UniversalEditor.DataFormats.Multimedia.AudioCollection.Synthesized.SPC2
+{
+ public class SPC2DataFormat : DataFormat
+ {
+ private static DataFormatReference _dfr = null;
+ public override DataFormatReference MakeReference()
+ {
+ if (_dfr == null)
+ {
+ _dfr = base.MakeReference();
+ _dfr.Capabilities.Add(typeof(SynthesizedAudioCollectionObjectModel), DataFormatCapabilities.All);
+ _dfr.ImportOptions.Add(new CustomOptionBoolean("UseID666TagInformationIfAvailable", "Use &ID666 tag information if available"));
+ _dfr.ExportOptions.Add(new CustomOptionBoolean("IncludeID666TagInformation", "Include &ID666 tag information in output file"));
+ _dfr.Filters.Add("K.Horton's KSPC/SPC2 audio file", new byte?[][] { new byte?[] { (byte)'K', (byte)'S', (byte)'P', (byte)'C', (byte)0x1A } }, new string[] { "*.kspc" });
+ _dfr.Sources.Add("http://blog.kevtris.org/blogfiles/spc2_file_specification_v1.txt");
+ }
+ return _dfr;
+ }
+
+ private bool mvarUseID666TagInformationIfAvailable = false;
+ public bool UseID666TagInformationIfAvailable { get { return mvarUseID666TagInformationIfAvailable; } set { mvarUseID666TagInformationIfAvailable = value; } }
+
+ protected override void LoadInternal(ref ObjectModel objectModel)
+ {
+ SynthesizedAudioCollectionObjectModel coll = (objectModel as SynthesizedAudioCollectionObjectModel);
+ if (coll == null) throw new ObjectModelNotSupportedException();
+
+ Reader reader = base.Accessor.Reader;
+ string signature = reader.ReadFixedLengthString(4);
+ byte x1A = reader.ReadByte();
+ if (signature != "KSPC" || x1A != 0x1A) throw new InvalidDataFormatException("File does not begin with 'KSPC', 0x1A");
+
+ byte versionMajor = reader.ReadByte();
+ byte versionMinor = reader.ReadByte();
+
+ ushort fileCount = reader.ReadUInt16();
+ byte[] expansion = reader.ReadBytes(7);
+
+ for (ushort i = 0; i < fileCount; i++)
+ {
+ // Each SPC data block has this format
+ for (int j = 0; j < 256; j++)
+ {
+ // Offsets for all 256, 256 byte blocks of data in RAM
+ ushort dataBlockRAMOffset = reader.ReadUInt16();
+ }
+
+ // DSP register data (as-is from .SPC)
+ byte[] dspRegisterData = reader.ReadBytes(128);
+
+ // IPL ROM (as-is from .SPC)
+ byte[] iplROM = reader.ReadBytes(64);
+
+ // PCL, PCH, A, X, Y, PSW, SP (as-is from .SPC)
+ byte registerPCL = reader.ReadByte();
+ byte registerPCH = reader.ReadByte();
+ byte registerA = reader.ReadByte();
+ byte registerX = reader.ReadByte();
+ byte registerY = reader.ReadByte();
+ byte registerPSW = reader.ReadByte();
+ byte registerSP = reader.ReadByte();
+
+ // channel enable bits, 1 per chan (0 = en, 1 = dis) (as-is)
+ byte channelEnableBits = reader.ReadByte();
+
+ // stored as four bytes, in mm/dd/yyyy as BCD, like so:
+ // 01h, 12h, 20h, 00h would be 01/12/2000
+ // 07h, 30h, 19h, 95h would be 07/30/1995
+ byte[] dateParts = reader.ReadBytes(4);
+ DateTime date = new DateTime
+ (
+ Int32.Parse(dateParts[2].ToString("X").PadLeft(2, '0') + dateParts[3].ToString("X").PadLeft(2, '0')),
+ Int32.Parse(dateParts[0].ToString("X").PadLeft(2, '0')),
+ Int32.Parse(dateParts[1].ToString("X").PadLeft(2, '0'))
+ );
+
+ // 1/64000th's to play before fadeout
+ uint fadeoutDelay = reader.ReadUInt32();
+ // 1/64000th's to fade to silence
+ uint fadeoutLength = reader.ReadUInt32();
+
+ // amplification value (10000h == 1.00)
+ uint iAmplificationValue = reader.ReadUInt32();
+ double amplificationValue = (double)iAmplificationValue * 0.00001;
+
+ SPC700Emulator emulator = (SPC700Emulator)reader.ReadByte();
+
+ byte ostDisk = reader.ReadByte();
+ byte ostTrackNumber = reader.ReadByte();
+
+ ushort copyrightYear = reader.ReadUInt16();
+
+ byte[] unused = reader.ReadBytes(34);
+
+ SynthesizedAudioCollectionTrack track = new SynthesizedAudioCollectionTrack();
+ track.SongTitle = reader.ReadFixedLengthString(32).TrimNull().Trim();
+ track.GameTitle = reader.ReadFixedLengthString(32).TrimNull().Trim();
+ track.ArtistName = reader.ReadFixedLengthString(32).TrimNull().Trim();
+ track.DumperName = reader.ReadFixedLengthString(32).TrimNull().Trim();
+ track.Comments = reader.ReadFixedLengthString(32).TrimNull().Trim();
+ track.AlbumTitle = reader.ReadFixedLengthString(32).TrimNull().Trim();
+ track.PublisherName = reader.ReadFixedLengthString(32).TrimNull().Trim();
+ track.OriginalFileName = reader.ReadFixedLengthString(28).TrimNull().Trim();
+
+ uint extendedDataBlockOffset = reader.ReadUInt32();
+ }
+ }
+
+ protected override void SaveInternal(ObjectModel objectModel)
+ {
+ SynthesizedAudioCollectionObjectModel coll = (objectModel as SynthesizedAudioCollectionObjectModel);
+ if (coll == null) throw new ObjectModelNotSupportedException();
+
+ Writer writer = base.Accessor.Writer;
+ }
+ }
+}
diff --git a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/Phoneme.cs b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/Phoneme.cs
new file mode 100644
index 00000000..cbe50631
--- /dev/null
+++ b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/Phoneme.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank
+{
+ public class Phoneme
+ {
+ public class PhonemeCollection
+ : System.Collections.ObjectModel.Collection
+ {
+
+ }
+
+ private string mvarTitle = String.Empty;
+ public string Title { get { return mvarTitle; } set { mvarTitle = value; } }
+ }
+}
diff --git a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/PhonemeGroup.cs b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/PhonemeGroup.cs
new file mode 100644
index 00000000..f196bbb0
--- /dev/null
+++ b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/PhonemeGroup.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank
+{
+ public class PhonemeGroup
+ {
+ public class PhonemeGroupCollection
+ : System.Collections.ObjectModel.Collection
+ {
+
+ }
+
+ private string mvarTitle = String.Empty;
+ public string Title { get { return mvarTitle; } set { mvarTitle = value; } }
+
+ private Phoneme.PhonemeCollection mvarPhonemes = new Phoneme.PhonemeCollection();
+ public Phoneme.PhonemeCollection Phonemes { get { return mvarPhonemes; } }
+ }
+}
diff --git a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/VoicebankObjectModel.cs b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/VoicebankObjectModel.cs
index 3a4a8d04..e84eecd2 100644
--- a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/VoicebankObjectModel.cs
+++ b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/VoicebankObjectModel.cs
@@ -14,20 +14,20 @@ namespace UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank
{
ObjectModelReference omr = base.MakeReference();
omr.Title = "Synthesized audio voice bank";
- omr.Path = new string[] { "Multimedia", "Audio", "Voicebank" };
- return omr;
+ omr.Path = new string[] { "Multimedia", "Audio", "Voicebank" };
+ return omr;
}
- public override void Clear()
- {
- mvarBankSelect = 0;
- mvarCreatorVersion = new Version(1, 0);
- mvarID = String.Empty;
- mvarInstallationPath = String.Empty;
- mvarProgramChange = 0;
- mvarSamples.Clear();
- mvarSynthesisParameters.Clear();
- }
+ public override void Clear()
+ {
+ mvarBankSelect = 0;
+ mvarCreatorVersion = new Version(1, 0);
+ mvarID = String.Empty;
+ mvarInstallationPath = String.Empty;
+ mvarProgramChange = 0;
+ mvarSamples.Clear();
+ mvarSynthesisParameters.Clear();
+ }
private int mvarBankSelect = 0;
public int BankSelect { get { return mvarBankSelect; } set { mvarBankSelect = value; } }
@@ -38,6 +38,9 @@ namespace UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank
private string mvarID = string.Empty;
public string ID { get { return mvarID; } set { mvarID = value; } }
+ private PhonemeGroup.PhonemeGroupCollection mvarPhonemeGroups = new PhonemeGroup.PhonemeGroupCollection();
+ public PhonemeGroup.PhonemeGroupCollection PhonemeGroups { get { return mvarPhonemeGroups; } }
+
private VoicebankSynthesisParameters mvarSynthesisParameters = new VoicebankSynthesisParameters();
public VoicebankSynthesisParameters SynthesisParameters { get { return mvarSynthesisParameters; } }
@@ -56,7 +59,7 @@ namespace UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank
public override void CopyTo(ObjectModel destination)
{
VoicebankObjectModel clone = (destination as VoicebankObjectModel);
- if (clone == null) return;
+ if (clone == null) return;
foreach (VoicebankSample phoneme in this.mvarSamples)
{
diff --git a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/AudioCollection/Synthesized/SynthesizedAudioCollectionObjectModel.cs b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/AudioCollection/Synthesized/SynthesizedAudioCollectionObjectModel.cs
new file mode 100644
index 00000000..ed6de2ee
--- /dev/null
+++ b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/AudioCollection/Synthesized/SynthesizedAudioCollectionObjectModel.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized;
+
+namespace UniversalEditor.ObjectModels.Multimedia.AudioCollection.Synthesized
+{
+ public class SynthesizedAudioCollectionObjectModel : ObjectModel
+ {
+ private static ObjectModelReference _omr = null;
+ public override ObjectModelReference MakeReference()
+ {
+ if (_omr == null)
+ {
+ _omr = base.MakeReference();
+ _omr.Title = "Synthesized audio collection";
+ }
+ return _omr;
+ }
+
+ private SynthesizedAudioCollectionTrack.SynthesizedAudioCollectionTrackCollection mvarTracks = new SynthesizedAudioCollectionTrack.SynthesizedAudioCollectionTrackCollection();
+ public SynthesizedAudioCollectionTrack.SynthesizedAudioCollectionTrackCollection Tracks { get { return mvarTracks; } }
+
+ public override void Clear()
+ {
+ mvarTracks.Clear();
+ }
+
+ public override void CopyTo(ObjectModel where)
+ {
+ SynthesizedAudioCollectionObjectModel clone = (where as SynthesizedAudioCollectionObjectModel);
+ foreach (SynthesizedAudioCollectionTrack track in mvarTracks)
+ {
+ clone.Tracks.Add(track.Clone() as SynthesizedAudioCollectionTrack);
+ }
+ }
+ }
+}
diff --git a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/AudioCollection/Synthesized/SynthesizedAudioCollectionTrack.cs b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/AudioCollection/Synthesized/SynthesizedAudioCollectionTrack.cs
new file mode 100644
index 00000000..19f1e38d
--- /dev/null
+++ b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/AudioCollection/Synthesized/SynthesizedAudioCollectionTrack.cs
@@ -0,0 +1,45 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized;
+
+namespace UniversalEditor.ObjectModels.Multimedia.AudioCollection.Synthesized
+{
+ public class SynthesizedAudioCollectionTrack : ICloneable
+ {
+ public class SynthesizedAudioCollectionTrackCollection
+ : System.Collections.ObjectModel.Collection
+ {
+
+ }
+
+ private string mvarSongTitle = String.Empty;
+ public string SongTitle { get { return mvarSongTitle; } set { mvarSongTitle = value; } }
+
+ private string mvarGameTitle = String.Empty;
+ public string GameTitle { get { return mvarGameTitle; } set { mvarGameTitle = value; } }
+
+ private string mvarArtistName = String.Empty;
+ public string ArtistName { get { return mvarArtistName; } set { mvarArtistName = value; } }
+
+ private string mvarDumperName = String.Empty;
+ public string DumperName { get { return mvarDumperName; } set { mvarDumperName = value; } }
+
+ private string mvarComments = String.Empty;
+ public string Comments { get { return mvarComments; } set { mvarComments = value; } }
+
+ private string mvarAlbumTitle = String.Empty;
+ public string AlbumTitle { get { return mvarAlbumTitle; } set { mvarAlbumTitle = value; } }
+
+ private string mvarPublisherName = String.Empty;
+ public string PublisherName { get { return mvarPublisherName; } set { mvarPublisherName = value; } }
+
+ private string mvarOriginalFileName = String.Empty;
+ public string OriginalFileName { get { return mvarOriginalFileName; } set { mvarOriginalFileName = value; } }
+
+ private SynthesizedAudioObjectModel mvarObjectModel = null;
+ public SynthesizedAudioObjectModel ObjectModel { get { return mvarObjectModel; } }
+
+ }
+}
diff --git a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/UniversalEditor.Plugins.Multimedia.csproj b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/UniversalEditor.Plugins.Multimedia.csproj
index 4750c383..d3173502 100644
--- a/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/UniversalEditor.Plugins.Multimedia.csproj
+++ b/CSharp/Plugins/UniversalEditor.Plugins.Multimedia/UniversalEditor.Plugins.Multimedia.csproj
@@ -1,4 +1,4 @@
-
+
{BE4D0BA3-0888-42A5-9C09-FC308A4509D2}
@@ -70,6 +70,7 @@
+
@@ -137,6 +138,8 @@
+
+
Code
@@ -184,6 +187,8 @@
+
+
Code