Browse Source

initial implementation of the ProjectBehavior-API

pull/18/head
Siegfried Pammer 14 years ago
parent
commit
8527075b41
  1. 9
      src/Main/Base/Project/ICSharpCode.SharpDevelop.addin
  2. 4
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  3. 38
      src/Main/Base/Project/Src/Project/AbstractProject.cs
  4. 144
      src/Main/Base/Project/Src/Project/Behaviors/ProjectBehavior.cs
  5. 32
      src/Main/Base/Project/Src/Project/Behaviors/ProjectBehaviorService.cs
  6. 47
      src/Main/Base/Project/Src/Project/Behaviors/ProjectBehaviorSupportedConditionEvaluator.cs

9
src/Main/Base/Project/ICSharpCode.SharpDevelop.addin

@ -32,6 +32,7 @@
<ConditionEvaluator name="ProjectItem" class="ICSharpCode.SharpDevelop.Project.ProjectItemConditionEvaluator"/> <ConditionEvaluator name="ProjectItem" class="ICSharpCode.SharpDevelop.Project.ProjectItemConditionEvaluator"/>
<ConditionEvaluator name="IsTextSelected" class="ICSharpCode.SharpDevelop.Editor.AvalonEdit.TextSelectedCondition"/> <ConditionEvaluator name="IsTextSelected" class="ICSharpCode.SharpDevelop.Editor.AvalonEdit.TextSelectedCondition"/>
<ConditionEvaluator name="ViewInBrowser" class="ICSharpCode.SharpDevelop.ViewInBrowserConditionEvaluator"/> <ConditionEvaluator name="ViewInBrowser" class="ICSharpCode.SharpDevelop.ViewInBrowserConditionEvaluator"/>
<ConditionEvaluator name="ProjectBehaviourSupported" class="ICSharpCode.SharpDevelop.Project.ProjectBehaviourSupportedConditionEvaluator"/>
<Doozer name="CustomTool" class="ICSharpCode.SharpDevelop.Project.CustomToolDoozer"/> <Doozer name="CustomTool" class="ICSharpCode.SharpDevelop.Project.CustomToolDoozer"/>
<Doozer name="CustomProperty" class="ICSharpCode.SharpDevelop.Project.CustomPropertyDoozer"/> <Doozer name="CustomProperty" class="ICSharpCode.SharpDevelop.Project.CustomPropertyDoozer"/>
@ -473,14 +474,14 @@
<Condition name="IsProcessRunning" isprocessrunning="False" isdebugging="False"/> <Condition name="IsProcessRunning" isprocessrunning="False" isdebugging="False"/>
<Condition name = "ViewInBrowser" extensions="aspx,asmx,html,htm,svc"/> <Condition name = "ViewInBrowser" extensions="aspx,asmx,html,htm,svc"/>
</And> </And>
<MenuItem id = "ViewInBrowser" <MenuItem id = "ViewInBrowser"
label = "${res:ProjectComponent.ContextMenu.ViewInBrowser}" label = "${res:ProjectComponent.ContextMenu.ViewInBrowser}"
icon = "Icons.22x22.Browser" icon = "Icons.22x22.Browser"
class = "ICSharpCode.SharpDevelop.Project.Commands.ViewInBrowser"/> class = "ICSharpCode.SharpDevelop.Project.Commands.ViewInBrowser"/>
<MenuItem id = "ExcludeSeparator_ViewInBrowser" type = "Separator" /> <MenuItem id = "ExcludeSeparator_ViewInBrowser" type = "Separator" />
</ComplexCondition> </ComplexCondition>
<Include id="CutCopyPasteDeleteRename" path="/SharpDevelop/Pads/ProjectBrowser/ContextMenu/CutCopyPasteDeleteRename"/> <Include id="CutCopyPasteDeleteRename" path="/SharpDevelop/Pads/ProjectBrowser/ContextMenu/CutCopyPasteDeleteRename"/>
<MenuItem id = "RenameSeparator" type = "Separator" /> <MenuItem id = "RenameSeparator" type = "Separator" />
<MenuItem id = "Properties" <MenuItem id = "Properties"
@ -2330,4 +2331,8 @@
id = "TargetingPackWarningWorkaround" id = "TargetingPackWarningWorkaround"
class = "ICSharpCode.SharpDevelop.Project.TargetingPackWarningWorkaround"/> class = "ICSharpCode.SharpDevelop.Project.TargetingPackWarningWorkaround"/>
</Path> </Path>
<Path name = "/SharpDevelop/Workbench/ProjectBehaviors">
</Path>
</AddIn> </AddIn>

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

@ -340,6 +340,9 @@
<Compile Include="Src\Internal\Templates\File\FileTemplate.cs" /> <Compile Include="Src\Internal\Templates\File\FileTemplate.cs" />
<Compile Include="Src\Internal\Templates\TextTemplate.cs" /> <Compile Include="Src\Internal\Templates\TextTemplate.cs" />
<Compile Include="Src\Internal\Templates\File\INewFileCreator.cs" /> <Compile Include="Src\Internal\Templates\File\INewFileCreator.cs" />
<Compile Include="Src\Project\Behaviors\ProjectBehavior.cs" />
<Compile Include="Src\Project\Behaviors\ProjectBehaviorService.cs" />
<Compile Include="Src\Project\Behaviors\ProjectBehaviorSupportedConditionEvaluator.cs" />
<Compile Include="Src\Project\BuildEngine.cs" /> <Compile Include="Src\Project\BuildEngine.cs" />
<Compile Include="Src\Project\ContextSpecificProperties.cs" /> <Compile Include="Src\Project\ContextSpecificProperties.cs" />
<Compile Include="Src\Project\Converter\IUpgradableProject.cs" /> <Compile Include="Src\Project\Converter\IUpgradableProject.cs" />
@ -913,6 +916,7 @@
<Private>False</Private> <Private>False</Private>
</ProjectReference> </ProjectReference>
<Folder Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference" /> <Folder Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference" />
<Folder Include="Src\Project\Behaviors" />
<Folder Include="themes" /> <Folder Include="themes" />
<Folder Include="Src\Bookmarks\Pad\Controls" /> <Folder Include="Src\Bookmarks\Pad\Controls" />
<Folder Include="Src\Editor\AvalonEdit" /> <Folder Include="Src\Editor\AvalonEdit" />

38
src/Main/Base/Project/Src/Project/AbstractProject.cs

@ -305,7 +305,7 @@ namespace ICSharpCode.SharpDevelop.Project
[Browsable(false)] [Browsable(false)]
public virtual ICollection<ItemType> AvailableFileItemTypes { public virtual ICollection<ItemType> AvailableFileItemTypes {
get { get {
return ItemType.DefaultFileItems; return GetOrCreateBehavior().AvailableFileItemTypes;
} }
} }
@ -386,7 +386,7 @@ namespace ICSharpCode.SharpDevelop.Project
[Browsable(false)] [Browsable(false)]
public virtual bool IsStartable { public virtual bool IsStartable {
get { get {
return false; return GetOrCreateBehavior().IsStartable;
} }
} }
@ -399,18 +399,7 @@ namespace ICSharpCode.SharpDevelop.Project
public virtual void Start(bool withDebugging) public virtual void Start(bool withDebugging)
{ {
ProcessStartInfo psi; GetOrCreateBehavior().Start(withDebugging);
try {
psi = CreateStartInfo();
} catch (ProjectStartException ex) {
MessageService.ShowError(ex.Message);
return;
}
if (withDebugging) {
DebuggerService.CurrentDebugger.Start(psi);
} else {
DebuggerService.CurrentDebugger.StartWithoutDebugging(psi);
}
} }
/// <summary> /// <summary>
@ -421,7 +410,7 @@ namespace ICSharpCode.SharpDevelop.Project
/// Note: this can be a ProcessStartInfo with a URL as filename!</returns> /// Note: this can be a ProcessStartInfo with a URL as filename!</returns>
public virtual ProcessStartInfo CreateStartInfo() public virtual ProcessStartInfo CreateStartInfo()
{ {
throw new NotSupportedException(); return GetOrCreateBehavior().CreateStartInfo();
} }
/// <summary> /// <summary>
@ -481,7 +470,7 @@ namespace ICSharpCode.SharpDevelop.Project
/// </summary> /// </summary>
public virtual ProjectItem CreateProjectItem(IProjectItemBackendStore item) public virtual ProjectItem CreateProjectItem(IProjectItemBackendStore item)
{ {
return new UnknownProjectItem(this, item); return GetOrCreateBehavior().CreateProjectItem(item);
} }
#region Dirty #region Dirty
@ -513,7 +502,7 @@ namespace ICSharpCode.SharpDevelop.Project
/// </summary> /// </summary>
public virtual ItemType GetDefaultItemType(string fileName) public virtual ItemType GetDefaultItemType(string fileName)
{ {
return ItemType.None; return GetOrCreateBehavior().GetDefaultItemType(fileName);
} }
[Browsable(false)] [Browsable(false)]
@ -611,6 +600,7 @@ namespace ICSharpCode.SharpDevelop.Project
public virtual void ProjectCreationComplete() public virtual void ProjectCreationComplete()
{ {
GetOrCreateBehavior().ProjectCreationComplete();
} }
public virtual XElement LoadProjectExtensions(string name) public virtual XElement LoadProjectExtensions(string name)
@ -626,5 +616,19 @@ namespace ICSharpCode.SharpDevelop.Project
public Properties ProjectSpecificProperties { public Properties ProjectSpecificProperties {
get; protected set; get; protected set;
} }
protected virtual ProjectBehavior CreateDefaultBehavior()
{
return new DefaultProjectBehavior(this);
}
protected ProjectBehavior projectBehavior;
protected virtual ProjectBehavior GetOrCreateBehavior()
{
if (projectBehavior == null)
projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, CreateDefaultBehavior());
return projectBehavior;
}
} }
} }

144
src/Main/Base/Project/Src/Project/Behaviors/ProjectBehavior.cs

@ -0,0 +1,144 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Debugging;
namespace ICSharpCode.SharpDevelop.Project
{
public abstract class ProjectBehavior
{
ProjectBehavior next;
protected IProject Project { get; private set; }
public ProjectBehavior(IProject project, ProjectBehavior next = null)
{
if (project == null)
throw new ArgumentNullException("project");
this.Project = project;
this.next = next;
}
internal void SetProject(IProject project)
{
if (project == null)
throw new ArgumentNullException("project");
this.Project = project;
}
internal void SetNext(ProjectBehavior next)
{
if (next == null)
throw new ArgumentNullException("next");
this.next = next;
}
public virtual bool IsStartable {
get {
if (this.next != null)
return next.IsStartable;
return false;
}
}
public virtual void Start(bool withDebugging)
{
if (this.next != null)
next.Start(withDebugging);
}
public virtual ProcessStartInfo CreateStartInfo()
{
if (this.next != null)
return next.CreateStartInfo();
return null;
}
public virtual ItemType GetDefaultItemType(string fileName)
{
if (this.next != null)
return next.GetDefaultItemType(fileName);
return default(ItemType);
}
public virtual ProjectItem CreateProjectItem(IProjectItemBackendStore item)
{
if (this.next != null)
return next.CreateProjectItem(item);
return null;
}
public virtual ICollection<ItemType> AvailableFileItemTypes {
get {
if (this.next != null)
return next.AvailableFileItemTypes;
return null;
}
}
public virtual void ProjectCreationComplete()
{
if (this.next != null)
next.ProjectCreationComplete();
}
}
sealed class DefaultProjectBehavior : ProjectBehavior
{
public DefaultProjectBehavior(IProject project)
: base(project)
{
}
public override bool IsStartable {
get { return false; }
}
public override void Start(bool withDebugging)
{
ProcessStartInfo psi;
try {
if (!(Project is AbstractProject))
return;
psi = ((AbstractProject)Project).CreateStartInfo();
} catch (ProjectStartException ex) {
MessageService.ShowError(ex.Message);
return;
}
if (withDebugging) {
DebuggerService.CurrentDebugger.Start(psi);
} else {
DebuggerService.CurrentDebugger.StartWithoutDebugging(psi);
}
}
public override ProcessStartInfo CreateStartInfo()
{
throw new NotSupportedException();
}
public override ItemType GetDefaultItemType(string fileName)
{
return ItemType.None;
}
public override ProjectItem CreateProjectItem(IProjectItemBackendStore item)
{
return new UnknownProjectItem(Project, item);
}
public override ICollection<ItemType> AvailableFileItemTypes {
get { return ItemType.DefaultFileItems; }
}
public override void ProjectCreationComplete()
{
}
}
}

32
src/Main/Base/Project/Src/Project/Behaviors/ProjectBehaviorService.cs

@ -0,0 +1,32 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Project
{
public static class ProjectBehaviorService
{
const string AddInPath = "/SharpDevelop/Workbench/ProjectBehaviors";
public static ProjectBehavior LoadBehaviorsForProject(IProject project, ProjectBehavior defaultBehavior)
{
List<ProjectBehavior> behaviors = AddInTree.BuildItems<ProjectBehavior>(AddInPath, project, false);
ProjectBehavior first = null, current = null;
foreach (var behavior in behaviors) {
behavior.SetProject(project);
if (first == null)
first = behavior;
else
current.SetNext(behavior);
current = behavior;
}
if (current == null)
return defaultBehavior;
current.SetNext(defaultBehavior);
return first;
}
}
}

47
src/Main/Base/Project/Src/Project/Behaviors/ProjectBehaviorSupportedConditionEvaluator.cs

@ -0,0 +1,47 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Project
{
public class ProjectBehaviorSupportedConditionEvaluator : IConditionEvaluator
{
public bool IsValid(object owner, Condition condition)
{
Guid conditionGuid;
if (!Guid.TryParse(condition.Properties["guid"], out conditionGuid))
return true;
string guidString;
if (owner is IProject)
guidString = FindGuidInProject((IProject)owner);
else if (ProjectService.CurrentProject != null)
guidString = FindGuidInProject(ProjectService.CurrentProject);
else
return false;
Guid result;
foreach (string guid in guidString.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) {
if (Guid.TryParse(guid, out result) && conditionGuid == result)
return true;
}
return false;
}
string FindGuidInProject(IProject project)
{
if (project is MSBuildBasedProject) {
string guid = ((MSBuildBasedProject)project).GetEvaluatedProperty("ProjectTypeGuids");
if (!string.IsNullOrEmpty(guid))
return guid;
}
return project.TypeGuid;
}
}
}
Loading…
Cancel
Save