diff options
author | Jeffrey Stedfast <jeff@xamarin.com> | 2013-08-08 01:49:43 +0400 |
---|---|---|
committer | Jeffrey Stedfast <jeff@xamarin.com> | 2013-08-08 01:49:43 +0400 |
commit | c5baa9fb8976efc860a65d5f0255ee5c1d296a4b (patch) | |
tree | f414a18f7366a5c6d250cb4ddc4ad6abd1e0dc7c /main | |
parent | 77beefd0e767d941f3d2f90eb64d2a4d68313afc (diff) |
[Ide] Fixes to support grouped ExecutionTargets
Diffstat (limited to 'main')
3 files changed, 60 insertions, 15 deletions
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/ExecutionTarget.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/ExecutionTarget.cs index 80b2cbcb38..acb5bc5cb2 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/ExecutionTarget.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/ExecutionTarget.cs @@ -41,6 +41,11 @@ namespace MonoDevelop.Core.Execution public abstract string Name { get; } /// <summary> + /// The display name of the item when it is selected + /// </summary> + public virtual string FullName { get { return Name; } } + + /// <summary> /// Unique identifier of the target /// </summary> public abstract string Id { get; } @@ -55,6 +60,11 @@ namespace MonoDevelop.Core.Execution { return Id.GetHashCode (); } + + public override string ToString () + { + return string.Format ("[ExecutionTarget: Name={0}, FullName={1}, Id={2}]", Name, FullName, Id); + } } public class ExecutionTargetGroup : ExecutionTarget, IList<ExecutionTarget> diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/ConfigurationMerger.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/ConfigurationMerger.cs index 41f2919492..d32eb80443 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/ConfigurationMerger.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/ConfigurationMerger.cs @@ -177,6 +177,34 @@ namespace MonoDevelop.Components.MainToolbar currentSolutionConfigurations.Sort (); } + static ExecutionTarget FirstRealExecutionTarget (IEnumerable<ExecutionTarget> targets) + { + foreach (var target in targets) { + if (target is ExecutionTargetGroup) { + var first = FirstRealExecutionTarget ((ExecutionTargetGroup) target); + if (first != null) + return first; + } else if (!(target is DummyExecutionTarget)) { + return target; + } + } + + return null; + } + + static bool ExecutionTargetsContains (IEnumerable<ExecutionTarget> targets, ExecutionTarget desired) + { + foreach (var target in targets) { + if (target == desired) + return true; + + if ((target is ExecutionTargetGroup) && ExecutionTargetsContains ((ExecutionTargetGroup) target, desired)) + return true; + } + + return false; + } + /// <summary> /// Gets the full configuration name given a possibly merged configuration name and execution target /// </summary> @@ -201,14 +229,15 @@ namespace MonoDevelop.Components.MainToolbar // The selected configuration is not reduced, just use it as full config name resolvedConfig = currentConfig; var part = currentTargetPartitions.FirstOrDefault (p => p.SolutionConfigurations.Contains (currentConfig)); - if (part == null) + if (part != null) { + if (!ExecutionTargetsContains (part.Targets, resolvedTarget)) + resolvedTarget = FirstRealExecutionTarget (part.Targets); + } else { resolvedTarget = null; - else if (!part.Targets.Contains (resolvedTarget)) - resolvedTarget = part.Targets.FirstOrDefault (t => !(t is DummyExecutionTarget)); + } } else { // Reduced configuration. Find the partition and guess the implicit project configuration - - var part = currentTargetPartitions.FirstOrDefault (p => p.Targets.Contains (currentTarget ?? dummyExecutionTarget)); + var part = currentTargetPartitions.FirstOrDefault (p => ExecutionTargetsContains (p.Targets, currentTarget ?? dummyExecutionTarget)); if (part != null) { resolvedConfig = part.SolutionConfigurations.FirstOrDefault (c => { string name, plat; @@ -221,7 +250,7 @@ namespace MonoDevelop.Components.MainToolbar if (part == null) part = currentTargetPartitions.FirstOrDefault (p => p.SolutionConfigurations.Contains (currentConfig)); if (part != null) { - resolvedTarget = part.Targets.FirstOrDefault (t => !(t is DummyExecutionTarget)); + resolvedTarget = FirstRealExecutionTarget (part.Targets); resolvedConfig = part.SolutionConfigurations.FirstOrDefault (c => { string name, plat; ItemConfiguration.ParseConfigurationId (c, out name, out plat); diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/MainToolbar.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/MainToolbar.cs index 1d22efcfb0..5cef07f81f 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/MainToolbar.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/MainToolbar.cs @@ -126,7 +126,7 @@ namespace MonoDevelop.Components.MainToolbar return target == null; } - static void RuntimeRenderCell (CellLayout layout, CellRenderer cell, TreeModel model, TreeIter iter) + void RuntimeRenderCell (CellLayout layout, CellRenderer cell, TreeModel model, TreeIter iter) { var target = (ExecutionTarget) model.GetValue (iter, RuntimeExecutionTarget); var indent = (bool) model.GetValue (iter, RuntimeIsIndented); @@ -140,7 +140,11 @@ namespace MonoDevelop.Components.MainToolbar } renderer.Xpad = indent ? (uint) 18 : (uint) 3; - renderer.Text = target.Name; + + if (!runtimeCombo.PopupShown) + renderer.Text = target.FullName; + else + renderer.Text = target.Name; } public MainToolbar () @@ -585,10 +589,8 @@ namespace MonoDevelop.Components.MainToolbar SelectActiveRuntime (); } - bool SelectActiveRuntime (TreeIter iter, ref ExecutionTarget defaultTarget, ref TreeIter defaultIter) + bool SelectActiveRuntime (TreeIter iter, ref bool selected, ref ExecutionTarget defaultTarget, ref TreeIter defaultIter) { - bool selected = false; - do { var target = (ExecutionTarget) runtimeStore.GetValue (iter, RuntimeExecutionTarget); @@ -598,8 +600,10 @@ namespace MonoDevelop.Components.MainToolbar if (target is ExecutionTargetGroup) { TreeIter child; - if (runtimeStore.IterHasChild (iter) && runtimeStore.IterChildren (out child, iter)) - selected = SelectActiveRuntime (child, ref defaultTarget, ref defaultIter); + if (runtimeStore.IterHasChild (iter) && runtimeStore.IterChildren (out child, iter)) { + if (SelectActiveRuntime (child, ref selected, ref defaultTarget, ref defaultIter)) + return true; + } continue; } @@ -613,6 +617,7 @@ namespace MonoDevelop.Components.MainToolbar IdeApp.Workspace.ActiveExecutionTarget = target; runtimeCombo.SetActiveIter (iter); UpdateBuildConfiguration (); + selected = true; return true; } @@ -623,7 +628,7 @@ namespace MonoDevelop.Components.MainToolbar } } while (runtimeStore.IterNext (ref iter)); - return selected; + return false; } void SelectActiveRuntime () @@ -636,8 +641,9 @@ namespace MonoDevelop.Components.MainToolbar if (runtimeStore.GetIterFirst (out iter)) { ExecutionTarget defaultTarget = null; TreeIter defaultIter = TreeIter.Zero; + bool selected = false; - if (!SelectActiveRuntime (iter, ref defaultTarget, ref defaultIter)) { + if (!SelectActiveRuntime (iter, ref selected, ref defaultTarget, ref defaultIter) && !selected) { if (defaultTarget != null) { IdeApp.Workspace.ActiveExecutionTarget = defaultTarget; runtimeCombo.SetActiveIter (defaultIter); |