public PortableRuntimeOptionsPanelWidget(PortableDotNetProject project, IEnumerable<ItemConfiguration> configurations)
        {
            this.target = project.TargetFramework;
            this.project = project;
            this.Build ();

            // Aggregate all SupportedFrameworks from .NETPortable TargetFrameworks
            targetFrameworks = GetPortableTargetFrameworks ().ToList ();
            targetFrameworks.Sort (CompareFrameworks);
            supportedFrameworks = new SortedDictionary<string, List<SupportedFramework>> ();

            if (!targetFrameworks.Contains (project.TargetFramework)) {
                missingFramework = project.TargetFramework;
                targetFrameworks.Insert (0, project.TargetFramework);
            }

            foreach (var fx in targetFrameworks) {
                foreach (var sfx in fx.SupportedFrameworks) {
                    List<SupportedFramework> list;

                    if (!supportedFrameworks.TryGetValue (sfx.DisplayName, out list)) {
                        list = new List<SupportedFramework> ();
                        supportedFrameworks.Add (sfx.DisplayName, list);
                    }

                    list.Add (sfx);
                }
            }

            // Now create a list of config options from our supported frameworks
            options = new List<OptionCombo> ();
            foreach (var fx in supportedFrameworks) {
                var combo = new OptionCombo (fx.Key);

                var dict = new SortedDictionary<string, OptionComboItem> ();
                foreach (var sfx in fx.Value) {
                    var label = GetDisplayName (sfx);

                    OptionComboItem item;
                    if (!dict.TryGetValue (label, out item)) {
                        item = new OptionComboItem (label, sfx);
                        dict.Add (label, item);
                    }

                    item.Targets.Add (sfx.TargetFramework);
                }

                combo.Items = dict.Values.ToList ();

                options.Add (combo);
            }

            CreateUI ();

            CurrentProfileChanged (project.TargetFramework);
        }
		public PortableRuntimeOptionsPanelWidget (PortableDotNetProject project, IEnumerable<ItemConfiguration> configurations)
		{
			this.project = project;
			this.Build ();
			
			SortedDictionary<string, List<Framework>> options = new SortedDictionary<string, List<Framework>> ();
			
			foreach (var fx in Runtime.SystemAssemblyService.GetTargetFrameworks ()) {
				if (fx.Hidden || fx.Id.Identifier != ".NETPortable" || !project.TargetRuntime.IsInstalled (fx))
					continue;
				
				foreach (var sfx in fx.SupportedFrameworks) {
					List<Framework> list;
					
					if (!options.TryGetValue (sfx.DisplayName, out list)) {
						list = new List<Framework> ();
						options.Add (sfx.DisplayName, list);
					}
					
					list.Add (sfx);
				}
			}
			
			foreach (var opt in options) {
				var alignment = new Alignment (0.0f, 0.5f, 1.0f, 1.0f) { LeftPadding = 18 };
				List<Framework> versions = opt.Value;
				CheckButton check;
				
				// FIXME: VS11 introduces comboboxes for some of these... which I suspect will need to sort based on version
				//versions.Sort (CompareFrameworksByVersion);
				check = new CheckButton (versions[0].DisplayName + " " + versions[0].MinimumVersionDisplayName);
				check.Sensitive = false; // Desensitize until we support changing these values...
				foreach (var ver in versions) {
					if (ver.TargetFramework == project.TargetFramework) {
						check.Active = true;
						break;
					}
				}
				check.Show ();
				
				alignment.Add (check);
				alignment.Show ();
				
				vbox1.PackStart (alignment, false, false, 0);
			}
		}
		public PortableRuntimeOptionsPanelWidget (PortableDotNetProject project, IEnumerable<ItemConfiguration> configurations)
		{
			this.target = project.TargetFramework;
			this.project = project;
			this.Build ();

			// Aggregate all SupportedFrameworks from .NETPortable TargetFrameworks
			SortedDictionary<string, List<SupportedFramework>> frameworks = new SortedDictionary<string, List<SupportedFramework>> ();
			foreach (var fx in GetPortableTargetFrameworks ()) {
				foreach (var sfx in fx.SupportedFrameworks) {
					List<SupportedFramework> list;
					
					if (!frameworks.TryGetValue (sfx.DisplayName, out list)) {
						list = new List<SupportedFramework> ();
						frameworks.Add (sfx.DisplayName, list);
					}
					
					list.Add (sfx);
				}
			}

			// Now create a list of config options from our supported frameworks
			var options = new List<SortedDictionary<string, List<TargetFramework>>> ();
			foreach (var fx in frameworks) {
				var dict = new SortedDictionary<string, List<TargetFramework>> ();
				List<SupportedFramework> versions = fx.Value;
				List<TargetFramework> targets;
				string label;

				foreach (var sfx in versions) {
					if (!string.IsNullOrEmpty (sfx.MinimumVersionDisplayName))
						label = sfx.DisplayName + " " + sfx.MinimumVersionDisplayName;
					else
						label = sfx.DisplayName;

					if (!dict.TryGetValue (label, out targets)) {
						targets = new List<TargetFramework> ();
						dict.Add (label, targets);
					}

					targets.Add (sfx.TargetFramework);
				}

				options.Add (dict);
			}

			// Add multi-option combo boxes first
			foreach (var opt in options) {
				if (opt.Count > 1)
					AddMultiOptionCombo (opt);
			}

			// Now add the single-option check boxes
			foreach (var opt in options) {
				if (opt.Count == 1) {
					var kvp = opt.FirstOrDefault ();

					AddSingleOptionCheckbox (kvp.Key, kvp.Value);
				}
			}
		}
		public PortableFrameworkSubset (PortableDotNetProject project)
		{
			this.Project = project;
		}