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" /> - + + + + +