From b1398334729e7f030490462b605c2dbc19a3610c Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 11 Mar 2006 14:59:27 +0000 Subject: [PATCH 01/17] SD2-690. The project browser tree nodes no longer override the default tree behaviour when the node text is being edited. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1210 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs | 6 ++++++ .../Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs | 9 +++++++++ .../Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs | 3 +++ 3 files changed, 18 insertions(+) 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..ff9944ae92 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 @@ -667,6 +667,9 @@ namespace ICSharpCode.SharpDevelop.Project public override bool EnableCopy { get { + if (IsEditing) { + return false; + } return true; } } @@ -677,6 +680,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..af2a0013a1 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 @@ -216,6 +216,9 @@ namespace ICSharpCode.SharpDevelop.Project public override bool EnableCopy { get { + if (base.IsEditing) { + return false; + } return true; } } @@ -227,6 +230,9 @@ namespace ICSharpCode.SharpDevelop.Project public override bool EnableCut { get { + if (IsEditing) { + return false; + } return true; } } @@ -240,6 +246,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; } } From c3a5affaecbef0eacf62b77bf36454023d7452a7 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 11 Mar 2006 16:14:58 +0000 Subject: [PATCH 02/17] SD2-720 - Cutting and pasting a file/folder to another folder in the project browser was generating a null reference exception. The directory node now uses Clipboard.Clear instead of setting the data object's data to null. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1211 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 ff9944ae92..6bb7070ec4 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 @@ -575,7 +575,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 +584,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(); } } } From b0738dbc5172fec31c8927f19cd3fb809590b561 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 11 Mar 2006 17:03:09 +0000 Subject: [PATCH 03/17] Fixed SD2-722 - Cutting and pasting folder adds duplicate entries into MSBuild project file. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1212 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs | 3 +++ 1 file changed, 3 insertions(+) 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..cede0dc000 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 @@ -57,6 +57,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)) { From 678dac3c2f079acca11c580a654018a1449e6123 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 11 Mar 2006 19:11:59 +0000 Subject: [PATCH 04/17] SD2-713. Renaming a folder to the same name as an existing folder was not updating the MSBuild project if the folder being renamed did not contain any files. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1213 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 6bb7070ec4..e89e5c2eb9 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 @@ -487,9 +487,7 @@ namespace ICSharpCode.SharpDevelop.Project 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 { From fdb8c49337e2978e417a85ba02ddc49a96f059d2 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 11 Mar 2006 20:24:20 +0000 Subject: [PATCH 05/17] SD2-723. Can now use F2 key to edit a project browser node. The ExtTreeView checks the CanLabelEdit property on the node before allowing the edit. No error message shown if the project browser node's text is unchanged after renaming. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1214 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Gui/Components/ExtTreeView/ExtTreeNode.cs | 2 +- .../Gui/Components/ExtTreeView/ExtTreeView.cs | 17 ++++++++++------- .../TreeNodes/AbstractProjectBrowserTreeNode.cs | 11 ----------- .../ProjectBrowser/TreeNodes/DirectoryNode.cs | 6 ++++++ .../Pads/ProjectBrowser/TreeNodes/FileNode.cs | 4 +++- .../TreeNodes/SolutionFolderNode.cs | 1 + .../TreeNodes/SolutionItemNode.cs | 1 + .../ProjectBrowser/TreeNodes/SolutionNode.cs | 1 + 8 files changed, 23 insertions(+), 20 deletions(-) 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/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 e89e5c2eb9..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,6 +485,9 @@ 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) { 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 af2a0013a1..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() 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"; From 2b08ae8c2b3e4408f08b73afeabb27449638e83f Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 12 Mar 2006 11:34:55 +0000 Subject: [PATCH 06/17] Fixed a null reference exception in the XML editor that occurs if the schema references an element that is not defined. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1216 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/XmlSchemaCompletionData.cs | 9 +-- .../XmlEditor/Project/XmlEditor.csproj | 17 +++++- .../Schema/MissingSchemaElementTestFixture.cs | 56 +++++++++++++++++++ .../XmlEditor/Test/XmlEditor.Tests.csproj | 1 + 4 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 src/AddIns/DisplayBindings/XmlEditor/Test/Schema/MissingSchemaElementTestFixture.cs 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 87795ac5e8..9cd81ef6f1 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/XmlEditor.csproj +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/XmlEditor.csproj @@ -14,23 +14,34 @@ 8.0.50215 Program ..\..\..\..\..\bin\SharpDevelop.exe + False + Auto + 4194304 + AnyCPU + 4096 + 0618 - True False False True ..\..\..\..\..\AddIns\AddIns\DisplayBindings\XmlEditor\ - False + false - False True False False ..\..\..\..\..\AddIns\AddIns\DisplayBindings\XmlEditor\ False + + Full + true + + + False + 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 @@ + From 73720fe798a8d3d711b48213ebf67c1f3ddb5762 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 12 Mar 2006 16:07:55 +0000 Subject: [PATCH 07/17] SD2-712 - Adding existing files to a project containing those files already breaks the build. If a file already exists in the MSBuild project it is not added again. User prompted to confirm copy if the files being copied already exist in the destination folder. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1217 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Commands/FolderNodeCommands.cs | 39 +++++++++++++++---- 1 file changed, 31 insertions(+), 8 deletions(-) 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 cede0dc000..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) { @@ -102,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); } @@ -208,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; From f936c1c1b931c2ec5e3ab5d2d52b49b2b4ff5af7 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Mon, 13 Mar 2006 16:39:45 +0000 Subject: [PATCH 08/17] SD2-689 - Resource editor copy/paste. The resource editor now checks that the list item is not being edited and that the list view has focus before overriding the standard copy/paste behaviour when using keyboard shortcuts. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1218 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/DisplayDefinition.cs | 15 ++++++ .../Project/Src/ResourceEdit/ResourceList.cs | 52 ++++++++++++------- 2 files changed, 47 insertions(+), 20 deletions(-) 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(); } } } From 9fb3aed842c2f9aba339c4b9a10e121238536e89 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Mon, 13 Mar 2006 18:44:01 +0000 Subject: [PATCH 09/17] SD2-427. The forms designer remembers which tools tab was selected on switching from the designer to the source code and back again. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1219 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/DesignerViewContent.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) 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; + } + } + } } } From 0a70a4ed553d3c18a4ef77885278a669680d19ee Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Mon, 13 Mar 2006 19:41:27 +0000 Subject: [PATCH 10/17] Autogeneration of xml comments no longer creates a returns element for constructors. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1220 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs | 2 +- .../Project/Src/FormattingStrategy/VBNetFormattingStrategy.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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/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("''' "); From 55777f300bb449c1ed3d63c46a558eea2e1195c5 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Tue, 14 Mar 2006 23:24:15 +0000 Subject: [PATCH 11/17] SD2-581 - Unable to remove controls from toolbox using context menu. Toolbox context menu items remove, rename, move up, move down and delete are now working for forms designer specific tabs. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1221 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- AddIns/ICSharpCode.SharpDevelop.addin | 54 ++++--- .../Project/Src/Gui/AddComponentsDialog.cs | 3 +- .../Project/Src/Gui/ComponentLibraryLoader.cs | 70 ++++++++- .../Project/Src/Gui/SideTabItemDesigner.cs | 9 +- .../Project/Src/ToolboxProvider.cs | 37 +++++ .../Project/Src/Commands/SideBarCommands.cs | 20 +-- .../Src/Gui/Components/SideBar/AxSideTab.cs | 141 +++++++++++++++++- .../Gui/Components/SideBar/AxSideTabItem.cs | 20 +++ .../Components/SideBar/SharpDevelopSideBar.cs | 61 +++++++- 9 files changed, 358 insertions(+), 57 deletions(-) diff --git a/AddIns/ICSharpCode.SharpDevelop.addin b/AddIns/ICSharpCode.SharpDevelop.addin index 82134abc53..58657a74fa 100644 --- a/AddIns/ICSharpCode.SharpDevelop.addin +++ b/AddIns/ICSharpCode.SharpDevelop.addin @@ -1005,15 +1005,17 @@ class = "ICSharpCode.SharpDevelop.Commands.SideBarDeleteTabHeader"/> - - + + + + - + - - - - - - - - - - - + + + + + + + + + + + + + + + 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/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/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; } } From bfddb042ed65bacc1aa00617205223e4af7799f1 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 15 Mar 2006 20:44:28 +0000 Subject: [PATCH 12/17] SD2-727 - Null reference exception on running unit test. On running the test a second time the LoadAssemblyList method was invoking the callback without using the SafeThreadAsyncCall which meant the UpdateProjectTitles method was not being called until after the SelectTest call. The SelectTest method was then unable to match the project name with any node in the treeview. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1222 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- src/AddIns/Misc/UnitTesting/Src/PadContent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AddIns/Misc/UnitTesting/Src/PadContent.cs b/src/AddIns/Misc/UnitTesting/Src/PadContent.cs index 6aff7d93f8..aabaa25242 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); } From 7a49557073025199a0c06877f667810a549d3532 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Thu, 16 Mar 2006 18:38:46 +0000 Subject: [PATCH 13/17] SD2-568 - No code completion for COM references. COM interops now loaded after a build. Type library filenames now have end digits removed from filenames in the add reference dialog. In the MSBuild file the COM reference include attribute is now set to the type library short name and not its description. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1223 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../ReferenceDialog/COMReferencePanel.cs | 2 +- .../Project/Items/ComReferenceProjectItem.cs | 18 +++ .../Project/Src/Project/Items/TypeLibrary.cs | 136 +++++++++++++++--- .../ParserService/ParseProjectContent.cs | 20 +++ 4 files changed, 153 insertions(+), 23 deletions(-) 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/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); + } + } + } + } } } From 4ca7b2d50a09cba7effb834410f121f665bc0afe Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Fri, 17 Mar 2006 18:10:19 +0000 Subject: [PATCH 14/17] Added copy menu item to output pad's context menu. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1224 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- AddIns/ICSharpCode.SharpDevelop.addin | 1 + 1 file changed, 1 insertion(+) diff --git a/AddIns/ICSharpCode.SharpDevelop.addin b/AddIns/ICSharpCode.SharpDevelop.addin index 58657a74fa..522a802c5c 100644 --- a/AddIns/ICSharpCode.SharpDevelop.addin +++ b/AddIns/ICSharpCode.SharpDevelop.addin @@ -632,6 +632,7 @@ + Date: Fri, 17 Mar 2006 18:20:21 +0000 Subject: [PATCH 15/17] Update to Boo 0.7.6.2175, adapted NRefactoryToBooConverter. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1225 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- AddIns/ICSharpCode.SharpDevelop.addin | 3 +-- .../NRefactoryToBooConverter/Project/ConvertVisitor.cs | 4 +--- .../Project/ConvertVisitorTypeMembers.cs | 7 ++----- .../NRefactoryToBooConverter/Test/ExpressionTests.cs | 2 +- .../Boo/NRefactoryToBooConverter/Test/MemberTests.cs | 10 +++++----- .../Boo/NRefactoryToBooConverter/Test/TestHelper.cs | 5 ----- 6 files changed, 10 insertions(+), 21 deletions(-) diff --git a/AddIns/ICSharpCode.SharpDevelop.addin b/AddIns/ICSharpCode.SharpDevelop.addin index 522a802c5c..314da0454a 100644 --- a/AddIns/ICSharpCode.SharpDevelop.addin +++ b/AddIns/ICSharpCode.SharpDevelop.addin @@ -631,12 +631,11 @@ - 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"); From b229f6a7984bab7fd1ad0ba411483d44ddef4988 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 19 Mar 2006 12:50:50 +0000 Subject: [PATCH 16/17] Work around NCover bug (NCover strips quotation marks) git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1226 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- src/AddIns/Misc/CodeCoverage/Project/Src/NCoverRunner.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/AddIns/Misc/CodeCoverage/Project/Src/NCoverRunner.cs b/src/AddIns/Misc/CodeCoverage/Project/Src/NCoverRunner.cs index cf87d5e8a3..3c71ec267b 100644 --- a/src/AddIns/Misc/CodeCoverage/Project/Src/NCoverRunner.cs +++ b/src/AddIns/Misc/CodeCoverage/Project/Src/NCoverRunner.cs @@ -248,7 +248,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(); } From 4a3ac892f8c76e96dec3e6a4db17675a50902f20 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 19 Mar 2006 14:28:38 +0000 Subject: [PATCH 17/17] Add compiler options panel for Boo. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1227 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Boo/BooBinding/Project/BooBinding.addin | 18 +- .../Boo/BooBinding/Project/BooBinding.csproj | 3 + .../Project/Resources/BuildOptions.xfrm | 184 ++++++++++++++++++ .../BooBinding/Project/Src/BuildOptions.cs | 57 ++++++ .../Project/Src/OptionPanels/BuildOptions.cs | 1 + .../Project/Src/OptionPanels/BuildOptions.cs | 1 + .../ProjectOptions/AbstractBuildOptions.cs | 7 +- 7 files changed, 260 insertions(+), 11 deletions(-) create mode 100644 src/AddIns/BackendBindings/Boo/BooBinding/Project/Resources/BuildOptions.xfrm create mode 100644 src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BuildOptions.cs 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 8a4a002f82..e5f80264ac 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj @@ -81,6 +81,8 @@ + + @@ -137,6 +139,7 @@ FormsDesigner False + 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/CSharpBinding/Project/Src/OptionPanels/BuildOptions.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/OptionPanels/BuildOptions.cs index abc166e189..2840181542 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/OptionPanels/BuildOptions.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/OptionPanels/BuildOptions.cs @@ -52,6 +52,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/OptionPanels/BuildOptions.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/OptionPanels/BuildOptions.cs index ea1266221c..cf3dfb01ed 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/OptionPanels/BuildOptions.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/OptionPanels/BuildOptions.cs @@ -56,6 +56,7 @@ namespace VBNetBinding.OptionPanels InitOutputPath(); InitXmlDoc(); + InitDebugInfo(); InitAdvanced(); InitWarnings(); 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 5e815a5d3f..7e0d97e3fa 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 @@ -137,14 +137,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;