63
63
[System.ComponentModel.ToolboxItem(true)]
64
64
public partial class PortableRuntimeOptionsPanelWidget : Gtk.Bin
66
static TargetFramework NetPortableProfile1;
67
static TargetFramework NetPortableProfile2;
68
static TargetFramework NetPortableProfile3;
69
static TargetFramework NetPortableProfile4;
71
Dictionary<CheckButton, List<TargetFramework>> checkboxes = new Dictionary<CheckButton, List<TargetFramework>> ();
72
Dictionary<CheckButton, ComboBox> comboboxes = new Dictionary<CheckButton, ComboBox> ();
66
73
PortableDotNetProject project;
74
TargetFramework target;
76
static void InitProfiles ()
78
// Profile 1 (.NETFramework + Silverlight + WindowsPhone + Xbox)
79
NetPortableProfile1 = Runtime.SystemAssemblyService.GetTargetFramework (new TargetFrameworkMoniker (".NETPortable", "4.0", "Profile1"));
80
SupportedFramework NetFramework = new SupportedFramework (NetPortableProfile1, ".NETFramework", ".NET Framework", "*", new Version (4, 0), "4");
81
SupportedFramework Silverlight = new SupportedFramework (NetPortableProfile1, "Silverlight", "Silverlight", "", new Version (4, 0), "4");
82
SupportedFramework WindowsPhone = new SupportedFramework (NetPortableProfile1, "Silverlight", "Windows Phone", "WindowsPhone*", new Version (4, 0), "7");
83
SupportedFramework Xbox = new SupportedFramework (NetPortableProfile1, "Xbox", "Xbox 360", "*", new Version (4, 0), "");
85
NetPortableProfile1.SupportedFrameworks.Add (NetFramework);
86
NetPortableProfile1.SupportedFrameworks.Add (Silverlight);
87
NetPortableProfile1.SupportedFrameworks.Add (WindowsPhone);
88
NetPortableProfile1.SupportedFrameworks.Add (Xbox);
90
// Profile 2 (.NETFramework + Silverlight + WindowsPhone)
91
NetPortableProfile2 = Runtime.SystemAssemblyService.GetTargetFramework (new TargetFrameworkMoniker (".NETPortable", "4.0", "Profile2"));
92
NetFramework = new SupportedFramework (NetPortableProfile2, ".NETFramework", ".NET Framework", "*", new Version (4, 0), "4");
93
Silverlight = new SupportedFramework (NetPortableProfile2, "Silverlight", "Silverlight", "", new Version (4, 0), "4");
94
WindowsPhone = new SupportedFramework (NetPortableProfile2, "Silverlight", "Windows Phone", "WindowsPhone*", new Version (4, 0), "7");
96
NetPortableProfile2.SupportedFrameworks.Add (NetFramework);
97
NetPortableProfile2.SupportedFrameworks.Add (Silverlight);
98
NetPortableProfile2.SupportedFrameworks.Add (WindowsPhone);
100
// Profile 3 (.NETFramework + Silverlight)
101
NetPortableProfile3 = Runtime.SystemAssemblyService.GetTargetFramework (new TargetFrameworkMoniker (".NETPortable", "4.0", "Profile3"));
102
NetFramework = new SupportedFramework (NetPortableProfile3, ".NETFramework", ".NET Framework", "*", new Version (4, 0), "4");
103
Silverlight = new SupportedFramework (NetPortableProfile3, "Silverlight", "Silverlight", "", new Version (4, 0), "4");
105
NetPortableProfile3.SupportedFrameworks.Add (NetFramework);
106
NetPortableProfile3.SupportedFrameworks.Add (Silverlight);
108
// Profile 4 (Silverlight + WindowsPhone)
109
NetPortableProfile4 = Runtime.SystemAssemblyService.GetTargetFramework (new TargetFrameworkMoniker (".NETPortable", "4.0", "Profile4"));
110
Silverlight = new SupportedFramework (NetPortableProfile4, "Silverlight", "Silverlight", "", new Version (4, 0), "4");
111
WindowsPhone = new SupportedFramework (NetPortableProfile4, "Silverlight", "Windows Phone", "WindowsPhone*", new Version (4, 0), "7");
113
NetPortableProfile4.SupportedFrameworks.Add (Silverlight);
114
NetPortableProfile4.SupportedFrameworks.Add (WindowsPhone);
68
117
public PortableRuntimeOptionsPanelWidget (PortableDotNetProject project, IEnumerable<ItemConfiguration> configurations)
119
this.target = project.TargetFramework;
70
120
this.project = project;
73
SortedDictionary<string, List<Framework>> options = new SortedDictionary<string, List<Framework>> ();
123
// Aggregate all SupportedFrameworks from .NETPortable TargetFrameworks
124
SortedDictionary<string, List<SupportedFramework>> frameworks = new SortedDictionary<string, List<SupportedFramework>> ();
125
foreach (var fx in GetPortableTargetFrameworks ()) {
126
foreach (var sfx in fx.SupportedFrameworks) {
127
List<SupportedFramework> list;
129
if (!frameworks.TryGetValue (sfx.DisplayName, out list)) {
130
list = new List<SupportedFramework> ();
131
frameworks.Add (sfx.DisplayName, list);
138
// Now create a list of config options from our supported frameworks
139
var options = new List<SortedDictionary<string, List<TargetFramework>>> ();
140
foreach (var fx in frameworks) {
141
var dict = new SortedDictionary<string, List<TargetFramework>> ();
142
List<SupportedFramework> versions = fx.Value;
143
List<TargetFramework> targets;
146
foreach (var sfx in versions) {
147
if (!string.IsNullOrEmpty (sfx.MinimumVersionDisplayName))
148
label = sfx.DisplayName + " " + sfx.MinimumVersionDisplayName;
150
label = sfx.DisplayName;
152
if (!dict.TryGetValue (label, out targets)) {
153
targets = new List<TargetFramework> ();
154
dict.Add (label, targets);
157
targets.Add (sfx.TargetFramework);
163
// Add multi-option combo boxes first
164
foreach (var opt in options) {
166
AddMultiOptionCombo (opt);
169
// Now add the single-option check boxes
170
foreach (var opt in options) {
171
if (opt.Count == 1) {
172
var kvp = opt.FirstOrDefault ();
174
AddSingleOptionCheckbox (kvp.Key, kvp.Value);
179
IEnumerable<TargetFramework> GetPortableTargetFrameworks ()
75
183
foreach (var fx in Runtime.SystemAssemblyService.GetTargetFrameworks ()) {
76
184
if (fx.Hidden || fx.Id.Identifier != ".NETPortable" || !project.TargetRuntime.IsInstalled (fx))
79
foreach (var sfx in fx.SupportedFrameworks) {
82
if (!options.TryGetValue (sfx.DisplayName, out list)) {
83
list = new List<Framework> ();
84
options.Add (sfx.DisplayName, list);
91
foreach (var opt in options) {
92
var alignment = new Alignment (0.0f, 0.5f, 1.0f, 1.0f) { LeftPadding = 18 };
93
List<Framework> versions = opt.Value;
96
// FIXME: VS11 introduces comboboxes for some of these... which I suspect will need to sort based on version
97
//versions.Sort (CompareFrameworksByVersion);
98
check = new CheckButton (versions[0].DisplayName + " " + versions[0].MinimumVersionDisplayName);
99
check.Sensitive = false; // Desensitize until we support changing these values...
100
foreach (var ver in versions) {
101
if (ver.TargetFramework == project.TargetFramework) {
108
alignment.Add (check);
111
vbox1.PackStart (alignment, false, false, 0);
115
static int CompareFrameworksByVersion (Framework fx1, Framework fx2)
117
if (fx1.MinimumVersion < fx2.MinimumVersion)
120
if (fx1.MinimumVersion > fx2.MinimumVersion)
123
if (fx1.MaximumVersion < fx2.MaximumVersion)
126
if (fx1.MaximumVersion > fx2.MaximumVersion)
194
if (NetPortableProfile1 == null)
197
yield return NetPortableProfile1;
198
yield return NetPortableProfile2;
199
yield return NetPortableProfile3;
200
yield return NetPortableProfile4;
203
void AddMultiOptionCombo (SortedDictionary<string, List<TargetFramework>> options)
205
var alignment = new Alignment (0.0f, 0.5f, 1.0f, 1.0f) { LeftPadding = 18 };
206
var model = new ListStore (new Type[] { typeof (string), typeof (object) });
207
var renderer = new CellRendererText ();
208
var combo = new ComboBox (model);
209
var check = new CheckButton ();
210
List<TargetFramework> targets;
211
var hbox = new HBox ();
216
foreach (var kvp in options) {
219
if (current + 1 < options.Count)
220
label += " or later";
224
foreach (var target in targets) {
225
if (target.Id.Equals (project.TargetFramework.Id)) {
232
model.AppendValues (label, targets);
236
combo.PackStart (renderer, true);
237
combo.AddAttribute (renderer, "text", 0);
243
combo.Active = active;
246
check.Active = false;
250
combo.Changed += (sender, e) => {
252
TargetFrameworkChanged (check, combo);
254
check.Toggled += (sender, e) => {
255
TargetFrameworkChanged (check, combo);
258
comboboxes.Add (check, combo);
260
hbox.PackStart (check, false, false, 0);
261
hbox.PackStart (combo, false, true, 0);
264
alignment.Add (hbox);
267
vbox1.PackStart (alignment, false, false, 0);
270
void AddSingleOptionCheckbox (string label, List<TargetFramework> targetFrameworks)
272
var alignment = new Alignment (0.0f, 0.5f, 1.0f, 1.0f) { LeftPadding = 18 };
273
var check = new CheckButton (label);
275
foreach (var fx in targetFrameworks) {
276
if (fx.Id.Equals (project.TargetFramework.Id)) {
282
check.Toggled += (sender, e) => {
283
TargetFrameworkChanged (check, targetFrameworks);
286
checkboxes.Add (check, targetFrameworks);
289
alignment.Add (check);
292
vbox1.PackStart (alignment, false, false, 0);
295
List<TargetFramework> GetTargetFrameworks (ComboBox combo)
299
if (!combo.GetActiveIter (out iter))
300
return new List<TargetFramework> ();
302
return (List<TargetFramework>) combo.Model.GetValue (iter, 1);
305
TargetFramework GetTargetFramework (CheckButton checkbox, List<TargetFramework> initial)
307
var list = new List<TargetFramework> (initial);
310
foreach (var kvp in comboboxes) {
311
var combo = kvp.Value;
317
if (!check.Active || check == checkbox)
320
var filtered = new List<TargetFramework> ();
321
foreach (var target in GetTargetFrameworks (combo)) {
322
if (list.Contains (target))
323
filtered.Add (target);
328
foreach (var kvp in checkboxes) {
329
var targets = kvp.Value;
335
if (!check.Active || check == checkbox)
338
var filtered = new List<TargetFramework> ();
339
foreach (var target in targets) {
340
if (list.Contains (target))
341
filtered.Add (target);
346
// Choose the TargetFramework with the smallest subset of supported frameworks
347
TargetFramework smallest = this.target;
348
int min = Int32.MaxValue;
350
foreach (var target in list) {
351
if (target.SupportedFrameworks.Count < min) {
352
min = target.SupportedFrameworks.Count;
360
void TargetFrameworkChanged (CheckButton check, List<TargetFramework> targetFrameworks)
363
targetFrameworks = new List<TargetFramework> (GetPortableTargetFrameworks ());
365
target = GetTargetFramework (check, targetFrameworks);
368
void TargetFrameworkChanged (CheckButton check, ComboBox combo)
370
List<TargetFramework> targetFrameworks;
373
targetFrameworks = new List<TargetFramework> (GetPortableTargetFrameworks ());
375
targetFrameworks = GetTargetFrameworks (combo);
377
target = GetTargetFramework (check, targetFrameworks);
132
380
public void Store ()
134
// no-op for now, until we figure out the logic for setting the target framework based on the checkboxes enabled...
382
if (target != null && target != project.TargetFramework) {
383
project.TargetFramework = target;
384
IdeApp.ProjectOperations.Save (project);