Browse Source

Implemented SD2-1353: Allow for build-action specific properties for FileProjectItems.

Removed non-generic AddInTree.BuildItems method - the generic version should always be used because it provides better error messages when an incorrectly typed node is put into the tree.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3067 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 17 years ago
parent
commit
11f6049c38
  1. 23
      AddIns/ICSharpCode.SharpDevelop.addin
  2. 46
      data/schemas/AddIn.xsd
  3. 35
      doc/technotes/ConditionList.html
  4. 54
      doc/technotes/DoozerList.html
  5. 5
      src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsCodeGeneratorTool.cs
  6. 4
      src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlView.cs
  7. 6
      src/AddIns/Misc/FiletypeRegisterer/Project/Src/FiletypeAssociationDoozer.cs
  8. 5
      src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceUtilities.cs
  9. 1
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  10. 2
      src/Main/Base/Project/Src/Commands/AutostartCommands.cs
  11. 5
      src/Main/Base/Project/Src/Gui/BrowserDisplayBinding/HtmlViewPane.cs
  12. 2
      src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/LocalizedObject.cs
  13. 2
      src/Main/Base/Project/Src/Gui/Pads/ClassBrowser/NodeBuilder/ClassNodeBuilders.cs
  14. 2
      src/Main/Base/Project/Src/Gui/Pads/ClassBrowser/NodeBuilder/ProjectNodeBuilders.cs
  15. 2
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs
  16. 2
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/NodeBuilder/NodeBuilders.cs
  17. 2
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPanel.cs
  18. 2
      src/Main/Base/Project/Src/Internal/Templates/File/FileTemplate.cs
  19. 2
      src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs
  20. 4
      src/Main/Base/Project/Src/Internal/Templates/TemplateCategorySortOrderFile.cs
  21. 167
      src/Main/Base/Project/Src/Project/ContextSpecificProperties.cs
  22. 5
      src/Main/Base/Project/Src/Project/CustomTool.cs
  23. 16
      src/Main/Base/Project/Src/Project/Items/FileProjectItem.cs
  24. 12
      src/Main/Base/Project/Src/Project/Items/ProjectItem.cs
  25. 2
      src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs
  26. 5
      src/Main/Base/Project/Src/TextEditor/Commands/GenerateCodeCommand.cs
  27. 20
      src/Main/Core/Project/Src/AddInTree/AddInTree.cs
  28. 3
      src/Main/Core/Project/Src/Services/StringParser/StringParser.cs

23
AddIns/ICSharpCode.SharpDevelop.addin

@ -27,8 +27,10 @@ @@ -27,8 +27,10 @@
<ConditionEvaluator name="CanNavigateBack" class="ICSharpCode.SharpDevelop.CanNavigateBackConditionEvaluator"/>
<ConditionEvaluator name="CanNavigateForward" class="ICSharpCode.SharpDevelop.CanNavigateForwardConditionEvaluator"/>
<ConditionEvaluator name="CompareProjectProperty" class="ICSharpCode.SharpDevelop.CompareProjectPropertyConditionEvaluator"/>
<ConditionEvaluator name="ProjectItem" class="ICSharpCode.SharpDevelop.Project.ProjectItemConditionEvaluator"/>
<Doozer name="CustomTool" class="ICSharpCode.SharpDevelop.Project.CustomToolDoozer"/>
<Doozer name="CustomProperty" class="ICSharpCode.SharpDevelop.Project.CustomPropertyDoozer"/>
<Doozer name="DialogPanel" class="ICSharpCode.SharpDevelop.DialogPanelDoozer"/>
<Doozer name="DisplayBinding" class="ICSharpCode.SharpDevelop.DisplayBindingDoozer"/>
<Doozer name="Pad" class="ICSharpCode.SharpDevelop.PadDoozer"/>
@ -2170,7 +2172,7 @@ @@ -2170,7 +2172,7 @@
<Path name="/SharpDevelop/Pads/TaskList/Toolbar">
<ToolbarItem id = "SelectScope"
class = "ICSharpCode.SharpDevelop.Gui.SelectScopeCommand"
type = "ComboBox"/>
type = "ComboBox"/>
</Path>
<Path name="/SharpDevelop/Services/ParserService/SingleFileGacReferences">
@ -2204,4 +2206,23 @@ @@ -2204,4 +2206,23 @@
<Class id="AddDotNet35ReferencesIfTargetFrameworkIs35"
class="ICSharpCode.SharpDevelop.Project.Commands.AddDotNet35ReferencesIfTargetFrameworkIs35Command"/>
</Path>
<Path name = "/SharpDevelop/Views/ProjectBrowser/ContextSpecificProperties">
<ComplexCondition>
<Not>
<Condition name = "ProjectItem" property = "Generator" value = ""/>
</Not>
<CustomProperty id = "CustomToolNamespace"
name = "CustomToolNamespace"
displayName = "${res:ICSharpCode.SharpDevelop.Internal.Project.ProjectFile.CustomToolNamespace}"
description = "${res:ICSharpCode.SharpDevelop.Internal.Project.ProjectFile.CustomToolNamespace.Description}"
runCustomTool="True" />
</ComplexCondition>
<Condition name = "ProjectItem" itemType = "EmbeddedResource">
<CustomProperty id = "EmbeddedResourceLogicalName"
name = "LogicalName"
displayName = "Logical Name"
description = "The name of the embedded resource. If left empty, the name is automatically generated." />
</Condition>
</Path>
</AddIn>

46
data/schemas/AddIn.xsd

@ -87,6 +87,7 @@ @@ -87,6 +87,7 @@
<!-- !!! INSERT DOOZER LIST !!! -->
<xs:element ref="Class" />
<xs:element ref="CodeCompletionBinding" />
<xs:element ref="CustomProperty" />
<xs:element ref="CustomTool" />
<xs:element ref="Debugger" />
<xs:element ref="DialogPanel" />
@ -129,6 +130,7 @@ @@ -129,6 +130,7 @@
<xs:attribute name="comparisonType" type="xs:string" use="optional" />
<xs:attribute name="debuggersupports" type="xs:string" use="optional" />
<xs:attribute name="equals" type="xs:string" use="optional" />
<xs:attribute name="itemType" type="xs:string" use="optional" />
<xs:attribute name="openwindow" type="xs:string" use="optional" />
<xs:attribute name="options" type="xs:string" use="optional" />
<xs:attribute name="property" type="xs:string" use="optional" />
@ -136,6 +138,7 @@ @@ -136,6 +138,7 @@
<xs:attribute name="supports" type="xs:string" use="optional" />
<xs:attribute name="textcontent" type="xs:string" use="optional" />
<xs:attribute name="urlRegex" type="xs:string" use="optional" />
<xs:attribute name="value" type="xs:string" use="optional" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
@ -154,6 +157,7 @@ @@ -154,6 +157,7 @@
<!-- !!! INSERT DOOZER LIST !!! -->
<xs:element ref="Class" />
<xs:element ref="CodeCompletionBinding" />
<xs:element ref="CustomProperty" />
<xs:element ref="CustomTool" />
<xs:element ref="Debugger" />
<xs:element ref="DialogPanel" />
@ -276,6 +280,48 @@ @@ -276,6 +280,48 @@
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:complexType name="CustomProperty">
<xs:complexContent>
<xs:extension base="AbstractCodon">
<xs:attribute name="name" use="required" type="xs:string">
<xs:annotation>
<xs:documentation>
The name of the MSBuild meta data.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="displayName" use="optional" type="xs:string">
<xs:annotation>
<xs:documentation>
The display name of the property.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="description" use="optional" type="xs:string">
<xs:annotation>
<xs:documentation>
The description text for the property.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="runCustomTool" use="optional" type="xs:string">
<xs:annotation>
<xs:documentation>
Boolean property specifying whether the custom tool should be run when the property value is changed
by the user. Default: false.
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="CustomProperty" type="CustomProperty">
<xs:annotation>
<xs:documentation>
Creates a custom property for project items.
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:complexType name="CustomTool">
<xs:complexContent>
<xs:extension base="AbstractCodon">

35
doc/technotes/ConditionList.html

@ -20,6 +20,7 @@ It is based on SharpDevelop 3.0.0.3062.</p> @@ -20,6 +20,7 @@ It is based on SharpDevelop 3.0.0.3062.</p>
<li><a href="#OpenWindowState">OpenWindowState</a>
<li><a href="#OwnerState">OwnerState</a>
<li><a href="#ProjectActive">ProjectActive</a>
<li><a href="#ProjectItem">ProjectItem</a>
<li><a href="#RefactoringProviderSupports">RefactoringProviderSupports</a>
<li><a href="#SolutionOpen">SolutionOpen</a>
<li><a href="#TextContent">TextContent</a>
@ -338,6 +339,40 @@ It is based on SharpDevelop 3.0.0.3062.</p> @@ -338,6 +339,40 @@ It is based on SharpDevelop 3.0.0.3062.</p>
<br><pre>
&lt;Condition name = "ProjectActive" activeproject="C#"&gt;</pre></p>
</div>
<div>
<h2><a name="ProjectItem">ProjectItem</a></h2>
<p>
Tests the item type of a project item and/or an MSBuild meta data value.
</p>
<table>
<tr>
<th colspan=2>Condition name:</td>
<td>ICSharpCode.SharpDevelop.Project.ProjectItemConditionEvaluator</td>
</tr>
<tr><td colspan=3><hr><h3>Attributes:</h3></td></tr>
<tr>
<th colspan=2>itemType:</td>
<td>
The type the project item must have. If this attribute is not specified, the type is not tested.
</td>
</tr>
<tr>
<th colspan=2>property:</td>
<td>
The name of the MSBuild meta data to test. If this attribute is not specified, no property is tested.
</td>
</tr>
<tr>
<th colspan=2>value:</td>
<td>
The value that the MSBuild meta data must have.
</td>
</tr>
</table>
<p><span class="exampleTitle">Example: Test if a ProjectItem is an embedded resource</span>
<br><pre>
&lt;Condition name = "ProjectItem" itemType = "EmbeddedResource"&gt;</pre></p>
</div>
<div>
<h2><a name="RefactoringProviderSupports">RefactoringProviderSupports</a></h2>
<p>

54
doc/technotes/DoozerList.html

@ -9,6 +9,7 @@ It is based on SharpDevelop 3.0.0.3062.</p> @@ -9,6 +9,7 @@ It is based on SharpDevelop 3.0.0.3062.</p>
<ul>
<li><a href="#Class">Class</a>
<li><a href="#CodeCompletionBinding">CodeCompletionBinding</a>
<li><a href="#CustomProperty">CustomProperty</a>
<li><a href="#CustomTool">CustomTool</a>
<li><a href="#Debugger">Debugger</a>
<li><a href="#DialogPanel">DialogPanel</a>
@ -102,6 +103,59 @@ It is based on SharpDevelop 3.0.0.3062.</p> @@ -102,6 +103,59 @@ It is based on SharpDevelop 3.0.0.3062.</p>
</tr>
</table>
</div>
<div>
<h2><a name="CustomProperty">CustomProperty</a></h2>
<p>
Creates a custom property for project items.
</p>
<table>
<tr>
<th colspan=2>Doozer name:</td>
<td>ICSharpCode.SharpDevelop.Project.CustomPropertyDoozer</td>
</tr>
<tr><td colspan=3><hr><h3>Attributes:</h3></td></tr>
<tr>
<th>name:</td>
<td class="userequired">required</td>
<td>
The name of the MSBuild meta data.
</td>
</tr>
<tr>
<th>displayName:</td>
<td class="userequired">optional</td>
<td>
The display name of the property.
</td>
</tr>
<tr>
<th>description:</td>
<td class="userequired">optional</td>
<td>
The description text for the property.
</td>
</tr>
<tr>
<th>runCustomTool:</td>
<td class="userequired">optional</td>
<td>
Boolean property specifying whether the custom tool should be run when the property value is changed
by the user. Default: false.
</td>
</tr>
<tr><td colspan=3><hr></td></tr>
<tr>
<th colspan=2>Usage:</td>
<td>In /SharpDevelop/Views/ProjectBrowser/ContextSpecificProperties</td>
</tr>
<tr>
<th colspan=2>Returns:</td>
<td>
A PropertyDescriptor object.
</td>
</tr>
</table>
</div>
<div>
<h2><a name="CustomTool">CustomTool</a></h2>
<p>

5
src/AddIns/DisplayBindings/SettingsEditor/Project/SettingsCodeGeneratorTool.cs

@ -24,8 +24,9 @@ namespace ICSharpCode.SettingsEditor @@ -24,8 +24,9 @@ namespace ICSharpCode.SettingsEditor
XmlDocument doc = new XmlDocument();
doc.Load(item.FileName);
SettingsDocument setDoc = new SettingsDocument(doc.DocumentElement, DummySettingsEntryHost.Instance);
if (!string.IsNullOrEmpty(item.CustomToolNamespace)) {
setDoc.GeneratedClassNamespace = item.CustomToolNamespace;
string customToolNamespace = item.GetEvaluatedMetadata("CustomToolNamespace");
if (!string.IsNullOrEmpty(customToolNamespace)) {
setDoc.GeneratedClassNamespace = customToolNamespace;
}
EasyCompileUnit ccu = new EasyCompileUnit();

4
src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlView.cs

@ -192,7 +192,7 @@ namespace ICSharpCode.XmlEditor @@ -192,7 +192,7 @@ namespace ICSharpCode.XmlEditor
/// </summary>
public static string[] GetXmlFileExtensions()
{
foreach (ParserDescriptor parser in (ParserDescriptor[])AddInTree.BuildItems("/Workspace/Parser", null, false).ToArray(typeof(ParserDescriptor))) {
foreach (ParserDescriptor parser in AddInTree.BuildItems<ParserDescriptor>("/Workspace/Parser", null, false)) {
if (parser.Codon.Id == "XmlFoldingParser") {
return parser.Supportedextensions;
}
@ -1271,7 +1271,7 @@ namespace ICSharpCode.XmlEditor @@ -1271,7 +1271,7 @@ namespace ICSharpCode.XmlEditor
/// </summary>
IEditAction[] GetEditActions()
{
return (IEditAction[])(AddInTree.BuildItems(editActionsPath, this, false).ToArray(typeof(IEditAction)));
return AddInTree.BuildItems<IEditAction>(editActionsPath, this, false).ToArray();
}
}
}

6
src/AddIns/Misc/FiletypeRegisterer/Project/Src/FiletypeAssociationDoozer.cs

@ -64,11 +64,7 @@ namespace ICSharpCode.FiletypeRegisterer @@ -64,11 +64,7 @@ namespace ICSharpCode.FiletypeRegisterer
{
public static List<FiletypeAssociation> GetList()
{
List<FiletypeAssociation> list = new List<FiletypeAssociation>();
foreach (FiletypeAssociation ass in AddInTree.BuildItems("/AddIns/FileTypeRegisterer/FileTypes", null, true)) {
list.Add(ass);
}
return list;
return AddInTree.BuildItems<FiletypeAssociation>("/AddIns/FileTypeRegisterer/FileTypes", null, true);
}
/// <summary>

5
src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceUtilities.cs

@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using ICSharpCode.Core;
@ -85,7 +86,7 @@ namespace SearchAndReplace @@ -85,7 +86,7 @@ namespace SearchAndReplace
}
}
static ArrayList excludedFileExtensions;
static List<string> excludedFileExtensions;
public static bool IsSearchable(string fileName)
{
@ -93,7 +94,7 @@ namespace SearchAndReplace @@ -93,7 +94,7 @@ namespace SearchAndReplace
return false;
if (excludedFileExtensions == null) {
excludedFileExtensions = AddInTree.BuildItems("/AddIns/DefaultTextEditor/Search/ExcludedFileExtensions", null, false);
excludedFileExtensions = AddInTree.BuildItems<string>("/AddIns/DefaultTextEditor/Search/ExcludedFileExtensions", null, false);
}
string extension = Path.GetExtension(fileName);
if (extension != null) {

1
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -117,6 +117,7 @@ @@ -117,6 +117,7 @@
<Compile Include="Src\Internal\Undo\UndoQueue.cs" />
<Compile Include="Src\Internal\Undo\UndoStack.cs" />
<Compile Include="Src\Project\BuildEngine.cs" />
<Compile Include="Src\Project\ContextSpecificProperties.cs" />
<Compile Include="Src\Project\IBuildFeedbackSink.cs" />
<Compile Include="Src\Project\MSBuildFileProject.cs" />
<Compile Include="Src\Project\ProjectPropertyChangedEventArgs.cs" />

2
src/Main/Base/Project/Src/Commands/AutostartCommands.cs

@ -111,7 +111,7 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -111,7 +111,7 @@ namespace ICSharpCode.SharpDevelop.Commands
}
if (!didLoadSolutionOrFile) {
foreach (ICommand command in AddInTree.BuildItems("/Workspace/AutostartNothingLoaded", null, false)) {
foreach (ICommand command in AddInTree.BuildItems<ICommand>("/Workspace/AutostartNothingLoaded", null, false)) {
command.Run();
}
}

5
src/Main/Base/Project/Src/Gui/BrowserDisplayBinding/HtmlViewPane.cs

@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
@ -154,12 +155,12 @@ namespace ICSharpCode.SharpDevelop.BrowserDisplayBinding @@ -154,12 +155,12 @@ namespace ICSharpCode.SharpDevelop.BrowserDisplayBinding
}
}
static ArrayList descriptors;
static List<SchemeExtensionDescriptor> descriptors;
public static ISchemeExtension GetScheme(string name)
{
if (descriptors == null) {
descriptors = AddInTree.BuildItems("/SharpDevelop/Views/Browser/SchemeExtensions", null, false);
descriptors = AddInTree.BuildItems<SchemeExtensionDescriptor>("/SharpDevelop/Views/Browser/SchemeExtensions", null, false);
}
foreach (SchemeExtensionDescriptor descriptor in descriptors) {
if (string.Equals(name, descriptor.SchemeName, StringComparison.OrdinalIgnoreCase)) {

2
src/Main/Base/Project/Src/Gui/Components/LocalizedPropertyGrid/LocalizedObject.cs

@ -124,7 +124,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -124,7 +124,7 @@ namespace ICSharpCode.SharpDevelop.Gui
return this;
}
public virtual void InformSetValue(LocalizedPropertyDescriptor localizedPropertyDescriptor, object component, object value)
public virtual void InformSetValue(PropertyDescriptor propertyDescriptor, object component, object value)
{
}

2
src/Main/Base/Project/Src/Gui/Pads/ClassBrowser/NodeBuilder/ClassNodeBuilders.cs

@ -21,7 +21,7 @@ namespace ICSharpCode.SharpDevelop.Gui.ClassBrowser @@ -21,7 +21,7 @@ namespace ICSharpCode.SharpDevelop.Gui.ClassBrowser
public static TreeNode AddClassNode(ExtTreeView classBrowser, IProject project, IClass c)
{
IClassNodeBuilder classNodeBuilder = null;
foreach (IClassNodeBuilder nodeBuilder in AddInTree.BuildItems("/SharpDevelop/Views/ClassBrowser/ClassNodeBuilders", null, true))
foreach (IClassNodeBuilder nodeBuilder in AddInTree.BuildItems<IClassNodeBuilder>("/SharpDevelop/Views/ClassBrowser/ClassNodeBuilders", null, true))
{
if (nodeBuilder.CanBuildClassTree(c))
{

2
src/Main/Base/Project/Src/Gui/Pads/ClassBrowser/NodeBuilder/ProjectNodeBuilders.cs

@ -20,7 +20,7 @@ namespace ICSharpCode.SharpDevelop.Gui.ClassBrowser @@ -20,7 +20,7 @@ namespace ICSharpCode.SharpDevelop.Gui.ClassBrowser
public static TreeNode AddProjectNode(ExtTreeView classBrowser, IProject project)
{
IProjectNodeBuilder projectNodeBuilder = null;
foreach (IProjectNodeBuilder nodeBuilder in AddInTree.BuildItems("/SharpDevelop/Views/ClassBrowser/ProjectNodeBuilders", null, true))
foreach (IProjectNodeBuilder nodeBuilder in AddInTree.BuildItems<IProjectNodeBuilder>("/SharpDevelop/Views/ClassBrowser/ProjectNodeBuilders", null, true))
{
if (nodeBuilder.CanBuildProjectTree(project))
{

2
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs

@ -153,7 +153,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -153,7 +153,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
List<string> list = new List<string>();
StringParser.Properties["Extension"] = Path.GetExtension(fileName);
string prefix = Path.Combine(Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName));
foreach (string ext in AddInTree.BuildItems("/SharpDevelop/Workbench/DependentFileExtensions", null, false)) {
foreach (string ext in AddInTree.BuildItems<string>("/SharpDevelop/Workbench/DependentFileExtensions", null, false)) {
if (File.Exists(prefix + ext))
list.Add(prefix + ext);
}

2
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/NodeBuilder/NodeBuilders.cs

@ -19,7 +19,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -19,7 +19,7 @@ namespace ICSharpCode.SharpDevelop.Project
public static TreeNode AddProjectNode(TreeNode motherNode, IProject project)
{
IProjectNodeBuilder projectNodeBuilder = null;
foreach (IProjectNodeBuilder nodeBuilder in AddInTree.BuildItems("/SharpDevelop/Views/ProjectBrowser/NodeBuilders", null, true)) {
foreach (IProjectNodeBuilder nodeBuilder in AddInTree.BuildItems<IProjectNodeBuilder>("/SharpDevelop/Views/ProjectBrowser/NodeBuilders", null, true)) {
if (nodeBuilder.CanBuildProjectTree(project)) {
projectNodeBuilder = nodeBuilder;
break;

2
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPanel.cs

@ -71,7 +71,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -71,7 +71,7 @@ namespace ICSharpCode.SharpDevelop.Project
ToolbarService.UpdateToolbar(toolStrip);
if (node != null && node.ToolbarAddinTreePath != null) {
toolStrip.Items.Add(new ToolStripSeparator());
toolStrip.Items.AddRange((ToolStripItem[])AddInTree.BuildItems(node.ToolbarAddinTreePath, node, false).ToArray(typeof(ToolStripItem)));
toolStrip.Items.AddRange(AddInTree.BuildItems<ToolStripItem>(node.ToolbarAddinTreePath, node, false).ToArray());
}
}

2
src/Main/Base/Project/Src/Internal/Templates/File/FileTemplate.cs

@ -275,7 +275,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -275,7 +275,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
{
string dataTemplateDir = FileUtility.Combine(PropertyService.DataDirectory, "templates", "file");
List<string> files = FileUtility.SearchDirectory(dataTemplateDir, "*.xft");
foreach (string templateDirectory in AddInTree.BuildItems(ProjectTemplate.TemplatePath, null, false)) {
foreach (string templateDirectory in AddInTree.BuildItems<string>(ProjectTemplate.TemplatePath, null, false)) {
files.AddRange(FileUtility.SearchDirectory(templateDirectory, "*.xft"));
}
foreach (string file in files) {

2
src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs

@ -421,7 +421,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -421,7 +421,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
projectTemplates = new List<ProjectTemplate>();
string dataTemplateDir = FileUtility.Combine(PropertyService.DataDirectory, "templates", "project");
List<string> files = FileUtility.SearchDirectory(dataTemplateDir, "*.xpt");
foreach (string templateDirectory in AddInTree.BuildItems(TemplatePath, null, false)) {
foreach (string templateDirectory in AddInTree.BuildItems<string>(TemplatePath, null, false)) {
files.AddRange(FileUtility.SearchDirectory(templateDirectory, "*.xpt"));
}
foreach (string fileName in files) {

4
src/Main/Base/Project/Src/Internal/Templates/TemplateCategorySortOrderFile.cs

@ -120,7 +120,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -120,7 +120,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
projectCategorySortOrderFiles = new List<TemplateCategorySortOrderFile>();
string dataTemplateDir = FileUtility.Combine(PropertyService.DataDirectory, "templates", "project");
List<string> files = FileUtility.SearchDirectory(dataTemplateDir, ProjectCategorySortOrderFileName);
foreach (string templateDirectory in AddInTree.BuildItems(ProjectTemplate.TemplatePath, null, false)) {
foreach (string templateDirectory in AddInTree.BuildItems<string>(ProjectTemplate.TemplatePath, null, false)) {
files.AddRange(FileUtility.SearchDirectory(templateDirectory, ProjectCategorySortOrderFileName));
}
foreach (string fileName in files) {
@ -137,7 +137,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -137,7 +137,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
fileCategorySortOrderFiles = new List<TemplateCategorySortOrderFile>();
string dataTemplateDir = FileUtility.Combine(PropertyService.DataDirectory, "templates", "file");
List<string> files = FileUtility.SearchDirectory(dataTemplateDir, FileCategorySortOrderFileName);
foreach (string templateDirectory in AddInTree.BuildItems(ProjectTemplate.TemplatePath, null, false)) {
foreach (string templateDirectory in AddInTree.BuildItems<string>(ProjectTemplate.TemplatePath, null, false)) {
files.AddRange(FileUtility.SearchDirectory(templateDirectory, FileCategorySortOrderFileName));
}
foreach (string fileName in files) {

167
src/Main/Base/Project/Src/Project/ContextSpecificProperties.cs

@ -0,0 +1,167 @@ @@ -0,0 +1,167 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
using ICSharpCode.Core;
using System.ComponentModel;
namespace ICSharpCode.SharpDevelop.Project
{
// The classes in this file provide support for context-specific custom properties
// (pseudo-properties that are visible in the property grid and allow editing MSBuild meta data)
/// <summary>
/// Creates a custom property for project items.
/// </summary>
/// <attribute name="name" use="required">
/// The name of the MSBuild meta data.
/// </attribute>
/// <attribute name="displayName" use="optional">
/// The display name of the property.
/// </attribute>
/// <attribute name="description" use="optional">
/// The description text for the property.
/// </attribute>
/// <attribute name="runCustomTool" use="optional">
/// Boolean property specifying whether the custom tool should be run when the property value is changed
/// by the user. Default: false.
/// </attribute>
/// <usage>In /SharpDevelop/Views/ProjectBrowser/ContextSpecificProperties</usage>
/// <returns>
/// A <see cref="PropertyDescriptor"/> object.
/// </returns>
public sealed class CustomPropertyDoozer : IDoozer
{
public bool HandleConditions {
get {
return false;
}
}
public object BuildItem(object caller, Codon codon, System.Collections.ArrayList subItems)
{
CustomProperty cp = new CustomProperty(codon.Properties["name"]) {
displayName = codon.Properties["displayName"],
description = codon.Properties["description"]
};
if (!string.IsNullOrEmpty(codon.Properties["runCustomTool"]))
cp.runCustomTool = bool.Parse(codon.Properties["runCustomTool"]);
return cp;
}
sealed class CustomProperty : PropertyDescriptor
{
public CustomProperty(string name) : base(name, null)
{
}
internal string displayName, description;
internal bool runCustomTool;
public override string DisplayName {
get {
if (string.IsNullOrEmpty(displayName))
return Name;
else
return StringParser.Parse(displayName);
}
}
public override string Description {
get { return StringParser.Parse(description); }
}
public override Type ComponentType {
get {
return typeof(ProjectItem);
}
}
public override bool IsReadOnly {
get {
return false;
}
}
public override Type PropertyType {
get {
return typeof(string);
}
}
public override bool CanResetValue(object component)
{
return true;
}
public override object GetValue(object component)
{
return ((ProjectItem)component).GetEvaluatedMetadata(Name);
}
public override void ResetValue(object component)
{
SetValue(component, null);
}
public override void SetValue(object component, object value)
{
ProjectItem p = (ProjectItem)component;
p.SetEvaluatedMetadata(Name, (string)value);
p.InformSetValue(this, component, value);
if (runCustomTool) {
FileProjectItem fpi = p as FileProjectItem;
if (fpi != null) {
CustomToolsService.RunCustomTool(fpi, false);
}
}
}
public override bool ShouldSerializeValue(object component)
{
return !string.IsNullOrEmpty((string)GetValue(component));
}
}
}
/// <summary>
/// Tests the item type of a project item and/or an MSBuild meta data value.
/// </summary>
/// <attribute name="itemType">
/// The type the project item must have. If this attribute is not specified, the type is not tested.
/// </attribute>
/// <attribute name="property">
/// The name of the MSBuild meta data to test. If this attribute is not specified, no property is tested.
/// </attribute>
/// <attribute name="value">
/// The value that the MSBuild meta data must have.
/// </attribute>
/// <example title="Test if a ProjectItem is an embedded resource">
/// &lt;Condition name = "ProjectItem" itemType = "EmbeddedResource"&gt;
/// </example>
public sealed class ProjectItemConditionEvaluator : IConditionEvaluator
{
public bool IsValid(object caller, Condition condition)
{
ProjectItem p = (ProjectItem)caller;
string itemType = condition.Properties["itemType"];
if (!string.IsNullOrEmpty(itemType)) {
if (!string.Equals(p.ItemType.ItemName, itemType, StringComparison.InvariantCultureIgnoreCase))
return false;
}
string propName = condition.Properties["property"];
string value = condition.Properties["value"];
if (!string.IsNullOrEmpty(propName)) {
if (!string.Equals(p.GetEvaluatedMetadata(propName) ?? "", value ?? "", StringComparison.InvariantCultureIgnoreCase))
return false;
}
return true;
}
}
}

5
src/Main/Base/Project/Src/Project/CustomTool.cs

@ -410,10 +410,9 @@ namespace ICSharpCode.SharpDevelop.Project @@ -410,10 +410,9 @@ namespace ICSharpCode.SharpDevelop.Project
return;
}
CustomToolContext context = new CustomToolContext(baseItem.Project);
if (string.IsNullOrEmpty(baseItem.CustomToolNamespace)) {
context.OutputNamespace = baseItem.GetEvaluatedMetadata("CustomToolNamespace");
if (string.IsNullOrEmpty(context.OutputNamespace)) {
context.OutputNamespace = GetDefaultNamespace(baseItem.Project, baseItem.FileName);
} else {
context.OutputNamespace = baseItem.CustomToolNamespace;
}
RunCustomTool(new CustomToolRun(context, fileName, baseItem, customTool, showMessageBoxOnErrors));
}

16
src/Main/Base/Project/Src/Project/Items/FileProjectItem.cs

@ -58,6 +58,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -58,6 +58,7 @@ namespace ICSharpCode.SharpDevelop.Project
}
set {
this.ItemType = new ItemType(value);
ReFilterProperties();
}
}
@ -99,6 +100,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -99,6 +100,7 @@ namespace ICSharpCode.SharpDevelop.Project
}
set {
SetEvaluatedMetadata("Generator", value);
ReFilterProperties();
}
}
@ -114,19 +116,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -114,19 +116,7 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
}
[LocalizedProperty("${res:ICSharpCode.SharpDevelop.Internal.Project.ProjectFile.CustomToolNamespace}",
Description ="${res:ICSharpCode.SharpDevelop.Internal.Project.ProjectFile.CustomToolNamespace.Description}")]
public string CustomToolNamespace {
get {
return GetEvaluatedMetadata("CustomToolNamespace");
}
set {
SetEvaluatedMetadata("CustomToolNamespace", value);
CustomToolsService.RunCustomTool(this, false);
}
}
[Browsable(false)]
public string DependentUpon {
get {

12
src/Main/Base/Project/Src/Project/Items/ProjectItem.cs

@ -425,9 +425,17 @@ namespace ICSharpCode.SharpDevelop.Project @@ -425,9 +425,17 @@ namespace ICSharpCode.SharpDevelop.Project
GetType().Name, this.ItemType.ItemName, this.Include);
}
public override void InformSetValue(LocalizedPropertyDescriptor localizedPropertyDescriptor, object component, object value)
protected override void FilterProperties(PropertyDescriptorCollection globalizedProps)
{
base.InformSetValue(localizedPropertyDescriptor, component, value);
base.FilterProperties(globalizedProps);
foreach (PropertyDescriptor p in AddInTree.BuildItems<PropertyDescriptor>("/SharpDevelop/Views/ProjectBrowser/ContextSpecificProperties", this, false)) {
globalizedProps.Add(p);
}
}
public override void InformSetValue(PropertyDescriptor propertyDescriptor, object component, object value)
{
base.InformSetValue(propertyDescriptor, component, value);
if (project != null) {
project.Save();
}

2
src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs

@ -44,7 +44,7 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -44,7 +44,7 @@ namespace ICSharpCode.SharpDevelop.Debugging
static void GetDescriptors()
{
if (debuggers == null) {
debuggers = (DebuggerDescriptor[])AddInTree.BuildItems("/SharpDevelop/Services/DebuggerService/Debugger", null, false).ToArray(typeof(DebuggerDescriptor));
debuggers = AddInTree.BuildItems<DebuggerDescriptor>("/SharpDevelop/Services/DebuggerService/Debugger", null, false).ToArray();
}
}

5
src/Main/Base/Project/Src/TextEditor/Commands/GenerateCodeCommand.cs

@ -48,9 +48,8 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -48,9 +48,8 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
IClass currentClass = GetCurrentClass(textEditorControl, cu, textEditorControl.FileName);
if (currentClass != null) {
ArrayList categories = new ArrayList();
ArrayList generators = AddInTree.BuildItems("/AddIns/DefaultTextEditor/CodeGenerator", this, true);
using (CodeGenerationForm form = new CodeGenerationForm(textEditorControl, (CodeGeneratorBase[])generators.ToArray(typeof(CodeGeneratorBase)), currentClass)) {
var generators = AddInTree.BuildItems<CodeGeneratorBase>("/AddIns/DefaultTextEditor/CodeGenerator", this, true);
using (CodeGenerationForm form = new CodeGenerationForm(textEditorControl, generators.ToArray(), currentClass)) {
form.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm);
}
}

20
src/Main/Core/Project/Src/AddInTree/AddInTree.cs

@ -140,25 +140,7 @@ namespace ICSharpCode.Core @@ -140,25 +140,7 @@ namespace ICSharpCode.Core
string parent = path.Substring(0, pos);
string child = path.Substring(pos + 1);
AddInTreeNode node = GetTreeNode(parent);
return node.BuildChildItem(child, caller, BuildItems(path, caller, false));
}
/// <summary>
/// Builds the items in the path.
/// </summary>
/// <param name="path">A path in the addin tree.</param>
/// <param name="caller">The owner used to create the objects.</param>
/// <param name="throwOnNotFound">
/// If <c>true</c>, throws a <see cref="TreePathNotFoundException"/> if the path is not found.
/// If <c>false</c>, an empty ArrayList is returned when the path is not found.
/// </param>
public static ArrayList BuildItems(string path, object caller, bool throwOnNotFound)
{
AddInTreeNode node = GetTreeNode(path, throwOnNotFound);
if (node == null)
return new ArrayList();
else
return node.BuildChildItems(caller);
return node.BuildChildItem(child, caller, new ArrayList(BuildItems<object>(path, caller, false)));
}
/// <summary>

3
src/Main/Core/Project/Src/Services/StringParser/StringParser.cs

@ -62,6 +62,9 @@ namespace ICSharpCode.Core @@ -62,6 +62,9 @@ namespace ICSharpCode.Core
}
}
/// <summary>
/// Expands ${xyz} style property values.
/// </summary>
public static string Parse(string input)
{
return Parse(input, null);

Loading…
Cancel
Save