1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
5
using System.Collections.Generic;
6
using System.ComponentModel;
9
using System.Windows.Controls;
11
using ICSharpCode.Core.Presentation;
13
namespace ICSharpCode.SharpDevelop.Project.Converter
16
/// Interaction logic for UpgradeView.xaml
18
internal partial class UpgradeView : UserControl
20
readonly Solution solution;
21
readonly List<Entry> entries;
23
public UpgradeView(Solution solution)
26
throw new ArgumentNullException("solution");
27
this.solution = solution;
28
InitializeComponent();
30
this.entries = solution.Projects.OfType<IUpgradableProject>().Select(p => new Entry(p)).ToList();
31
listView.ItemsSource = entries;
32
SortableGridViewColumn.SetCurrentSortColumn(listView, nameColumn);
33
SortableGridViewColumn.SetSortDirection(listView, ColumnSortDirection.Ascending);
34
ListView_SelectionChanged(null, null);
37
public bool UpgradeViewOpenedAutomatically {
38
get { return upgradeDescription.Visibility == Visibility.Visible; }
39
set { upgradeDescription.Visibility = value ? Visibility.Visible : Visibility.Collapsed; }
42
public Solution Solution {
43
get { return solution; }
46
public void Select(IUpgradableProject project)
48
foreach (Entry entry in entries) {
49
if (entry.Project == project)
50
listView.SelectedItem = entry;
54
void SelectAllCheckBox_Checked(object sender, RoutedEventArgs e)
59
void SelectAllCheckBox_Unchecked(object sender, RoutedEventArgs e)
61
listView.SelectedItems.Clear();
64
void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
66
if (listView.SelectedItems.Count == listView.ItemsSource.Cast<Entry>().Count())
67
selectAllCheckBox.IsChecked = true;
68
else if (listView.SelectedItems.Count == 0)
69
selectAllCheckBox.IsChecked = false;
71
selectAllCheckBox.IsChecked = null;
73
conversionGroupBox.IsEnabled = listView.SelectedItems.Count > 0;
74
UpdateCompilerComboBox();
77
void UpdateCompilerComboBox()
79
if (listView.SelectedItems.Count > 0) {
80
// Fetch list of available compiler versions
81
HashSet<CompilerVersion> availableVersionsSet = new HashSet<CompilerVersion>();
82
HashSet<CompilerVersion> currentVersions = new HashSet<CompilerVersion>();
83
foreach (Entry entry in listView.SelectedItems) {
84
if (entry.CompilerVersion != null)
85
currentVersions.Add(entry.CompilerVersion);
86
availableVersionsSet.AddRange(entry.Project.GetAvailableCompilerVersions());
88
List<CompilerVersion> availableVersions = availableVersionsSet.OrderBy(n => n.MSBuildVersion).ThenBy(n => n.DisplayName).ToList();
89
if (currentVersions.Count != 1) {
90
availableVersions.Insert(0, new UnchangedCompilerVersion());
92
// Assign available versions to newVersionComboBox
93
// Unless the user has already chosen a version, automatically set the selection to the
94
// current version of the chosen projects, or to 'do not change' if there are different
96
newCompilerSelectionChangingByCode = true;
97
newVersionComboBox.ItemsSource = availableVersions;
99
CompilerVersion oldSelectedVersion = newVersionComboBox.SelectedValue as CompilerVersion;
100
if (!newCompilerSelectionSetByUser || oldSelectedVersion == null) {
101
newCompilerSelectionSetByUser = false;
102
if (currentVersions.Count == 1)
103
newVersionComboBox.SelectedValue = currentVersions.Single();
105
newVersionComboBox.SelectedValue = new UnchangedCompilerVersion();
107
newCompilerSelectionChangingByCode = false;
108
UpdateTargetFrameworkComboBox();
112
bool newCompilerSelectionChangingByCode;
113
bool newCompilerSelectionSetByUser;
115
void newVersionComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
117
if (!newCompilerSelectionChangingByCode)
118
newCompilerSelectionSetByUser = true;
119
UpdateTargetFrameworkComboBox();
122
void UpdateTargetFrameworkComboBox()
124
// Determine the available target frameworks
125
List<TargetFramework> availableFrameworks;
126
bool doNotChangeAllowed;
127
CompilerVersion selectedCompiler = newVersionComboBox.SelectedValue as CompilerVersion;
128
if (selectedCompiler == null || selectedCompiler is UnchangedCompilerVersion) {
129
// no entries or "Do not change" selected
130
// -> available target frameworks is the intersection of all compiler's target framework,
131
// and "Do not change" is always available
133
var supportedTargetFrameworks =
134
from Entry entry in listView.SelectedItems
135
where entry.CompilerVersion != null
136
select entry.CompilerVersion.GetSupportedTargetFrameworks();
138
if (supportedTargetFrameworks.Any()) {
139
availableFrameworks = supportedTargetFrameworks.Aggregate((a, b) => a.Intersect(b)).ToList();
141
availableFrameworks = new List<TargetFramework>();
143
doNotChangeAllowed = true;
145
// Specific compiler version is selected
146
// Show that compiler's target frameworks
147
availableFrameworks = selectedCompiler.GetSupportedTargetFrameworks().ToList();
148
// Allow do not change on target framework if all current frameworks are supported
149
// by the new compiler.
150
doNotChangeAllowed = true;
151
foreach (Entry entry in listView.SelectedItems) {
152
doNotChangeAllowed &= availableFrameworks.Contains(entry.TargetFramework);
156
availableFrameworks.Sort((a, b) => a.DisplayName.CompareTo(b.DisplayName));
157
if (doNotChangeAllowed) {
158
availableFrameworks.Insert(0, new UnchangedTargetFramework());
161
// detect whether all projects use a single framework
162
TargetFramework frameworkUsedByAllProjects = null;
163
bool frameworkUsedByAllProjectsInitialized = false;
164
foreach (Entry entry in listView.SelectedItems) {
165
if (!frameworkUsedByAllProjectsInitialized) {
166
frameworkUsedByAllProjects = entry.TargetFramework;
167
frameworkUsedByAllProjectsInitialized = true;
169
if (!object.Equals(frameworkUsedByAllProjects, entry.TargetFramework))
170
frameworkUsedByAllProjects = null;
174
// if projects use different frameworks, preselect "<do not change>", if possible
175
if (frameworkUsedByAllProjects == null && doNotChangeAllowed)
176
frameworkUsedByAllProjects = availableFrameworks[0];
178
newFrameworkSelectionChangingByCode = true;
179
newFrameworkComboBox.ItemsSource = availableFrameworks;
181
TargetFramework oldSelectedFramework = newFrameworkComboBox.SelectedValue as TargetFramework;
182
if (!newFrameworkSelectionSetByUser || oldSelectedFramework == null) {
183
newFrameworkSelectionSetByUser = false;
184
newFrameworkComboBox.SelectedValue = frameworkUsedByAllProjects;
186
newFrameworkSelectionChangingByCode = false;
187
UpdateConvertButtonEnabled();
190
bool newFrameworkSelectionChangingByCode;
191
bool newFrameworkSelectionSetByUser;
193
void newFrameworkComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
195
if (!newFrameworkSelectionChangingByCode)
196
newFrameworkSelectionSetByUser = true;
197
UpdateConvertButtonEnabled();
200
void UpdateConvertButtonEnabled()
202
CompilerVersion selectedCompiler = newVersionComboBox.SelectedValue as CompilerVersion;
203
TargetFramework selectedFramework = newFrameworkComboBox.SelectedValue as TargetFramework;
205
bool changingCompiler = false;
206
bool changingFramework = false;
207
if (!(selectedCompiler is UnchangedCompilerVersion)) {
208
foreach (Entry entry in listView.SelectedItems) {
209
if (!object.Equals(entry.CompilerVersion, selectedCompiler))
210
changingCompiler = true;
213
if (!(selectedFramework is UnchangedTargetFramework)) {
214
foreach (Entry entry in listView.SelectedItems) {
215
if (!object.Equals(entry.TargetFramework, selectedFramework))
216
changingFramework = true;
220
convertButton.IsEnabled = selectedCompiler != null && selectedFramework != null && (changingCompiler || changingFramework);
223
void convertButton_Click(object sender, RoutedEventArgs e)
225
Core.AnalyticsMonitorService.TrackFeature(GetType(), "convertButton_Click");
227
CompilerVersion selectedCompiler = newVersionComboBox.SelectedValue as CompilerVersion;
228
TargetFramework selectedFramework = newFrameworkComboBox.SelectedValue as TargetFramework;
229
if (selectedCompiler is UnchangedCompilerVersion)
230
selectedCompiler = null;
231
if (selectedFramework is UnchangedTargetFramework)
232
selectedFramework = null;
235
foreach (Entry entry in listView.SelectedItems) {
236
entry.UpgradeProject(selectedCompiler, selectedFramework);
239
UpdateCompilerComboBox();
242
sealed class UnchangedCompilerVersion : CompilerVersion
244
public UnchangedCompilerVersion() : base(new Version(0, 0), Core.StringParser.Parse("${res:ICSharpCode.SharpDevelop.Project.UpgradeView.DoNotChange}"))
248
public override bool Equals(object obj)
250
return obj is UnchangedCompilerVersion;
253
public override int GetHashCode()
259
sealed class UnchangedTargetFramework : TargetFramework
261
public UnchangedTargetFramework() : base(string.Empty, Core.StringParser.Parse("${res:ICSharpCode.SharpDevelop.Project.UpgradeView.DoNotChange}"))
265
public override bool Equals(object obj)
267
return obj is UnchangedTargetFramework;
270
public override int GetHashCode()
276
internal sealed class Entry : INotifyPropertyChanged
278
public readonly IUpgradableProject Project;
280
public Entry(IUpgradableProject project)
282
this.Project = project;
284
this.CompilerVersion = project.CurrentCompilerVersion;
285
this.TargetFramework = project.CurrentTargetFramework;
289
get { return this.Project.Name; }
292
public override string ToString()
297
public CompilerVersion CompilerVersion;
298
public TargetFramework TargetFramework;
300
public string CompilerVersionName {
301
get { return CompilerVersion != null ? CompilerVersion.DisplayName : null; }
304
public string TargetFrameworkName {
305
get { return TargetFramework != null ? TargetFramework.DisplayName : null; }
308
public void UpgradeProject(CompilerVersion newVersion, TargetFramework newFramework)
310
this.Project.UpgradeProject(newVersion, newFramework);
312
this.CompilerVersion = this.Project.CurrentCompilerVersion;
313
this.TargetFramework = this.Project.CurrentTargetFramework;
314
OnPropertyChanged("CompilerVersionName");
315
OnPropertyChanged("TargetFrameworkName");
318
public event PropertyChangedEventHandler PropertyChanged;
320
void OnPropertyChanged(string propertyName)
322
if (PropertyChanged != null) {
323
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));