Browse Source

Debugger tooltips - Debugger.AddIn.TreeNodes provide Visualizer commands which are displayed in Visualizer pickers in DebuggerTooltipControl.

Made everything in DebuggerTooltipControl not Focusable - if grid cell or Visualizer picker was focused, it blocked shortcuts (like F10 for stepping).

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4652 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Martin Koníček 16 years ago
parent
commit
c89bf915e0
  1. 8
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.csproj
  2. 45
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/ExpressionNode.cs
  3. 13
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/TreeNode.cs
  4. 34
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Commands/ExpressionNodeVisualizerCommand.cs
  5. 38
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Commands/GridVisualizerCommand.cs
  6. 38
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Commands/ObjectGraphVisualizerCommand.cs
  7. 5
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Commands/ShowGridVisualizerCommand.cs
  8. 5
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Commands/ShowObjectGraphVisualizerCommand.cs
  9. 2
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ObjectValue.cs
  10. 16
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Utils/DebuggerHelpers.cs
  11. 1
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  12. 4
      src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerPopup.cs
  13. 9
      src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerTooltipControl.xaml
  14. 7
      src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerTooltipControl.xaml.cs
  15. 4
      src/Main/Base/Project/Src/Services/Debugger/Tooltips/ITreeNode.cs
  16. 28
      src/Main/Base/Project/Src/Services/Debugger/Tooltips/IVisualizerCommand.cs
  17. 26
      src/Main/Base/Project/Src/Services/Debugger/Tooltips/VisualizerPicker.cs

8
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.csproj

@ -121,6 +121,11 @@
<DependentUpon>DebuggerEventForm.cs</DependentUpon> <DependentUpon>DebuggerEventForm.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="Src\TreeModel\DebuggerResourceService.cs" /> <Compile Include="Src\TreeModel\DebuggerResourceService.cs" />
<Compile Include="Src\Visualizers\Commands\ExpressionNodeVisualizerCommand.cs" />
<Compile Include="Src\Visualizers\Commands\GridVisualizerCommand.cs" />
<Compile Include="Src\Visualizers\Commands\ObjectGraphVisualizerCommand.cs" />
<Compile Include="Src\Visualizers\Commands\ShowGridVisualizerCommand.cs" />
<Compile Include="Src\Visualizers\Commands\ShowObjectGraphVisualizerCommand.cs" />
<Compile Include="Src\Visualizers\Common\DebuggerVisualizerException.cs" /> <Compile Include="Src\Visualizers\Common\DebuggerVisualizerException.cs" />
<Compile Include="Src\Visualizers\Common\IEvaluate.cs" /> <Compile Include="Src\Visualizers\Common\IEvaluate.cs" />
<Compile Include="Src\Visualizers\Common\IListValuesProvider.cs" /> <Compile Include="Src\Visualizers\Common\IListValuesProvider.cs" />
@ -232,13 +237,11 @@
<Compile Include="Src\Visualizers\Graph\ObjectGraph\ObjectGraphBuilder.cs" /> <Compile Include="Src\Visualizers\Graph\ObjectGraph\ObjectGraphBuilder.cs" />
<Compile Include="Src\Visualizers\Graph\ObjectGraph\ObjectGraphNode.cs" /> <Compile Include="Src\Visualizers\Graph\ObjectGraph\ObjectGraphNode.cs" />
<Compile Include="Src\Visualizers\Graph\ObjectGraph\ObjectGraphProperty.cs" /> <Compile Include="Src\Visualizers\Graph\ObjectGraph\ObjectGraphProperty.cs" />
<Compile Include="Src\Visualizers\Graph\ShowObjectGraphVisualizerCommand.cs" />
<Compile Include="Src\Visualizers\GridVisualizer\GridVisualizerWindow.xaml.cs"> <Compile Include="Src\Visualizers\GridVisualizer\GridVisualizerWindow.xaml.cs">
<DependentUpon>GridVisualizerWindow.xaml</DependentUpon> <DependentUpon>GridVisualizerWindow.xaml</DependentUpon>
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="Src\Visualizers\GridVisualizer\ObjectValue.cs" /> <Compile Include="Src\Visualizers\GridVisualizer\ObjectValue.cs" />
<Compile Include="Src\Visualizers\GridVisualizer\ShowGridVisualizerCommand.cs" />
<Compile Include="Src\Visualizers\GridVisualizer\ValueProviders\EnumerableValuesProvider.cs" /> <Compile Include="Src\Visualizers\GridVisualizer\ValueProviders\EnumerableValuesProvider.cs" />
<Compile Include="Src\Visualizers\GridVisualizer\ValueProviders\ListValuesProvider.cs" /> <Compile Include="Src\Visualizers\GridVisualizer\ValueProviders\ListValuesProvider.cs" />
<Compile Include="Src\Visualizers\GridVisualizer\ValueProviders\VirtualizingIEnumerable.cs" /> <Compile Include="Src\Visualizers\GridVisualizer\ValueProviders\VirtualizingIEnumerable.cs" />
@ -347,6 +350,7 @@
<Folder Include="Src\Visualizers\GridVisualizer\ValueProviders" /> <Folder Include="Src\Visualizers\GridVisualizer\ValueProviders" />
<Folder Include="Src\Visualizers\Controls" /> <Folder Include="Src\Visualizers\Controls" />
<Folder Include="Src\Visualizers\Common" /> <Folder Include="Src\Visualizers\Common" />
<Folder Include="Src\Visualizers\Commands" />
<Folder Include="Src\Visualizers\Utils" /> <Folder Include="Src\Visualizers\Utils" />
<Folder Include="Src\Visualizers\GridVisualizer" /> <Folder Include="Src\Visualizers\GridVisualizer" />
<Folder Include="Src\Visualizers\PresentationBindings" /> <Folder Include="Src\Visualizers\PresentationBindings" />

45
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/ExpressionNode.cs

@ -4,13 +4,14 @@
// <version>$Revision$</version> // <version>$Revision$</version>
// </file> // </file>
using Debugger.AddIn.Visualizers;
using Debugger.AddIn.Visualizers.Utils;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Globalization; using System.Globalization;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Windows.Forms; using System.Windows.Forms;
using Debugger.MetaData; using Debugger.MetaData;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Core.WinForms; using ICSharpCode.Core.WinForms;
@ -76,10 +77,46 @@ namespace Debugger.AddIn.TreeModel
} }
public override bool HasChildNodes { public override bool HasChildNodes {
get { get {
if (!evaluated) EvaluateExpression(); if (!evaluated) EvaluateExpression();
return base.HasChildNodes; return base.HasChildNodes;
}
}
/// <summary> Used to determine available VisualizerCommands </summary>
private DebugType expressionType;
/// <summary> Used to determine available VisualizerCommands </summary>
private bool valueIsNull = true;
private IEnumerable<IVisualizerCommand> visualizerCommands;
public override IEnumerable<IVisualizerCommand> VisualizerCommands {
get {
if (visualizerCommands == null) {
visualizerCommands = getAvailableVisualizerCommands();
}
return visualizerCommands;
}
}
private IEnumerable<IVisualizerCommand> getAvailableVisualizerCommands()
{
if (!evaluated) EvaluateExpression();
if (this.expressionType == null) {
// no visualizers if EvaluateExpression failed
yield break;
}
if (this.valueIsNull) {
// no visualizers if evaluated value is null
yield break;
}
if (this.expressionType.IsPrimitive || this.expressionType.IsSystemDotObject() || this.expressionType.IsEnum()) {
// no visualizers for primitive types
yield break;
} }
// these should be obtained from AddIn tree so that it is possible to write add-in for Debugger.AddIn with new visualizers
yield return new GridVisualizerCommand(this);
yield return new ObjectGraphVisualizerCommand(this);
} }
public ExpressionNode(IImage image, string name, Expression expression) public ExpressionNode(IImage image, string name, Expression expression)
@ -112,7 +149,9 @@ namespace Debugger.AddIn.TreeModel
fullText = val.AsString; fullText = val.AsString;
} }
this.expressionType = val.Type;
this.Type = val.Type.Name; this.Type = val.Type.Name;
this.valueIsNull = val.IsNull;
// Note that these return enumerators so they are lazy-evaluated // Note that these return enumerators so they are lazy-evaluated
if (val.IsNull) { if (val.IsNull) {

13
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/TreeNode.cs

@ -8,6 +8,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Windows.Media; using System.Windows.Media;
using System.Linq;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Debugging; using ICSharpCode.SharpDevelop.Debugging;
@ -81,6 +82,18 @@ namespace Debugger.AddIn.TreeModel
get { return childNodes != null; } get { return childNodes != null; }
} }
public virtual IEnumerable<IVisualizerCommand> VisualizerCommands {
get {
return null;
}
}
public virtual bool HasVisualizerCommands {
get {
return (VisualizerCommands != null) && (VisualizerCommands.Count() > 0);
}
}
public TreeNode() public TreeNode()
{ {
} }

34
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Commands/ExpressionNodeVisualizerCommand.cs

@ -0,0 +1,34 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Martin Koníček" email="martin.konicek@gmail.com"/>
// <version>$Revision$</version>
// </file>
using Debugger.AddIn.TreeModel;
using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.SharpDevelop.Debugging;
namespace Debugger.AddIn.Visualizers
{
/// <summary>
/// Visualizer command for <see cref="ExpressionNode"/>
/// </summary>
// probably we should not make visualizers available only to ExpressionNodes and descendants,
// the visualizer command should be available for any TreeNode
// and the VisualizerCommand itself should decide what to do with passed instance
public abstract class ExpressionNodeVisualizerCommand : IVisualizerCommand
{
public ExpressionNode Node { get; private set; }
public ExpressionNodeVisualizerCommand(ExpressionNode expressionNode)
{
this.Node = expressionNode;
}
public abstract bool CanExecute { get; }
public abstract void Execute();
}
}

38
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Commands/GridVisualizerCommand.cs

@ -0,0 +1,38 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Martin Koníček" email="martin.konicek@gmail.com"/>
// <version>$Revision$</version>
// </file>
using Debugger.AddIn.TreeModel;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Debugger.AddIn.Visualizers
{
/// <summary>
/// Executes grid visualizer for a node.
/// </summary>
public class GridVisualizerCommand : ExpressionNodeVisualizerCommand
{
public GridVisualizerCommand(ExpressionNode expressionNode)
:base(expressionNode)
{
}
public override bool CanExecute {
get { return true; }
}
public override string ToString()
{
return "Collection visualizer";
}
public override void Execute()
{
}
}
}

38
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Commands/ObjectGraphVisualizerCommand.cs

@ -0,0 +1,38 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Martin Koníček" email="martin.konicek@gmail.com"/>
// <version>$Revision$</version>
// </file>
using Debugger.AddIn.TreeModel;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Debugger.AddIn.Visualizers
{
/// <summary>
/// Executes object graph visualizer for a node.
/// </summary>
public class ObjectGraphVisualizerCommand : ExpressionNodeVisualizerCommand
{
public ObjectGraphVisualizerCommand(ExpressionNode expressionNode)
:base(expressionNode)
{
}
public override bool CanExecute {
get { return true; }
}
public override string ToString()
{
return "Object graph visualizer";
}
public override void Execute()
{
}
}
}

5
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ShowGridVisualizerCommand.cs → src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Commands/ShowGridVisualizerCommand.cs

@ -4,10 +4,11 @@
// <owner name="Martin Koníèek" email="martin.konicek@gmail.com"/> // <owner name="Martin Koníèek" email="martin.konicek@gmail.com"/>
// <version>$Revision$</version> // <version>$Revision$</version>
// </file> // </file>
using ICSharpCode.Core; using Debugger.AddIn.Visualizers.GridVisualizer;
using System; using System;
using ICSharpCode.Core;
namespace Debugger.AddIn.Visualizers.GridVisualizer namespace Debugger.AddIn.Visualizers
{ {
/// <summary> /// <summary>
/// Description of ShowGridVisualizerCommand. /// Description of ShowGridVisualizerCommand.

5
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Graph/ShowObjectGraphVisualizerCommand.cs → src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Commands/ShowObjectGraphVisualizerCommand.cs

@ -4,13 +4,14 @@
// <owner name="Martin Koníèek" email="martin.konicek@gmail.com"/> // <owner name="Martin Koníèek" email="martin.konicek@gmail.com"/>
// <version>$Revision$</version> // <version>$Revision$</version>
// </file> // </file>
using Debugger.AddIn.Visualizers.Graph;
using System; using System;
using System.Text; using System.Text;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
namespace Debugger.AddIn.Visualizers.Graph namespace Debugger.AddIn.Visualizers
{ {
/// <summary> /// <summary>
/// Command in the tools menu for showing the object graph visualizer. /// Command in the tools menu for showing the object graph visualizer.
@ -21,8 +22,6 @@ namespace Debugger.AddIn.Visualizers.Graph
{ {
VisualizerWPFWindow window = new VisualizerWPFWindow(); VisualizerWPFWindow window = new VisualizerWPFWindow();
window.Topmost = true; window.Topmost = true;
// fix non-editable TextBox bug
//System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(window);
window.Show(); window.Show();
//WorkbenchSingleton.Workbench.ShowView(new DebuggerVisualizerViewContent()); //WorkbenchSingleton.Workbench.ShowView(new DebuggerVisualizerViewContent());
} }

2
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ObjectValue.cs

@ -66,7 +66,7 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
Value permanentReference = value.GetPermanentReference(); Value permanentReference = value.GetPermanentReference();
result.PermanentReference = permanentReference; result.PermanentReference = permanentReference;
// cannot use GetMemberValues because memberValue does not have CodeTail anymore - we need the name of the member // cannot use GetMemberValues because memberValue does not have CodeTail anymore - but we need the name of the member
/*foreach(MemberInfo memberInfo in permanentReference.Type.GetMembers(bindingFlags)) /*foreach(MemberInfo memberInfo in permanentReference.Type.GetMembers(bindingFlags))
{ {
Value memberValue = permanentReference.GetMemberValue(memberInfo); Value memberValue = permanentReference.GetMemberValue(memberInfo);

16
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Utils/DebuggerHelpers.cs

@ -23,6 +23,22 @@ namespace Debugger.AddIn.Visualizers.Utils
return refVal.Value; return refVal.Value;
} }
/// <summary>
/// Returns true if this type is enum.
/// </summary>
public static bool IsEnum(this DebugType type)
{
return (type.BaseType != null) && (type.BaseType.FullName == "System.Enum");
}
/// <summary>
/// Returns true is this type is just System.Object.
/// </summary>
public static bool IsSystemDotObject(this DebugType type)
{
return type.FullName == "System.Object";
}
/// <summary> /// <summary>
/// Evaluates expression and gets underlying address of object in the debuggee. /// Evaluates expression and gets underlying address of object in the debuggee.
/// </summary> /// </summary>

1
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -227,6 +227,7 @@
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="Src\Services\Debugger\Tooltips\ITreeNode.cs" /> <Compile Include="Src\Services\Debugger\Tooltips\ITreeNode.cs" />
<Compile Include="Src\Services\Debugger\Tooltips\IVisualizerCommand.cs" />
<Compile Include="Src\Services\Debugger\Tooltips\LazyItemsControl.cs" /> <Compile Include="Src\Services\Debugger\Tooltips\LazyItemsControl.cs" />
<Compile Include="Src\Services\Debugger\Tooltips\VirtualizingIEnumerable.cs" /> <Compile Include="Src\Services\Debugger\Tooltips\VirtualizingIEnumerable.cs" />
<Compile Include="Src\Services\Debugger\Tooltips\VisualizerPicker.cs" /> <Compile Include="Src\Services\Debugger\Tooltips\VisualizerPicker.cs" />

4
src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerPopup.cs

@ -27,8 +27,8 @@ namespace ICSharpCode.SharpDevelop.Debugging
this.Child = this.contentControl; this.Child = this.contentControl;
this.IsLeaf = false; this.IsLeaf = false;
this.contentControl.Focusable = true; //this.contentControl.Focusable = true;
Keyboard.Focus(this.contentControl); //Keyboard.Focus(this.contentControl);
//this.AllowsTransparency = true; //this.AllowsTransparency = true;
//this.PopupAnimation = PopupAnimation.Slide; //this.PopupAnimation = PopupAnimation.Slide;
} }

9
src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerTooltipControl.xaml

@ -132,7 +132,7 @@
</DataGrid.RowStyle> </DataGrid.RowStyle>
<DataGrid.CellStyle> <DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}"> <Style TargetType="{x:Type DataGridCell}">
<Setter Property="Focusable" Value="true" /> <Setter Property="Focusable" Value="false" /> <!-- Focusable=true blocks shortcuts if cell is focused -->
<Setter Property="BorderThickness" Value="0" /> <Setter Property="BorderThickness" Value="0" />
<Style.Triggers> <Style.Triggers>
<Trigger Property="IsSelected" Value="True"> <!-- disable selection highlight --> <Trigger Property="IsSelected" Value="True"> <!-- disable selection highlight -->
@ -181,7 +181,12 @@
<DataGridTemplateColumn> <DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn.CellTemplate>
<DataTemplate> <DataTemplate>
<debugging:VisualizerPicker Margin="4 0 0 0" SelectionChanged="VisualizerPicker_SelectionChanged"></debugging:VisualizerPicker> <debugging:VisualizerPicker Focusable="False" x:Name="visPicker" ItemsSource="{Binding Path=VisualizerCommands, Mode=OneWay}" Margin="4 0 0 0"></debugging:VisualizerPicker>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=HasVisualizerCommands}" Value="False">
<Setter TargetName="visPicker" Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate> </DataTemplate>
</DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn> </DataGridTemplateColumn>

7
src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerTooltipControl.xaml.cs

@ -207,12 +207,5 @@ namespace ICSharpCode.SharpDevelop.Debugging
{ {
this.lazyGrid.ScrollViewer.ScrollDown(1); this.lazyGrid.ScrollViewer.ScrollDown(1);
} }
void VisualizerPicker_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var clickedVisualizer = (VisualizerPicker)e.OriginalSource;
var clickedNode = (ITreeNode)clickedVisualizer.DataContext;
}
} }
} }

4
src/Main/Base/Project/Src/Services/Debugger/Tooltips/ITreeNode.cs

@ -26,5 +26,9 @@ namespace ICSharpCode.SharpDevelop.Debugging
IEnumerable<ITreeNode> ChildNodes { get; } IEnumerable<ITreeNode> ChildNodes { get; }
bool HasChildNodes { get; } bool HasChildNodes { get; }
IEnumerable<IVisualizerCommand> VisualizerCommands { get; }
bool HasVisualizerCommands { get; }
} }
} }

28
src/Main/Base/Project/Src/Services/Debugger/Tooltips/IVisualizerCommand.cs

@ -0,0 +1,28 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Martin Koníček" email="martin.konicek@gmail.com"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using System.Linq;
namespace ICSharpCode.SharpDevelop.Debugging
{
/// <summary>
/// Command called from <see cref="VisualizerPicker"/>.
/// </summary>
public interface IVisualizerCommand
{
/// <summary>
/// Can this command execute?
/// </summary>
bool CanExecute { get; }
/// <summary>
/// Executes this visualizer command.
/// </summary>
void Execute();
}
}

26
src/Main/Base/Project/Src/Services/Debugger/Tooltips/VisualizerPicker.cs

@ -4,6 +4,7 @@
// <owner name="Martin Koníček" email="martin.konicek@gmail.com"/> // <owner name="Martin Koníček" email="martin.konicek@gmail.com"/>
// <version>$Revision$</version> // <version>$Revision$</version>
// </file> // </file>
using ICSharpCode.Core;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -12,13 +13,34 @@ using System.Windows.Controls;
namespace ICSharpCode.SharpDevelop.Debugging namespace ICSharpCode.SharpDevelop.Debugging
{ {
/// <summary> /// <summary>
/// Description of VisualizerPicker. /// Control displaying and executing <see cref="IVisualizerCommand">visualizer commands</see>.
/// </summary> /// </summary>
public class VisualizerPicker : ComboBox public class VisualizerPicker : ComboBox
{ {
public VisualizerPicker() public VisualizerPicker()
{ {
this.ItemsSource = new string[] { "Collection visualizer", "Object graph visualizer" }; this.SelectionChanged += VisualizerPicker_SelectionChanged;
}
void VisualizerPicker_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (this.SelectedItem == null) {
return;
}
var clickedCommand = this.SelectedItem as IVisualizerCommand;
if (clickedCommand == null) {
throw new InvalidOperationException(
string.Format("{0} clicked, only instances of {1} must be present in {2}.",
this.SelectedItem.GetType().ToString(), typeof(IVisualizerCommand).Name, typeof(VisualizerPicker).Name));
}
clickedCommand.Execute();
}
public IEnumerable<IVisualizerCommand> ItemsSource
{
get { return (IEnumerable<IVisualizerCommand>)base.ItemsSource; }
set { base.ItemsSource = value; }
} }
} }
} }
Loading…
Cancel
Save