Browse Source

Grid visualizer - Preparation for displaying IEnumerable (just implementation of EnumerableValuesProvider is missing)

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4326 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Martin Koníček 16 years ago
parent
commit
590536a38c
  1. 5
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.csproj
  2. 32
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs
  3. 54
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/LazyListView.cs
  4. 8
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ObjectValue.cs
  5. 16
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/EnumerableValuesProvider.cs
  6. 0
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/VirtualizingCollection.cs
  7. 35
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/VirtualizingIEnumerable.cs
  8. 63
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Utils/TypeResolver.cs

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

@ -122,6 +122,7 @@ @@ -122,6 +122,7 @@
<Compile Include="Src\Service\DebuggerEventForm.Designer.cs">
<DependentUpon>DebuggerEventForm.cs</DependentUpon>
</Compile>
<Compile Include="Src\Visualizers\Utils\TypeResolver.cs" />
<EmbeddedResource Include="Src\Service\DebuggeeExceptionForm.resx">
<DependentUpon>DebuggeeExceptionForm.cs</DependentUpon>
</EmbeddedResource>
@ -205,12 +206,14 @@ @@ -205,12 +206,14 @@
<DependentUpon>GridVisualizerWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\Visualizers\GridVisualizer\LazyListView.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\IListValuesProvider.cs" />
<Compile Include="Src\Visualizers\GridVisualizer\ValueProviders\ListValuesProvider.cs" />
<Compile Include="Src\Visualizers\GridVisualizer\VirtualizingCollection.cs" />
<Compile Include="Src\Visualizers\GridVisualizer\ValueProviders\VirtualizingCollection.cs" />
<Compile Include="Src\Visualizers\GridVisualizer\ValueProviders\VirtualizingIEnumerable.cs" />
<Compile Include="Src\Visualizers\ObjectProperty.cs" />
<Compile Include="Src\Visualizers\Utils\DebuggerHelpers.cs" />
<Compile Include="Src\Visualizers\Utils\DictionaryExtensions.cs" />

32
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs

@ -17,6 +17,7 @@ using System.Windows.Input; @@ -17,6 +17,7 @@ using System.Windows.Input;
using System.Windows.Media;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Services;
using Debugger.AddIn.Visualizers.Utils;
namespace Debugger.AddIn.Visualizers.GridVisualizer
{
@ -41,22 +42,25 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer @@ -41,22 +42,25 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
Value val = debuggerService.GetValueFromName(txtExpression.Text).GetPermanentReference();
if (val != null && !val.IsNull)
{
// search val.Type.Interfaces for IList<T>, from it, get T
DebugType iListType = val.Type.GetInterface(typeof(IList).FullName);
if (iListType != null)
DebugType iListType, listItemType;
if (val.Type.ResolveIListImplementation(out iListType, out listItemType))
{
List<DebugType> genericArguments = val.Type.GenericArguments;
if (genericArguments.Count == 1)
var valuesProvider = new ListValuesProvider(val.Expression, iListType, listItemType);
var virtCollection = new VirtualizingCollection<ObjectValue>(valuesProvider);
IList<MemberInfo> listItemTypeMembers = valuesProvider.GetItemTypeMembers();
createListViewColumns(listItemTypeMembers);
this.listView.ItemsSource = virtCollection;
}
else
{
DebugType iEnumerableType, itemType;
if (val.Type.ResolveIEnumerableImplementation(out iEnumerableType, out itemType))
{
DebugType listItemType = genericArguments[0];
var valuesProvider = new ListValuesProvider(val.Expression, iListType, listItemType);
var virtCollection = new VirtualizingCollection<ObjectValue>(valuesProvider);
IList<MemberInfo> listItemTypeMembers = valuesProvider.GetItemTypeMembers();
createListViewColumns(listItemTypeMembers);
this.listView.ItemsSource = virtCollection;
var lazyListView = new LazyListView<ObjectValue>(this.listView);
var iEnumerableValuesProvider = new EnumerableValuesProvider(val.Expression, iEnumerableType, itemType);
lazyListView.ItemsSource = new VirtualizingIEnumerable<ObjectValue>(iEnumerableValuesProvider.ItemsSource);
}
}
}

54
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/LazyListView.cs

@ -0,0 +1,54 @@ @@ -0,0 +1,54 @@
// <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.Windows.Controls;
namespace Debugger.AddIn.Visualizers.GridVisualizer
{
public class LazyListView<T>
{
private ListView listView;
public LazyListView(ListView wrappedListView)
{
if (wrappedListView == null)
throw new ArgumentNullException("wrappedListView");
this.listView = wrappedListView;
this.listView.AddHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler(handleListViewScroll));
}
private VirtualizingIEnumerable<T> itemsSource;
public VirtualizingIEnumerable<T> ItemsSource
{
get
{
return itemsSource;
}
set
{
this.itemsSource = value;
this.itemsSource.RequestNextItems(14);
this.listView.ItemsSource = value;
}
}
private void handleListViewScroll(object sender, ScrollChangedEventArgs e)
{
if (e.VerticalChange > 0)
{
// scrolled to bottom
if (e.VerticalOffset == this.itemsSource.Count - e.ViewportHeight)
{
this.itemsSource.RequestNextItems(1);
}
}
}
}
}

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

@ -35,11 +35,13 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer @@ -35,11 +35,13 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
foreach(Expression memberExpr in expr.AppendObjectMembers(type, bindingFlags))
{
ObjectProperty property = new ObjectProperty();
property.IsAtomic = memberExpr.Evaluate(WindowsDebugger.CurrentProcess).Type.IsPrimitive;
Value propertyValue = memberExpr.Evaluate(WindowsDebugger.CurrentProcess).GetPermanentReference();
property.Name = memberExpr.CodeTail;
property.Expression = memberExpr;
property.IsNull = memberExpr.Evaluate(WindowsDebugger.CurrentProcess).IsNull;
property.Value = memberExpr.Evaluate(WindowsDebugger.CurrentProcess).AsString;
property.IsAtomic = propertyValue.Type.IsPrimitive;
property.IsNull = propertyValue.IsNull;
property.Value = /*property.IsNull ? "" :*/ propertyValue.AsString;
result.properties.Add(property.Name, property);
}

16
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/EnumerableValuesProvider.cs

@ -4,10 +4,11 @@ @@ -4,10 +4,11 @@
// <owner name="Martin Koníček" email="martin.konicek@gmail.com"/>
// <version>$Revision$</version>
// </file>
using Debugger.MetaData;
using System;
using System.Collections.Generic;
using Debugger.Expressions;
using ICSharpCode.SharpDevelop.Services;
using System.Collections.Generic;
namespace Debugger.AddIn.Visualizers.GridVisualizer
{
@ -16,11 +17,18 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer @@ -16,11 +17,18 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
/// </summary>
public class EnumerableValuesProvider
{
private WindowsDebugger debugger;
//private WindowsDebugger debugger;
private Expression targetObject;
private DebugType iListType;
private DebugType listItemType;
public EnumerableValuesProvider(WindowsDebugger debuggerService, Expression targetObject)
public EnumerableValuesProvider(Expression targetObject, DebugType iListType, DebugType listItemType)
{
this.debugger = debuggerService;
this.targetObject = targetObject;
this.iListType = iListType;
this.listItemType = listItemType;
this.itemsSource = enumerateItems(targetObject);
}

0
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/VirtualizingCollection.cs → src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/VirtualizingCollection.cs

35
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/VirtualizingIEnumerable.cs

@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
// <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.Collections.ObjectModel;
namespace Debugger.AddIn.Visualizers.GridVisualizer
{
public class VirtualizingIEnumerable<T> : ObservableCollection<T>
{
private IEnumerator<T> originalSourceEnumerator;
public VirtualizingIEnumerable(IEnumerable<T> originalSource)
{
if (originalSource == null)
throw new ArgumentNullException("originalSource");
this.originalSourceEnumerator = originalSource.GetEnumerator();
}
public void RequestNextItems(int count)
{
for (int i = 0; i < count; i++)
{
if (!originalSourceEnumerator.MoveNext()) break;
this.Add(originalSourceEnumerator.Current);
}
}
}
}

63
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Utils/TypeResolver.cs

@ -0,0 +1,63 @@ @@ -0,0 +1,63 @@
// <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;
using Debugger.MetaData;
using System.Collections.Generic;
namespace Debugger.AddIn.Visualizers.Utils
{
/// <summary>
/// Helper for obtaining information about DebugType.
/// </summary>
public static class TypeResolverExtension
{
public static bool ResolveIListImplementation(this DebugType type, out DebugType iListType, out DebugType itemType)
{
if (type == null)
throw new ArgumentNullException("type");
iListType = null;
itemType = null;
// alternative: search val.Type.Interfaces for IList<T>, from it, get T
// works when MyClass : IList<int> - MyClass is not generic, yet can be displayed
iListType = type.GetInterface(typeof(IList).FullName);
if (iListType != null)
{
List<DebugType> genericArguments = type.GenericArguments;
if (genericArguments.Count == 1)
{
itemType = genericArguments[0];
return true;
}
}
return false;
}
public static bool ResolveIEnumerableImplementation(this DebugType type, out DebugType iEnumerableType, out DebugType itemType)
{
if (type == null)
throw new ArgumentNullException("type");
iEnumerableType = null;
itemType = null;
// alternative: search val.Type.Interfaces for IList<T>, from it, get T
// works when MyClass : IEnumerable<int> - MyClass is not generic, yet can be displayed
iEnumerableType = type.GetInterface(typeof(IEnumerable).FullName);
if (iEnumerableType != null)
{
List<DebugType> genericArguments = type.GenericArguments;
if (genericArguments.Count == 1)
{
itemType = genericArguments[0];
return true;
}
}
return false;
}
}
}
Loading…
Cancel
Save