diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Resources/CompilerParametersPanel.xfrm b/src/AddIns/BackendBindings/WixBinding/Project/Resources/CompilerParametersPanel.xfrm index cc4fad442d..8487875c6b 100644 --- a/src/AddIns/BackendBindings/WixBinding/Project/Resources/CompilerParametersPanel.xfrm +++ b/src/AddIns/BackendBindings/WixBinding/Project/Resources/CompilerParametersPanel.xfrm @@ -1,11 +1,19 @@  - + - + + + + + + + + + diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Resources/LibraryParametersPanel.xfrm b/src/AddIns/BackendBindings/WixBinding/Project/Resources/LibraryParametersPanel.xfrm new file mode 100644 index 0000000000..d034414b38 --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Resources/LibraryParametersPanel.xfrm @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Resources/LinkerParametersPanel.xfrm b/src/AddIns/BackendBindings/WixBinding/Project/Resources/LinkerParametersPanel.xfrm index c606194299..d034414b38 100644 --- a/src/AddIns/BackendBindings/WixBinding/Project/Resources/LinkerParametersPanel.xfrm +++ b/src/AddIns/BackendBindings/WixBinding/Project/Resources/LinkerParametersPanel.xfrm @@ -1,5 +1,16 @@  + + + + + + + + + + + diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/AddCompilerExtensionsDialog.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/AddCompilerExtensionsDialog.cs new file mode 100644 index 0000000000..1eaa11df8d --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/AddCompilerExtensionsDialog.cs @@ -0,0 +1,203 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; + +namespace ICSharpCode.WixBinding +{ + /// + /// Dialog that allows the user to add standard compiler extensions. Only + /// the standard compiler extensions are displayed. + /// + public class AddCompilerExtensionsDialog : System.Windows.Forms.Form + { + List currentExtensions = new List(); + bool changed; + + /// + /// Creates a new instance of this dialog. + /// + /// The current extensions selected + /// by the user. This is used to tick the standard WiX extensions that + /// have already been added to the project. + /// The standard WiX extensions (e.g. NetFx) + /// that are available for the user. + public AddCompilerExtensionsDialog(WixCompilerExtensionName[] currentExtensions, WixCompilerExtensionName[] standardExtensions) + { + InitializeComponent(); + this.currentExtensions.AddRange(currentExtensions); + AddStandardExtensions(standardExtensions); + } + + /// + /// Gets whether one or more extensions have been added or removed + /// by the user. + /// + public bool IsChanged { + get { + return changed; + } + } + + /// + /// Gets the new set of extensions selected. This includes the current + /// extensions that are not considered standard extensions and were + /// passed to the constructor of this class. + /// + public WixCompilerExtensionName[] GetExtensions() + { + UpdateCurrentExtensions(); + + List extensions = new List(); + foreach (WixCompilerExtensionName extensionName in currentExtensions) { + extensions.Add(extensionName); + } + return extensions.ToArray(); + } + + /// + /// Disposes resources used by the form. + /// + /// 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); + } + + #region Windows Forms Designer generated code + + /// + /// Designer variable used to keep track of non-visual components. + /// + System.ComponentModel.IContainer components = null; + + /// + /// 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. + /// + void InitializeComponent() + { + this.extensionsListView = new System.Windows.Forms.ListView(); + this.okButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // extensionsListView + // + this.extensionsListView.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.extensionsListView.CheckBoxes = true; + this.extensionsListView.Location = new System.Drawing.Point(0, 0); + this.extensionsListView.Name = "extensionsListView"; + this.extensionsListView.Size = new System.Drawing.Size(466, 255); + this.extensionsListView.Sorting = System.Windows.Forms.SortOrder.Ascending; + this.extensionsListView.TabIndex = 0; + this.extensionsListView.UseCompatibleStateImageBehavior = false; + this.extensionsListView.View = System.Windows.Forms.View.List; + this.extensionsListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.ExtensionsListViewItemChecked); + // + // okButton + // + this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.okButton.Location = new System.Drawing.Point(294, 261); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(75, 23); + this.okButton.TabIndex = 1; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(379, 261); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 23); + this.cancelButton.TabIndex = 2; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + // + // AddCompilerExtensionsDialog + // + this.AcceptButton = this.okButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cancelButton; + this.ClientSize = new System.Drawing.Size(466, 291); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.okButton); + this.Controls.Add(this.extensionsListView); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(200, 100); + this.Name = "AddCompilerExtensionsDialog"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Add Extensions"; + this.ResumeLayout(false); + } + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.ListView extensionsListView; + + #endregion + + void AddStandardExtensions(WixCompilerExtensionName[] extensions) + { + foreach (WixCompilerExtensionName extension in extensions) { + ListViewItem item = extensionsListView.Items.Add(extension.DisplayName); + item.Tag = extension; + item.Checked = currentExtensions.Contains(extension); + } + } + + void ExtensionsListViewItemChecked(object sender, ItemCheckedEventArgs e) + { + changed = true; + } + + void CreateCurrentExtensions(string[] extensions) + { + foreach (string extension in extensions) { + currentExtensions.Add(new WixCompilerExtensionName(extension)); + } + } + + /// + /// Adds and removes any extensions that have been checked or + /// unchecked. + /// + void UpdateCurrentExtensions() + { + foreach (ListViewItem item in extensionsListView.Items) { + WixCompilerExtensionName extension = (WixCompilerExtensionName)item.Tag; + if (item.Checked) { + if (!currentExtensions.Contains(extension)) { + currentExtensions.Add(extension); + } + } else { + int index = currentExtensions.IndexOf(extension); + if (index >= 0) { + currentExtensions.RemoveAt(index); + } + } + } + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/CompilerParametersPanel.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/CompilerParametersPanel.cs index d0a1c7e79f..bd7f37ee34 100644 --- a/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/CompilerParametersPanel.cs +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/CompilerParametersPanel.cs @@ -45,6 +45,16 @@ namespace ICSharpCode.WixBinding b = helper.BindString("wixMSBuildExtensionsPathTextBox", "WixMSBuildExtensionsPath"); ConnectBrowseFolder("wixMSBuildExtensionsPathBrowseButton", "wixMSBuildExtensionsPathTextBox", String.Empty); + // Add the extension picker in manually since the anchoring does not + // work if we add the picker into the XML of the CompilerParametersPanel.xfrm file. + WixCompilerExtensionPicker extensionPicker = new WixCompilerExtensionPicker(); + extensionPicker.Dock = DockStyle.Fill; + ControlDictionary["compilerExtensionsGroupBox"].Controls.Add(extensionPicker); + extensionPicker.ExtensionsChanged += CompilerExtensionsChanged; + + b = new WixCompilerExtensionBinding(extensionPicker); + helper.AddBinding("CompileExtension", b); + InitWarnings(); helper.AddConfigurationSelector(this); @@ -66,5 +76,10 @@ namespace ICSharpCode.WixBinding b = helper.BindBoolean("treatWarningsAsErrorsCheckBox", "TreatWarningsAsErrors", false); b.RegisterLocationButton(locationButton); } + + void CompilerExtensionsChanged(object source, EventArgs e) + { + IsDirty = true; + } } } diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/LibraryParametersPanel.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/LibraryParametersPanel.cs new file mode 100644 index 0000000000..98213ef139 --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/LibraryParametersPanel.cs @@ -0,0 +1,44 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Windows.Forms; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Internal.ExternalTool; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Gui.OptionPanels; +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.WixBinding +{ + public class LibraryParametersPanel : AbstractProjectOptionPanel + { + public override void LoadPanelContents() + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("ICSharpCode.WixBinding.Resources.LibraryParametersPanel.xfrm")); + InitializeHelper(); + + // Add the extension picker in manually since the anchoring does not + // work if we add the picker into the XML of the LibraryParametersPanel.xfrm file. + WixCompilerExtensionPicker extensionPicker = new WixCompilerExtensionPicker(); + extensionPicker.Dock = DockStyle.Fill; + ControlDictionary["compilerExtensionsGroupBox"].Controls.Add(extensionPicker); + extensionPicker.ExtensionsChanged += CompilerExtensionsChanged; + + WixCompilerExtensionBinding b = new WixCompilerExtensionBinding(extensionPicker); + helper.AddBinding("LibExtension", b); + + helper.AddConfigurationSelector(this); + } + + void CompilerExtensionsChanged(object source, EventArgs e) + { + IsDirty = true; + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/LinkerParametersPanel.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/LinkerParametersPanel.cs index 5f9ad7eda9..964e58a85e 100644 --- a/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/LinkerParametersPanel.cs +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/LinkerParametersPanel.cs @@ -23,7 +23,22 @@ namespace ICSharpCode.WixBinding SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("ICSharpCode.WixBinding.Resources.LinkerParametersPanel.xfrm")); InitializeHelper(); + // Add the extension picker in manually since the anchoring does not + // work if we add the picker into the XML of the LinkerParametersPanel.xfrm file. + WixCompilerExtensionPicker extensionPicker = new WixCompilerExtensionPicker(); + extensionPicker.Dock = DockStyle.Fill; + ControlDictionary["compilerExtensionsGroupBox"].Controls.Add(extensionPicker); + extensionPicker.ExtensionsChanged += CompilerExtensionsChanged; + + WixCompilerExtensionBinding b = new WixCompilerExtensionBinding(extensionPicker); + helper.AddBinding("LinkExtension", b); + helper.AddConfigurationSelector(this); } + + void CompilerExtensionsChanged(object source, EventArgs e) + { + IsDirty = true; + } } } diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/WixCompilerExtensionBinding.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/WixCompilerExtensionBinding.cs new file mode 100644 index 0000000000..dae6829efb --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/WixCompilerExtensionBinding.cs @@ -0,0 +1,109 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.SharpDevelop.Project; +using System; +using System.Collections.ObjectModel; + +namespace ICSharpCode.WixBinding +{ + public class WixCompilerExtensionBinding : ConfigurationGuiBinding + { + WixCompilerExtensionPicker extensionPicker; + + enum WixExtensionType { + Compiler, + Linker, + Library + } + + public WixCompilerExtensionBinding(WixCompilerExtensionPicker extensionPicker) + { + this.extensionPicker = extensionPicker; + } + + public override bool Save() + { + RemoveExistingProjectExtensions(); + + IProject project = Project; + WixCompilerExtensionName[] extensions = extensionPicker.GetExtensions(); + foreach (WixCompilerExtensionName extension in extensions) { + project.Items.Add(CreateProjectItem(extension)); + } + return true; + } + + public override void Load() + { + ReadOnlyCollection extensions = GetExtensions(); + foreach (WixExtensionProjectItem extension in extensions) { + extensionPicker.AddExtension(extension.QualifiedName); + } + } + + WixExtensionProjectItem CreateProjectItem(WixCompilerExtensionName extension) + { + WixExtensionProjectItem projectItem; + switch (ExtensionType) { + case WixExtensionType.Compiler: + projectItem = new WixCompilerExtensionProjectItem(Project); + break; + case WixExtensionType.Library: + projectItem = new WixLibraryExtensionProjectItem(Project); + break; + default: + projectItem = new WixLinkerExtensionProjectItem(Project); + break; + } + projectItem.Include = extension.AssemblyName; + projectItem.ClassName = extension.ClassName; + return projectItem; + } + + ReadOnlyCollection GetExtensions() + { + switch (ExtensionType) { + case WixExtensionType.Compiler: + return WixProject.WixCompilerExtensions; + case WixExtensionType.Library: + return WixProject.WixLibraryExtensions; + default: + return WixProject.WixLinkerExtensions; + } + } + + WixProject WixProject { + get { + return (WixProject)Project; + } + } + + WixExtensionType ExtensionType { + get { + switch (Property) { + case "CompileExtension": + return WixExtensionType.Compiler; + case "LibExtension": + return WixExtensionType.Library; + case "LinkExtension": + return WixExtensionType.Linker; + default: + throw new ApplicationException("Unknown WiX extension type: " + Property); + } + } + } + + void RemoveExistingProjectExtensions() + { + IProject project = Project; + foreach (ProjectItem item in GetExtensions()) { + project.Items.Remove(item); + } + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/WixCompilerExtensionPicker.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/WixCompilerExtensionPicker.cs new file mode 100644 index 0000000000..dd94982910 --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/WixCompilerExtensionPicker.cs @@ -0,0 +1,179 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.Core; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace ICSharpCode.WixBinding +{ + /// + /// Allows the user to add/remove Wix compiler, linker or library extensions. + /// + public class WixCompilerExtensionPicker : System.Windows.Forms.UserControl + { + public event EventHandler ExtensionsChanged; + + public WixCompilerExtensionPicker() + { + InitializeComponent(); + } + + /// + /// Adds an extension to the list. + /// + public void AddExtension(string extension) + { + extensionsTextBox.AppendText(String.Concat(extension, "\r\n")); + } + + /// + /// Clears the extensions list. + /// + public void Clear() + { + extensionsTextBox.Text = String.Empty; + } + + /// + /// Adds a set of extensions to the picker. + /// + public void AddExtensions(WixCompilerExtensionName[] extensions) + { + foreach (WixCompilerExtensionName extension in extensions) { + AddExtension(extension.QualifiedName); + } + } + + /// + /// Gets the extensions in the list. + /// + public WixCompilerExtensionName[] GetExtensions() + { + List extensions = new List(); + foreach (string line in extensionsTextBox.Lines) { + if (line.Length > 0) { + extensions.Add(new WixCompilerExtensionName(line)); + } + } + return extensions.ToArray(); + } + + /// + /// 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); + } + + #region Windows Forms Designer generated code + + /// + /// Designer variable used to keep track of non-visual components. + /// + System.ComponentModel.IContainer components = null; + + /// + /// 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. + /// + void InitializeComponent() + { + this.extensionsTextBox = new System.Windows.Forms.RichTextBox(); + this.addButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // extensionsTextBox + // + this.extensionsTextBox.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.extensionsTextBox.Location = new System.Drawing.Point(0, 0); + this.extensionsTextBox.Name = "extensionsTextBox"; + this.extensionsTextBox.Size = new System.Drawing.Size(370, 109); + this.extensionsTextBox.TabIndex = 0; + this.extensionsTextBox.Text = ""; + this.extensionsTextBox.TextChanged += new System.EventHandler(this.ExtensionsTextBoxTextChanged); + // + // addButton + // + this.addButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.addButton.Location = new System.Drawing.Point(301, 115); + this.addButton.Name = "addButton"; + this.addButton.Size = new System.Drawing.Size(66, 24); + this.addButton.TabIndex = 1; + this.addButton.Text = "Add..."; + this.addButton.UseVisualStyleBackColor = true; + this.addButton.Click += new System.EventHandler(this.AddButtonClick); + // + // WixCompilerExtensionPicker + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.addButton); + this.Controls.Add(this.extensionsTextBox); + this.MinimumSize = new System.Drawing.Size(370, 134); + this.Name = "WixCompilerExtensionPicker"; + this.Size = new System.Drawing.Size(370, 142); + this.ResumeLayout(false); + } + private System.Windows.Forms.Button addButton; + private System.Windows.Forms.RichTextBox extensionsTextBox; + + #endregion + + void OnExtensionsChanged() + { + if (ExtensionsChanged != null) { + ExtensionsChanged(this, new EventArgs()); + } + } + + void AddButtonClick(object sender, EventArgs e) + { + using (AddCompilerExtensionsDialog dialog = new AddCompilerExtensionsDialog(GetExtensions(), GetStandardExtensions())) { + if (DialogResult.OK == dialog.ShowDialog() && dialog.IsChanged) { + Clear(); + AddExtensions(dialog.GetExtensions()); + OnExtensionsChanged(); + } + } + } + + /// + /// Returns a list of the standard Wix Compiler extensions. + /// These are defined in the WixBinding.addin file. + /// + WixCompilerExtensionName[] GetStandardExtensions() + { + List extensionNames = new List(); + List extensions = AddInTree.BuildItems("/AddIns/WixBinding/CompilerExtensions", this); + + foreach (string extension in extensions) { + extensionNames.Add(WixCompilerExtensionName.CreateFromString(extension)); + } + + return extensionNames.ToArray(); + } + + void ExtensionsTextBoxTextChanged(object sender, EventArgs e) + { + OnExtensionsChanged(); + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixCompilerExtensionName.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixCompilerExtensionName.cs new file mode 100644 index 0000000000..5a4e8a438a --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixCompilerExtensionName.cs @@ -0,0 +1,97 @@ +// +// +// +// +// $Revision$ +// + +using System; + +namespace ICSharpCode.WixBinding +{ + public class WixCompilerExtensionName + { + string assemblyName; + string className; + string displayName = String.Empty; + + public WixCompilerExtensionName(string qualifiedName) + { + int index = qualifiedName.IndexOf(','); + if (index >= 0) { + className = qualifiedName.Substring(0, index).Trim(); + assemblyName = qualifiedName.Substring(index + 1).Trim(); + } else { + className = qualifiedName; + assemblyName = String.Empty; + } + } + + public WixCompilerExtensionName(string assemblyName, string className) + { + this.assemblyName = assemblyName; + this.className = className; + } + + public string AssemblyName { + get { + return assemblyName; + } + } + + /// + /// Gets the qualified name for the extension "ClassName, AssemblyName". + /// + public string QualifiedName { + get { + if (assemblyName.Length > 0) { + return String.Concat(className, ", ", assemblyName); + } + return className; + } + } + + public string ClassName { + get { + return className; + } + } + + public string DisplayName { + get { + return displayName; + } + set { + displayName = value; + } + } + + public override bool Equals(object obj) + { + WixCompilerExtensionName name = (WixCompilerExtensionName)obj; + return name.assemblyName == assemblyName && name.className == className; + } + + public override int GetHashCode() + { + return assemblyName.GetHashCode() ^ className.GetHashCode(); + } + + /// + /// Creates a new WixCompilerExtensionName from a string of the form + /// "AssemblyName, ClassName|DisplayName". + /// + public static WixCompilerExtensionName CreateFromString(string s) + { + int index = s.IndexOf("|"); + if (index >= 0) { + string qualifiedName = s.Substring(0, index); + string displayName = s.Substring(index + 1); + WixCompilerExtensionName name = new WixCompilerExtensionName(qualifiedName); + name.DisplayName = displayName; + return name; + } + return new WixCompilerExtensionName(s); + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixCompilerExtensionProjectItem.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixCompilerExtensionProjectItem.cs new file mode 100644 index 0000000000..43107fcb8e --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixCompilerExtensionProjectItem.cs @@ -0,0 +1,30 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.SharpDevelop.Project; +using System; + +namespace ICSharpCode.WixBinding +{ + public class WixCompilerExtensionProjectItem : WixExtensionProjectItem + { + public WixCompilerExtensionProjectItem(IProject project) : base(project) + { + } + + public override string Tag { + get { + return "CompileExtension"; + } + } + + protected override ProjectItem CreateNewInstance(IProject project) + { + return new WixCompilerExtensionProjectItem(project); + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixExtensionProjectItem.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixExtensionProjectItem.cs new file mode 100644 index 0000000000..d5c4f57d2f --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixExtensionProjectItem.cs @@ -0,0 +1,75 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.SharpDevelop.Project; +using System; + +namespace ICSharpCode.WixBinding +{ + /// + /// Base class for all Wix compiler extension project items. + /// + public abstract class WixExtensionProjectItem : ProjectItem + { + public WixExtensionProjectItem(IProject project) : base(project) + { + } + + public override ItemType ItemType { + get { + return ItemType.None; + } + } + + /// + /// Gets or sets the Wix extension class name. + /// + /// + /// This is the fully qualified class name. + /// + public string ClassName { + get { + return base.Properties["Class"]; + } + set { + base.Properties["Class"] = value; + } + } + + /// + /// Gets or sets the qualified name. This updates the ClassName and the + /// Include property. + /// + /// Returns "ClassName, Include" as the qualified name. + public string QualifiedName { + get { + WixCompilerExtensionName name = new WixCompilerExtensionName(Include, ClassName); + return name.QualifiedName; + } + set { + WixCompilerExtensionName name = new WixCompilerExtensionName(value); + ClassName = name.ClassName; + Include = name.AssemblyName; + } + } + + public override ProjectItem Clone() + { + ProjectItem n = CreateNewInstance(Project); + n.Include = Include; + this.CopyExtraPropertiesTo(n); + return n; + } + + /// + /// Derived Wix compiler extensions need to create a new instance of + /// themselves when this method is called. This helps to have one + /// common Clone method. + /// + protected abstract ProjectItem CreateNewInstance(IProject project); + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixLibraryExtensionProjectItem.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixLibraryExtensionProjectItem.cs new file mode 100644 index 0000000000..3b0529d18a --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixLibraryExtensionProjectItem.cs @@ -0,0 +1,30 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.SharpDevelop.Project; +using System; + +namespace ICSharpCode.WixBinding +{ + public class WixLibraryExtensionProjectItem : WixExtensionProjectItem + { + public WixLibraryExtensionProjectItem(IProject project) : base(project) + { + } + + public override string Tag { + get { + return "LibExtension"; + } + } + + protected override ProjectItem CreateNewInstance(IProject project) + { + return new WixLibraryExtensionProjectItem(project); + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixLinkerExtensionProjectItem.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixLinkerExtensionProjectItem.cs new file mode 100644 index 0000000000..a571681d78 --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixLinkerExtensionProjectItem.cs @@ -0,0 +1,30 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.SharpDevelop.Project; +using System; + +namespace ICSharpCode.WixBinding +{ + public class WixLinkerExtensionProjectItem : WixExtensionProjectItem + { + public WixLinkerExtensionProjectItem(IProject project) : base(project) + { + } + + public override string Tag { + get { + return "LinkExtension"; + } + } + + protected override ProjectItem CreateNewInstance(IProject project) + { + return new WixLinkerExtensionProjectItem(project); + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixProject.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixProject.cs index dc838f218c..7fb076d976 100644 --- a/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixProject.cs +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixProject.cs @@ -86,6 +86,12 @@ namespace ICSharpCode.WixBinding switch (itemType) { case "WixLibrary": return new WixLibraryProjectItem(this); + case "CompileExtension": + return new WixCompilerExtensionProjectItem(this); + case "LibExtension": + return new WixLibraryExtensionProjectItem(this); + case "LinkExtension": + return new WixLinkerExtensionProjectItem(this); default: return ProjectItemFactory.CreateProjectItem(this, itemType); } @@ -144,6 +150,33 @@ namespace ICSharpCode.WixBinding } } + /// + /// Returns the compiler extension project items. + /// + public ReadOnlyCollection WixCompilerExtensions { + get { + return GetExtensions(typeof(WixCompilerExtensionProjectItem)); + } + } + + /// + /// Returns the linker extension project items. + /// + public ReadOnlyCollection WixLinkerExtensions { + get { + return GetExtensions(typeof(WixLinkerExtensionProjectItem)); + } + } + + /// + /// Returns the library extension project items. + /// + public ReadOnlyCollection WixLibraryExtensions { + get { + return GetExtensions(typeof(WixLibraryExtensionProjectItem)); + } + } + /// /// Gets a preprocessor variable value with the given name. /// @@ -219,5 +252,23 @@ namespace ICSharpCode.WixBinding } return new ReadOnlyCollection(items); } + + /// + /// Returns a collection of compiler extension items that match the specified + /// type. + /// + ReadOnlyCollection GetExtensions(Type type) + { + List items = new List(); + foreach (ProjectItem projectItem in Items) { + WixExtensionProjectItem item = projectItem as WixExtensionProjectItem; + if (item != null) { + if (item.GetType() == type) { + items.Add(item); + } + } + } + return new ReadOnlyCollection(items); + } } } diff --git a/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.addin b/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.addin index 41f4f7e7c2..752196e372 100644 --- a/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.addin +++ b/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.addin @@ -62,12 +62,15 @@ - + + @@ -218,4 +221,14 @@ icon = "Icons.16x16.DeleteIcon" class = "ICSharpCode.WixBinding.RemoveElementCommand"/> + + + + + + + diff --git a/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.csproj b/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.csproj index b2674ad56a..9c28dc68ef 100644 --- a/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.csproj +++ b/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.csproj @@ -127,6 +127,16 @@ + + + + + + + + + + diff --git a/src/AddIns/BackendBindings/WixBinding/Test/Project/CreateWixProjectItemTests.cs b/src/AddIns/BackendBindings/WixBinding/Test/Project/CreateWixProjectItemTests.cs index c4dd51b6f7..2b7c69c3d4 100644 --- a/src/AddIns/BackendBindings/WixBinding/Test/Project/CreateWixProjectItemTests.cs +++ b/src/AddIns/BackendBindings/WixBinding/Test/Project/CreateWixProjectItemTests.cs @@ -35,5 +35,29 @@ namespace WixBinding.Tests.Project ProjectItem item = p.CreateProjectItem("WixLibrary"); Assert.IsInstanceOfType(typeof(WixLibraryProjectItem), item); } + + [Test] + public void CreateWixCompilerExtensionProjectItem() + { + WixProject p = WixBindingTestsHelper.CreateEmptyWixProject(); + ProjectItem item = p.CreateProjectItem("CompileExtension"); + Assert.IsInstanceOfType(typeof(WixCompilerExtensionProjectItem), item); + } + + [Test] + public void CreateWixLinkerExtensionProjectItem() + { + WixProject p = WixBindingTestsHelper.CreateEmptyWixProject(); + ProjectItem item = p.CreateProjectItem("LinkExtension"); + Assert.IsInstanceOfType(typeof(WixLinkerExtensionProjectItem), item); + } + + [Test] + public void CreateWixLibraryExtensionProjectItem() + { + WixProject p = WixBindingTestsHelper.CreateEmptyWixProject(); + ProjectItem item = p.CreateProjectItem("LibExtension"); + Assert.IsInstanceOfType(typeof(WixLibraryExtensionProjectItem), item); + } } } diff --git a/src/AddIns/BackendBindings/WixBinding/Test/Project/GetWixCompilerExtensionsTestFixture.cs b/src/AddIns/BackendBindings/WixBinding/Test/Project/GetWixCompilerExtensionsTestFixture.cs new file mode 100644 index 0000000000..1c6a41933d --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Test/Project/GetWixCompilerExtensionsTestFixture.cs @@ -0,0 +1,119 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.WixBinding; +using NUnit.Framework; +using System; +using WixBinding.Tests.Utils; + +namespace WixBinding.Tests.Project +{ + /// + /// Tests that the WixProject's WixCompilerExtensions, WixLinkerExtensions and + /// WixLibraryExtensions properties return ProjectItems. + /// + [TestFixture] + public class GetWixCompilerExtensionsTestFixture + { + WixExtensionProjectItem compilerExtensionItem; + WixExtensionProjectItem linkerExtensionItem; + WixExtensionProjectItem libraryExtensionItem; + + [SetUp] + public void SetUpFixture() + { + WixProject p = WixBindingTestsHelper.CreateEmptyWixProject(); + + WixCompilerExtensionProjectItem compilerItem = new WixCompilerExtensionProjectItem(p); + compilerItem.Include = "WixNetFxExtension"; + compilerItem.ClassName = "Microsoft.Tools.WindowsInstallerXml.Extensions.NetFxCompiler"; + p.Items.Add(compilerItem); + + WixLinkerExtensionProjectItem linkerItem = new WixLinkerExtensionProjectItem(p); + linkerItem.Include = "LinkerExtension"; + linkerItem.ClassName = "LinkerExtension.ClassName"; + p.Items.Add(linkerItem); + + WixLibraryExtensionProjectItem libraryItem = new WixLibraryExtensionProjectItem(p); + libraryItem.Include = "LibraryExtension"; + libraryItem.ClassName = "LibraryExtension.ClassName"; + p.Items.Add(libraryItem); + + compilerExtensionItem = p.WixCompilerExtensions[0]; + libraryExtensionItem = p.WixLibraryExtensions[0]; + linkerExtensionItem = p.WixLinkerExtensions[0]; + } + + [Test] + public void WixCompilerExtensionItemInclude() + { + Assert.AreEqual("WixNetFxExtension", compilerExtensionItem.Include); + } + + [Test] + public void IsCompilerExtensionType() + { + Assert.IsInstanceOfType(typeof(WixCompilerExtensionProjectItem), compilerExtensionItem); + } + + [Test] + public void WixLinkerExtensionItemInclude() + { + Assert.AreEqual("LinkerExtension", linkerExtensionItem.Include); + } + + [Test] + public void IsLinkerExtensionType() + { + Assert.IsInstanceOfType(typeof(WixLinkerExtensionProjectItem), linkerExtensionItem); + } + + [Test] + public void WixLibraryExtensionItemInclude() + { + Assert.AreEqual("LibraryExtension", libraryExtensionItem.Include); + } + + [Test] + public void IsLibraryExtensionType() + { + Assert.IsInstanceOfType(typeof(WixLibraryExtensionProjectItem), libraryExtensionItem); + } + + [Test] + public void GetQualifiedName() + { + Assert.AreEqual("Microsoft.Tools.WindowsInstallerXml.Extensions.NetFxCompiler, WixNetFxExtension", compilerExtensionItem.QualifiedName); + } + + [Test] + public void ChangeQualifiedName() + { + compilerExtensionItem.QualifiedName = "class,include"; + Assert.AreEqual("include", compilerExtensionItem.Include); + Assert.AreEqual("class", compilerExtensionItem.ClassName); + } + + [Test] + public void ChangeQualifiedNameWithNoInclude() + { + compilerExtensionItem.QualifiedName = "class,"; + Assert.AreEqual(String.Empty, compilerExtensionItem.Include); + Assert.AreEqual("class", compilerExtensionItem.ClassName); + } + + [Test] + public void ChangeQualifiedNameWithNoComma() + { + compilerExtensionItem.QualifiedName = "class"; + Assert.AreEqual(String.Empty, compilerExtensionItem.Include); + Assert.AreEqual("class", compilerExtensionItem.ClassName); + Assert.AreEqual("class", compilerExtensionItem.QualifiedName); + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Test/Project/WixCompilerExtensionNameTests.cs b/src/AddIns/BackendBindings/WixBinding/Test/Project/WixCompilerExtensionNameTests.cs new file mode 100644 index 0000000000..669e43d93a --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Test/Project/WixCompilerExtensionNameTests.cs @@ -0,0 +1,67 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.WixBinding; +using NUnit.Framework; +using System; + +namespace WixBinding.Tests.Project +{ + [TestFixture] + public class WixCompilerExtensionNameTests + { + [Test] + public void DisplayName() + { + WixCompilerExtensionName name = WixCompilerExtensionName.CreateFromString("ClassName, AssemblyName|DisplayName"); + Assert.AreEqual("DisplayName", name.DisplayName); + Assert.AreEqual("ClassName", name.ClassName); + Assert.AreEqual("AssemblyName", name.AssemblyName); + } + + [Test] + public void NoDisplayName() + { + WixCompilerExtensionName name = WixCompilerExtensionName.CreateFromString("ClassName, AssemblyName"); + Assert.AreEqual(String.Empty, name.DisplayName); + Assert.AreEqual("ClassName", name.ClassName); + Assert.AreEqual("AssemblyName", name.AssemblyName); + } + + [Test] + public void ExtraSpaces() + { + WixCompilerExtensionName name = new WixCompilerExtensionName(" ClassName , AssemblyName "); + Assert.AreEqual("ClassName", name.ClassName); + Assert.AreEqual("AssemblyName", name.AssemblyName); + } + + [Test] + public void Equals() + { + WixCompilerExtensionName name1 = new WixCompilerExtensionName("foo, bar"); + WixCompilerExtensionName name2 = new WixCompilerExtensionName("foo, bar"); + Assert.IsTrue(name1.Equals(name2)); + } + + [Test] + public void NotEqualsDifferentAssemblyName() + { + WixCompilerExtensionName name1 = new WixCompilerExtensionName("foo"); + WixCompilerExtensionName name2 = new WixCompilerExtensionName("foo, bar"); + Assert.IsFalse(name1.Equals(name2)); + } + + [Test] + public void NotEqualsDifferentClassName() + { + WixCompilerExtensionName name1 = new WixCompilerExtensionName("foo, bar"); + WixCompilerExtensionName name2 = new WixCompilerExtensionName("class, bar"); + Assert.IsFalse(name1.Equals(name2)); + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Test/Utils/MockViewContent.cs b/src/AddIns/BackendBindings/WixBinding/Test/Utils/MockViewContent.cs index 4bdfbfc70e..6f8798961f 100644 --- a/src/AddIns/BackendBindings/WixBinding/Test/Utils/MockViewContent.cs +++ b/src/AddIns/BackendBindings/WixBinding/Test/Utils/MockViewContent.cs @@ -35,6 +35,7 @@ namespace WixBinding.Tests.Utils public event EventHandler Saving; public event SaveEventHandler Saved; public event EventHandler DirtyChanged; + public event EventHandler FileNameChanged; public string UntitledName { get { @@ -197,6 +198,12 @@ namespace WixBinding.Tests.Utils } } + protected virtual void OnFileNameChanged(EventArgs e) + { + if (FileNameChanged != null) { + FileNameChanged(this, e); + } + } #endregion } diff --git a/src/AddIns/BackendBindings/WixBinding/Test/WixBinding.Tests.csproj b/src/AddIns/BackendBindings/WixBinding/Test/WixBinding.Tests.csproj index 2a941e7fbc..84b24a764d 100644 --- a/src/AddIns/BackendBindings/WixBinding/Test/WixBinding.Tests.csproj +++ b/src/AddIns/BackendBindings/WixBinding/Test/WixBinding.Tests.csproj @@ -187,6 +187,8 @@ + +