diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/AspNet.Mvc.sln b/src/AddIns/BackendBindings/AspNet.Mvc/AspNet.Mvc.sln
index 3fd56c8681..a97d67c977 100644
--- a/src/AddIns/BackendBindings/AspNet.Mvc/AspNet.Mvc.sln
+++ b/src/AddIns/BackendBindings/AspNet.Mvc/AspNet.Mvc.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
-# SharpDevelop 4.2.0.8299-alpha
+# SharpDevelop 4.2.0.8564-beta
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AspNet.Mvc", "Project\AspNet.Mvc.csproj", "{D781721F-C2A7-4E95-B76F-247170AC3B13}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AspNet.Mvc.Tests", "Test\AspNet.Mvc.Tests.csproj", "{0B12A079-B2DB-42B9-8A8E-AA5CBC2B3225}"
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj
index c0aa3fcc3f..923e3db267 100644
--- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj
+++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj
@@ -49,6 +49,9 @@
4.0
+
+ 3.5
+
@@ -224,11 +227,13 @@
+
-
+
WebProjectOptionsPanel.xaml
+
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ViewInBrowser.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ViewInBrowser.cs
index f7075bc407..4a89a3e636 100644
--- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ViewInBrowser.cs
+++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ViewInBrowser.cs
@@ -1,77 +1,77 @@
-// 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.IO;
-using System.Linq;
-
-using ICSharpCode.Core;
-using ICSharpCode.SharpDevelop.Gui.OptionPanels;
-using ICSharpCode.SharpDevelop.Project;
-using ICSharpCode.SharpDevelop.Project.Commands;
-
-namespace ICSharpCode.AspNet.Mvc
-{
- public class ViewInBrowser : AbstractMenuCommand
- {
- public override void Run()
- {
- var node = ProjectBrowserPad.Instance.SelectedNode as FileNode;
- if (node == null) {
- return;
- }
-
- var project = ProjectService.CurrentProject as CompilableProject;
- if (project == null) {
- return;
- }
-
- if (!project.IsWebProject) {
- MessageService.ShowError("${res:ProjectComponent.ContextMenu.NotAWebProject}");
- return;
- }
-
- if (!WebProjectService.IsIISOrIISExpressInstalled) {
- MessageService.ShowError("${res:ICSharpCode.WebProjectOptionsPanel.IISNotFound}");
- return;
- }
-
- string fileName = node.FileName;
-
-// // set project options
-// project.StartAction = StartAction.StartURL;
-// string directoryName = Path.GetDirectoryName(project.FileName) + "\\";
-// project.StartUrl = fileName.Replace(directoryName, "/").Replace("\\", "/");
-
- // set web server options
- string projectName = project.Name;
- WebProjectOptions existingOptions = WebProjectsOptions.Instance.GetWebProjectOptions(projectName);
-
- var options = new WebProjectOptions {
- Data = new WebProjectDebugData {
- WebServer = WebProjectService.IsIISExpressInstalled ? WebServer.IISExpress : WebServer.IIS,
- Port = (existingOptions != null && existingOptions.Data != null) ? existingOptions.Data.Port : "8080", //TODO: port collision detection
- ProjectUrl = string.Format("{0}/{1}", WebBehavior.LocalHost, project.Name)
- },
- ProjectName = projectName
- };
-
- if (options.Data.WebServer == WebServer.IISExpress) {
- options.Data.ProjectUrl = string.Format(
- @"{0}:{1}/{2}", WebBehavior.LocalHost, options.Data.Port, projectName);
- }
-
- WebProjectsOptions.Instance.SetWebProjectOptions(projectName, options);
-
- // create virtual directory
- string error = WebProjectService.CreateVirtualDirectory(
- options.Data.WebServer,
- projectName,
- Path.GetDirectoryName(ProjectService.CurrentProject.FileName));
- LoggingService.Info(error ?? string.Empty);
-
- // RunProject
- new RunProject().Run();
- }
- }
-}
+//// 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.IO;
+//using System.Linq;
+//
+//using ICSharpCode.Core;
+//using ICSharpCode.SharpDevelop.Gui.OptionPanels;
+//using ICSharpCode.SharpDevelop.Project;
+//using ICSharpCode.SharpDevelop.Project.Commands;
+//
+//namespace ICSharpCode.AspNet.Mvc
+//{
+// public class ViewInBrowser : AbstractMenuCommand
+// {
+// public override void Run()
+// {
+// var node = ProjectBrowserPad.Instance.SelectedNode as FileNode;
+// if (node == null) {
+// return;
+// }
+//
+// var project = ProjectService.CurrentProject as CompilableProject;
+// if (project == null) {
+// return;
+// }
+//
+// if (!project.IsWebProject) {
+// MessageService.ShowError("${res:ProjectComponent.ContextMenu.NotAWebProject}");
+// return;
+// }
+//
+// if (!WebProjectService.IsIISOrIISExpressInstalled) {
+// MessageService.ShowError("${res:ICSharpCode.WebProjectOptionsPanel.IISNotFound}");
+// return;
+// }
+//
+// string fileName = node.FileName;
+//
+//// // set project options
+//// project.StartAction = StartAction.StartURL;
+//// string directoryName = Path.GetDirectoryName(project.FileName) + "\\";
+//// project.StartUrl = fileName.Replace(directoryName, "/").Replace("\\", "/");
+//
+// // set web server options
+// string projectName = project.Name;
+// WebProjectOptions existingOptions = WebProjectsOptions.Instance.GetWebProjectOptions(projectName);
+//
+// var options = new WebProjectOptions {
+// Data = new WebProjectDebugData {
+// WebServer = WebProjectService.IsIISExpressInstalled ? WebServer.IISExpress : WebServer.IIS,
+// Port = (existingOptions != null && existingOptions.Data != null) ? existingOptions.Data.Port : "8080", //TODO: port collision detection
+// ProjectUrl = string.Format("{0}/{1}", WebBehavior.LocalHost, project.Name)
+// },
+// ProjectName = projectName
+// };
+//
+// if (options.Data.WebServer == WebServer.IISExpress) {
+// options.Data.ProjectUrl = string.Format(
+// @"{0}:{1}/{2}", WebBehavior.LocalHost, options.Data.Port, projectName);
+// }
+//
+// WebProjectsOptions.Instance.SetWebProjectOptions(projectName, options);
+//
+// // create virtual directory
+// string error = WebProjectService.CreateVirtualDirectory(
+// options.Data.WebServer,
+// projectName,
+// Path.GetDirectoryName(ProjectService.CurrentProject.FileName));
+// LoggingService.Info(error ?? string.Empty);
+//
+// // RunProject
+// new RunProject().Run();
+// }
+// }
+//}
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/VisualStudioProjectExtension.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/VisualStudioProjectExtension.cs
new file mode 100644
index 0000000000..912063e612
--- /dev/null
+++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/VisualStudioProjectExtension.cs
@@ -0,0 +1,64 @@
+// 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.Linq;
+using System.Xml.Linq;
+
+using ICSharpCode.SharpDevelop.Project;
+
+namespace ICSharpCode.AspNet.Mvc
+{
+ public class VisualStudioProjectExtension
+ {
+ public static readonly string ProjectExtensionName = "VisualStudio";
+ public static readonly string FlavorPropertiesName = "FlavorProperties";
+
+ WebProjectProperties webProjectProperties;
+ MSBuildBasedProject msbuildProject;
+
+ public VisualStudioProjectExtension(WebProjectProperties properties)
+ {
+ this.webProjectProperties = properties;
+ }
+
+ public VisualStudioProjectExtension(MSBuildBasedProject msbuildProject)
+ {
+ this.msbuildProject = msbuildProject;
+ }
+
+ public string Name {
+ get { return ProjectExtensionName; }
+ }
+
+ public XElement ToXElement()
+ {
+ var flavorProperties = new XElement(FlavorPropertiesName);
+ flavorProperties.SetAttributeValue("GUID", "{349C5851-65DF-11DA-9384-00065B846F21}");
+ flavorProperties.Add(webProjectProperties.ToXElement());
+ return flavorProperties;
+ }
+
+ public static bool ProjectContainsExtension(MSBuildBasedProject msbuildProject)
+ {
+ return msbuildProject.ContainsProjectExtension(ProjectExtensionName);
+ }
+
+ public WebProjectProperties GetWebProjectProperties()
+ {
+ XElement element = msbuildProject.LoadProjectExtensions(ProjectExtensionName);
+ return new WebProjectProperties(element.Descendants().First());
+ }
+
+ public void Save(MSBuildBasedProject msbuildProject)
+ {
+ msbuildProject.SaveProjectExtensions(ProjectExtensionName, ToXElement());
+ }
+
+ public bool ContainsWebProjectProperties()
+ {
+ XElement element = msbuildProject.LoadProjectExtensions(ProjectExtensionName);
+ return element.Element("WebProjectProperties") != null;
+ }
+ }
+}
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebBehavior.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebBehavior.cs
index 834db51393..bd07723636 100644
--- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebBehavior.cs
+++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebBehavior.cs
@@ -18,6 +18,7 @@ namespace ICSharpCode.AspNet.Mvc
public const string LocalHost = "http://localhost";
ProcessMonitor monitor;
+ WebProject webProject;
public string StartProgram {
get { return GetProjectProperty("StartProgram"); }
@@ -43,6 +44,19 @@ namespace ICSharpCode.AspNet.Mvc
get { return (MSBuildBasedProject)Project; }
}
+ CompilableProject CompilableProject {
+ get { return (CompilableProject)Project; }
+ }
+
+ WebProject WebProject {
+ get {
+ if (webProject == null) {
+ webProject = new WebProject(MSBuildProject);
+ }
+ return webProject;
+ }
+ }
+
public override bool IsStartable {
get { return true; }
}
@@ -54,111 +68,88 @@ namespace ICSharpCode.AspNet.Mvc
public override void Start(bool withDebugging)
{
- ProcessStartInfo processStartInfo = MSBuildProject.CreateStartInfo();
- if (FileUtility.IsUrl(processStartInfo.FileName)) {
- if (!CheckWebProjectStartInfo())
- return;
- // we deal with a WebProject
- try {
- var project = ProjectService.OpenSolution.StartupProject as CompilableProject;
- WebProjectOptions options = WebProjectsOptions.Instance.GetWebProjectOptions(project.Name);
-
- string processName = WebProjectService.GetWorkerProcessName(options.Data.WebServer);
-
- // try find the worker process directly or using the process monitor callback
- Process[] processes = System.Diagnostics.Process.GetProcesses();
- int index = processes.FindIndex(p => p.ProcessName.Equals(processName, StringComparison.OrdinalIgnoreCase));
- if (index > -1) {
- if (withDebugging)
- DebuggerService.CurrentDebugger.Attach(processes[index]);
- } else {
- if (options.Data.WebServer == WebServer.IISExpress) {
- // start IIS express and attach to it
- if (WebProjectService.IsIISExpressInstalled) {
- DebuggerService.CurrentDebugger.Start(new ProcessStartInfo(WebProjectService.IISExpressProcessLocation));
- } else {
- DisposeProcessMonitor();
- MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
- return;
- }
+ if (!CheckWebProjectStartInfo())
+ return;
+
+ try {
+ WebProjectProperties properties = WebProject.GetWebProjectProperties();
+ string processName = WebProjectService.GetWorkerProcessName(properties);
+
+ // try find the worker process directly or using the process monitor callback
+ Process[] processes = System.Diagnostics.Process.GetProcesses();
+ int index = processes.FindIndex(p => p.ProcessName.Equals(processName, StringComparison.OrdinalIgnoreCase));
+ if (index > -1) {
+ if (withDebugging)
+ DebuggerService.CurrentDebugger.Attach(processes[index]);
+ } else {
+ if (properties.UseIISExpress) {
+ // start IIS express and attach to it
+ if (WebProjectService.IsIISExpressInstalled) {
+ DebuggerService.CurrentDebugger.Start(new ProcessStartInfo(WebProjectService.IISExpressProcessLocation));
} else {
DisposeProcessMonitor();
- this.monitor = new ProcessMonitor(processName);
- this.monitor.ProcessCreated += delegate {
- WorkbenchSingleton.SafeThreadCall((Action)(() => OnProcessCreated(options, withDebugging)));
- };
- this.monitor.Start();
+ MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
+ return;
}
+ } else {
+ DisposeProcessMonitor();
+ this.monitor = new ProcessMonitor(processName);
+ this.monitor.ProcessCreated += delegate {
+ WorkbenchSingleton.SafeThreadCall((Action)(() => OnProcessCreated(properties, withDebugging)));
+ };
+ this.monitor.Start();
}
-
- // start default application(e.g. browser) or the one specified
- switch (project.StartAction) {
- case StartAction.Project:
- if (FileUtility.IsUrl(options.Data.ProjectUrl)) {
- Process.Start(options.Data.ProjectUrl);
+ }
+
+ // start default application(e.g. browser) or the one specified
+ switch (CompilableProject.StartAction) {
+ case StartAction.Project:
+ if (FileUtility.IsUrl(properties.IISUrl)) {
+ Process.Start(properties.IISUrl);
+ } else {
+ MessageService.ShowError("${res:ICSharpCode.WebProjectOptionsPanel.NoProjectUrlOrProgramAction}");
+ DisposeProcessMonitor();
+ }
+ break;
+ case StartAction.Program:
+ Process.Start(StartProgram);
+ break;
+ case StartAction.StartURL:
+ if (FileUtility.IsUrl(StartUrl)) {
+ Process.Start(StartUrl);
+ } else {
+ string url = string.Concat(properties.IISUrl, StartUrl);
+ if (FileUtility.IsUrl(url)) {
+ Process.Start(url);
} else {
MessageService.ShowError("${res:ICSharpCode.WebProjectOptionsPanel.NoProjectUrlOrProgramAction}");
DisposeProcessMonitor();
+ return;
}
- break;
- case StartAction.Program:
- Process.Start(StartProgram);
- break;
- case StartAction.StartURL:
- if (FileUtility.IsUrl(StartUrl)) {
- Process.Start(StartUrl);
- } else {
- string url = string.Concat(options.Data.ProjectUrl, StartUrl);
- if (FileUtility.IsUrl(url)) {
- Process.Start(url);
- } else {
- MessageService.ShowError("${res:ICSharpCode.WebProjectOptionsPanel.NoProjectUrlOrProgramAction}");
- DisposeProcessMonitor();
- return;
- }
- }
- break;
- default:
- throw new System.Exception("Invalid value for StartAction");
- }
- } catch (System.Exception ex) {
- string err = "Error: " + ex.Message;
- MessageService.ShowError(err);
- LoggingService.Error(err);
- DisposeProcessMonitor();
+ }
+ break;
+ default:
+ throw new Exception("Invalid value for StartAction");
}
+ } catch (Exception ex) {
+ MessageService.ShowError(ex.Message);
+ LoggingService.Error(ex.ToString());
+ DisposeProcessMonitor();
}
}
bool CheckWebProjectStartInfo()
{
- // check if we have startup project
- var project = ProjectService.OpenSolution.StartupProject as CompilableProject;
- if (project == null) {
- MessageService.ShowError("${res:ICSharpCode.NoStartupProject}");
- return false;
- }
-
- // check if we have options
- if (WebProjectsOptions.Instance == null) {
- MessageService.ShowError("${res:ICSharpCode.WebProjectOptionsPanel.NoProjectUrlOrProgramAction}");
- return false;
+ if (WebProject.HasWebProjectProperties() && WebProject.GetWebProjectProperties().IsConfigured()) {
+ return true;
}
-
- // check the options
- WebProjectOptions options = WebProjectsOptions.Instance.GetWebProjectOptions(project.Name);
- if (options == null || options.Data == null || string.IsNullOrEmpty(options.ProjectName) ||
- options.Data.WebServer == WebServer.None) {
- MessageService.ShowError("${res:ICSharpCode.WebProjectOptionsPanel.NoProjectUrlOrProgramAction}");
- return false;
- }
-
- return true;
+ MessageService.ShowError("${res:ICSharpCode.WebProjectOptionsPanel.NoProjectUrlOrProgramAction}");
+ return false;
}
- void OnProcessCreated(WebProjectOptions options, bool withDebugging)
+ void OnProcessCreated(WebProjectProperties properties, bool withDebugging)
{
- string processName = WebProjectService.GetWorkerProcessName(options.Data.WebServer);
+ string processName = WebProjectService.GetWorkerProcessName(properties);
Process[] processes = Process.GetProcesses();
int index = processes.FindIndex(p => p.ProcessName.Equals(processName, StringComparison.OrdinalIgnoreCase));
if (index == -1)
@@ -167,7 +158,7 @@ namespace ICSharpCode.AspNet.Mvc
DebuggerService.CurrentDebugger.Attach(processes[index]);
if (!DebuggerService.CurrentDebugger.IsAttached) {
- if(options.Data.WebServer == WebServer.IIS) {
+ if(properties.UseIIS) {
string format = ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.NoIISWP");
MessageService.ShowMessage(string.Format(format, processName));
}
@@ -183,21 +174,5 @@ namespace ICSharpCode.AspNet.Mvc
monitor = null;
}
}
-
- public override Properties CreateMemento()
- {
- Properties properties = base.CreateMemento();
- WebProjectOptions webOptions = WebProjectsOptions.Instance.GetWebProjectOptions(Project.Name);
- if (webOptions != null)
- properties.Set("WebProjectOptions", webOptions);
- return properties;
- }
-
- public override void SetMemento(Properties memento)
- {
- // web project properties
- WebProjectsOptions.Instance.SetWebProjectOptions(Project.Name, memento.Get("WebProjectOptions", new WebProjectOptions()) as WebProjectOptions);
- base.SetMemento(memento);
- }
}
}
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProject.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProject.cs
new file mode 100644
index 0000000000..915cfb2edd
--- /dev/null
+++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProject.cs
@@ -0,0 +1,78 @@
+// 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 ICSharpCode.SharpDevelop.Project;
+
+namespace ICSharpCode.AspNet.Mvc
+{
+ public class WebProject
+ {
+ public static readonly WebProjectProperties DefaultProperties = new WebProjectProperties
+ {
+ DevelopmentServerPort = 8080,
+ DevelopmentServerVPath = "/"
+ };
+
+ MSBuildBasedProject msbuildProject;
+
+ public WebProject(MSBuildBasedProject msbuildProject)
+ {
+ this.msbuildProject = msbuildProject;
+ }
+
+ public bool HasWebProjectProperties()
+ {
+ if (VisualStudioProjectExtension.ProjectContainsExtension(msbuildProject)) {
+ var projectExtension = new VisualStudioProjectExtension(msbuildProject);
+ return projectExtension.ContainsWebProjectProperties();
+ }
+ return false;
+ }
+
+ public WebProjectProperties GetWebProjectProperties()
+ {
+ if (HasWebProjectProperties()) {
+ var projectExtension = new VisualStudioProjectExtension(msbuildProject);
+ WebProjectProperties properties = projectExtension.GetWebProjectProperties();
+ properties.UseIISExpress = UseIISExpress;
+ return properties;
+ }
+ return DefaultProperties;
+ }
+
+ public bool UseIISExpress
+ {
+ get { return GetUseIISExpress(); }
+ }
+
+ bool GetUseIISExpress()
+ {
+ string value = GetMSBuildProperty("UseIISExpress");
+ bool result = false;
+ Boolean.TryParse(value, out result);
+ return result;
+ }
+
+ string GetMSBuildProperty(string propertyName)
+ {
+ string value = msbuildProject.GetEvaluatedProperty(propertyName);
+ if (value != null) {
+ return value;
+ }
+ return String.Empty;
+ }
+
+ public void UpdateWebProjectProperties(WebProjectProperties properties)
+ {
+ var projectExtension = new VisualStudioProjectExtension(properties);
+ projectExtension.Save(msbuildProject);
+ SetMSBuildProperty("UseIISExpress", properties.UseIISExpress);
+ }
+
+ void SetMSBuildProperty(string propertyName, bool value)
+ {
+ msbuildProject.SetProperty(propertyName, value.ToString());
+ }
+ }
+}
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptions.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptions.cs
deleted file mode 100644
index 74efc0e1dc..0000000000
--- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptions.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-// 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.ComponentModel;
-
-using ICSharpCode.Core;
-using ICSharpCode.SharpDevelop.Project;
-
-namespace ICSharpCode.AspNet.Mvc
-{
- public sealed class WebProjectsOptions
- {
- private WebProjectsOptions() { }
-
- private static readonly WebProjectsOptions _Instance = new WebProjectsOptions();
-
- private List options = new List();
-
- public WebProjectOptions GetWebProjectOptions(string projectName) {
- return options.Find(o => o.ProjectName == projectName);
- }
-
- public void SetWebProjectOptions(string projectName, WebProjectOptions data)
- {
- var d = GetWebProjectOptions(projectName);
- if (d == null)
- {
- if (data == null)
- data = new WebProjectOptions() { ProjectName = projectName };
-
- options.Add(data);
- }
- else
- {
- int index = options.IndexOf(d);
- options[index] = data;
- }
- }
-
- public static WebProjectsOptions Instance {
- get {
- return _Instance;
- }
- }
- }
-
- [Serializable]
- public class WebProjectOptions
- {
- [DefaultValue(null)]
- public string ProjectName { get; set; }
-
- [DefaultValue(null)]
- public WebProjectDebugData Data { get; set; }
- }
-
- [Serializable]
- public class WebProjectDebugData
- {
- [DefaultValue(null)]
- public string ProjectUrl { get; set; }
-
- [DefaultValue("8080")]
- public string Port { get; set; }
-
- [DefaultValue(WebServer.None)]
- public WebServer WebServer { get; set; }
- }
-}
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml
index 6685003fa7..0e92d788d7 100644
--- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml
+++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml
@@ -67,20 +67,27 @@
FontWeight="Bold"
TextWrapping="Wrap"
Name="StatusLabel" />
-
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs
index 3bda9b79f2..f5adc8ddbe 100644
--- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs
+++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs
@@ -6,6 +6,8 @@ using System.IO;
using System.Web.Services.Description;
using System.Windows;
using System.Windows.Controls;
+using System.Windows.Input;
+
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui.OptionPanels;
using ICSharpCode.SharpDevelop.Project;
@@ -14,146 +16,141 @@ namespace ICSharpCode.AspNet.Mvc
{
public partial class WebProjectOptionsPanel : ProjectOptionPanel
{
+ WebProject webProject;
+ WebProjectProperties properties;
+
public WebProjectOptionsPanel()
{
InitializeComponent();
-
- if (CurrentProjectDebugData == null)
- CurrentProjectDebugData = new WebProjectDebugData();
-
- Loaded += OnLoaded;
}
-
- void OnLoaded(object sender, RoutedEventArgs e)
+
+ protected override void Load(MSBuildBasedProject project, string configuration, string platform)
{
+ CreateWebProject(project);
if (!WebProjectService.IsIISOrIISExpressInstalled) {
StatusLabel.Text = ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.IISNotFound");
return;
}
- switch (CurrentProjectDebugData.WebServer)
- {
- case WebServer.IISExpress:
- if (WebProjectService.IsIISExpressInstalled) {
- UseIISExpress.IsChecked = true;
- PortTextBox.Text = CurrentProjectDebugData.Port ?? "8080";
-
- SelectIISExpress();
- }
- break;
- case WebServer.IIS:
- if (WebProjectService.IISVersion != IISVersion.None) {
- UseLocalIIS.IsChecked = true;
- ProjectUrl.Text = CurrentProjectDebugData.ProjectUrl ?? string.Empty;
-
- SelectLocalIIS();
- }
- break;
- default:
- // do nothing
- break;
+ if (properties.UseIISExpress) {
+ if (WebProjectService.IsIISExpressInstalled) {
+ UseIISExpress.IsChecked = true;
+ PortTextBox.Text = properties.DevelopmentServerPort.ToString();
+ SelectIISExpress();
+ }
+ } else if (properties.UseIIS) {
+ if (WebProjectService.IISVersion != IISVersion.None) {
+ UseLocalIIS.IsChecked = true;
+ ProjectUrl.Text = properties.IISUrl;
+ SelectLocalIIS();
+ }
}
}
+
+ void CreateWebProject(MSBuildBasedProject project)
+ {
+ webProject = new WebProject(project);
+ properties = webProject.GetWebProjectProperties();
+ }
- WebProjectDebugData CurrentProjectDebugData {
- get {
- var data = WebProjectsOptions.Instance.GetWebProjectOptions(ProjectService.CurrentProject.Name);
- if (data != null)
- return data.Data;
-
- return null;
- }
- set {
- WebProjectOptions data;
- if (value != null)
- {
- data = new WebProjectOptions() {
- ProjectName = ProjectService.CurrentProject.Name,
- Data = value
- };
- }
- else
- data = new WebProjectOptions();
-
- WebProjectsOptions.Instance.SetWebProjectOptions(ProjectService.CurrentProject.Name, data);
+ protected override bool Save(MSBuildBasedProject project, string configuration, string platform)
+ {
+ if (IsDirty) {
+ webProject.UpdateWebProjectProperties(properties);
+ //project.Save();
}
+ IsDirty = false;
+ return true;
}
void CreateVirtualDirectory_Click(object sender, RoutedEventArgs e)
{
string error = WebProjectService.CreateVirtualDirectory(
- CurrentProjectDebugData.WebServer,
+ GetWebServer(),
ProjectService.CurrentProject.Name,
Path.GetDirectoryName(ProjectService.CurrentProject.FileName));
- if (!string.IsNullOrEmpty(error))
+ if (!string.IsNullOrEmpty(error)) {
MessageService.ShowError(error);
- else {
+ } else {
MessageService.ShowMessage(ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.VirtualDirCreated"));
}
}
+ WebServer GetWebServer()
+ {
+ if (properties.UseIISExpress) {
+ return WebServer.IISExpress;
+ }
+ return WebServer.IIS;
+ }
+
void UseIISExpress_Click(object sender, RoutedEventArgs e)
{
SelectIISExpress();
+ OnWebProjectPropertiesChanged();
}
void SelectIISExpress()
{
- WebProjectDebugData data = new WebProjectDebugData();
- data.WebServer = WebServer.IISExpress;
- data.Port = PortTextBox.Text;
- data.ProjectUrl = string.Format(@"http://localhost:{0}/" + ProjectService.CurrentProject.Name, PortTextBox.Text);
+ properties.UseIISExpress = true;
+ properties.UseIIS = false;
+ properties.DevelopmentServerPort = Int32.Parse(PortTextBox.Text);
+ if (String.IsNullOrEmpty(properties.IISUrl)) {
+ properties.IISUrl = String.Format(@"http://localhost:{0}/" + ProjectService.CurrentProject.Name, PortTextBox.Text);
+ OnWebProjectPropertiesChanged();
+ }
bool isIISExpressInstalled = WebProjectService.IsIISExpressInstalled;
if (!isIISExpressInstalled) {
UseIISExpress.IsChecked = false;
- data.WebServer = WebServer.None;
+ properties.UseIISExpress = false;
StatusLabel.Text = ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.IISNotFound");
- data.ProjectUrl = string.Empty;
+ } else {
+ StatusLabel.Text = String.Empty;
}
- else
- StatusLabel.Text = string.Empty;
IISExpressGroup.IsEnabled = CreateVirtualDirectoryButton.IsEnabled = isIISExpressInstalled;
LocalIISGroup.IsEnabled = false;
- CurrentProjectDebugData = data;
}
void UseLocalIIS_Click(object sender, RoutedEventArgs e)
{
SelectLocalIIS();
+ OnWebProjectPropertiesChanged();
}
void SelectLocalIIS()
{
- WebProjectDebugData data = new WebProjectDebugData();
- data.WebServer = WebServer.IIS;
- data.Port = string.Empty;
+ properties.UseIISExpress = false;
+ properties.UseIIS = true;
bool isIISInstalled = WebProjectService.IISVersion != IISVersion.None;
if (!isIISInstalled) {
StatusLabel.Text = ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.IISNotFound");
- ProjectUrl.Text = string.Empty;
- data.WebServer = WebServer.None;
+ ProjectUrl.Text = String.Empty;
UseLocalIIS.IsChecked = false;
} else {
- StatusLabel.Text = string.Empty;
- ProjectUrl.Text = string.Format("{0}/{1}", WebBehavior.LocalHost, ProjectService.CurrentProject.Name);
+ StatusLabel.Text = String.Empty;
+ if (String.IsNullOrEmpty(properties.IISUrl)) {
+ properties.IISUrl = String.Format("{0}/{1}", WebBehavior.LocalHost, ProjectService.CurrentProject.Name);
+ OnWebProjectPropertiesChanged();
+ }
+ ProjectUrl.Text = properties.IISUrl;
}
-
- data.ProjectUrl = ProjectUrl.Text;
LocalIISGroup.IsEnabled = CreateVirtualDirectoryButton.IsEnabled = isIISInstalled;
IISExpressGroup.IsEnabled = false;
- CurrentProjectDebugData = data;
}
void ProjectUrl_TextChanged(object sender, TextChangedEventArgs e)
{
- WebProjectDebugData data = new WebProjectDebugData();
- data.WebServer = WebServer.IIS;
- data.ProjectUrl = ProjectUrl.Text;
- CurrentProjectDebugData = data;
+ properties.IISUrl = ProjectUrl.Text;
+ OnWebProjectPropertiesChanged();
+ }
+
+ void OnWebProjectPropertiesChanged()
+ {
+ IsDirty = true;
}
void ClearWebServerButton_Click(object sender, RoutedEventArgs e)
@@ -161,40 +158,37 @@ namespace ICSharpCode.AspNet.Mvc
UseIISExpress.IsChecked = false;
UseLocalIIS.IsChecked = false;
CreateVirtualDirectoryButton.IsEnabled = false;
- ProjectUrl.Text = string.Empty;
+ ProjectUrl.Text = String.Empty;
LocalIISGroup.IsEnabled = false;
IISExpressGroup.IsEnabled = false;
- WebProjectDebugData data = new WebProjectDebugData();
- data.WebServer = WebServer.None;
- data.ProjectUrl = string.Empty;
-
- CurrentProjectDebugData = data;
+ properties.UseIISExpress = false;
+ properties.UseIIS = false;
+ OnWebProjectPropertiesChanged();
}
bool AreAllValidNumericChars(string str)
{
- foreach(char c in str)
- {
- if(!Char.IsNumber(c)) return false;
+ foreach(char c in str) {
+ if (!Char.IsNumber(c)) return false;
}
-
return true;
}
- void PortTextBox_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
+ void PortTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
- e.Handled = !AreAllValidNumericChars(e.Text);
+ if (AreAllValidNumericChars(e.Text)) {
+ OnWebProjectPropertiesChanged();
+ } else {
+ e.Handled = true;
+ }
base.OnPreviewTextInput(e);
}
- void PortTextBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
+ void PortTextBox_KeyUp(object sender, KeyEventArgs e)
{
- WebProjectDebugData data = new WebProjectDebugData();
- data.WebServer = WebServer.IISExpress;
- data.Port = PortTextBox.Text;
- data.ProjectUrl = string.Format(@"{0}:{1}/{2}", WebBehavior.LocalHost, PortTextBox.Text, ProjectService.CurrentProject.Name);
- CurrentProjectDebugData = data;
+ properties.DevelopmentServerPort = Int32.Parse(PortTextBox.Text);
+ properties.IISUrl = String.Format(@"{0}:{1}/{2}", WebBehavior.LocalHost, PortTextBox.Text, ProjectService.CurrentProject.Name);
}
}
}
\ No newline at end of file
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectProperties.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectProperties.cs
new file mode 100644
index 0000000000..afa783d31c
--- /dev/null
+++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectProperties.cs
@@ -0,0 +1,148 @@
+// 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.IO;
+using System.Xml;
+using System.Xml.Linq;
+
+namespace ICSharpCode.AspNet.Mvc
+{
+ public class WebProjectProperties
+ {
+ public WebProjectProperties()
+ {
+ this.CustomServerUrl = String.Empty;
+ this.DevelopmentServerVPath = String.Empty;
+ this.IISUrl = String.Empty;
+ }
+
+ public WebProjectProperties(XElement element)
+ {
+ Load(element);
+ }
+
+ void Load(XElement element)
+ {
+ AutoAssignPort = GetChildElementBoolean("AutoAssignPort", element);
+ CustomServerUrl = GetChildElementString("CustomServerUrl", element);
+ DevelopmentServerPort = GetChildElementInteger("DevelopmentServerPort", element);
+ DevelopmentServerVPath = GetChildElementString("DevelopmentServerVPath", element);
+ IISUrl = GetChildElementString("IISUrl", element);
+ NTLMAuthentication = GetChildElementBoolean("NTLMAuthentication", element);
+ SaveServerSettingsInUserFile = GetChildElementBoolean("SaveServerSettingsInUserFile", element);
+ UseCustomServer = GetChildElementBoolean("UseCustomServer", element);
+ UseIIS = GetChildElementBoolean("UseIIS", element);
+ }
+
+ string GetChildElementString(string name, XElement element)
+ {
+ XElement childElement = element.Element(name);
+ if (childElement != null) {
+ return childElement.Value;
+ }
+ return String.Empty;
+ }
+
+ int GetChildElementInteger(string name, XElement element)
+ {
+ string value = GetChildElementString(name, element);
+ int result = 0;
+ Int32.TryParse(value, out result);
+ return result;
+ }
+
+ bool GetChildElementBoolean(string name, XElement element)
+ {
+ string value = GetChildElementString(name, element);
+ bool result = false;
+ Boolean.TryParse(value, out result);
+ return result;
+ }
+
+ public override bool Equals(object obj)
+ {
+ var properties = obj as WebProjectProperties;
+ if (properties != null) {
+ return Equals(properties);
+ }
+ return false;
+ }
+
+ bool Equals(WebProjectProperties properties)
+ {
+ return
+ (AutoAssignPort == properties.AutoAssignPort) &&
+ (UseIIS == properties.UseIIS) &&
+ (DevelopmentServerVPath == properties.DevelopmentServerVPath) &&
+ (DevelopmentServerPort == properties.DevelopmentServerPort) &&
+ (CustomServerUrl == properties.CustomServerUrl) &&
+ (UseCustomServer == properties.UseCustomServer) &&
+ (SaveServerSettingsInUserFile == properties.SaveServerSettingsInUserFile) &&
+ (UseIISExpress == properties.UseIISExpress) &&
+ (NTLMAuthentication == properties.NTLMAuthentication) &&
+ (IISUrl == properties.IISUrl);
+ }
+
+ public override int GetHashCode()
+ {
+ return base.GetHashCode();
+ }
+
+ public override string ToString()
+ {
+ return String.Format(
+ "[WebProjectProperties IISUrl=\"{0}\", UseIISExpress={1}, UseIIS={2}, SaveServerSettingsInUserFile={3}]",
+ IISUrl,
+ UseIISExpress,
+ UseIIS,
+ SaveServerSettingsInUserFile);
+ }
+
+ public bool AutoAssignPort { get; set; }
+ public string DevelopmentServerVPath { get; set; }
+ public int DevelopmentServerPort { get; set; }
+
+ public bool NTLMAuthentication { get; set; }
+
+ public bool UseIIS { get; set; }
+ public string IISUrl { get; set; }
+ public bool UseIISExpress { get; set; }
+
+ public bool SaveServerSettingsInUserFile { get; set; }
+
+ public bool UseCustomServer { get; set; }
+ public string CustomServerUrl { get; set; }
+
+ public XElement ToXElement()
+ {
+ return new XElement(
+ "WebProjectProperties",
+ CreateBooleanXElement("UseIIS", UseIIS),
+ CreateBooleanXElement("AutoAssignPort", AutoAssignPort),
+ new XElement("DevelopmentServerPort", DevelopmentServerPort),
+ new XElement("DevelopmentServerVPath", DevelopmentServerVPath),
+ new XElement("IISUrl", IISUrl),
+ CreateBooleanXElement("NTLMAuthentication", NTLMAuthentication),
+ CreateBooleanXElement("UseCustomServer", UseCustomServer),
+ new XElement("CustomServerUrl", CustomServerUrl),
+ CreateBooleanXElement("SaveServerSettingsInUserFile", SaveServerSettingsInUserFile));
+ }
+
+ XElement CreateBooleanXElement(string name, bool value)
+ {
+ return new XElement(name, value.ToString());
+ }
+
+ public bool IsConfigured()
+ {
+ return
+ (UseIIS || UseIISExpress) && IsValidIISUrl();
+ }
+
+ bool IsValidIISUrl()
+ {
+ return !String.IsNullOrEmpty(IISUrl);
+ }
+ }
+}
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectService.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectService.cs
index 12f1ff3ee7..9781ea0d3b 100644
--- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectService.cs
+++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectService.cs
@@ -83,6 +83,14 @@ namespace ICSharpCode.AspNet.Mvc
return GetIISWorkerProcessName();
}
+ public static string GetWorkerProcessName(WebProjectProperties properties)
+ {
+ if (properties.UseIISExpress) {
+ return GetIISExpressWorkerProcessName();
+ }
+ return GetIISWorkerProcessName();
+ }
+
public static string GetIISExpressWorkerProcessName()
{
if (!IsIISExpressInstalled)
@@ -97,8 +105,7 @@ namespace ICSharpCode.AspNet.Mvc
return ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.IISNotFound");
try {
- switch (IISVersion)
- {
+ switch (IISVersion) {
case IISVersion.IIS5:
return IIS_5_PROCESS_NAME;
default:
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj b/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj
index dc6a520b81..9e1e9ea594 100644
--- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj
+++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj
@@ -29,6 +29,7 @@
TRACE
+
..\..\..\Misc\TextTemplating\Project\lib\Mono.TextTemplating.dll
@@ -42,7 +43,7 @@
3.0
- lib\Rhino.Mocks.dll
+ ..\..\..\..\Libraries\RhinoMocks\Rhino.Mocks.dll
@@ -53,6 +54,9 @@
4.0
+
+ 3.5
+
3.0
@@ -79,6 +83,7 @@
+
@@ -144,6 +149,9 @@
+
+
+
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MSBuildProjectHelper.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MSBuildProjectHelper.cs
new file mode 100644
index 0000000000..6e5a2511b4
--- /dev/null
+++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MSBuildProjectHelper.cs
@@ -0,0 +1,21 @@
+// 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 ICSharpCode.SharpDevelop.Internal.Templates;
+using ICSharpCode.SharpDevelop.Project;
+using Rhino.Mocks;
+
+namespace AspNet.Mvc.Tests.Helpers
+{
+ public static class MSBuildProjectHelper
+ {
+ public static MSBuildBasedProject CreateCSharpProject()
+ {
+ var createInfo = new ProjectCreateInformation();
+ createInfo.Solution = new Solution(MockRepository.GenerateStub());
+ createInfo.OutputProjectFileName = @"d:\projects\MyProject\MyProject.csproj";
+ return new MSBuildBasedProject(createInfo);
+ }
+ }
+}
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/VisualStudioProjectExtensionTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/VisualStudioProjectExtensionTests.cs
new file mode 100644
index 0000000000..2b8ad8baaa
--- /dev/null
+++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/VisualStudioProjectExtensionTests.cs
@@ -0,0 +1,104 @@
+// 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.Xml.Linq;
+using AspNet.Mvc.Tests.Helpers;
+using ICSharpCode.AspNet.Mvc;
+using ICSharpCode.SharpDevelop.Project;
+using NUnit.Framework;
+
+namespace AspNet.Mvc.Tests
+{
+ [TestFixture]
+ public class VisualStudioProjectExtensionTests
+ {
+ VisualStudioProjectExtension extension;
+ MSBuildBasedProject msbuildProject;
+
+ void CreateExtension()
+ {
+ msbuildProject = MSBuildProjectHelper.CreateCSharpProject();
+ CreateExtension(msbuildProject);
+ }
+
+ void CreateExtension(MSBuildBasedProject msbuildProject)
+ {
+ extension = new VisualStudioProjectExtension(msbuildProject);
+ }
+
+ void CreateMSBuildProject()
+ {
+ msbuildProject = MSBuildProjectHelper.CreateCSharpProject();
+ }
+
+ void CreateMSBuildProjectWithWebProjectProperties()
+ {
+ CreateMSBuildProject();
+ var properties = new WebProjectProperties();
+ var extension = new VisualStudioProjectExtension(properties);
+ extension.Save(msbuildProject);
+ }
+
+ void AddVisualStudioExtensionWithChildElement(string childElementName)
+ {
+ msbuildProject.SaveProjectExtensions(VisualStudioProjectExtension.ProjectExtensionName, new XElement(childElementName));
+ }
+
+ [Test]
+ public void ProjectContainsExtension_MSBuildProjectHasNoVisualStudioExtension_ReturnsFalse()
+ {
+ CreateMSBuildProject();
+
+ bool exists = VisualStudioProjectExtension.ProjectContainsExtension(msbuildProject);
+
+ Assert.IsFalse(exists);
+ }
+
+ [Test]
+ public void ProjectContainsExtension_MSBuildProjectHasVisualStudioExtension_ReturnsTrue()
+ {
+ CreateMSBuildProject();
+ AddVisualStudioExtensionWithChildElement("Test");
+
+ bool exists = VisualStudioProjectExtension.ProjectContainsExtension(msbuildProject);
+
+ Assert.IsTrue(exists);
+ }
+
+
+ [Test]
+ public void ContainsWebProjectProperties_MSBuildProjectHasWebProjectProperties_ReturnsTrue()
+ {
+ CreateMSBuildProjectWithWebProjectProperties();
+ CreateExtension(msbuildProject);
+
+ bool contains = extension.ContainsWebProjectProperties();
+
+ Assert.IsTrue(contains);
+ }
+
+ [Test]
+ public void ContainsWebProjectProperties_MSBuildProjectDoesNotHaveWebProjectProperties_ReturnsFalse()
+ {
+ CreateMSBuildProject();
+ CreateExtension();
+
+ bool contains = extension.ContainsWebProjectProperties();
+
+ Assert.IsFalse(contains);
+ }
+
+ [Test]
+ public void ContainsWebProjectProperties_MSBuildProjectDoesNotHaveWebProjectPropertiesButHasVisualStudioExtension_ReturnsFalse()
+ {
+ CreateMSBuildProject();
+ AddVisualStudioExtensionWithChildElement("Test");
+ CreateExtension(msbuildProject);
+
+ bool contains = extension.ContainsWebProjectProperties();
+
+ Assert.IsFalse(contains);
+ }
+ }
+}
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/WebProjectPropertiesTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/WebProjectPropertiesTests.cs
new file mode 100644
index 0000000000..da92a257ef
--- /dev/null
+++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/WebProjectPropertiesTests.cs
@@ -0,0 +1,282 @@
+// 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.Xml.Linq;
+using ICSharpCode.AspNet.Mvc;
+using NUnit.Framework;
+
+namespace AspNet.Mvc.Tests
+{
+ [TestFixture]
+ public class WebProjectPropertiesTests
+ {
+ WebProjectProperties lhs;
+ WebProjectProperties rhs;
+
+ void CreateTwoWebProjectProperties()
+ {
+ lhs = new WebProjectProperties();
+ rhs = new WebProjectProperties();
+ }
+
+ [Test]
+ public void Equals_AllPropertiesAreTheSame_ReturnsTrue()
+ {
+ CreateTwoWebProjectProperties();
+
+ Assert.AreEqual(lhs, rhs);
+ }
+
+ [Test]
+ public void Equals_UseIISPropertyIsDifferent_ReturnsFalse()
+ {
+ CreateTwoWebProjectProperties();
+ lhs.UseIIS = false;
+ rhs.UseIIS = true;
+
+ Assert.AreNotEqual(lhs, rhs);
+ }
+
+ [Test]
+ public void Equals_Null_ReturnsFalse()
+ {
+ CreateTwoWebProjectProperties();
+ bool result = lhs.Equals(null);
+
+ Assert.IsFalse(result);
+ }
+
+ [Test]
+ public void Equals_AutoAssignPortPropertyIsDifferent_ReturnsFalse()
+ {
+ CreateTwoWebProjectProperties();
+ lhs.AutoAssignPort = true;
+ rhs.AutoAssignPort = false;
+
+ Assert.AreNotEqual(lhs, rhs);
+ }
+
+ [Test]
+ public void Equals_DevelopmentServerVPathPropertyIsDifferent_ReturnsFalse()
+ {
+ CreateTwoWebProjectProperties();
+ lhs.DevelopmentServerVPath = "/";
+ rhs.DevelopmentServerVPath = "/Test";
+
+ Assert.AreNotEqual(lhs, rhs);
+ }
+
+ [Test]
+ public void Equals_DevelopmentServerPortPropertyIsDifferent_ReturnsFalse()
+ {
+ CreateTwoWebProjectProperties();
+ lhs.DevelopmentServerPort = 8080;
+ rhs.DevelopmentServerPort = 7777;
+
+ Assert.AreNotEqual(lhs, rhs);
+ }
+
+ [Test]
+ public void Equals_NTLMAuthenticationPropertyIsDifferent_ReturnsFalse()
+ {
+ CreateTwoWebProjectProperties();
+ lhs.NTLMAuthentication = false;
+ rhs.NTLMAuthentication = true;
+
+ Assert.AreNotEqual(lhs, rhs);
+ }
+
+ [Test]
+ public void Equals_IISUrlPropertyIsDifferent_ReturnsFalse()
+ {
+ CreateTwoWebProjectProperties();
+ lhs.IISUrl = "http://localhost/";
+ rhs.IISUrl = "http://localhost:1888/";
+
+ Assert.AreNotEqual(lhs, rhs);
+ }
+
+ [Test]
+ public void Equals_UseIISExpressPropertyIsDifferent_ReturnsFalse()
+ {
+ CreateTwoWebProjectProperties();
+ lhs.UseIISExpress = false;
+ rhs.UseIISExpress = true;
+
+ Assert.AreNotEqual(lhs, rhs);
+ }
+
+ [Test]
+ public void Equals_SaveServerSettingsInUserFilePropertyIsDifferent_ReturnsFalse()
+ {
+ CreateTwoWebProjectProperties();
+ lhs.SaveServerSettingsInUserFile = false;
+ rhs.SaveServerSettingsInUserFile = true;
+
+ Assert.AreNotEqual(lhs, rhs);
+ }
+
+ [Test]
+ public void Equals_CustomServerUrlPropertyIsDifferent_ReturnsFalse()
+ {
+ CreateTwoWebProjectProperties();
+ lhs.CustomServerUrl = "/a";
+ rhs.CustomServerUrl = "/test";
+
+ Assert.AreNotEqual(lhs, rhs);
+ }
+
+ [Test]
+ public void Equals_UseCustomServerPropertyIsDifferent_ReturnsFalse()
+ {
+ CreateTwoWebProjectProperties();
+ lhs.UseCustomServer = false;
+ rhs.UseCustomServer = true;
+
+ Assert.AreNotEqual(lhs, rhs);
+ }
+
+ [Test]
+ public void ToString_NewInstance_ReturnsMainPropertyValues()
+ {
+ CreateTwoWebProjectProperties();
+ lhs.UseIISExpress = false;
+ lhs.UseIIS = true;
+ lhs.IISUrl = "http://localhost";
+ lhs.SaveServerSettingsInUserFile = true;
+
+ string text = lhs.ToString();
+
+ string expectedText =
+ "[WebProjectProperties IISUrl=\"http://localhost\", UseIISExpress=False, UseIIS=True, SaveServerSettingsInUserFile=True]";
+
+ Assert.AreEqual(expectedText, text);
+ }
+
+ [Test]
+ public void Constructor_WebPropertyPropertiesXElementHasNoChildElements_ExceptionNotThrown()
+ {
+ var element = new XElement("WebPropertyProperties");
+ var properties = new WebProjectProperties(element);
+
+ Assert.AreEqual(String.Empty, properties.IISUrl);
+ Assert.AreEqual(String.Empty, properties.CustomServerUrl);
+ }
+
+ [Test]
+ public void Constructor_XElementHasCustomServerUrl_CustomServerUrlPropertyPopulated()
+ {
+ var properties = new WebProjectProperties() { CustomServerUrl = "/Test" };
+ properties = new WebProjectProperties(properties.ToXElement());
+
+ Assert.AreEqual("/Test", properties.CustomServerUrl);
+ }
+
+ [Test]
+ public void Constructor_XElementHasAutoAssignPort_AutoAssignPortPropertyPopulated()
+ {
+ var properties = new WebProjectProperties() { AutoAssignPort = true };
+ properties = new WebProjectProperties(properties.ToXElement());
+
+ Assert.IsTrue(properties.AutoAssignPort);
+ }
+
+ [Test]
+ public void Constructor_XElementHasDevelopmentServerVPath_DevelopmentServerVPathPropertyPopulated()
+ {
+ var properties = new WebProjectProperties() { DevelopmentServerVPath = "Test" };
+ properties = new WebProjectProperties(properties.ToXElement());
+
+ Assert.AreEqual("Test", properties.DevelopmentServerVPath);
+ }
+
+ [Test]
+ public void Constructor_XElementHasNTLMAuthentication_NTLMAuthenticationPropertyPopulated()
+ {
+ var properties = new WebProjectProperties() { NTLMAuthentication = true };
+ properties = new WebProjectProperties(properties.ToXElement());
+
+ Assert.IsTrue(properties.NTLMAuthentication);
+ }
+
+ [Test]
+ public void Constructor_XElementHasSaveServerSettingsInUserFile_SaveServerSettingsInUserFilePropertyPopulated()
+ {
+ var properties = new WebProjectProperties() { SaveServerSettingsInUserFile = true };
+ properties = new WebProjectProperties(properties.ToXElement());
+
+ Assert.IsTrue(properties.SaveServerSettingsInUserFile);
+ }
+
+ [Test]
+ public void Constructor_XElementHasUseIIS_UseIISPropertyPopulated()
+ {
+ var properties = new WebProjectProperties() { UseIIS = true };
+ properties = new WebProjectProperties(properties.ToXElement());
+
+ Assert.IsTrue(properties.UseIIS);
+ }
+
+ [Test]
+ public void Constructor_XElementHasUseCustomServer_UseCustomServerPropertyPopulated()
+ {
+ var properties = new WebProjectProperties() { UseCustomServer = true };
+ properties = new WebProjectProperties(properties.ToXElement());
+
+ Assert.IsTrue(properties.UseCustomServer);
+ }
+
+ [Test]
+ public void IsConfigured_UseIISAndUseIISExpressAreBothFalse_ReturnsFalse()
+ {
+ var properties = new WebProjectProperties() { UseIISExpress = false, UseIIS = false };
+
+ bool configured = properties.IsConfigured();
+
+ Assert.IsFalse(configured);
+ }
+
+ [Test]
+ public void IsConfigured_UseIISExpressIsTrueAndIISUrlIsValidUrl_ReturnsTrue()
+ {
+ var properties = new WebProjectProperties
+ {
+ UseIISExpress = true,
+ IISUrl = "http://localhost:8080/"
+ };
+
+ bool configured = properties.IsConfigured();
+
+ Assert.IsTrue(configured);
+ }
+
+ [Test]
+ public void IsConfigured_UseIISExpressIsTrueAndIISUrlIsEmptyString_ReturnsFalse()
+ {
+ var properties = new WebProjectProperties
+ {
+ UseIISExpress = true,
+ IISUrl = String.Empty
+ };
+
+ bool configured = properties.IsConfigured();
+
+ Assert.IsFalse(configured);
+ }
+
+ [Test]
+ public void IsConfigured_UseIISIsTrueAndIISUrlIsNull_ReturnsFalse()
+ {
+ var properties = new WebProjectProperties
+ {
+ UseIISExpress = true,
+ IISUrl = null
+ };
+
+ bool configured = properties.IsConfigured();
+
+ Assert.IsFalse(configured);
+ }
+ }
+}
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/WebProjectTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/WebProjectTests.cs
new file mode 100644
index 0000000000..729f19e4db
--- /dev/null
+++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/WebProjectTests.cs
@@ -0,0 +1,276 @@
+// 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.IO;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Xml;
+using System.Xml.Linq;
+
+using AspNet.Mvc.Tests.Helpers;
+using ICSharpCode.AspNet.Mvc;
+using ICSharpCode.SharpDevelop.Internal.Templates;
+using ICSharpCode.SharpDevelop.Project;
+using NUnit.Framework;
+using Rhino.Mocks;
+
+namespace AspNet.Mvc.Tests
+{
+ [TestFixture]
+ public class WebProjectTests
+ {
+ MSBuildBasedProject msbuildProject;
+ WebProject webProject;
+
+ void CreateMSBuildProject()
+ {
+ msbuildProject = MSBuildProjectHelper.CreateCSharpProject();
+ }
+
+ void CreateWebProject()
+ {
+ CreateMSBuildProject();
+ CreateWebProject(msbuildProject);
+ }
+
+ void CreateWebProject(MSBuildBasedProject msbuildProject)
+ {
+ webProject = new WebProject(msbuildProject);
+ }
+
+ void CreateWebProjectFromMSBuildProjectWithWebProjectProperties(WebProjectProperties properties)
+ {
+ CreateWebProject();
+ webProject.UpdateWebProjectProperties(properties);
+ CreateWebProject(msbuildProject);
+ }
+
+ void CreateWebProjectFromMSBuildProjectWithWebProjectProperties()
+ {
+ CreateWebProjectFromMSBuildProjectWithWebProjectProperties(new WebProjectProperties());
+ }
+
+ string GetMSBuildProjectExtensions()
+ {
+ var fileContentsBuilder = new StringBuilder();
+ var stringWriter = new StringWriter(fileContentsBuilder);
+ msbuildProject.MSBuildProjectFile.Save(stringWriter);
+
+ return GetProjectExtensions(fileContentsBuilder.ToString());
+ }
+
+ string GetProjectExtensions(string text)
+ {
+ return Regex.Match(
+ text,
+ ".*?",
+ RegexOptions.Singleline).Value;
+ }
+
+ void SetUseIISExpressInMSBuildProjectToTrue()
+ {
+ msbuildProject.SetProperty("UseIISExpress", "True");
+ }
+
+ void AddVisualStudioExtensionWithChildElement(string childElementName)
+ {
+ msbuildProject.SaveProjectExtensions(VisualStudioProjectExtension.ProjectExtensionName, new XElement(childElementName));
+ }
+
+ [Test]
+ public void Regex_GetMSBuildProjectExtensions_ReturnsProjectExtensionsXml()
+ {
+ string text =
+ "\r\n" +
+ " \r\n" +
+ " \r\n" +
+ " \r\n" +
+ " \r\n" +
+ "";
+
+ string result = GetProjectExtensions(text);
+
+ string expectedResult =
+ " \r\n" +
+ " \r\n" +
+ " \r\n" +
+ " ";
+
+ Assert.AreNotEqual(expectedResult, result);
+ }
+
+ [Test]
+ public void Regex_GetMSBuildProjectExtensionsFromFullProjectXml_ReturnsProjectExtensionsXml()
+ {
+ string text =
+@"
+
+
+ {20D05950-C385-4093-8EAF-ADF36EAA54BE}
+ Debug
+ x86
+
+
+ x86
+
+
+
+ True False 7777 / http://localhost:7777/test False False False
+
+
+";
+
+ string result = GetProjectExtensions(text);
+
+ string expectedResult =
+@"
+
+ True False 7777 / http://localhost:7777/test False False False
+
+ ";
+
+ Assert.AreEqual(expectedResult, result);
+ }
+
+ [Test]
+ public void GetWebProjectProperties_NoExistingWebProjectPropertiesInMSBuildProject_ReturnsWebProjectPropertiesWithDefaultValues()
+ {
+ CreateWebProject();
+ WebProjectProperties properties = webProject.GetWebProjectProperties();
+
+ Assert.AreEqual(WebProject.DefaultProperties, properties);
+ }
+
+ [Test]
+ public void UpdateWebProjectProperties_SaveServerSettingsInUserFileIsFalse_SavesPropertiesToMainProjectFile()
+ {
+ CreateWebProject();
+ WebProjectProperties properties = webProject.GetWebProjectProperties();
+ properties.SaveServerSettingsInUserFile = false;
+ properties.DevelopmentServerPort = 7777;
+ properties.DevelopmentServerVPath = "/";
+ properties.IISUrl = "http://localhost:7777/test";
+ properties.UseIIS = true;
+
+ webProject.UpdateWebProjectProperties(properties);
+
+ string msbuildProjectFileContents = GetMSBuildProjectExtensions();
+
+ string expectedMSBuildProjectFileContents =
+@"
+
+
+
+ True
+ False
+ 7777
+ /
+ http://localhost:7777/test
+ False
+ False
+
+ False
+
+
+
+ ";
+
+ Assert.AreEqual(expectedMSBuildProjectFileContents, msbuildProjectFileContents);
+ }
+
+ [Test]
+ public void GetWebProjectProperties_MSBuildHasWebProjectProperties_ReadsWebProjectPropertiesFromMSBuildProject()
+ {
+ var expectedProperties = new WebProjectProperties
+ {
+ DevelopmentServerPort = 8989,
+ IISUrl = "http://localhost:8989/test"
+ };
+ CreateWebProjectFromMSBuildProjectWithWebProjectProperties(expectedProperties);
+
+ WebProjectProperties properties = webProject.GetWebProjectProperties();
+
+ Assert.AreEqual(expectedProperties, properties);
+ }
+
+ [Test]
+ public void GetWebProjectProperties_MSBuildHasUseIISExpressPropertySetToTrue_UseIISExpressPropertyIsTrue()
+ {
+ CreateWebProjectFromMSBuildProjectWithWebProjectProperties();
+ SetUseIISExpressInMSBuildProjectToTrue();
+
+ var properties = webProject.GetWebProjectProperties();
+
+ var expectedProperties = new WebProjectProperties { UseIISExpress = true };
+
+ Assert.AreEqual(expectedProperties, properties);
+ }
+
+ [Test]
+ public void UpdateWebProjectProperties_UseIISExpressIsTrue_MSBuildProjectIISExpressPropertySetToTrue()
+ {
+ CreateWebProject();
+ var properties = new WebProjectProperties { UseIISExpress = true };
+
+ webProject.UpdateWebProjectProperties(properties);
+
+ string value = msbuildProject.GetEvaluatedProperty("UseIISExpress");
+
+ Assert.AreEqual("True", value);
+ }
+
+ [Test]
+ public void UseIISExpress_MSBuildUseIISExpressIsTrue_ReturnsTrue()
+ {
+ CreateWebProject();
+ msbuildProject.SetProperty("UseIISExpress", "True");
+
+ bool result = webProject.UseIISExpress;
+
+ Assert.IsTrue(result);
+ }
+
+ [Test]
+ public void UseIISExpress_MSBuildHasNoUseIISExpressProperty_ReturnsFalse()
+ {
+ CreateWebProject();
+
+ bool result = webProject.UseIISExpress;
+
+ Assert.IsFalse(result);
+ }
+
+ [Test]
+ public void HasWebProjectProperties_MSBuildHasNoWebProjectProperties_ReturnsFalse()
+ {
+ CreateWebProject();
+
+ bool result = webProject.HasWebProjectProperties();
+
+ Assert.IsFalse(result);
+ }
+
+ [Test]
+ public void HasWebProjectProperties_MSBuildHasWebProjectProperties_ReturnsTrue()
+ {
+ CreateWebProjectFromMSBuildProjectWithWebProjectProperties();
+
+ bool result = webProject.HasWebProjectProperties();
+
+ Assert.IsTrue(result);
+ }
+
+ [Test]
+ public void HasWebProjectProperties_MSBuildProjectDoesNotHaveWebProjectPropertiesButHasVisualStudioExtension_ReturnsFalse()
+ {
+ CreateMSBuildProject();
+ AddVisualStudioExtensionWithChildElement("Test");
+ CreateWebProject(msbuildProject);
+
+ bool contains = webProject.HasWebProjectProperties();
+
+ Assert.IsFalse(contains);
+ }
+ }
+}
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/lib/Rhino.Mocks.dll b/src/AddIns/BackendBindings/AspNet.Mvc/Test/lib/Rhino.Mocks.dll
deleted file mode 100644
index 3fc4b2ae43..0000000000
Binary files a/src/AddIns/BackendBindings/AspNet.Mvc/Test/lib/Rhino.Mocks.dll and /dev/null differ
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/lib/Rhino.Mocks.license.txt b/src/AddIns/BackendBindings/AspNet.Mvc/Test/lib/Rhino.Mocks.license.txt
deleted file mode 100644
index 011d4156d5..0000000000
--- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/lib/Rhino.Mocks.license.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2005 - 2009 Ayende Rahien (ayende@ayende.com)
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- * Neither the name of Ayende Rahien nor the names of its
- contributors may be used to endorse or promote products derived from this
- software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/DebugOptions.xaml.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/DebugOptions.xaml.cs
index fe3a259636..ee4d2a36fa 100644
--- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/DebugOptions.xaml.cs
+++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/DebugOptions.xaml.cs
@@ -29,14 +29,6 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
public DebugOptions()
{
InitializeComponent();
-
- if (ProjectService.CurrentProject is CompilableProject) {
- if (((CompilableProject)ProjectService.CurrentProject).IsWebProject) {
- IsWebProject = Visibility.Visible;
- } else {
- IsWebProject = Visibility.Hidden;
- }
- }
}
@@ -74,18 +66,6 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
}
}
-
- Visibility isWebControlVisible;
-
- public Visibility IsWebProject {
- get { return isWebControlVisible; }
- set {
- isWebControlVisible = value;
- OnPropertyChanged("IsWebProject");
- }
- }
-
-
void ExternalProgramButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
string fileFilter = "${res:SharpDevelop.FileFilter.ExecutableFiles}|*.exe;*.com;*.pif;*.bat;*.cmd";
diff --git a/src/Main/Base/Project/Src/Project/AbstractProject.cs b/src/Main/Base/Project/Src/Project/AbstractProject.cs
index 208a93c1ec..d63a2ae9aa 100644
--- a/src/Main/Base/Project/Src/Project/AbstractProject.cs
+++ b/src/Main/Base/Project/Src/Project/AbstractProject.cs
@@ -356,13 +356,6 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
- [Browsable(false)]
- public virtual bool IsWebProject {
- get {
- return false;
- }
- }
-
public void Start(bool withDebugging)
{
GetOrCreateBehavior().Start(withDebugging);
@@ -578,6 +571,11 @@ namespace ICSharpCode.SharpDevelop.Project
{
}
+ public virtual bool ContainsProjectExtension(string name)
+ {
+ return false;
+ }
+
[Browsable(false)]
public Properties ProjectSpecificProperties {
get; internal set;
diff --git a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs
index 14625caf36..b8acbfe405 100644
--- a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs
+++ b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs
@@ -8,9 +8,11 @@ using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
+using System.Text;
using System.Threading;
using System.Xml;
using System.Xml.Linq;
+
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Internal.Templates;
@@ -1530,28 +1532,59 @@ namespace ICSharpCode.SharpDevelop.Project
#endregion
#region ProjectExtensions
+ public override bool ContainsProjectExtension(string name)
+ {
+ ProjectExtensionsElement projectExtensions = GetExistingProjectExtensionsElement();
+ if (projectExtensions != null) {
+ return projectExtensions[name] != null;
+ }
+ return false;
+ }
+
public override void SaveProjectExtensions(string name, XElement element)
{
lock (SyncRoot) {
- var existing = projectFile.Children.OfType().FirstOrDefault();
+ ProjectExtensionsElement existing = GetExistingProjectExtensionsElement();
if (existing == null) {
existing = projectFile.CreateProjectExtensionsElement();
projectFile.AppendChild(existing);
}
- existing[name] = element.ToString();
+ existing[name] = FormatProjectExtension(element);
}
}
public override XElement LoadProjectExtensions(string name)
{
lock (SyncRoot) {
- var existing = projectFile.Children.OfType().FirstOrDefault();
+ ProjectExtensionsElement existing = GetExistingProjectExtensionsElement();
if (existing == null) {
existing = projectFile.CreateProjectExtensionsElement();
+ return new XElement(name);
}
- return XElement.Parse(existing[name]) ?? new XElement(name);
+ return XElement.Parse(existing[name]);
}
}
- #endregion
+
+ ProjectExtensionsElement GetExistingProjectExtensionsElement()
+ {
+ return projectFile.Children.OfType().FirstOrDefault();
+ }
+
+ string FormatProjectExtension(XElement element)
+ {
+ var settings = new XmlWriterSettings {
+ Indent = true,
+ IndentChars = " ",
+ NewLineChars = "\r\n ",
+ NewLineHandling = NewLineHandling.Replace,
+ OmitXmlDeclaration = true
+ };
+ var formattedText = new StringBuilder();
+ using (XmlWriter writer = XmlWriter.Create(new StringWriter(formattedText), settings)) {
+ element.WriteTo(writer);
+ }
+ return formattedText.ToString();
+ }
+ #endregion
}
}
diff --git a/src/Main/Base/Test/ServiceReferences/MSBuildBasedProjectTests.cs b/src/Main/Base/Test/ServiceReferences/MSBuildBasedProjectTests.cs
index bca1d2b922..de5b0efafa 100644
--- a/src/Main/Base/Test/ServiceReferences/MSBuildBasedProjectTests.cs
+++ b/src/Main/Base/Test/ServiceReferences/MSBuildBasedProjectTests.cs
@@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
+using System.Xml.Linq;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Tests.WebReferences;
using NUnit.Framework;
@@ -48,5 +49,26 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
Assert.IsNotNull(projectItem);
}
+
+ [Test]
+ public void ContainsProjectExtension_ProjectDoesNotContainsExtension_ReturnsFalse()
+ {
+ CreateProject();
+
+ bool contains = project.ContainsProjectExtension("UNKNOWN_EXTENSION");
+
+ Assert.IsFalse(contains);
+ }
+
+ [Test]
+ public void ContainsProjectExtension_ProjectContainsExtension_ReturnsTrue()
+ {
+ CreateProject();
+ project.SaveProjectExtensions("Test", new XElement("MyProjectExtension"));
+
+ bool contains = project.ContainsProjectExtension("Test");
+
+ Assert.IsTrue(contains);
+ }
}
}