diff --git a/AddIns/ICSharpCode.SharpDevelop.addin b/AddIns/ICSharpCode.SharpDevelop.addin index 1b37bede0e..d39fbde0af 100644 --- a/AddIns/ICSharpCode.SharpDevelop.addin +++ b/AddIns/ICSharpCode.SharpDevelop.addin @@ -631,11 +631,11 @@ - + @@ -1008,15 +1008,17 @@ class = "ICSharpCode.SharpDevelop.Commands.SideBarDeleteTabHeader"/> - - + + + + - + - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin index 632ac9cf45..48427d2db1 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin @@ -97,25 +97,25 @@ - + diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj index 94f3f30360..14e77821f4 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj @@ -84,6 +84,8 @@ Configuration\GlobalAssemblyInfo.cs + + @@ -141,7 +143,8 @@ False + - \ No newline at end of file + diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Resources/BuildOptions.xfrm b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Resources/BuildOptions.xfrm new file mode 100644 index 0000000000..0d90359ddc --- /dev/null +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Resources/BuildOptions.xfrm @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BuildOptions.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BuildOptions.cs new file mode 100644 index 0000000000..7e7789fda6 --- /dev/null +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BuildOptions.cs @@ -0,0 +1,57 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Gui.XmlForms; +using ICSharpCode.SharpDevelop.Gui.OptionPanels; + +using StringPair = System.Collections.Generic.KeyValuePair; + +namespace Grunwald.BooBinding +{ + public sealed class BuildOptions : AbstractBuildOptions + { + public override void LoadPanelContents() + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream(GetType().Namespace + ".Resources.BuildOptions.xfrm")); + InitializeHelper(); + + InitOutputPath(); + //InitXmlDoc(); + InitDebugInfo(); + + ConfigurationGuiBinding b; + + //b = helper.BindString("conditionalSymbolsTextBox", "DefineConstants"); + //b.DefaultLocation = PropertyStorageLocations.ConfigurationSpecific; + //b.CreateLocationButton("conditionalSymbolsTextBox"); + + b = helper.BindBoolean("noCorlibCheckBox", "NoStdLib", false); + b.CreateLocationButton("noCorlibCheckBox"); + + helper.BindString("pipelineTextBox", "Pipeline").CreateLocationButton("pipelineLabel"); + + //InitWarnings(); + + // + helper.BindString("baseIntermediateOutputPathTextBox", "BaseIntermediateOutputPath").CreateLocationButton("baseIntermediateOutputPathTextBox"); + ConnectBrowseFolder("baseIntermediateOutputPathBrowseButton", "baseIntermediateOutputPathTextBox", "${res:Dialog.Options.PrjOptions.Configuration.FolderBrowserDescription}"); + helper.BindString("intermediateOutputPathTextBox", "IntermediateOutputPath").CreateLocationButton("intermediateOutputPathTextBox"); + ConnectBrowseFolder("intermediateOutputPathBrowseButton", "intermediateOutputPathTextBox", "${res:Dialog.Options.PrjOptions.Configuration.FolderBrowserDescription}"); + // + + helper.AddConfigurationSelector(this); + } + } +} diff --git a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitor.cs b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitor.cs index c85b8088ee..8a9a7d4321 100644 --- a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitor.cs @@ -146,9 +146,7 @@ namespace NRefactoryToBooConverter if ((m & Modifier.Default) != 0) { ParametrizedNode parametrizedNode = node as ParametrizedNode; string name = null; - if (node is IndexerDeclaration) { - name = DefaultIndexerName; - } else if (parametrizedNode != null) { + if (parametrizedNode != null) { name = parametrizedNode.Name; } else { AddError(node, "Default modifier is not supported on this member."); diff --git a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitorTypeMembers.cs b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitorTypeMembers.cs index f257683415..f1b7ab8c94 100644 --- a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitorTypeMembers.cs +++ b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitorTypeMembers.cs @@ -213,13 +213,10 @@ namespace NRefactoryToBooConverter return m; } - public const string DefaultIndexerName = "Indexer"; - public object Visit(IndexerDeclaration indexerDeclaration, object data) { - indexerDeclaration.Modifier |= Modifier.Default; - B.Property m = new B.Property(GetLexicalInfo(indexerDeclaration)); + m.Modifiers = ConvertModifier(indexerDeclaration, B.TypeMemberModifiers.Private); ConvertAttributes(indexerDeclaration.Attributes, m.Attributes); if (currentType != null) currentType.Members.Add(m); @@ -228,7 +225,7 @@ namespace NRefactoryToBooConverter m.Type = ConvertTypeReference(indexerDeclaration.TypeReference); m.Name = "this"; m.ExplicitInfo = ConvertInterfaceImplementations(indexerDeclaration.InterfaceImplementations, indexerDeclaration, m); - m.Name = DefaultIndexerName; + m.Name = "self"; if (!indexerDeclaration.IsWriteOnly) { m.Getter = new B.Method(GetLexicalInfo(indexerDeclaration.GetRegion)); if (indexerDeclaration.GetRegion != null) { diff --git a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/ExpressionTests.cs b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/ExpressionTests.cs index 945d36d2cd..c143b747d6 100644 --- a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/ExpressionTests.cs +++ b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/ExpressionTests.cs @@ -220,7 +220,7 @@ namespace NRefactoryToBooConverter.Tests [Test] public void CreateArrayWithOneElement() { - TestExpr("new int[] { 1 }", "(of System.Int32: 1,)"); + TestExpr("new int[] { 1 }", "(of System.Int32: 1)"); } [Test] diff --git a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/MemberTests.cs b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/MemberTests.cs index 0ed55fb270..3d1106486c 100644 --- a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/MemberTests.cs +++ b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/MemberTests.cs @@ -217,26 +217,26 @@ namespace NRefactoryToBooConverter.Tests [Test] public void ReadOnlyIndexer() { - TestInClassWithIndexer("public string this[int index] { get { } }", "public Indexer(index as System.Int32) as System.String:\n\tget:\n\t\tpass"); + TestInClass("public string this[int index] { get { } }", "public self[index as System.Int32] as System.String:\n\tget:\n\t\tpass"); } [Test] public void WriteOnlyIndexer() { - TestInClassWithIndexer("public string this[int index] { set { } }", "public Indexer(index as System.Int32) as System.String:\n\tset:\n\t\tpass"); + TestInClass("public string this[int index] { set { } }", "public self[index as System.Int32] as System.String:\n\tset:\n\t\tpass"); } [Test] public void Indexer() { - TestInClassWithIndexer("public string this[int index] { get {} set { } }", "public Indexer(index as System.Int32) as System.String:\n\tget:\n\t\tpass\n\tset:\n\t\tpass"); + TestInClass("public string this[int index] { get {} set { } }", "public self[index as System.Int32] as System.String:\n\tget:\n\t\tpass\n\tset:\n\t\tpass"); } [Test] public void IndexerWithAttributes() { - TestInClassWithIndexer("[AA] public string this[int index] { [BB] get {} [CC] set { } }", - "[AA]\npublic Indexer(index as System.Int32) as System.String:\n\t[BB]\n\tget:\n\t\tpass\n\t[CC]\n\tset:\n\t\tpass"); + TestInClass("[AA] public string this[int index] { [BB] get {} [CC] set { } }", + "[AA]\npublic self[index as System.Int32] as System.String:\n\t[BB]\n\tget:\n\t\tpass\n\t[CC]\n\tset:\n\t\tpass"); } [Test] diff --git a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/TestHelper.cs b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/TestHelper.cs index 7e68eab9bd..652bd915ab 100644 --- a/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/TestHelper.cs +++ b/src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/TestHelper.cs @@ -75,11 +75,6 @@ namespace NRefactoryToBooConverter.Tests TestVB("Public Class ClassName\n" + input + "\nEnd Class\n", "public class ClassName:\n\t" + output.Replace("\n", "\n\t")); } - protected void TestInClassWithIndexer(string input, string output) - { - Test("public class ClassName {\n" + input + "\n}", "[System.Reflection.DefaultMember('Indexer')]\npublic class ClassName:\n\t" + output.Replace("\n", "\n\t")); - } - protected void TestStatement(string input, string output) { ConverterSettings dummySet = new ConverterSettings("dummy.cs"); diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs index 9de4273914..704865e096 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs @@ -347,7 +347,7 @@ namespace CSharpBinding.FormattingStrategy sb.Append("\">"); } } - if (method.ReturnType != null && method.ReturnType.FullyQualifiedName != "System.Void") { + if (method.ReturnType != null && !method.IsConstructor && method.ReturnType.FullyQualifiedName != "System.Void") { sb.Append("\n"); sb.Append(indentation); sb.Append("/// "); diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/OptionPanels/BuildOptions.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/OptionPanels/BuildOptions.cs index 9384caaba6..262250a8ba 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/OptionPanels/BuildOptions.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/OptionPanels/BuildOptions.cs @@ -54,6 +54,7 @@ namespace CSharpBinding.OptionPanels b = helper.BindBoolean("noCorlibCheckBox", "NoStdLib", false); b.CreateLocationButton("noCorlibCheckBox"); + InitDebugInfo(); InitAdvanced(); b = helper.BindStringEnum("fileAlignmentComboBox", "FileAlignment", "4096", diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/FormattingStrategy/VBNetFormattingStrategy.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/FormattingStrategy/VBNetFormattingStrategy.cs index 25e802fb5c..65070cacb0 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/FormattingStrategy/VBNetFormattingStrategy.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/FormattingStrategy/VBNetFormattingStrategy.cs @@ -289,7 +289,7 @@ namespace VBNetBinding.FormattingStrategy sb.Append("\">"); } } - if (method.ReturnType != null && method.ReturnType.FullyQualifiedName != "System.Void") { + if (method.ReturnType != null && !method.IsConstructor && method.ReturnType.FullyQualifiedName != "System.Void") { sb.Append("\n"); sb.Append(indentation); sb.Append("''' "); diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/OptionPanels/BuildOptions.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/OptionPanels/BuildOptions.cs index a2cabe5a05..348ebd31ef 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/OptionPanels/BuildOptions.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/OptionPanels/BuildOptions.cs @@ -61,6 +61,7 @@ namespace VBNetBinding.OptionPanels InitTargetFramework(VBNetProject.DefaultTargetsFile, @"$(SharpDevelopBinPath)\SharpDevelop.Build.VisualBasic.targets"); + InitDebugInfo(); InitAdvanced(); InitWarnings(); diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs index 1292f5c7c7..bd45021b69 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs @@ -57,6 +57,7 @@ namespace ICSharpCode.FormsDesigner Panel p = new Panel(); DesignSurface designSurface; bool disposing; + string activeTabName = String.Empty; IDesignerLoaderProvider loaderProvider; IDesignerGenerator generator; @@ -340,6 +341,7 @@ namespace ICSharpCode.FormsDesigner Reload(); IsFormsDesignerVisible = true; AddSideBars(); + SetActiveSideTab(); UpdatePropertyPad(); } @@ -361,6 +363,10 @@ namespace ICSharpCode.FormsDesigner PropertyPad.PropertyValueChanged -= PropertyValueChanged; propertyContainer.Clear(); IsFormsDesignerVisible = false; + activeTabName = String.Empty; + if (SharpDevelopSideBar.SideBar.ActiveTab != null && ToolboxProvider.SideTabs.Contains(SharpDevelopSideBar.SideBar.ActiveTab)) { + activeTabName = SharpDevelopSideBar.SideBar.ActiveTab.Name; + } foreach(AxSideTab tab in ToolboxProvider.SideTabs) { if (!SharpDevelopSideBar.SideBar.Tabs.Contains(tab)) { return; @@ -601,5 +607,19 @@ namespace ICSharpCode.FormsDesigner } SharpDevelopSideBar.SideBar.Refresh(); } + + void SetActiveSideTab() + { + if (activeTabName.Length == 0) { + return; + } + + foreach(AxSideTab tab in ToolboxProvider.SideTabs) { + if (activeTabName == tab.Name) { + SharpDevelopSideBar.SideBar.ActiveTab = tab; + return; + } + } + } } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/AddComponentsDialog.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/AddComponentsDialog.cs index 2e38dc888a..f0ea2f11c3 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/AddComponentsDialog.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/AddComponentsDialog.cs @@ -132,8 +132,7 @@ namespace ICSharpCode.FormsDesigner.Gui newItem.ImageIndex = (int)images[t.FullName + ".bmp"]; } newItem.Checked = true; - ToolComponent toolComponent = new ToolComponent(t.FullName, new ComponentAssembly(assembly.FullName, loadPath)); - toolComponent.IsEnabled = true; + ToolComponent toolComponent = new ToolComponent(t.FullName, new ComponentAssembly(assembly.FullName, loadPath), true); newItem.Tag = toolComponent; componentListView.Items.Add(newItem); ToolboxItem item = new ToolboxItem(t); diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/ComponentLibraryLoader.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/ComponentLibraryLoader.cs index ef69788dce..7437ff1f5a 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/ComponentLibraryLoader.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/ComponentLibraryLoader.cs @@ -87,11 +87,12 @@ namespace ICSharpCode.FormsDesigner.Gui protected ToolComponent() { } - public ToolComponent(string fullName, ComponentAssembly assembly) + public ToolComponent(string fullName, ComponentAssembly assembly, bool enabled) { this.fullName = fullName; this.assemblyName = assembly.Name; - this.hintPath = assembly.HintPath; + this.hintPath = assembly.HintPath; + this.isEnabled = enabled; } public string FileName { get { @@ -239,6 +240,57 @@ namespace ICSharpCode.FormsDesigner.Gui return newCategories; } + public void RemoveCategory(string name) + { + foreach (Category category in categories) { + if (category.Name == name) { + categories.Remove(category); + break; + } + } + } + + public void DisableToolComponent(string categoryName, string fullName) + { + foreach (Category category in categories) { + if (category.Name == categoryName) { + foreach (ToolComponent component in category.ToolComponents) { + if (component.FullName == fullName) { + component.IsEnabled = false; + return; + } + } + } + } + } + + /// + /// Swaps the order of the two specified tool components + /// + public void ExchangeToolComponents(string categoryName, string fullName1, string fullName2) + { + foreach (Category category in categories) { + if (category.Name == categoryName) { + int index1 = -1; + int index2 = -1; + for (int i = 0; i < category.ToolComponents.Count; ++i) { + ToolComponent component = (ToolComponent)category.ToolComponents[i]; + if (component.FullName == fullName1) { + index1 = i; + } else if (component.FullName == fullName2) { + index2 = i; + } + + if (index1 != -1 && index2 != -1) { + ToolComponent component1 = (ToolComponent)category.ToolComponents[index1]; + category.ToolComponents[index1] = category.ToolComponents[index2]; + category.ToolComponents[index2] = component1; + return; + } + } + } + } + } public bool LoadToolComponentLibrary(string fileName) { @@ -273,7 +325,8 @@ namespace ICSharpCode.FormsDesigner.Gui Category newCategory = new Category(name); foreach (XmlNode componentNode in node.ChildNodes) { ToolComponent newToolComponent = new ToolComponent(componentNode.Attributes["class"].InnerText, - (ComponentAssembly)assemblies[Int32.Parse(componentNode.Attributes["assembly"].InnerText)]); + (ComponentAssembly)assemblies[Int32.Parse(componentNode.Attributes["assembly"].InnerText)], + IsEnabled(componentNode.Attributes["enabled"])); newCategory.ToolComponents.Add(newToolComponent); } categories.Add(newCategory); @@ -381,5 +434,16 @@ namespace ICSharpCode.FormsDesigner.Gui } doc.Save(fileName); } + + bool IsEnabled(XmlAttribute attribute) + { + if (attribute != null && attribute.InnerText != null) { + bool enabled = true; + if (Boolean.TryParse(attribute.InnerText, out enabled)) { + return enabled; + } + } + return true; + } } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/SideTabItemDesigner.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/SideTabItemDesigner.cs index 930c3d02e9..d415417ece 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/SideTabItemDesigner.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Gui/SideTabItemDesigner.cs @@ -38,6 +38,7 @@ namespace ICSharpCode.FormsDesigner.Gui ///create a tabitem from a toolboxitem. It init Icon and name from the tag public SideTabItemDesigner(ToolboxItem tag) : base(tag.DisplayName, tag) { + CanBeRenamed = false; this.Icon = tag.Bitmap; ReloadToolBox(); } @@ -45,6 +46,7 @@ namespace ICSharpCode.FormsDesigner.Gui ///create a tabitem from a toolboxitem. It init Icon from the tag public SideTabItemDesigner(string name, ToolboxItem tag) : base(name, tag) { + CanBeRenamed = false; this.Icon = tag.Bitmap; ReloadToolBox(); } @@ -52,15 +54,14 @@ namespace ICSharpCode.FormsDesigner.Gui ///create a default tabitem : a pointer icon with an empty toolboxitem public SideTabItemDesigner() : base("Pointer") { - - - + CanBeRenamed = false; + CanBeDeleted = false; Bitmap pointerBitmap = new Bitmap(IconService.GetBitmap("Icons.16x16.FormsDesigner.PointerIcon"), 16, 16); // ToolboxItem toolboxItemPointer = new ToolboxItem(); // toolboxItemPointer.Bitmap = pointerBitmap; // toolboxItemPointer.DisplayName = "Pointer"; this.Icon = pointerBitmap; - this.Tag = null; //toolboxItemPointer; + this.Tag = null; ReloadToolBox(); } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ToolboxProvider.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ToolboxProvider.cs index 06b4c12461..80438a299a 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ToolboxProvider.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ToolboxProvider.cs @@ -55,6 +55,7 @@ namespace ICSharpCode.FormsDesigner toolboxService = new ICSharpCode.FormsDesigner.Services.ToolboxService(); ReloadSideTabs(false); toolboxService.SelectedItemUsed += new EventHandler(SelectedToolUsedHandler); + SharpDevelopSideBar.SideBar.SideTabDeleted += SideTabDeleted; } return toolboxService; } @@ -101,6 +102,8 @@ namespace ICSharpCode.FormsDesigner { bool reInsertTabs = false; foreach(AxSideTab tab in SideTabs) { + tab.ItemRemoved -= SideTabItemRemoved; + tab.ItemsExchanged -= SideTabItemsExchanged; if (SharpDevelopSideBar.SideBar.Tabs.Contains(tab)) { SharpDevelopSideBar.SideBar.Tabs.Remove(tab); reInsertTabs = true;; @@ -113,6 +116,8 @@ namespace ICSharpCode.FormsDesigner if (category.IsEnabled) { try { SideTabDesigner newTab = new SideTabDesigner(SharpDevelopSideBar.SideBar, category, toolboxService); + newTab.ItemRemoved += SideTabItemRemoved; + newTab.ItemsExchanged += SideTabItemsExchanged; SideTabs.Add(newTab); } catch (Exception e) { ICSharpCode.Core.LoggingService.Warn("Can't add tab : " + e); @@ -120,6 +125,8 @@ namespace ICSharpCode.FormsDesigner } } SideTabDesigner customTab = new CustomComponentsSideTab(SharpDevelopSideBar.SideBar, "Custom Components", toolboxService); + customTab.ItemRemoved += SideTabItemRemoved; + customTab.ItemsExchanged += SideTabItemsExchanged; SideTabs.Add(customTab); if (reInsertTabs) { foreach(AxSideTab tab in SideTabs) { @@ -247,5 +254,35 @@ namespace ICSharpCode.FormsDesigner ProjectService.AddProjectItem(project, reference); project.Save(); } + + static void SideTabDeleted(object source, SideTabEventArgs e) + { + if (SideTabs.Contains(e.SideTab)) { + SideTabs.Remove(e.SideTab); + componentLibraryLoader.RemoveCategory(e.SideTab.Name); + SaveToolbox(); + } + } + + static void SideTabItemRemoved(object source, SideTabItemEventArgs e) + { + SideTabDesigner tab = source as SideTabDesigner; + ToolboxItem toolboxItem = e.Item.Tag as ToolboxItem; + if (tab != null && toolboxItem != null) { + componentLibraryLoader.DisableToolComponent(tab.Name, toolboxItem.TypeName); + SaveToolbox(); + } + } + + static void SideTabItemsExchanged(object source, SideTabItemExchangeEventArgs e) + { + SideTabDesigner tab = source as SideTabDesigner; + ToolboxItem toolboxItem1 = e.Item1.Tag as ToolboxItem; + ToolboxItem toolboxItem2 = e.Item2.Tag as ToolboxItem; + if (tab != null && toolboxItem1 != null && toolboxItem2 != null) { + componentLibraryLoader.ExchangeToolComponents(tab.Name, toolboxItem1.TypeName, toolboxItem2.TypeName); + SaveToolbox(); + } + } } } diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/DisplayDefinition.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/DisplayDefinition.cs index bad31cd0d2..4ade349c02 100644 --- a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/DisplayDefinition.cs +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/DisplayDefinition.cs @@ -110,6 +110,9 @@ namespace ResourceEditor public bool EnableCut { get { + if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { + return false; + } return resourceEditor.ResourceList.SelectedItems.Count > 0; } } @@ -117,6 +120,9 @@ namespace ResourceEditor public bool EnableCopy { get { + if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { + return false; + } return resourceEditor.ResourceList.SelectedItems.Count > 0; } } @@ -124,6 +130,9 @@ namespace ResourceEditor public bool EnablePaste { get { + if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { + return false; + } return true; } } @@ -131,6 +140,9 @@ namespace ResourceEditor public bool EnableDelete { get { + if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { + return false; + } return resourceEditor.ResourceList.SelectedItems.Count > 0; } } @@ -138,6 +150,9 @@ namespace ResourceEditor public bool EnableSelectAll { get { + if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { + return false; + } return true; } } diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceList.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceList.cs index a858739e0d..05d3df2320 100644 --- a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceList.cs +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceList.cs @@ -39,6 +39,7 @@ namespace ResourceEditor UndoStack undoStack = null; bool writeProtected = false; + int editListViewItemIndex = -1; public event EventHandler Changed; @@ -73,12 +74,16 @@ namespace ResourceEditor } } + public bool IsEditing { + get { + return editListViewItemIndex != -1; + } + } + public ResourceList(ResourceEditorControl editor) { undoStack = new UndoStack(); - - - + name.Text = ResourceService.GetString("Global.Name"); name.Width = 250; @@ -110,9 +115,6 @@ namespace ResourceEditor images.Images.Add(ResourceService.GetIcon("Icons.16x16.ResourceEditor.obj")); SmallImageList = images; - AfterLabelEdit += new LabelEditEventHandler(afterLabelEdit); - - ContextMenuStrip = MenuService.CreateContextMenu(editor, "/SharpDevelop/ResourceEditor/ResourceList/ContextMenu"); } @@ -197,8 +199,27 @@ namespace ResourceEditor } } - void afterLabelEdit(object sender, LabelEditEventArgs e) + public void InitializeListView() + { + BeginUpdate(); + Items.Clear(); + + foreach (KeyValuePair entry in resources) { + ResourceItem item = entry.Value; + + string tmp = item.ToString(); + string type = item.ResourceValue.GetType().FullName; + + ListViewItem lv = new ListViewItem(new String[] {item.Name, type, tmp}, item.ImageIndex); + Items.Add(lv); + } + EndUpdate(); + } + + protected override void OnAfterLabelEdit(LabelEditEventArgs e) { + editListViewItemIndex = -1; + if (writeProtected) { e.CancelEdit = true; return; @@ -226,21 +247,12 @@ namespace ResourceEditor OnChanged(); } - public void InitializeListView() + protected override void OnBeforeLabelEdit(LabelEditEventArgs e) { - BeginUpdate(); - Items.Clear(); - - foreach (KeyValuePair entry in resources) { - ResourceItem item = entry.Value; - - string tmp = item.ToString(); - string type = item.ResourceValue.GetType().FullName; - - ListViewItem lv = new ListViewItem(new String[] {item.Name, type, tmp}, item.ImageIndex); - Items.Add(lv); + base.OnBeforeLabelEdit(e); + if (!e.CancelEdit) { + editListViewItemIndex = e.Item; } - EndUpdate(); } } } diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlSchemaCompletionData.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlSchemaCompletionData.cs index 9ee86943b2..22123e124d 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlSchemaCompletionData.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlSchemaCompletionData.cs @@ -234,15 +234,12 @@ namespace ICSharpCode.XmlEditor /// void ReadSchema(XmlReader reader) { - try - { + try { schema = XmlSchema.Read(reader, new ValidationEventHandler(SchemaValidation)); schema.Compile(new ValidationEventHandler(SchemaValidation)); namespaceUri = schema.TargetNamespace; - } - finally - { + } finally { reader.Close(); } } @@ -882,7 +879,7 @@ namespace ICSharpCode.XmlEditor } else { // Abstract element? XmlSchemaElement abstractElement = FindElement(element.RefName); - if (abstractElement.IsAbstract) { + if (abstractElement != null && abstractElement.IsAbstract) { matchedElement = FindSubstitutionGroupElement(abstractElement.QualifiedName, name); } } diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/XmlEditor.csproj b/src/AddIns/DisplayBindings/XmlEditor/Project/XmlEditor.csproj index 67053a5efc..2bf8777760 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/XmlEditor.csproj +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/XmlEditor.csproj @@ -126,4 +126,4 @@ - \ No newline at end of file + diff --git a/src/AddIns/DisplayBindings/XmlEditor/Test/Schema/MissingSchemaElementTestFixture.cs b/src/AddIns/DisplayBindings/XmlEditor/Test/Schema/MissingSchemaElementTestFixture.cs new file mode 100644 index 0000000000..0d1bd9938b --- /dev/null +++ b/src/AddIns/DisplayBindings/XmlEditor/Test/Schema/MissingSchemaElementTestFixture.cs @@ -0,0 +1,56 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.TextEditor.Gui.CompletionWindow; +using ICSharpCode.XmlEditor; +using NUnit.Framework; +using System; +using System.IO; + +namespace XmlEditor.Tests.Schema +{ + [TestFixture] + public class MissingSchemaElementTestFixture : SchemaTestFixtureBase + { + ICompletionData[] barElementAttributes; + + public override void FixtureInit() + { + XmlElementPath path = new XmlElementPath(); + path.Elements.Add(new QualifiedName("root", "http://foo")); + path.Elements.Add(new QualifiedName("bar", "http://foo")); + barElementAttributes = SchemaCompletionData.GetAttributeCompletionData(path); + } + + [Test] + public void BarHasOneAttribute() + { + Assert.AreEqual(1, barElementAttributes.Length, "Should have 1 attribute."); + } + + protected override string GetSchema() + { + return "\r\n" + + "\t\r\n" + + "\t\t\r\n" + + "\t\t\t\r\n" + + "\t\t\t\r\n" + + "\t\t\r\n" + + "\t\t\r\n" + + "\t\r\n" + + "\t\r\n" + + "\t\r\n" + + "\t\t\r\n" + + "\t\r\n" + + "\t\r\n" + + ""; + } + } +} diff --git a/src/AddIns/DisplayBindings/XmlEditor/Test/XmlEditor.Tests.csproj b/src/AddIns/DisplayBindings/XmlEditor/Test/XmlEditor.Tests.csproj index c3f2be1138..20c7df8aea 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Test/XmlEditor.Tests.csproj +++ b/src/AddIns/DisplayBindings/XmlEditor/Test/XmlEditor.Tests.csproj @@ -89,6 +89,7 @@ + diff --git a/src/AddIns/Misc/CodeCoverage/Project/Src/NCoverRunner.cs b/src/AddIns/Misc/CodeCoverage/Project/Src/NCoverRunner.cs index c9b9ead780..e9506cd03d 100644 --- a/src/AddIns/Misc/CodeCoverage/Project/Src/NCoverRunner.cs +++ b/src/AddIns/Misc/CodeCoverage/Project/Src/NCoverRunner.cs @@ -267,7 +267,10 @@ namespace ICSharpCode.CodeCoverage } ncoverArguments.AppendFormat("\"{0}\" ", profiledApplicationCommand); - ncoverArguments.Append(profiledApplicationCommandLineArguments); + + //ncoverArguments.Append(profiledApplicationCommandLineArguments); + // HACK: Work around NCover bug: http://ncover.org/SITE/forums/thread/266.aspx + ncoverArguments.Append(profiledApplicationCommandLineArguments.Replace("\"", "\\\"")); return ncoverArguments.ToString(); } diff --git a/src/AddIns/Misc/UnitTesting/Src/PadContent.cs b/src/AddIns/Misc/UnitTesting/Src/PadContent.cs index c7706c8a37..a8b30b601c 100644 --- a/src/AddIns/Misc/UnitTesting/Src/PadContent.cs +++ b/src/AddIns/Misc/UnitTesting/Src/PadContent.cs @@ -127,7 +127,7 @@ namespace ICSharpCode.UnitTesting { if (autoLoadItems) { if (callback != null) - callback(); + WorkbenchSingleton.SafeThreadAsyncCall(callback); } else { ReloadAssemblyList(callback); } diff --git a/src/Main/Base/Project/Src/Commands/SideBarCommands.cs b/src/Main/Base/Project/Src/Commands/SideBarCommands.cs index a5295ed79e..a743a960bd 100644 --- a/src/Main/Base/Project/Src/Commands/SideBarCommands.cs +++ b/src/Main/Base/Project/Src/Commands/SideBarCommands.cs @@ -35,9 +35,6 @@ namespace ICSharpCode.SharpDevelop.Commands { SharpDevelopSideBar sideBar = (SharpDevelopSideBar)Owner; AxSideTabItem item = sideBar.ActiveTab.ChoosedItem; - - - if (item != null && MessageBox.Show(StringParser.Parse(ResourceService.GetString("SideBarComponent.ContextMenu.DeleteTabItemQuestion"), new string[,] { {"TabItem", item.Name}}), ResourceService.GetString("Global.QuestionText"), MessageBoxButtons.YesNo, @@ -128,15 +125,12 @@ namespace ICSharpCode.SharpDevelop.Commands { SharpDevelopSideBar sideBar = (SharpDevelopSideBar)Owner; AxSideTab selectedSideTab = sideBar.GetTabAt(sideBar.SideBarMousePosition.X, sideBar.SideBarMousePosition.Y); - - - if (MessageBox.Show(StringParser.Parse(ResourceService.GetString("SideBarComponent.ContextMenu.DeleteTabHeaderQuestion"), new string[,] { {"TabHeader", selectedSideTab.Name}}), ResourceService.GetString("Global.QuestionText"), MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes) { - sideBar.Tabs.Remove(selectedSideTab); + sideBar.DeleteSideTab(selectedSideTab); sideBar.Refresh(); } } @@ -156,11 +150,9 @@ namespace ICSharpCode.SharpDevelop.Commands public override void Run() { SharpDevelopSideBar sideBar = (SharpDevelopSideBar)Owner; - int index = sideBar.ActiveTab.Items.IndexOf(sideBar.ActiveTab.SelectedItem); + int index = sideBar.ActiveTab.Items.IndexOf(sideBar.ActiveTab.ChoosedItem); if (index > 0) { - AxSideTabItem item = sideBar.ActiveTab.Items[index]; - sideBar.ActiveTab.Items[index] = sideBar.ActiveTab.Items[index - 1]; - sideBar.ActiveTab.Items[index - 1] = item; + sideBar.ActiveTab.Exchange(index -1, index); sideBar.Refresh(); } } @@ -171,11 +163,9 @@ namespace ICSharpCode.SharpDevelop.Commands public override void Run() { SharpDevelopSideBar sideBar = (SharpDevelopSideBar)Owner; - int index = sideBar.ActiveTab.Items.IndexOf(sideBar.ActiveTab.SelectedItem); + int index = sideBar.ActiveTab.Items.IndexOf(sideBar.ActiveTab.ChoosedItem); if (index >= 0 && index < sideBar.ActiveTab.Items.Count - 1) { - AxSideTabItem item = sideBar.ActiveTab.Items[index]; - sideBar.ActiveTab.Items[index] = sideBar.ActiveTab.Items[index + 1]; - sideBar.ActiveTab.Items[index + 1] = item; + sideBar.ActiveTab.Exchange(index, index + 1); sideBar.Refresh(); } } diff --git a/src/Main/Base/Project/Src/Gui/Components/ExtTreeView/ExtTreeNode.cs b/src/Main/Base/Project/Src/Gui/Components/ExtTreeView/ExtTreeNode.cs index f06ff92e3d..acd742041b 100644 --- a/src/Main/Base/Project/Src/Gui/Components/ExtTreeView/ExtTreeNode.cs +++ b/src/Main/Base/Project/Src/Gui/Components/ExtTreeView/ExtTreeNode.cs @@ -115,7 +115,7 @@ namespace ICSharpCode.SharpDevelop.Gui } #region Label edit - protected bool canLabelEdit = true; + protected bool canLabelEdit = false; public virtual bool CanLabelEdit { get { return canLabelEdit; diff --git a/src/Main/Base/Project/Src/Gui/Components/ExtTreeView/ExtTreeView.cs b/src/Main/Base/Project/Src/Gui/Components/ExtTreeView/ExtTreeView.cs index ff1d2427cc..c810653a2e 100644 --- a/src/Main/Base/Project/Src/Gui/Components/ExtTreeView/ExtTreeView.cs +++ b/src/Main/Base/Project/Src/Gui/Components/ExtTreeView/ExtTreeView.cs @@ -139,21 +139,24 @@ namespace ICSharpCode.SharpDevelop.Gui if (node == null) { return; } - node.EnsureVisible(); - SelectedNode = node; - LabelEdit = true; - node.BeforeLabelEdit(); - node.BeginEdit(); + + if (node.CanLabelEdit) { + node.EnsureVisible(); + SelectedNode = node; + LabelEdit = true; + node.BeforeLabelEdit(); + node.BeginEdit(); + } } - protected override bool ProcessDialogKey(Keys keyData) + protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { switch (keyData) { case Keys.F2: StartLabelEdit(SelectedNode as ExtTreeNode); break; } - return base.ProcessDialogKey(keyData); + return base.ProcessCmdKey(ref msg, keyData); } protected override void OnAfterLabelEdit(NodeLabelEditEventArgs e) diff --git a/src/Main/Base/Project/Src/Gui/Components/SideBar/AxSideTab.cs b/src/Main/Base/Project/Src/Gui/Components/SideBar/AxSideTab.cs index 4419e906e3..bfd56c632c 100644 --- a/src/Main/Base/Project/Src/Gui/Components/SideBar/AxSideTab.cs +++ b/src/Main/Base/Project/Src/Gui/Components/SideBar/AxSideTab.cs @@ -20,11 +20,74 @@ namespace ICSharpCode.SharpDevelop.Gui Dragged } + public delegate void SideTabEventHandler(object source, SideTabEventArgs e); + + public class SideTabEventArgs + { + AxSideTab tab; + + public SideTabEventArgs(AxSideTab tab) + { + this.tab = tab; + } + + public AxSideTab SideTab { + get { + return tab; + } + } + } + + public delegate void SideTabItemEventHandler(object source, SideTabItemEventArgs e); + + public class SideTabItemEventArgs + { + AxSideTabItem item; + + public SideTabItemEventArgs(AxSideTabItem item) + { + this.item = item; + } + + public AxSideTabItem Item { + get { + return item; + } + } + } + + public delegate void SideTabItemExchangeEventHandler(object source, SideTabItemExchangeEventArgs e); + + public class SideTabItemExchangeEventArgs + { + AxSideTabItem item1; + AxSideTabItem item2; + + public SideTabItemExchangeEventArgs(AxSideTabItem item1, AxSideTabItem item2) + { + this.item1 = item1; + this.item2 = item2; + } + + public AxSideTabItem Item1 { + get { + return item1; + } + } + + public AxSideTabItem Item2 { + get { + return item2; + } + } + } + public class AxSideTab { string name; bool canDragDrop = true; bool canBeDeleted = true; + bool canBeRenamed = true; bool isClipboardRing = false; SideTabItemCollection items = new SideTabItemCollection(); SideTabStatus sideTabStatus; @@ -83,7 +146,7 @@ namespace ICSharpCode.SharpDevelop.Gui } } - public bool CanBeDeleted { + public bool CanBeDeleted { get { return canBeDeleted; } @@ -92,6 +155,15 @@ namespace ICSharpCode.SharpDevelop.Gui } } + public bool CanBeRenamed { + get { + return canBeRenamed; + } + set { + canBeRenamed = value; + } + } + public string Name { get { return name; @@ -166,6 +238,16 @@ namespace ICSharpCode.SharpDevelop.Gui } } + /// + /// A SideTabItem has been removed. + /// + public event SideTabItemEventHandler ItemRemoved; + + /// + /// Two SideTabItems have exchanged locations. + /// + public event SideTabItemExchangeEventHandler ItemsExchanged; + public ISideTabItemFactory SideTabItemFactory { get { return items.SideTabItemFactory; @@ -187,14 +269,17 @@ namespace ICSharpCode.SharpDevelop.Gui public AxSideTab(AxSideBar sideBar, string name) : this(sideBar.SideTabItemFactory) { this.name = name; + SetCanRename(); + items.ItemRemoved += OnSideTabItemRemoved; } public AxSideTab(string name) { this.name = name; + SetCanRename(); + items.ItemRemoved += OnSideTabItemRemoved; } - public bool ScrollDownButtonActivated { get { return scrollIndex > 0; @@ -261,11 +346,13 @@ namespace ICSharpCode.SharpDevelop.Gui { return GetItemAt(pos.X, pos.Y); } + public int ItemHeight { get { return 20; } } + public void DrawTabContent(Graphics g, Font f, Rectangle rectangle) { for (int i = 0; i + ScrollIndex < Items.Count; ++i) { @@ -280,11 +367,46 @@ namespace ICSharpCode.SharpDevelop.Gui } } + /// + /// Swaps two side tab items with the given indexes. + /// + public void Exchange(int a, int b) + { + AxSideTabItem itemA = Items[a]; + AxSideTabItem itemB = Items[b]; + Items[a] = itemB; + Items[b] = itemA; + OnExchange(itemA, itemB); + } + + void SetCanRename() + { + if (name != null && name.StartsWith("${res:")) { + canBeRenamed = false; + } + } + + void OnSideTabItemRemoved(object source, SideTabItemEventArgs e) + { + if (ItemRemoved != null) { + ItemRemoved(this, e); + } + } + + void OnExchange(AxSideTabItem item1, AxSideTabItem item2) + { + if (ItemsExchanged != null) { + ItemsExchanged(this, new SideTabItemExchangeEventArgs(item1, item2)); + } + } + public class SideTabItemCollection : ICollection, IEnumerable { ArrayList list = new ArrayList(); ISideTabItemFactory sideTabItemFactory = new DefaultSideTabItemFactory(); + public event SideTabItemEventHandler ItemRemoved; + public ISideTabItemFactory SideTabItemFactory { get { return sideTabItemFactory; @@ -399,11 +521,24 @@ namespace ICSharpCode.SharpDevelop.Gui public virtual void Remove(AxSideTabItem item) { list.Remove(item); + OnItemRemoved(item); } public virtual void RemoveAt(int index) { - list.RemoveAt(index); + if (index < 0 || index >= list.Count) { + return; + } + AxSideTabItem item = this[index]; + list.Remove(item); + OnItemRemoved(item); + } + + void OnItemRemoved(AxSideTabItem item) + { + if (ItemRemoved != null) { + ItemRemoved(this, new SideTabItemEventArgs(item)); + } } } } diff --git a/src/Main/Base/Project/Src/Gui/Components/SideBar/AxSideTabItem.cs b/src/Main/Base/Project/Src/Gui/Components/SideBar/AxSideTabItem.cs index 06136259b7..3773e945dd 100644 --- a/src/Main/Base/Project/Src/Gui/Components/SideBar/AxSideTabItem.cs +++ b/src/Main/Base/Project/Src/Gui/Components/SideBar/AxSideTabItem.cs @@ -27,6 +27,8 @@ namespace ICSharpCode.SharpDevelop.Gui object tag; SideTabItemStatus sideTabItemStatus; Bitmap icon; + bool canBeRenamed = true; + bool canBeDeleted = true; public Bitmap Icon { get { @@ -64,6 +66,24 @@ namespace ICSharpCode.SharpDevelop.Gui } } + public bool CanBeRenamed { + get { + return canBeRenamed; + } + set { + canBeRenamed = value; + } + } + + public bool CanBeDeleted { + get { + return canBeDeleted; + } + set { + canBeDeleted = value; + } + } + public AxSideTabItem(string name) { int idx = name.IndexOf("\n"); diff --git a/src/Main/Base/Project/Src/Gui/Components/SideBar/SharpDevelopSideBar.cs b/src/Main/Base/Project/Src/Gui/Components/SideBar/SharpDevelopSideBar.cs index 912490ccd6..4365b12adb 100644 --- a/src/Main/Base/Project/Src/Gui/Components/SideBar/SharpDevelopSideBar.cs +++ b/src/Main/Base/Project/Src/Gui/Components/SideBar/SharpDevelopSideBar.cs @@ -34,7 +34,7 @@ namespace ICSharpCode.SharpDevelop.Gui return new SharpDevelopSideTabItem(name, tag, bitmap); } } - + public class SharpDevelopSideBar : AxSideBar, IOwnerState { readonly static string contextMenuPath = "/SharpDevelop/Workbench/SharpDevelopSideBar/ContextMenu"; @@ -62,7 +62,8 @@ namespace ICSharpCode.SharpDevelop.Gui CanMoveDown = 2, TabCanBeDeleted = 4, CanMoveItemUp = 8, - CanMoveItemDown = 16 + CanMoveItemDown = 16, + CanBeRenamed = 32 } protected SidebarState internalState = SidebarState.TabCanBeDeleted; @@ -172,17 +173,55 @@ namespace ICSharpCode.SharpDevelop.Gui System.Diagnostics.Debug.Assert(false, "Can't find clipboard ring side tab category"); } + public void DeleteSideTab(AxSideTab tab) + { + if (tab == null) { + return; + } + + Tabs.Remove(tab); + OnSideTabDeleted(tab); + } + //////////////////////////////////////////////////////////////////////////// // Tab Context Menu - void SetDeletedState(AxSideTab tab) + void SetDeletedState(AxSideTabItem item) { - if (tab.CanBeDeleted) { + if (item != null) { + SetDeletedState(item.CanBeDeleted); + } else { + SetDeletedState(false); + } + } + + void SetDeletedState(bool canBeDeleted) + { + if (canBeDeleted) { internalState |= SidebarState.TabCanBeDeleted; } else { internalState = internalState & ~SidebarState.TabCanBeDeleted; } } + + + void SetRenameState(AxSideTabItem item) + { + if (item != null) { + SetRenameState(item.CanBeRenamed); + } else { + SetRenameState(false); + } + } + + void SetRenameState(bool canBeRenamed) + { + if (canBeRenamed) { + internalState |= SidebarState.CanBeRenamed; + } else { + internalState = internalState & ~SidebarState.CanBeRenamed; + } + } void SetContextMenu(object sender, MouseEventArgs e) { @@ -192,7 +231,8 @@ namespace ICSharpCode.SharpDevelop.Gui if (index >= 0) { AxSideTab tab = Tabs[index]; - SetDeletedState(tab); + SetDeletedState(tab.CanBeDeleted); + SetRenameState(tab.CanBeRenamed); if (index > 0) { internalState |= SidebarState.CanMoveUp; @@ -240,7 +280,8 @@ namespace ICSharpCode.SharpDevelop.Gui if (e.Button == MouseButtons.Right) { // set moveup/down states correctly - SetDeletedState(ActiveTab); + SetDeletedState(ActiveTab.SelectedItem); + SetRenameState(ActiveTab.SelectedItem); int index = ActiveTab.Items.IndexOf(ActiveTab.SelectedItem); if (index > 0) { @@ -329,5 +370,13 @@ namespace ICSharpCode.SharpDevelop.Gui return el; } + void OnSideTabDeleted(AxSideTab tab) + { + if (SideTabDeleted != null) { + SideTabDeleted(this, new SideTabEventArgs(tab)); + } + } + + public event SideTabEventHandler SideTabDeleted; } } 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 7150890df5..7864cc1e09 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 @@ -149,14 +149,17 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels ConfigurationGuiBinding debugInfoBinding; protected ChooseStorageLocationButton advancedLocationButton; - protected void InitAdvanced() + protected void InitDebugInfo() { debugInfoBinding = helper.BindEnum("debugInfoComboBox", "DebugType"); debugInfoBinding.CreateLocationButton("debugInfoLabel"); DebugSymbolsLoaded(null, null); helper.Loaded += DebugSymbolsLoaded; helper.Saved += DebugSymbolsSave; - + } + + protected void InitAdvanced() + { ConfigurationGuiBinding b; b = helper.BindBoolean("registerCOMInteropCheckBox", "RegisterForComInterop", false); b.DefaultLocation = PropertyStorageLocations.PlatformSpecific; diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/COMReferencePanel.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/COMReferencePanel.cs index 4fb01911b7..d383801601 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/COMReferencePanel.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/COMReferencePanel.cs @@ -74,7 +74,7 @@ namespace ICSharpCode.SharpDevelop.Gui void PopulateListView() { foreach (TypeLibrary typeLib in TypeLibrary.Libraries) { - ListViewItem newItem = new ListViewItem(new string[] { typeLib.Name, typeLib.Path }); + ListViewItem newItem = new ListViewItem(new string[] { typeLib.Description, typeLib.Path }); newItem.Tag = typeLib; Items.Add(newItem); } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs index ba3fc710c7..8692097e03 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs @@ -24,6 +24,13 @@ namespace ICSharpCode.SharpDevelop.Project.Commands { public class AddExistingItemsToProject : AbstractMenuCommand { + enum ReplaceExistingFile { + Yes = 0, + YesToAll = 1, + No = 2, + Cancel = 3 + } + int GetFileFilterIndex(IProject project, string[] fileFilters) { if (project != null) { @@ -57,6 +64,9 @@ namespace ICSharpCode.SharpDevelop.Project.Commands continue; string virtualFullName = Path.Combine(project.Directory, fileItem.VirtualName); if (FileUtility.IsBaseDirectory(directoryName, virtualFullName)) { + if (item.ItemType == ItemType.Folder && FileUtility.IsEqualFileName(directoryName, virtualFullName)) { + continue; + } LoggingService.Debug("Found file " + virtualFullName); FileProjectItem newItem = new FileProjectItem(node.Project, fileItem.ItemType); if (FileUtility.IsBaseDirectory(directoryName, fileItem.FileName)) { @@ -99,22 +109,21 @@ namespace ICSharpCode.SharpDevelop.Project.Commands string copiedFileName = Path.Combine(node.Directory, Path.GetFileName(fileName)); if (!FileUtility.IsEqualFileName(fileName, copiedFileName)) { File.Copy(fileName, copiedFileName, true); - FileNode newNode = new FileNode(copiedFileName); - newNode.AddTo(node); - if (includeInProject) { - return IncludeFileInProject.IncludeFileNode(newNode); - } - } else if (includeInProject) { + } + if (includeInProject) { FileNode fileNode; foreach (TreeNode childNode in node.AllNodes) { if (childNode is FileNode) { fileNode = (FileNode)childNode; if (FileUtility.IsEqualFileName(fileNode.FileName, copiedFileName)) { - return IncludeFileInProject.IncludeFileNode(fileNode); + if (fileNode.FileNodeStatus == FileNodeStatus.Missing) { + fileNode.FileNodeStatus = FileNodeStatus.InProject; + } + return fileNode.ProjectItem as FileProjectItem; } } } - fileNode = new FileNode(fileName); + fileNode = new FileNode(copiedFileName); fileNode.AddTo(node); return IncludeFileInProject.IncludeFileNode(fileNode); } @@ -205,7 +214,24 @@ namespace ICSharpCode.SharpDevelop.Project.Commands return; } } + bool replaceAll = false; foreach (KeyValuePair pair in fileNames) { + copiedFileName = Path.Combine(node.Directory, Path.GetFileName(pair.Key)); + if (!replaceAll && File.Exists(copiedFileName) && !FileUtility.IsEqualFileName(pair.Key, copiedFileName)) { + ReplaceExistingFile res = (ReplaceExistingFile)MessageService.ShowCustomDialog(fdiag.Title, "A file with the name '" + Path.GetFileName(pair.Key) + "' already exists. Do you want to replace it?", + 0, 3, + "${res:Global.Yes}", + "Yes to All", + "${res:Global.No}", + "${res:Global.CancelButtonText}"); + if (res == ReplaceExistingFile.YesToAll) { + replaceAll = true; + } else if (res == ReplaceExistingFile.No) { + continue; + } else if (res == ReplaceExistingFile.Cancel) { + break; + } + } FileProjectItem item = CopyFile(pair.Key, node, true); if (item != null) { item.DependentUpon = pair.Value; diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/AbstractProjectBrowserTreeNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/AbstractProjectBrowserTreeNode.cs index 47291e495a..8cfd9b8576 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/AbstractProjectBrowserTreeNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/AbstractProjectBrowserTreeNode.cs @@ -30,17 +30,6 @@ namespace ICSharpCode.SharpDevelop.Project string toolbarAddinTreePath = null; protected bool autoClearNodes = true; - protected bool canLabelEdited = true; - - /// - /// True, if this node can be label edited, false otherwise. - /// - public bool CanLabelEdited { - get { - return canLabelEdited; - } - } - public virtual string ToolbarAddinTreePath { get { diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs index b129b59f36..4a91024f72 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs @@ -244,11 +244,13 @@ namespace ICSharpCode.SharpDevelop.Project { sortOrder = 1; SetIcon(); + canLabelEdit = true; } public DirectoryNode(string directory) : this(directory, FileNodeStatus.None) { sortOrder = 1; + canLabelEdit = true; } CustomNode removeMe = null; public DirectoryNode(string directory, FileNodeStatus fileNodeStatus) @@ -262,6 +264,7 @@ namespace ICSharpCode.SharpDevelop.Project removeMe.AddTo(this); SetIcon(); + canLabelEdit = true; } /// @@ -482,14 +485,15 @@ namespace ICSharpCode.SharpDevelop.Project if (!FileService.CheckDirectoryName(newName)) { return; } + if (String.Compare(Text, newName, true) == 0) { + return; + } string oldText = Text; Text = newName; if (Directory != null) { string newPath = Path.Combine(Path.GetDirectoryName(Directory), newName); if (System.IO.Directory.Exists(newPath)) { - if (System.IO.Directory.GetFiles(Directory).Length == 0) { - System.IO.Directory.Delete(Directory); - } else if (System.IO.Directory.GetFiles(newPath).Length == 0) { + if (System.IO.Directory.GetFileSystemEntries(newPath).Length == 0) { System.IO.Directory.Delete(newPath); FileService.RenameFile(Directory, newPath, true); } else { @@ -575,7 +579,7 @@ namespace ICSharpCode.SharpDevelop.Project if (File.Exists(clipboardObject.FileName)) { CopyFileHere(clipboardObject.FileName, clipboardObject.PerformMove); if (clipboardObject.PerformMove) { - dataObject.SetData(null); + Clipboard.Clear(); } } } else if (dataObject.GetDataPresent(typeof(DirectoryNode))) { @@ -584,7 +588,7 @@ namespace ICSharpCode.SharpDevelop.Project if (System.IO.Directory.Exists(clipboardObject.FileName)) { CopyDirectoryHere(clipboardObject.FileName, clipboardObject.PerformMove); if (clipboardObject.PerformMove) { - dataObject.SetData(null); + Clipboard.Clear(); } } } @@ -667,6 +671,9 @@ namespace ICSharpCode.SharpDevelop.Project public override bool EnableCopy { get { + if (IsEditing) { + return false; + } return true; } } @@ -677,6 +684,9 @@ namespace ICSharpCode.SharpDevelop.Project public override bool EnableCut { get { + if (IsEditing) { + return false; + } return true; } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs index 9f0c35a374..a05641e275 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs @@ -19,7 +19,7 @@ namespace ICSharpCode.SharpDevelop.Project string fileName = String.Empty; FileNodeStatus fileNodeStatus = FileNodeStatus.None; ProjectItem projectItem = null; - + public override bool Visible { get { return ShowAll || fileNodeStatus != FileNodeStatus.None; @@ -112,11 +112,13 @@ namespace ICSharpCode.SharpDevelop.Project autoClearNodes = false; SetIcon(); + canLabelEdit = true; } public FileNode(string fileName) : this (fileName, FileNodeStatus.None) { sortOrder = 5; + canLabelEdit = true; } public override void ActivateItem() @@ -216,6 +218,9 @@ namespace ICSharpCode.SharpDevelop.Project public override bool EnableCopy { get { + if (base.IsEditing) { + return false; + } return true; } } @@ -227,6 +232,9 @@ namespace ICSharpCode.SharpDevelop.Project public override bool EnableCut { get { + if (IsEditing) { + return false; + } return true; } } @@ -240,6 +248,9 @@ namespace ICSharpCode.SharpDevelop.Project public override bool EnablePaste { get { + if (IsEditing) { + return false; + } return ((ExtTreeNode)Parent).EnablePaste; } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs index f09b0a9b9e..0f4cdf1be5 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs @@ -109,6 +109,9 @@ namespace ICSharpCode.SharpDevelop.Project public override bool EnableCut { get { + if (IsEditing) { + return false; + } return true; } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs index c691ccf2af..46f55cfa3a 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs @@ -60,6 +60,7 @@ namespace ICSharpCode.SharpDevelop.Project public SolutionFolderNode(Solution solution, SolutionFolder folder) { sortOrder = 0; + canLabelEdit = true; ContextmenuAddinTreePath = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/SolutionFolderNode"; this.solution = solution; diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs index c1ea4f88f1..21d4cbf95f 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs @@ -35,6 +35,7 @@ namespace ICSharpCode.SharpDevelop.Project public SolutionItemNode(Solution solution, SolutionItem item) { sortOrder = 2; + canLabelEdit = true; ContextmenuAddinTreePath = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/SolutionItemNode"; diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionNode.cs index 0988727942..783a2483bc 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionNode.cs @@ -39,6 +39,7 @@ namespace ICSharpCode.SharpDevelop.Project this.solution = solution; Text = "Solution " + solution.Name; autoClearNodes = false; + canLabelEdit = true; ContextmenuAddinTreePath = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/SolutionNode"; diff --git a/src/Main/Base/Project/Src/Project/Items/ComReferenceProjectItem.cs b/src/Main/Base/Project/Src/Project/Items/ComReferenceProjectItem.cs index c683973b0e..8ffe120b37 100644 --- a/src/Main/Base/Project/Src/Project/Items/ComReferenceProjectItem.cs +++ b/src/Main/Base/Project/Src/Project/Items/ComReferenceProjectItem.cs @@ -100,5 +100,23 @@ namespace ICSharpCode.SharpDevelop.Project Include, Properties); } + + public override string FileName { + get { + try { + if (Project != null && Project.OutputAssemblyFullPath != null) { + string outputFolder = Path.GetDirectoryName(Project.OutputAssemblyFullPath); + string interopFileName = Path.Combine(outputFolder, String.Concat("Interop.", Include, ".dll")); + if (File.Exists(interopFileName)) { + return interopFileName; + } + } + } + catch (Exception) { } + return Include; + } + set { + } + } } } diff --git a/src/Main/Base/Project/Src/Project/Items/TypeLibrary.cs b/src/Main/Base/Project/Src/Project/Items/TypeLibrary.cs index 3e7b6d209f..9337d8b9ea 100644 --- a/src/Main/Base/Project/Src/Project/Items/TypeLibrary.cs +++ b/src/Main/Base/Project/Src/Project/Items/TypeLibrary.cs @@ -7,16 +7,17 @@ using System; using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; using Microsoft.Win32; namespace ICSharpCode.SharpDevelop.Project { - /// - /// Description of TypeLibrary. - /// public class TypeLibrary { string name; + string description; string path; string guid; string version; @@ -43,10 +44,19 @@ namespace ICSharpCode.SharpDevelop.Project public string Name { get { + if (name == null) { + name = GetTypeLibName(); + } return name; } } + public string Description { + get { + return description; + } + } + public string Path { get { return path; @@ -90,40 +100,40 @@ namespace ICSharpCode.SharpDevelop.Project public static IEnumerable Libraries { get { - RegistryKey typelibsKey = Registry.ClassesRoot.OpenSubKey("TypeLib"); - foreach (string typelibKeyName in typelibsKey.GetSubKeyNames()) { - RegistryKey typelibKey = typelibsKey.OpenSubKey(typelibKeyName); - if (typelibKey == null) { + RegistryKey typeLibsKey = Registry.ClassesRoot.OpenSubKey("TypeLib"); + foreach (string typeLibKeyName in typeLibsKey.GetSubKeyNames()) { + RegistryKey typeLibKey = typeLibsKey.OpenSubKey(typeLibKeyName); + if (typeLibKey == null) { continue; } - TypeLibrary lib = Create(typelibKey); - if (lib != null && lib.Name != null && lib.Path != null && lib.Name.Length > 0 && lib.Path.Length > 0) { + TypeLibrary lib = Create(typeLibKey); + if (lib != null && lib.Description != null && lib.Path != null && lib.Description.Length > 0 && lib.Path.Length > 0) { yield return lib; } } } } - static TypeLibrary Create(RegistryKey typelibKey) + static TypeLibrary Create(RegistryKey typeLibKey) { - string[] versions = typelibKey.GetSubKeyNames(); + string[] versions = typeLibKey.GetSubKeyNames(); if (versions.Length > 0) { TypeLibrary lib = new TypeLibrary(); // Use the last version lib.version = versions[versions.Length - 1]; - RegistryKey versionKey = typelibKey.OpenSubKey(lib.version); - lib.name = (string)versionKey.GetValue(null); - lib.path = GetTypelibPath(versionKey, ref lib.lcid); - lib.guid = System.IO.Path.GetFileName(typelibKey.Name); + RegistryKey versionKey = typeLibKey.OpenSubKey(lib.version); + lib.description = (string)versionKey.GetValue(null); + lib.path = GetTypeLibPath(versionKey, ref lib.lcid); + lib.guid = System.IO.Path.GetFileName(typeLibKey.Name); return lib; } return null; } - static string GetTypelibPath(RegistryKey versionKey, ref string lcid) + static string GetTypeLibPath(RegistryKey versionKey, ref string lcid) { // Get the default value of the (typically) 0\win32 subkey: string[] subkeys = versionKey.GetSubKeyNames(); @@ -132,17 +142,15 @@ namespace ICSharpCode.SharpDevelop.Project return null; } for (int i = 0; i < subkeys.Length; i++) { - try { - int.Parse(subkeys[i]); // The right key is a number + int result; + if (Int32.TryParse(subkeys[i], out result)) { lcid = subkeys[i]; RegistryKey NullKey = versionKey.OpenSubKey(subkeys[i]); string[] subsubkeys = NullKey.GetSubKeyNames(); RegistryKey win32Key = NullKey.OpenSubKey("win32"); - return win32Key == null || win32Key.GetValue(null) == null ? null : win32Key.GetValue(null).ToString(); - } catch (FormatException) { - // Wrong keys don't parse til int - } + return win32Key == null || win32Key.GetValue(null) == null ? null : GetTypeLibPath(win32Key.GetValue(null).ToString()); + } } return null; } @@ -155,5 +163,89 @@ namespace ICSharpCode.SharpDevelop.Project } return -1; } + + string GetTypeLibName() + { + string name = null; + + int typeLibLcid; + if (guid != null && lcid != null && Int32.TryParse(lcid, out typeLibLcid)) { + Guid typeLibGuid = new Guid(this.guid); + name = GetTypeLibNameFromGuid(ref typeLibGuid, (short)VersionMajor, (short)VersionMinor, typeLibLcid); + } + + if (name == null) { + name = GetTypeLibNameFromFile(path); + } + + if (name != null) { + return name; + } + return description; + } + + /// + /// Removes the trailing part of the type library filename if it + /// starts with a number. + /// + static string GetTypeLibPath(string fileName) + { + if (fileName != null) { + int index = fileName.LastIndexOf('\\'); + if (index > 0 && index + 1 < fileName.Length) { + if (Char.IsDigit(fileName[index + 1])) { + return fileName.Substring(0, index); + } + } + } + return fileName; + } + + static string GetTypeLibNameFromFile(string fileName) + { + if (fileName != null && fileName.Length > 0 && File.Exists(fileName)) { + ITypeLib typeLib; + if (LoadTypeLibEx(fileName, RegKind.None, out typeLib) == 0) { + try { + return Marshal.GetTypeLibName(typeLib); + } finally { + Marshal.ReleaseComObject(typeLib); + } + } + } + return null; + } + + static string GetTypeLibNameFromGuid(ref Guid guid, short versionMajor, short versionMinor, int lcid) + { + ITypeLib typeLib; + if (LoadRegTypeLib(ref guid, versionMajor, versionMinor, lcid, out typeLib) == 0) { + try { + return Marshal.GetTypeLibName(typeLib); + } finally { + Marshal.ReleaseComObject(typeLib); + } + } + return null; + } + + enum RegKind { + Default, + Register, + None + } + + [DllImport("oleaut32.dll")] + static extern int LoadTypeLibEx([MarshalAs(UnmanagedType.BStr)] string szFile, + RegKind regkind, + out ITypeLib pptlib); + + [DllImport("oleaut32.dll")] + static extern int LoadRegTypeLib( + ref Guid rguid, + short wVerMajor, + short wVerMinor, + int lcid, + out ITypeLib pptlib); } } diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs b/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs index a7cb19b815..7069cc72fe 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs @@ -6,6 +6,7 @@ // using System; +using System.IO; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Project; @@ -54,12 +55,14 @@ namespace ICSharpCode.Core ProjectItem[] items = project.Items.ToArray(); ProjectService.ProjectItemAdded += OnProjectItemAdded; ProjectService.ProjectItemRemoved += OnProjectItemRemoved; + ProjectService.EndBuild += OnEndBuild; UpdateDefaultImports(items); foreach (ProjectItem item in items) { if (!initializing) return; // abort initialization switch (item.ItemType) { case ItemType.Reference: case ItemType.ProjectReference: + case ItemType.COMReference: AddReference(item as ReferenceProjectItem, false); break; } @@ -208,8 +211,25 @@ namespace ICSharpCode.Core { ProjectService.ProjectItemAdded -= OnProjectItemAdded; ProjectService.ProjectItemRemoved -= OnProjectItemRemoved; + ProjectService.EndBuild -= OnEndBuild; initializing = false; base.Dispose(); } + + void OnEndBuild(object source, EventArgs e) + { + AddComReferences(); + } + + void AddComReferences() + { + if (project != null) { + foreach (ProjectItem item in project.Items) { + if (item.ItemType == ItemType.COMReference) { + System.Threading.ThreadPool.QueueUserWorkItem(AddReference, item as ReferenceProjectItem); + } + } + } + } } }