From 9169d53913554da1e51d50398e1e97947dc07a4b Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 17 Sep 2005 18:19:35 +0000 Subject: [PATCH] Improved project options (more strings translatable, reference paths tab works now) git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@494 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Resources/BuildOptions.xfrm | 15 +- .../ILAsmBinding/Project/Src/ILAsmProject.cs | 2 +- .../Project/Resources/BuildOptions.xfrm | 14 +- .../Project/SharpDevelop.Build.MSIL.targets | 6 +- .../Project/Src/Lexer/VBNet/Lexer.cs | 4 +- .../Project/ICSharpCode.SharpDevelop.csproj | 2 +- .../ProjectOptions/ReferencePaths.xfrm | 71 ---- .../Dom/Implementations/AbstractDecoration.cs | 3 - .../Src/Gui/Components/StringListEditor.cs | 348 ++++++++++++++++++ .../ProjectOptions/AbstractBuildOptions.cs | 5 - .../ProjectOptions/ReferencePaths.cs | 42 ++- .../Src/Gui/XmlForms/Lib/XmlUserControl.cs | 5 +- .../Base/Project/Src/Project/MSBuildEngine.cs | 11 +- .../Resources/StringResources.resources | Bin 265996 -> 267072 bytes 14 files changed, 418 insertions(+), 110 deletions(-) delete mode 100644 src/Main/Base/Project/Resources/ProjectOptions/ReferencePaths.xfrm create mode 100644 src/Main/Base/Project/Src/Gui/Components/StringListEditor.cs diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/BuildOptions.xfrm b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/BuildOptions.xfrm index aeff2b9d67..7e3022fe32 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/BuildOptions.xfrm +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/BuildOptions.xfrm @@ -214,7 +214,8 @@ - + + @@ -229,7 +230,7 @@ - + @@ -237,7 +238,7 @@ - + @@ -245,7 +246,7 @@ - + @@ -255,7 +256,7 @@ - + @@ -270,7 +271,7 @@ - + @@ -286,7 +287,7 @@ - + diff --git a/src/AddIns/BackendBindings/ILAsmBinding/Project/Src/ILAsmProject.cs b/src/AddIns/BackendBindings/ILAsmBinding/Project/Src/ILAsmProject.cs index 5990496ea6..0474fa1905 100644 --- a/src/AddIns/BackendBindings/ILAsmBinding/Project/Src/ILAsmProject.cs +++ b/src/AddIns/BackendBindings/ILAsmBinding/Project/Src/ILAsmProject.cs @@ -25,7 +25,7 @@ namespace ICSharpCode.ILAsmBinding { Language = "ILAsm"; Create(info); - imports.Add(@"$(SharpDevelopBuildBinPath)\SharpDevelop.Build.MSIL.Targets"); + imports.Add(@"$(SharpDevelopBinPath)\SharpDevelop.Build.MSIL.Targets"); } public override bool CanCompile(string fileName) diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Resources/BuildOptions.xfrm b/src/AddIns/BackendBindings/VBNetBinding/Project/Resources/BuildOptions.xfrm index 237e04419a..96b3cc4063 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/Resources/BuildOptions.xfrm +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Resources/BuildOptions.xfrm @@ -213,7 +213,7 @@ - + @@ -228,7 +228,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -244,7 +244,7 @@ - + @@ -254,7 +254,7 @@ - + @@ -269,7 +269,7 @@ - + @@ -285,7 +285,7 @@ - + diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.MSIL.targets b/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.MSIL.targets index e1120fef4a..2966172f34 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.MSIL.targets +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.MSIL.targets @@ -1,8 +1,8 @@ - + - $(MSBuildAllProjects);$(SharpDevelopBuildBinPath)\SharpDevelop.Build.MSIL.targets + $(MSBuildAllProjects);$(SharpDevelopBinPath)\SharpDevelop.Build.MSIL.targets .il ILAsm @@ -37,5 +37,5 @@ /> - + diff --git a/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs b/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs index 59a1e761fd..4075d40e83 100644 --- a/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs +++ b/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs @@ -29,7 +29,7 @@ namespace ICSharpCode.NRefactory.Parser.VB if (curToken == null) { // first call of NextToken() curToken = Next(); specialTracker.InformToken(curToken.kind); - Console.WriteLine("Tok:" + Tokens.GetTokenString(curToken.kind) + " --- " + curToken.val); + //Console.WriteLine("Tok:" + Tokens.GetTokenString(curToken.kind) + " --- " + curToken.val); return curToken; } @@ -48,7 +48,7 @@ namespace ICSharpCode.NRefactory.Parser.VB curToken.next = new Token(Tokens.EOF, curToken.col, curToken.line, "\n"); specialTracker.InformToken(curToken.next.kind); } - Console.WriteLine("Tok:" + Tokens.GetTokenString(curToken.kind) + " --- " + curToken.val); + //Console.WriteLine("Tok:" + Tokens.GetTokenString(curToken.kind) + " --- " + curToken.val); return curToken; } diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index a2cc052892..f9b57fad1c 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -614,7 +614,6 @@ - @@ -702,6 +701,7 @@ + diff --git a/src/Main/Base/Project/Resources/ProjectOptions/ReferencePaths.xfrm b/src/Main/Base/Project/Resources/ProjectOptions/ReferencePaths.xfrm deleted file mode 100644 index 46c7d351a3..0000000000 --- a/src/Main/Base/Project/Resources/ProjectOptions/ReferencePaths.xfrm +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Main/Base/Project/Src/Dom/Implementations/AbstractDecoration.cs b/src/Main/Base/Project/Src/Dom/Implementations/AbstractDecoration.cs index 5b03aba14c..38bf2d9c9a 100644 --- a/src/Main/Base/Project/Src/Dom/Implementations/AbstractDecoration.cs +++ b/src/Main/Base/Project/Src/Dom/Implementations/AbstractDecoration.cs @@ -197,9 +197,6 @@ namespace ICSharpCode.SharpDevelop.Dom } // TODO: check inner classes for protected members too. - // TODO: look for FullyQualifiedName == FullyQualifiedName. Must be replaced by a function wich pays attention to the case. - // Look at NRefactoryResolver.IsSameName. Also pay attention if you can put this Function in IClass, and if you have to - // compare the names instead of the FullyQualifiedNames public bool IsAccessible(IClass callingClass, bool isClassInInheritanceTree) { if (IsInternal) { diff --git a/src/Main/Base/Project/Src/Gui/Components/StringListEditor.cs b/src/Main/Base/Project/Src/Gui/Components/StringListEditor.cs new file mode 100644 index 0000000000..3d32efa1bf --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Components/StringListEditor.cs @@ -0,0 +1,348 @@ +/* + * Created by SharpDevelop. + * User: Daniel Grunwald + * Date: 17.09.2005 + * Time: 18:31 + */ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.Gui +{ + /// + /// Control to edit a list of strings. + /// + public class StringListEditor : System.Windows.Forms.UserControl + { + public StringListEditor() + { + // + // The InitializeComponent() call is required for Windows Forms designer support. + // + InitializeComponent(); + + this.ManualOrder = true; + this.BrowseForDirectory = false; + // init enabled states: + ListBoxSelectedIndexChanged(null, null); + EditTextBoxTextChanged(null, null); + updateButton.Text = StringParser.Parse(updateButton.Text); + removeButton.Text = StringParser.Parse(removeButton.Text); + moveUpButton.Image = ResourceService.GetBitmap("Icons.16x16.ArrowUp"); + moveDownButton.Image = ResourceService.GetBitmap("Icons.16x16.ArrowDown"); + deleteButton.Image = ResourceService.GetBitmap("Icons.16x16.DeleteIcon"); + } + + #region Windows Forms Designer generated code + /// + /// 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.Size = new System.Drawing.Size(380, 272); + // + // StringListEditor + // + removeButton = new System.Windows.Forms.Button(); + // + // removeButton + // + removeButton.Location = new System.Drawing.Point(165, 53); + removeButton.Name = "removeButton"; + removeButton.Size = new System.Drawing.Size(75, 23); + removeButton.TabIndex = 5; + removeButton.Text = "${res:Global.DeleteButtonText}"; + removeButton.Click += new System.EventHandler(this.RemoveButtonClick); + deleteButton = new System.Windows.Forms.Button(); + // + // deleteButton + // + deleteButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + deleteButton.Location = new System.Drawing.Point(329, 164); + deleteButton.Name = "deleteButton"; + deleteButton.Size = new System.Drawing.Size(24, 24); + deleteButton.TabIndex = 10; + deleteButton.Click += new System.EventHandler(this.RemoveButtonClick); + moveDownButton = new System.Windows.Forms.Button(); + // + // moveDownButton + // + moveDownButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + moveDownButton.Location = new System.Drawing.Point(329, 134); + moveDownButton.Name = "moveDownButton"; + moveDownButton.Size = new System.Drawing.Size(24, 24); + moveDownButton.TabIndex = 9; + moveDownButton.Click += new System.EventHandler(this.MoveDownButtonClick); + moveUpButton = new System.Windows.Forms.Button(); + // + // moveUpButton + // + moveUpButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + moveUpButton.Location = new System.Drawing.Point(329, 104); + moveUpButton.Name = "moveUpButton"; + moveUpButton.Size = new System.Drawing.Size(24, 24); + moveUpButton.TabIndex = 8; + moveUpButton.Click += new System.EventHandler(this.MoveUpButtonClick); + listBox = new System.Windows.Forms.ListBox(); + // + // listBox + // + listBox.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))); + listBox.FormattingEnabled = true; + listBox.Location = new System.Drawing.Point(3, 104); + listBox.Name = "listBox"; + listBox.Size = new System.Drawing.Size(320, 160); + listBox.TabIndex = 7; + listBox.SelectedIndexChanged += new System.EventHandler(this.ListBoxSelectedIndexChanged); + listLabel = new System.Windows.Forms.Label(); + // + // listLabel + // + listLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + listLabel.Location = new System.Drawing.Point(3, 89); + listLabel.Name = "listLabel"; + listLabel.Size = new System.Drawing.Size(350, 23); + listLabel.TabIndex = 6; + listLabel.Text = "List:"; + updateButton = new System.Windows.Forms.Button(); + // + // updateButton + // + updateButton.Location = new System.Drawing.Point(84, 53); + updateButton.Name = "updateButton"; + updateButton.Size = new System.Drawing.Size(75, 23); + updateButton.TabIndex = 4; + updateButton.Text = "${res:Global.UpdateButtonText}"; + updateButton.Click += new System.EventHandler(this.UpdateButtonClick); + addButton = new System.Windows.Forms.Button(); + // + // addButton + // + addButton.Location = new System.Drawing.Point(3, 53); + addButton.Name = "addButton"; + addButton.Size = new System.Drawing.Size(75, 23); + addButton.TabIndex = 3; + addButton.Text = "Add Item"; + addButton.Click += new System.EventHandler(this.AddButtonClick); + editTextBox = new System.Windows.Forms.TextBox(); + // + // editTextBox + // + editTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + editTextBox.Location = new System.Drawing.Point(3, 26); + editTextBox.Name = "editTextBox"; + editTextBox.Size = new System.Drawing.Size(316, 21); + editTextBox.TabIndex = 1; + editTextBox.TextChanged += new System.EventHandler(this.EditTextBoxTextChanged); + browseButton = new System.Windows.Forms.Button(); + // + // browseButton + // + browseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + browseButton.Location = new System.Drawing.Point(325, 24); + browseButton.Name = "browseButton"; + browseButton.Size = new System.Drawing.Size(28, 23); + browseButton.TabIndex = 2; + browseButton.Text = "..."; + browseButton.Click += new System.EventHandler(this.BrowseButtonClick); + TitleLabel = new System.Windows.Forms.Label(); + // + // TitleLabel + // + TitleLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + TitleLabel.Location = new System.Drawing.Point(3, 10); + TitleLabel.Name = "TitleLabel"; + TitleLabel.Size = new System.Drawing.Size(350, 23); + TitleLabel.TabIndex = 0; + TitleLabel.Text = "Title:"; + this.Controls.Add(removeButton); + this.Controls.Add(deleteButton); + this.Controls.Add(moveDownButton); + this.Controls.Add(moveUpButton); + this.Controls.Add(listBox); + this.Controls.Add(listLabel); + this.Controls.Add(updateButton); + this.Controls.Add(addButton); + this.Controls.Add(editTextBox); + this.Controls.Add(browseButton); + this.Controls.Add(TitleLabel); + this.Name = "StringListEditor"; + } + private System.Windows.Forms.Button removeButton; + private System.Windows.Forms.Button deleteButton; + private System.Windows.Forms.Button moveDownButton; + private System.Windows.Forms.Button moveUpButton; + private System.Windows.Forms.ListBox listBox; + private System.Windows.Forms.Label listLabel; + private System.Windows.Forms.Button updateButton; + private System.Windows.Forms.Button addButton; + private System.Windows.Forms.TextBox editTextBox; + private System.Windows.Forms.Button browseButton; + private System.Windows.Forms.Label TitleLabel; + #endregion + + public event EventHandler ListChanged; + + protected virtual void OnListChanged(EventArgs e) + { + if (ListChanged != null) { + ListChanged(this, e); + } + } + + public bool ManualOrder { + get { + return !listBox.Sorted; + } + set { + moveUpButton.Visible = moveDownButton.Visible = deleteButton.Visible = value; + removeButton.Visible = !value; + listBox.Sorted = !value; + } + } + + bool browseForDirectory; + + public bool BrowseForDirectory { + get { + return browseForDirectory; + } + set { + browseForDirectory = value; + browseButton.Visible = browseForDirectory; // || browseForFile; + } + } + + public string TitleText { + get { + return TitleLabel.Text; + } + set { + TitleLabel.Text = value; + } + } + + public string AddButtonText { + get { + return addButton.Text; + } + set { + addButton.Text = value; + } + } + + public string ListCaption { + get { + return listLabel.Text; + } + set { + listLabel.Text = value; + } + } + + public void LoadList(IEnumerable list) + { + listBox.Items.Clear(); + foreach (string str in list) { + listBox.Items.Add(str); + } + } + + public string[] GetList() + { + string[] list = new string[listBox.Items.Count]; + for (int i = 0; i < list.Length; i++) { + list[i] = listBox.Items[i].ToString(); + } + return list; + } + + void BrowseButtonClick(object sender, EventArgs e) + { + FolderDialog fdiag = new FolderDialog(); + if (fdiag.DisplayDialog("Select folder") == DialogResult.OK) { + string path = fdiag.Path; + if (!path.EndsWith("\\") && !path.EndsWith("/")) + path += "\\"; + editTextBox.Text = path; + } + } + + void AddButtonClick(object sender, EventArgs e) + { + editTextBox.Text = editTextBox.Text.Trim(); + if (editTextBox.TextLength > 0) { + int index = listBox.Items.IndexOf(editTextBox.Text); + if (index < 0) { + index = listBox.Items.Add(editTextBox.Text); + OnListChanged(EventArgs.Empty); + } + listBox.SelectedIndex = index; + } + } + + void UpdateButtonClick(object sender, EventArgs e) + { + editTextBox.Text = editTextBox.Text.Trim(); + if (editTextBox.TextLength > 0) { + listBox.Items[listBox.SelectedIndex] = editTextBox.Text; + OnListChanged(EventArgs.Empty); + } + } + + void RemoveButtonClick(object sender, EventArgs e) + { + listBox.Items.RemoveAt(listBox.SelectedIndex); + OnListChanged(EventArgs.Empty); + } + + void MoveUpButtonClick(object sender, EventArgs e) + { + int index = listBox.SelectedIndex; + object tmp = listBox.Items[index]; + listBox.Items[index] = listBox.Items[index - 1]; + listBox.Items[index - 1] = tmp; + listBox.SelectedIndex = index - 1; + OnListChanged(EventArgs.Empty); + } + + void MoveDownButtonClick(object sender, EventArgs e) + { + int index = listBox.SelectedIndex; + object tmp = listBox.Items[index]; + listBox.Items[index] = listBox.Items[index + 1]; + listBox.Items[index + 1] = tmp; + listBox.SelectedIndex = index + 1; + OnListChanged(EventArgs.Empty); + } + + void ListBoxSelectedIndexChanged(object sender, EventArgs e) + { + if (listBox.SelectedIndex >= 0) { + editTextBox.Text = listBox.Items[listBox.SelectedIndex].ToString(); + } + moveUpButton.Enabled = listBox.SelectedIndex > 0; + moveDownButton.Enabled = listBox.SelectedIndex >= 0 && listBox.SelectedIndex < listBox.Items.Count - 1; + removeButton.Enabled = deleteButton.Enabled = listBox.SelectedIndex >= 0; + updateButton.Enabled = listBox.SelectedIndex >= 0 && editTextBox.TextLength > 0; + } + + void EditTextBoxTextChanged(object sender, System.EventArgs e) + { + addButton.Enabled = editTextBox.TextLength > 0; + updateButton.Enabled = listBox.SelectedIndex >= 0 && editTextBox.TextLength > 0; + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AbstractBuildOptions.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AbstractBuildOptions.cs index a776ecd8df..33c4f2dd08 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AbstractBuildOptions.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AbstractBuildOptions.cs @@ -113,11 +113,6 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels { helper.BindEnum("debugInfoComboBox", "DebugType"); helper.BindBoolean("registerCOMInteropCheckBox", "RegisterForComInterop", false); - helper.BindStringEnum("generateSerializationAssemblyComboBox", "GenerateSerializationAssemblies", - "Auto", - new StringPair("Off", "Off"), - new StringPair("On", "On"), - new StringPair("Auto", "Auto")); helper.BindStringEnum("generateSerializationAssemblyComboBox", "GenerateSerializationAssemblies", "Auto", new StringPair("Off", "Off"), diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ReferencePaths.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ReferencePaths.cs index a9febd744d..46031b0857 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ReferencePaths.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ReferencePaths.cs @@ -15,20 +15,46 @@ using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.SharpDevelop.Gui.OptionPanels { - public class ReferencePaths : AbstractOptionPanel + public class ReferencePaths : AbstractProjectOptionPanel { - MSBuildProject project; - public override void LoadPanelContents() { - SetupFromXmlResource("ProjectOptions.ReferencePaths.xfrm"); - this.project = (MSBuildProject)((Properties)CustomizationObject).Get("Project"); + InitializeHelper(); + + StringListEditor editor = new StringListEditor(); + editor.BrowseForDirectory = true; + editor.ListCaption = StringParser.Parse("&${res:Dialog.ProjectOptions.ReferencePaths}:"); + editor.TitleText = StringParser.Parse("&${res:Dialog.ExportProjectToHtml.FolderLabel}"); + editor.AddButtonText = StringParser.Parse("${res:Dialog.ProjectOptions.ReferencePaths.AddPath}"); + editor.ListChanged += delegate { IsDirty = true; }; + helper.AddBinding("ReferencePath", new SemicolonSeparatedStringListBinding(editor)); + this.Controls.Add(editor); } - public override bool StorePanelContents() + public class SemicolonSeparatedStringListBinding : ConfigurationGuiBinding { - // TODO - return true; + StringListEditor editor; + + public SemicolonSeparatedStringListBinding(StringListEditor editor) + { + this.editor = editor; + } + + public override void Load() + { + string[] values = Get("").Split(';'); + if (values.Length == 1 && values[0].Length == 0) { + editor.LoadList(new string[0]); + } else { + editor.LoadList(values); + } + } + + public override bool Save() + { + Set(string.Join(";", editor.GetList())); + return true; + } } } } diff --git a/src/Main/Base/Project/Src/Gui/XmlForms/Lib/XmlUserControl.cs b/src/Main/Base/Project/Src/Gui/XmlForms/Lib/XmlUserControl.cs index d15824985b..37d4362c82 100644 --- a/src/Main/Base/Project/Src/Gui/XmlForms/Lib/XmlUserControl.cs +++ b/src/Main/Base/Project/Src/Gui/XmlForms/Lib/XmlUserControl.cs @@ -29,7 +29,10 @@ namespace ICSharpCode.SharpDevelop.Gui.XmlForms /// public Dictionary ControlDictionary { get { - return xmlLoader.ControlDictionary; + if (xmlLoader == null) + return null; + else + return xmlLoader.ControlDictionary; } } diff --git a/src/Main/Base/Project/Src/Project/MSBuildEngine.cs b/src/Main/Base/Project/Src/Project/MSBuildEngine.cs index d8cbd5a4b4..00bfa423a9 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildEngine.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildEngine.cs @@ -27,10 +27,16 @@ namespace ICSharpCode.SharpDevelop.Project { /// /// Gets a list of the task names that cause a "Compiling ..." log message. + /// The contents of the list can be changed by addins. /// All names must be in lower case! /// public static readonly List CompileTaskNames = new List(new string[] {"csc", "vbc", "ilasm"}); + /// + /// Gets a list where addins can add additional properties for use in MsBuild. + /// + public static readonly List> MsBuildProperties = new List>(); + MessageViewCategory messageView; /// @@ -64,7 +70,10 @@ namespace ICSharpCode.SharpDevelop.Project CompilerResults results = new CompilerResults(null); BuildPropertyGroup properties = new BuildPropertyGroup(); string location = Path.GetDirectoryName(typeof(MSBuildEngine).Assembly.Location); - properties.SetProperty("SharpDevelopBuildBinPath", location); + properties.SetProperty("SharpDevelopBinPath", location); + foreach (KeyValuePair entry in MsBuildProperties) { + properties.SetProperty(entry.Key, entry.Value); + } Engine engine = new Engine(System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()); SharpDevelopLogger logger = new SharpDevelopLogger(this, results); diff --git a/src/Main/StartUp/Project/Resources/StringResources.resources b/src/Main/StartUp/Project/Resources/StringResources.resources index 0a73ef59300140719e62128924f2ac4e775fffb0..f3d85973dbf3cef5f5394be92aa9e6708676a57c 100644 GIT binary patch delta 31022 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 delta 29936 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