Browse Source

Implemented UpgradeView.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4994 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 16 years ago
parent
commit
1b10fc0c20
  1. 31
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs
  2. 119
      src/Main/Base/Project/Src/Project/CompilableProject.cs
  3. 15
      src/Main/Base/Project/Src/Project/Converter/IUpgradableProject.cs
  4. 24
      src/Main/Base/Project/Src/Project/Converter/UpgradeView.xaml
  5. 230
      src/Main/Base/Project/Src/Project/Converter/UpgradeView.xaml.cs
  6. 8
      src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs
  7. 2
      src/Main/Base/Project/Src/Project/TargetFramework.cs

31
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs

@ -5,15 +5,18 @@ @@ -5,15 +5,18 @@
// <version>$Revision$</version>
// </file>
using ICSharpCode.SharpDevelop;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.CSharp;
using ICSharpCode.SharpDevelop.Internal.Templates;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Project.Converter;
namespace CSharpBinding
{
@ -90,6 +93,30 @@ namespace CSharpBinding @@ -90,6 +93,30 @@ namespace CSharpBinding
}
}
static readonly CompilerVersion msbuild20 = new CompilerVersion(new Version(2, 0), "C# 2.0");
static readonly CompilerVersion msbuild35 = new CompilerVersion(new Version(3, 5), "C# 3.0");
static readonly CompilerVersion msbuild40 = new CompilerVersion(new Version(4, 0), "C# 4.0");
public override CompilerVersion CurrentCompilerVersion {
get {
switch (MinimumSolutionVersion) {
case Solution.SolutionVersionVS2005:
return msbuild20;
case Solution.SolutionVersionVS2008:
return msbuild35;
case Solution.SolutionVersionVS2010:
return msbuild40;
default:
throw new NotSupportedException();
}
}
}
public override IEnumerable<CompilerVersion> GetAvailableCompilerVersions()
{
return new[] { msbuild20, msbuild35, msbuild40 };
}
/*
protected override void AddOrRemoveExtensions()
{
@ -126,6 +153,6 @@ namespace CSharpBinding @@ -126,6 +153,6 @@ namespace CSharpBinding
}
}
}
*/
*/
}
}

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

@ -409,67 +409,24 @@ namespace ICSharpCode.SharpDevelop.Project @@ -409,67 +409,24 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
public override void ConvertToMSBuild40(bool changeTargetFrameworkToNet40)
protected internal virtual void AddDotnet35References()
{
lock (SyncRoot) {
base.ConvertToMSBuild40(changeTargetFrameworkToNet40);
throw new NotImplementedException();
/*
var winFxImport = MSBuildProject.Imports.Cast<Microsoft.Build.BuildEngine.Import>()
.Where(import => !import.IsImported)
.FirstOrDefault(import => string.Equals(import.ProjectPath, "$(MSBuildBinPath)\\Microsoft.WinFX.targets", StringComparison.OrdinalIgnoreCase));
if (winFxImport != null) {
MSBuildProject.Imports.RemoveImport(winFxImport);
}
if (changeTargetFrameworkToNet40) {
bool isDotNet40 = TargetFrameworkVersion == "v4.0";
SetProperty(null, null, "TargetFrameworkVersion", "v4.0", PropertyStorageLocations.Base, true);
if (!isDotNet40) {
AddDotnet40References();
}
} else {
foreach (string config in ConfigurationNames) {
foreach (string platform in PlatformNames) {
PropertyStorageLocations loc;
string targetFrameworkVersion = GetProperty(config, platform, "TargetFrameworkVersion", out loc);
if (string.IsNullOrEmpty(targetFrameworkVersion))
targetFrameworkVersion = "v2.0";
switch (targetFrameworkVersion) {
case "CF 1.0":
targetFrameworkVersion = "CF 2.0";
break;
case "v1.0":
case "v1.1":
targetFrameworkVersion = "v2.0";
break;
}
if (targetFrameworkVersion == "v2.0" && winFxImport != null)
targetFrameworkVersion = "v3.0";
SetProperty(config, platform, "TargetFrameworkVersion", targetFrameworkVersion, loc, true);
}
}
}
*/
}
AddOrRemoveExtensions();
}
protected internal virtual void AddDotnet40References()
{
ReferenceProjectItem rpi = new ReferenceProjectItem(this, "System.Core");
rpi.SetMetadata("RequiredTargetFramework", "3.5");
ProjectService.AddProjectItem(this, rpi);
AddReferenceIfNotExists("System.Core", "3.5");
if (GetItemsOfType(ItemType.Reference).Any(r => r.Include == "System.Data")) {
rpi = new ReferenceProjectItem(this, "System.Data.DataSetExtensions");
rpi.SetMetadata("RequiredTargetFramework", "3.5");
ProjectService.AddProjectItem(this, rpi);
AddReferenceIfNotExists("System.Data.DataSetExtensions", "3.5");
}
if (GetItemsOfType(ItemType.Reference).Any(r => r.Include == "System.Xml")) {
rpi = new ReferenceProjectItem(this, "System.Xml.Linq");
rpi.SetMetadata("RequiredTargetFramework", "3.5");
AddReferenceIfNotExists("System.Xml.Linq", "3.5");
}
}
void AddReferenceIfNotExists(string name, string requiredTargetFramework)
{
if (!(GetItemsOfType(ItemType.Reference).Any(r => r.Include == name))) {
ReferenceProjectItem rpi = new ReferenceProjectItem(this, name);
if (requiredTargetFramework != null)
rpi.SetMetadata("RequiredTargetFramework", requiredTargetFramework);
ProjectService.AddProjectItem(this, rpi);
}
}
@ -480,7 +437,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -480,7 +437,7 @@ namespace ICSharpCode.SharpDevelop.Project
#region IUpgradableProject
bool IUpgradableProject.UpgradeDesired {
public virtual bool UpgradeDesired {
get {
return MinimumSolutionVersion < Solution.SolutionVersionVS2010;
}
@ -522,7 +479,51 @@ namespace ICSharpCode.SharpDevelop.Project @@ -522,7 +479,51 @@ namespace ICSharpCode.SharpDevelop.Project
public virtual void UpgradeProject(CompilerVersion newVersion, TargetFramework newFramework)
{
throw new NotImplementedException();
if (!this.ReadOnly) {
lock (SyncRoot) {
TargetFramework oldFramework = this.CurrentTargetFramework;
if (newVersion != null && GetAvailableCompilerVersions().Contains(newVersion)) {
SetToolsVersion(newVersion.MSBuildVersion.Major + "." + newVersion.MSBuildVersion.Minor);
}
if (newFramework != null) {
SetProperty(null, null, "TargetFrameworkVersion", newFramework.Name, PropertyStorageLocations.Base, true);
if (oldFramework != null && !oldFramework.IsBasedOn(TargetFramework.Net35) && newFramework.IsBasedOn(TargetFramework.Net35))
AddDotnet35References();
}
/*
var winFxImport = MSBuildProject.Imports.Cast<Microsoft.Build.BuildEngine.Import>()
.Where(import => !import.IsImported)
.FirstOrDefault(import => string.Equals(import.ProjectPath, "$(MSBuildBinPath)\\Microsoft.WinFX.targets", StringComparison.OrdinalIgnoreCase));
if (winFxImport != null) {
MSBuildProject.Imports.RemoveImport(winFxImport);
}
if (!changeTargetFrameworkToNet40) {
foreach (string config in ConfigurationNames) {
foreach (string platform in PlatformNames) {
PropertyStorageLocations loc;
string targetFrameworkVersion = GetProperty(config, platform, "TargetFrameworkVersion", out loc);
if (string.IsNullOrEmpty(targetFrameworkVersion))
targetFrameworkVersion = "v2.0";
switch (targetFrameworkVersion) {
case "CF 1.0":
targetFrameworkVersion = "CF 2.0";
break;
case "v1.0":
case "v1.1":
targetFrameworkVersion = "v2.0";
break;
}
if (targetFrameworkVersion == "v2.0" && winFxImport != null)
targetFrameworkVersion = "v3.0";
SetProperty(config, platform, "TargetFrameworkVersion", targetFrameworkVersion, loc, true);
}
}
}
*/
AddOrRemoveExtensions();
Save();
}
}
}
#endregion
}
@ -536,7 +537,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -536,7 +537,7 @@ namespace ICSharpCode.SharpDevelop.Project
CompilableProject project = (CompilableProject)Owner;
TargetFramework fx = project.CurrentTargetFramework;
if (fx != null && fx.IsBasedOn(TargetFramework.Net35)) {
project.AddDotnet40References();
project.AddDotnet35References();
}
}
}

15
src/Main/Base/Project/Src/Project/Converter/IUpgradableProject.cs

@ -70,5 +70,20 @@ namespace ICSharpCode.SharpDevelop.Project.Converter @@ -70,5 +70,20 @@ namespace ICSharpCode.SharpDevelop.Project.Converter
this.MSBuildVersion = msbuildVersion;
this.DisplayName = displayName;
}
public override bool Equals(object obj)
{
if (obj == null)
return false;
if (GetType() != obj.GetType())
return false;
CompilerVersion v = (CompilerVersion)obj;
return this.MSBuildVersion == v.MSBuildVersion;
}
public override int GetHashCode()
{
return MSBuildVersion.GetHashCode();
}
}
}

24
src/Main/Base/Project/Src/Project/Converter/UpgradeView.xaml

@ -1,10 +1,7 @@ @@ -1,10 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<UserControl
x:ClassModifier="internal"
x:Class="ICSharpCode.SharpDevelop.Project.Converter.UpgradeView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:core="http://icsharpcode.net/sharpdevelop/core">
x:Class="ICSharpCode.SharpDevelop.Project.Converter.UpgradeView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:core="http://icsharpcode.net/sharpdevelop/core">
<Grid>
<Grid.RowDefinitions>
<RowDefinition
@ -35,6 +32,7 @@ @@ -35,6 +32,7 @@
<ListView.View>
<GridView>
<core:SortableGridViewColumn
x:Name="nameColumn"
SortBy="Name"
Header="Project">
<GridViewColumn.CellTemplate>
@ -68,7 +66,8 @@ @@ -68,7 +66,8 @@
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Margin="8,0,8,8"
Header="Change version of selected projects">
Header="Change version of selected projects"
Name="conversionGroupBox">
<Grid
Margin="4">
<Grid.RowDefinitions>
@ -83,7 +82,7 @@ @@ -83,7 +82,7 @@
<ColumnDefinition
Width="Auto" />
<ColumnDefinition
Width="120" />
Width="160" />
</Grid.ColumnDefinitions>
<Label
Content="Convert selected _projects to:"
@ -92,9 +91,11 @@ @@ -92,9 +91,11 @@
Target="{Binding ElementName=newVersionComboBox}" />
<ComboBox
Name="newVersionComboBox"
Grid.Column="1"
DisplayMemberPath="DisplayName"
SelectionChanged="newVersionComboBox_SelectionChanged"
Height="22"
Grid.Row="0"
Height="22" />
Grid.Column="1" />
<Label
Content="Change _target framework:"
Grid.Column="0"
@ -104,7 +105,9 @@ @@ -104,7 +105,9 @@
Name="newFrameworkComboBox"
Grid.Column="1"
Grid.Row="1"
Height="22" />
Height="22"
DisplayMemberPath="DisplayName"
SelectionChanged="newFrameworkComboBox_SelectionChanged" />
<Button
Name="convertButton"
Width="90"
@ -112,7 +115,8 @@ @@ -112,7 +115,8 @@
Content="_Convert"
Grid.Column="0"
Grid.ColumnSpan="2"
Grid.Row="2" />
Grid.Row="2"
Click="convertButton_Click" />
</Grid>
</GroupBox>
</Grid>

230
src/Main/Base/Project/Src/Project/Converter/UpgradeView.xaml.cs

@ -5,11 +5,12 @@ @@ -5,11 +5,12 @@
// <version>$Revision$</version>
// </file>
using ICSharpCode.Core.Presentation;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
@ -24,11 +25,16 @@ namespace ICSharpCode.SharpDevelop.Project.Converter @@ -24,11 +25,16 @@ namespace ICSharpCode.SharpDevelop.Project.Converter
/// </summary>
internal partial class UpgradeView : UserControl
{
Solution solution;
public UpgradeView(Solution solution)
{
this.solution = solution;
InitializeComponent();
listView.ItemsSource = solution.Projects.OfType<IUpgradableProject>().Select(p => new Entry(p)).ToList();
SortableGridViewColumn.SetCurrentSortColumn(listView, nameColumn);
SortableGridViewColumn.SetSortDirection(listView, ColumnSortDirection.Ascending);
ListView_SelectionChanged(null, null);
}
@ -51,7 +57,205 @@ namespace ICSharpCode.SharpDevelop.Project.Converter @@ -51,7 +57,205 @@ namespace ICSharpCode.SharpDevelop.Project.Converter
else
selectAllCheckBox.IsChecked = null;
convertButton.IsEnabled = listView.SelectedItems.Count > 0;
conversionGroupBox.IsEnabled = listView.SelectedItems.Count > 0;
UpdateCompilerComboBox();
}
void UpdateCompilerComboBox()
{
if (listView.SelectedItems.Count > 0) {
// Fetch list of available compiler versions
HashSet<CompilerVersion> availableVersionsSet = new HashSet<CompilerVersion>();
HashSet<CompilerVersion> currentVersions = new HashSet<CompilerVersion>();
foreach (Entry entry in listView.SelectedItems) {
if (entry.CompilerVersion != null)
currentVersions.Add(entry.CompilerVersion);
availableVersionsSet.AddRange(entry.Project.GetAvailableCompilerVersions());
}
List<CompilerVersion> availableVersions = availableVersionsSet.OrderBy(n => n.MSBuildVersion).ThenBy(n => n.DisplayName).ToList();
if (currentVersions.Count != 1) {
availableVersions.Insert(0, new UnchangedCompilerVersion());
}
// Assign available versions to newVersionComboBox
// Unless the user has already chosen a version, automatically set the selection to the
// current version of the chosen projects, or to 'do not change' if there are different
// current versions.
newCompilerSelectionChangingByCode = true;
newVersionComboBox.ItemsSource = availableVersions;
CompilerVersion oldSelectedVersion = newVersionComboBox.SelectedValue as CompilerVersion;
if (!newCompilerSelectionSetByUser || oldSelectedVersion == null) {
newCompilerSelectionSetByUser = false;
if (currentVersions.Count == 1)
newVersionComboBox.SelectedValue = currentVersions.Single();
else
newVersionComboBox.SelectedValue = new UnchangedCompilerVersion();
}
newCompilerSelectionChangingByCode = false;
UpdateTargetFrameworkComboBox();
}
}
bool newCompilerSelectionChangingByCode;
bool newCompilerSelectionSetByUser;
void newVersionComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (!newCompilerSelectionChangingByCode)
newCompilerSelectionSetByUser = true;
UpdateTargetFrameworkComboBox();
}
void UpdateTargetFrameworkComboBox()
{
// Determine the available target frameworks
List<TargetFramework> availableFrameworks;
bool doNotChangeAllowed;
CompilerVersion selectedCompiler = newVersionComboBox.SelectedValue as CompilerVersion;
if (selectedCompiler == null || selectedCompiler is UnchangedCompilerVersion) {
// no entries or "Do not change" selected
// -> available target frameworks is the intersection of all compiler's target framework,
// and "Do not change" is always available
var supportedTargetFrameworks =
from Entry entry in listView.SelectedItems
where entry.CompilerVersion != null
select entry.CompilerVersion.GetSupportedTargetFrameworks();
if (supportedTargetFrameworks.Any()) {
availableFrameworks = supportedTargetFrameworks.Aggregate((a, b) => a.Intersect(b)).ToList();
} else {
availableFrameworks = new List<TargetFramework>();
}
doNotChangeAllowed = true;
} else {
// Specific compiler version is selected
// Show that compiler's target frameworks
availableFrameworks = selectedCompiler.GetSupportedTargetFrameworks().ToList();
// Allow do not change on target framework if all current frameworks are supported
// by the new compiler.
doNotChangeAllowed = true;
foreach (Entry entry in listView.SelectedItems) {
doNotChangeAllowed &= availableFrameworks.Contains(entry.TargetFramework);
}
}
availableFrameworks.Sort((a, b) => a.DisplayName.CompareTo(b.DisplayName));
if (doNotChangeAllowed) {
availableFrameworks.Insert(0, new UnchangedTargetFramework());
}
// detect whether all projects use a single framework
TargetFramework frameworkUsedByAllProjects = null;
bool frameworkUsedByAllProjectsInitialized = false;
foreach (Entry entry in listView.SelectedItems) {
if (!frameworkUsedByAllProjectsInitialized) {
frameworkUsedByAllProjects = entry.TargetFramework;
frameworkUsedByAllProjectsInitialized = true;
} else {
if (!object.Equals(frameworkUsedByAllProjects, entry.TargetFramework))
frameworkUsedByAllProjects = null;
}
}
// if projects use different frameworks, preselect "<do not change>", if possible
if (frameworkUsedByAllProjects == null && doNotChangeAllowed)
frameworkUsedByAllProjects = availableFrameworks[0];
newFrameworkSelectionChangingByCode = true;
newFrameworkComboBox.ItemsSource = availableFrameworks;
TargetFramework oldSelectedFramework = newFrameworkComboBox.SelectedValue as TargetFramework;
if (!newFrameworkSelectionSetByUser || oldSelectedFramework == null) {
newFrameworkSelectionSetByUser = false;
newFrameworkComboBox.SelectedValue = frameworkUsedByAllProjects;
}
newFrameworkSelectionChangingByCode = false;
UpdateConvertButtonEnabled();
}
bool newFrameworkSelectionChangingByCode;
bool newFrameworkSelectionSetByUser;
void newFrameworkComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (!newFrameworkSelectionChangingByCode)
newFrameworkSelectionSetByUser = true;
UpdateConvertButtonEnabled();
}
void UpdateConvertButtonEnabled()
{
CompilerVersion selectedCompiler = newVersionComboBox.SelectedValue as CompilerVersion;
TargetFramework selectedFramework = newFrameworkComboBox.SelectedValue as TargetFramework;
bool changingCompiler = false;
bool changingFramework = false;
if (!(selectedCompiler is UnchangedCompilerVersion)) {
foreach (Entry entry in listView.SelectedItems) {
if (!object.Equals(entry.CompilerVersion, selectedCompiler))
changingCompiler = true;
}
}
if (!(selectedFramework is UnchangedTargetFramework)) {
foreach (Entry entry in listView.SelectedItems) {
if (!object.Equals(entry.TargetFramework, selectedFramework))
changingFramework = true;
}
}
convertButton.IsEnabled = selectedCompiler != null && selectedFramework != null && (changingCompiler || changingFramework);
}
void convertButton_Click(object sender, RoutedEventArgs e)
{
CompilerVersion selectedCompiler = newVersionComboBox.SelectedValue as CompilerVersion;
TargetFramework selectedFramework = newFrameworkComboBox.SelectedValue as TargetFramework;
if (selectedCompiler is UnchangedCompilerVersion)
selectedCompiler = null;
if (selectedFramework is UnchangedTargetFramework)
selectedFramework = null;
foreach (Entry entry in listView.SelectedItems) {
entry.UpgradeProject(selectedCompiler, selectedFramework);
}
solution.Save();
UpdateCompilerComboBox();
}
sealed class UnchangedCompilerVersion : CompilerVersion
{
public UnchangedCompilerVersion() : base(new Version(0, 0), "<do not change>")
{
}
public override bool Equals(object obj)
{
return obj is UnchangedCompilerVersion;
}
public override int GetHashCode()
{
return 0;
}
}
sealed class UnchangedTargetFramework : TargetFramework
{
public UnchangedTargetFramework() : base(string.Empty, "<do not change>")
{
}
public override bool Equals(object obj)
{
return obj is UnchangedTargetFramework;
}
public override int GetHashCode()
{
return 0;
}
}
internal sealed class Entry : INotifyPropertyChanged
@ -62,23 +266,33 @@ namespace ICSharpCode.SharpDevelop.Project.Converter @@ -62,23 +266,33 @@ namespace ICSharpCode.SharpDevelop.Project.Converter
{
this.Project = project;
this.compilerVersion = project.CurrentCompilerVersion;
this.targetFramework = project.CurrentTargetFramework;
this.CompilerVersion = project.CurrentCompilerVersion;
this.TargetFramework = project.CurrentTargetFramework;
}
public string Name {
get { return this.Project.Name; }
}
CompilerVersion compilerVersion;
TargetFramework targetFramework;
public CompilerVersion CompilerVersion;
public TargetFramework TargetFramework;
public string CompilerVersionName {
get { return compilerVersion != null ? compilerVersion.DisplayName : null; }
get { return CompilerVersion != null ? CompilerVersion.DisplayName : null; }
}
public string TargetFrameworkName {
get { return targetFramework != null ? targetFramework.DisplayName : null; }
get { return TargetFramework != null ? TargetFramework.DisplayName : null; }
}
public void UpgradeProject(CompilerVersion newVersion, TargetFramework newFramework)
{
this.Project.UpgradeProject(newVersion, newFramework);
this.CompilerVersion = this.Project.CurrentCompilerVersion;
this.TargetFramework = this.Project.CurrentTargetFramework;
OnPropertyChanged("CompilerVersionName");
OnPropertyChanged("TargetFrameworkName");
}
public event PropertyChangedEventHandler PropertyChanged;

8
src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs

@ -109,11 +109,13 @@ namespace ICSharpCode.SharpDevelop.Project @@ -109,11 +109,13 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
public virtual void ConvertToMSBuild40(bool changeTargetFrameworkToNet40)
protected void SetToolsVersion(string newToolsVersion)
{
lock (SyncRoot) {
projectFile.ToolsVersion = "4.0";
userProjectFile.ToolsVersion = "4.0";
UnloadCurrentlyOpenProject();
projectFile.ToolsVersion = newToolsVersion;
userProjectFile.ToolsVersion = newToolsVersion;
CreateItemsListFromMSBuild();
}
}

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

@ -9,7 +9,7 @@ using System; @@ -9,7 +9,7 @@ using System;
namespace ICSharpCode.SharpDevelop.Project
{
public sealed class TargetFramework
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) };

Loading…
Cancel
Save