Browse Source

Implemented SD-1457 - Client profile.

Now creating or upgrading a project will adjust the <supportedVersion> in the app.config
pull/1/head
Daniel Grunwald 16 years ago
parent
commit
4ef945f0f7
  1. 2
      src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Extensions.cs
  2. 2
      src/AddIns/DisplayBindings/ClassDiagram/ClassDiagramAddin/Src/ShowClassDiagramCommand.cs
  3. 2
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/ProjectTools.cs
  4. 4
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  5. 2
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.cs
  6. 17
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPad.cs
  7. 52
      src/Main/Base/Project/Src/Project/CompilableProject.cs
  8. 2
      src/Main/Base/Project/Src/Project/CustomTool.cs
  9. 74
      src/Main/Base/Project/Src/Project/TargetFramework.cs
  10. 6
      src/Main/Base/Project/Src/Services/File/OpenedFile.cs
  11. 4
      src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs
  12. 200
      src/Main/Base/Project/Src/Util/FakeXmlViewContent.cs

2
src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Extensions.cs

@ -37,7 +37,7 @@ namespace ICSharpCode.Profiler.AddIn @@ -37,7 +37,7 @@ namespace ICSharpCode.Profiler.AddIn
if (!project.ReadOnly) {
FileProjectItem file = new FileProjectItem(project, ItemType.Content, "ProfilingSessions\\" + Path.GetFileName(path));
ProjectService.AddProjectItem(project, file);
ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView();
ProjectBrowserPad.RefreshViewAsync();
project.Save();
}
};

2
src/AddIns/DisplayBindings/ClassDiagram/ClassDiagramAddin/Src/ShowClassDiagramCommand.cs

@ -59,7 +59,7 @@ namespace ClassDiagramAddin @@ -59,7 +59,7 @@ namespace ClassDiagramAddin
FileProjectItem fpi = new FileProjectItem(p, ItemType.Content);
fpi.FileName = filename;
ProjectService.AddProjectItem(p, fpi);
ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView();
ProjectBrowserPad.RefreshViewAsync();
p.Save();
FileService.OpenFile(filename);
}

2
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/ProjectTools.cs

@ -33,7 +33,7 @@ namespace ICSharpCode.WpfDesign.AddIn @@ -33,7 +33,7 @@ namespace ICSharpCode.WpfDesign.AddIn
ProjectService.AddProjectItem(project,fileProjectItem);
}
project.Save();
ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView();
ProjectBrowserPad.RefreshViewAsync();
}
/// <summary>

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

@ -62,6 +62,9 @@ @@ -62,6 +62,9 @@
<Reference Include="System.Xaml" />
<Reference Include="Microsoft.Build.Framework" />
<Reference Include="Microsoft.Build" />
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
@ -727,6 +730,7 @@ @@ -727,6 +730,7 @@
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\AsyncDiscoveryState.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\DiscoveryNetworkCredential.cs" />
<Compile Include="Src\Services\ProjectService\ProjectLoader.cs" />
<Compile Include="Src\Util\FakeXmlViewContent.cs" />
<Compile Include="Src\Util\TreeNode.cs" />
<Compile Include="Src\Util\NativeMethods.cs" />
<Compile Include="Src\Util\ProcessRunnerException.cs" />

2
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.cs

@ -129,7 +129,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -129,7 +129,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
FileProjectItem newItem = new FileProjectItem(project, ItemType.None);
newItem.Include = "app.manifest";
ProjectService.AddProjectItem(project, newItem);
ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView();
ProjectBrowserPad.RefreshViewAsync();
}
FileService.OpenFile(manifestFile);

17
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPad.cs

@ -255,5 +255,22 @@ namespace ICSharpCode.SharpDevelop.Project @@ -255,5 +255,22 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
#endregion
static bool refreshViewEnqueued;
public static void RefreshViewAsync()
{
WorkbenchSingleton.AssertMainThread();
if (refreshViewEnqueued)
return;
refreshViewEnqueued = true;
WorkbenchSingleton.SafeThreadAsyncCall(
delegate {
refreshViewEnqueued = false;
if (instance != null) {
instance.ProjectBrowserControl.RefreshView();
}
});
}
}
}

52
src/Main/Base/Project/Src/Project/CompilableProject.cs

@ -1,6 +1,8 @@ @@ -1,6 +1,8 @@
// 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.Xml.Linq;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project.Converter;
using System;
using System.Collections.Generic;
@ -11,6 +13,7 @@ using System.Linq; @@ -11,6 +13,7 @@ using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Internal.Templates;
using ICSharpCode.SharpDevelop.Util;
namespace ICSharpCode.SharpDevelop.Project
{
@ -430,6 +433,8 @@ namespace ICSharpCode.SharpDevelop.Project @@ -430,6 +433,8 @@ namespace ICSharpCode.SharpDevelop.Project
if (fx != null && (fx.IsBasedOn(TargetFramework.Net40) || fx.IsBasedOn(TargetFramework.Net40Client))) {
AddDotnet40References();
}
if (fx != null)
UpdateAppConfig(fx);
base.ProjectCreationComplete();
}
@ -545,6 +550,8 @@ namespace ICSharpCode.SharpDevelop.Project @@ -545,6 +550,8 @@ namespace ICSharpCode.SharpDevelop.Project
SetToolsVersion(newVersion.MSBuildVersion.Major + "." + newVersion.MSBuildVersion.Minor);
}
if (newFramework != null) {
UpdateAppConfig(newFramework);
ClientProfileTargetFramework clientProfile = newFramework as ClientProfileTargetFramework;
if (clientProfile != null) {
newFramework = clientProfile.FullFramework;
@ -572,6 +579,51 @@ namespace ICSharpCode.SharpDevelop.Project @@ -572,6 +579,51 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
}
void UpdateAppConfig(TargetFramework newFramework)
{
// When changing the target framework, update any existing app.config
// Also, for applications (not libraries), create an app.config is it is required for the target framework
bool createAppConfig = newFramework.RequiresAppConfigEntry && (this.OutputType != OutputType.Library && this.OutputType != OutputType.Module);
string appConfigFileName = Path.Combine(this.Directory, "app.config");
if (!File.Exists(appConfigFileName)) {
if (createAppConfig) {
File.WriteAllText(appConfigFileName,
"<?xml version=\"1.0\"?>" + Environment.NewLine +
"<configuration>" + Environment.NewLine
+ "</configuration>");
} else {
return;
}
}
if (!IsFileInProject(appConfigFileName)) {
FileProjectItem fpi = new FileProjectItem(this, ItemType.None, "app.config");
ProjectService.AddProjectItem(this, fpi);
FileService.FireFileCreated(appConfigFileName, false);
ProjectBrowserPad.RefreshViewAsync();
}
using (FakeXmlViewContent xml = new FakeXmlViewContent(appConfigFileName)) {
if (xml.Document != null) {
XElement configuration = xml.Document.Root;
XElement startup = configuration.Element("startup");
if (startup == null) {
startup = new XElement("startup");
configuration.AddFirst(startup);
}
XElement supportedRuntime = startup.Element("supportedRuntime");
if (supportedRuntime == null) {
supportedRuntime = new XElement("supportedRuntime");
startup.AddFirst(supportedRuntime);
}
supportedRuntime.SetAttributeValue("version", newFramework.SupportedRuntimeVersion);
supportedRuntime.SetAttributeValue("sku", newFramework.SupportedSku);
}
}
}
#endregion
}
}

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

@ -137,7 +137,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -137,7 +137,7 @@ namespace ICSharpCode.SharpDevelop.Project
ProjectService.AddProjectItem(project, outputItem);
FileService.FireFileCreated(outputFileName, false);
project.Save();
ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView();
ProjectBrowserPad.RefreshViewAsync();
}
return outputItem;
}

74
src/Main/Base/Project/Src/Project/TargetFramework.cs

@ -7,15 +7,35 @@ namespace ICSharpCode.SharpDevelop.Project @@ -7,15 +7,35 @@ namespace ICSharpCode.SharpDevelop.Project
{
public class TargetFramework
{
public readonly static TargetFramework Net20 = new TargetFramework("v2.0", ".NET Framework 2.0") { MinimumMSBuildVersion = new Version(2, 0) };
public readonly static TargetFramework Net30 = new TargetFramework("v3.0", ".NET Framework 3.0") { BasedOn = Net20, MinimumMSBuildVersion = new Version(3, 5) };
public readonly static TargetFramework Net35 = new TargetFramework("v3.5", ".NET Framework 3.5") { BasedOn = Net30, MinimumMSBuildVersion = new Version(3, 5) };
public readonly static TargetFramework Net35Client = new ClientProfileTargetFramework(Net35);
public readonly static TargetFramework Net40 = new TargetFramework("v4.0", ".NET Framework 4.0") { BasedOn = Net35, MinimumMSBuildVersion = new Version(4, 0) };
public readonly static TargetFramework Net40Client = new ClientProfileTargetFramework(Net40) { BasedOn = Net35Client };
public readonly static TargetFramework Net20 = new TargetFramework("v2.0", ".NET Framework 2.0") {
SupportedRuntimeVersion = "v2.0.50727",
MinimumMSBuildVersion = new Version(2, 0)
};
public readonly static TargetFramework Net30 = new TargetFramework("v3.0", ".NET Framework 3.0") {
SupportedRuntimeVersion = "v2.0.50727",
BasedOn = Net20,
MinimumMSBuildVersion = new Version(3, 5)
};
public readonly static TargetFramework Net35 = new TargetFramework("v3.5", ".NET Framework 3.5") {
SupportedRuntimeVersion = "v2.0.50727",
BasedOn = Net30,
MinimumMSBuildVersion = new Version(3, 5)
};
public readonly static TargetFramework Net35Client = new ClientProfileTargetFramework(Net35) {
RequiresAppConfigEntry = true
};
public readonly static TargetFramework Net40 = new TargetFramework("v4.0", ".NET Framework 4.0") {
BasedOn = Net35,
MinimumMSBuildVersion = new Version(4, 0),
SupportedSku = ".NETFramework,Version=v4.0",
RequiresAppConfigEntry = true
};
public readonly static TargetFramework Net40Client = new ClientProfileTargetFramework(Net40) {
BasedOn = Net35Client
};
public readonly static TargetFramework[] TargetFrameworks = {
Net40, Net35, Net30, Net20, Net40Client, Net35Client
Net40, Net40Client, Net35, Net35Client, Net30, Net20
};
public readonly static TargetFramework DefaultTargetFramework = Net40Client;
@ -31,6 +51,13 @@ namespace ICSharpCode.SharpDevelop.Project @@ -31,6 +51,13 @@ namespace ICSharpCode.SharpDevelop.Project
string name, displayName;
public TargetFramework(string name, string displayName)
{
this.name = name;
this.displayName = displayName;
this.SupportedRuntimeVersion = name;
}
public string Name {
get { return name; }
}
@ -39,7 +66,29 @@ namespace ICSharpCode.SharpDevelop.Project @@ -39,7 +66,29 @@ namespace ICSharpCode.SharpDevelop.Project
get { return displayName; }
}
/// <summary>
/// Supported runtime version string for app.config
/// </summary>
public string SupportedRuntimeVersion { get; set; }
/// <summary>
/// Supported SKU string for app.config.
/// </summary>
public string SupportedSku { get; set; }
/// <summary>
/// Specifies whether this target framework requires an explicit app.config entry.
/// </summary>
public bool RequiresAppConfigEntry { get; set; }
/// <summary>
/// Gets the minimum MSBuild version required to build projects with this target framework.
/// </summary>
public Version MinimumMSBuildVersion { get; set; }
/// <summary>
/// Gets the previous release of this target framework.
/// </summary>
public TargetFramework BasedOn { get; set; }
public bool IsBasedOn(TargetFramework potentialBase)
@ -53,12 +102,6 @@ namespace ICSharpCode.SharpDevelop.Project @@ -53,12 +102,6 @@ namespace ICSharpCode.SharpDevelop.Project
return false;
}
public TargetFramework(string name, string displayName)
{
this.name = name;
this.displayName = displayName;
}
public override string ToString()
{
return DisplayName;
@ -73,7 +116,12 @@ namespace ICSharpCode.SharpDevelop.Project @@ -73,7 +116,12 @@ namespace ICSharpCode.SharpDevelop.Project
: base(fullFramework.Name + "Client", fullFramework.DisplayName + " Client Profile")
{
this.FullFramework = fullFramework;
this.SupportedRuntimeVersion = fullFramework.SupportedRuntimeVersion;
this.MinimumMSBuildVersion = fullFramework.MinimumMSBuildVersion;
if (fullFramework.SupportedSku != null)
this.SupportedSku = fullFramework.SupportedSku + ",Profile=Client";
else
this.SupportedSku = "Client";
}
}
}

6
src/Main/Base/Project/Src/Services/File/OpenedFile.cs

@ -259,8 +259,12 @@ namespace ICSharpCode.SharpDevelop @@ -259,8 +259,12 @@ namespace ICSharpCode.SharpDevelop
}
protected void SwitchedToView(IViewContent newView)
public void SwitchedToView(IViewContent newView)
{
if (newView == null)
throw new ArgumentNullException("newView");
if (currentView == newView)
return;
if (currentView != null) {
if (newView.SupportsSwitchToThisWithoutSaveLoad(this, currentView)
|| currentView.SupportsSwitchFromThisWithoutSaveLoad(this, newView))

4
src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs

@ -86,7 +86,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -86,7 +86,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
ProjectService.AddProjectItem(project, projectItem);
FileService.FireFileCreated(newInterfaceFileName, false);
project.Save();
ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView();
ProjectBrowserPad.RefreshViewAsync();
}
}
@ -458,7 +458,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -458,7 +458,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
ProjectService.AddProjectItem(project, projectItem);
FileService.FireFileCreated(newFileName, false);
project.Save();
ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView();
ProjectBrowserPad.RefreshViewAsync();
}
}

200
src/Main/Base/Project/Src/Util/FakeXmlViewContent.cs

@ -0,0 +1,200 @@ @@ -0,0 +1,200 @@
// 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;
using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.SharpDevelop.Util
{
/// <summary>
/// IViewContent implementation that opens a file as XDocument and allows editing it, while synchronizing changes with any open editor.
/// </summary>
public sealed class FakeXmlViewContent : IViewContent
{
public FakeXmlViewContent(string fileName)
{
this.PrimaryFile = FileService.GetOrCreateOpenedFile(fileName);
this.oldView = this.PrimaryFile.CurrentView;
this.PrimaryFile.RegisterView(this);
this.PrimaryFile.SwitchedToView(this);
}
IViewContent oldView;
XDocument document;
byte[] fileData;
/// <summary>
/// Gets the document.
/// Can return null if there were load errors.
/// </summary>
public XDocument Document {
get { return document; }
}
public void Dispose()
{
if (this.IsDisposed)
return;
this.IsDisposed = true;
if (document != null) {
this.PrimaryFile.MakeDirty();
if (this.PrimaryFile.RegisteredViewContents.Count == 1)
this.PrimaryFile.SaveToDisk();
}
this.PrimaryFile.UnregisterView(this);
if (oldView != null)
this.PrimaryFile.SwitchedToView(oldView);
if (Disposed != null)
Disposed(this, EventArgs.Empty);
}
void IViewContent.Save(OpenedFile file, Stream stream)
{
if (document != null)
document.Save(stream, SaveOptions.DisableFormatting);
else if (fileData != null)
stream.Write(fileData, 0, fileData.Length);
}
void IViewContent.Load(OpenedFile file, Stream stream)
{
document = null;
fileData = null;
try {
document = XDocument.Load(stream, LoadOptions.PreserveWhitespace);
} catch (XmlException) {
stream.Position = 0;
fileData = new byte[(int)stream.Length];
int pos = 0;
while (pos < fileData.Length) {
int c = stream.Read(fileData, pos, fileData.Length - pos);
if (c == 0) break;
pos += c;
}
}
}
#region IViewContent stub implementation
event EventHandler IViewContent.TabPageTextChanged {
add { }
remove { }
}
event EventHandler IViewContent.TitleNameChanged {
add { }
remove { }
}
public event EventHandler Disposed;
event EventHandler ICanBeDirty.IsDirtyChanged {
add { }
remove { }
}
object IViewContent.Control {
get {
throw new NotImplementedException();
}
}
object IViewContent.InitiallyFocusedControl {
get {
throw new NotImplementedException();
}
}
IWorkbenchWindow IViewContent.WorkbenchWindow {
get {
throw new NotImplementedException();
}
set {
throw new NotImplementedException();
}
}
string IViewContent.TabPageText {
get {
throw new NotImplementedException();
}
}
string IViewContent.TitleName {
get {
throw new NotImplementedException();
}
}
System.Collections.Generic.IList<OpenedFile> IViewContent.Files {
get { return new [] { PrimaryFile }; }
}
public OpenedFile PrimaryFile { get; set; }
ICSharpCode.Core.FileName IViewContent.PrimaryFileName {
get { return PrimaryFile.FileName; }
}
public bool IsDisposed { get; private set; }
bool IViewContent.IsReadOnly {
get {
throw new NotImplementedException();
}
}
bool IViewContent.IsViewOnly {
get {
throw new NotImplementedException();
}
}
System.Collections.Generic.ICollection<IViewContent> IViewContent.SecondaryViewContents {
get {
throw new NotImplementedException();
}
}
bool ICanBeDirty.IsDirty {
get {
throw new NotImplementedException();
}
}
INavigationPoint IViewContent.BuildNavPoint()
{
throw new NotImplementedException();
}
bool IViewContent.SupportsSwitchFromThisWithoutSaveLoad(OpenedFile file, IViewContent newView)
{
return false;
}
bool IViewContent.SupportsSwitchToThisWithoutSaveLoad(OpenedFile file, IViewContent oldView)
{
return false;
}
void IViewContent.SwitchFromThisWithoutSaveLoad(OpenedFile file, IViewContent newView)
{
throw new NotImplementedException();
}
void IViewContent.SwitchToThisWithoutSaveLoad(OpenedFile file, IViewContent oldView)
{
throw new NotImplementedException();
}
object IServiceProvider.GetService(Type serviceType)
{
return null;
}
#endregion
}
}
Loading…
Cancel
Save