From 8ffd9d8269e63eb2263f3b02a87d4d5c1c67cb43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kon=C3=AD=C4=8Dek?= Date: Mon, 3 Aug 2009 07:09:37 +0000 Subject: [PATCH] Refactored LazyListView to LazyItemsControl, can be used with any ItemsControl. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4584 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Graph/Layout/Tree/NeatoProcess.cs | 27 +++++++-------- .../GridVisualizerWindow.xaml.cs | 4 +-- .../GridVisualizer/LazyListView.cs | 34 ++++++++++++------- .../ValueProviders/GridValuesProvider.cs | 8 ++--- .../ValueProviders/ListValuesProvider.cs | 6 ++-- .../ValueProviders/VirtualizingIEnumerable.cs | 5 ++- 6 files changed, 46 insertions(+), 38 deletions(-) diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Graph/Layout/Tree/NeatoProcess.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Graph/Layout/Tree/NeatoProcess.cs index 481e54f704..1b0ddbc732 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Graph/Layout/Tree/NeatoProcess.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/Graph/Layout/Tree/NeatoProcess.cs @@ -17,19 +17,9 @@ namespace Debugger.AddIn.Visualizers.Graph.Layout { private System.Diagnostics.Process neatoProcess; - /// - /// Creates new NeatoProcess. - /// - /// Underlying neato.exe process - private NeatoProcess(System.Diagnostics.Process neatoProcess) - { - this.neatoProcess = neatoProcess; - } - /// /// Starts neato.exe /// - /// public static NeatoProcess Start() { System.Diagnostics.Process neatoProcess = new System.Diagnostics.Process(); @@ -56,24 +46,33 @@ namespace Debugger.AddIn.Visualizers.Graph.Layout return new NeatoProcess(neatoProcess); } + /// Creates new NeatoProcess. + /// Underlying neato.exe process + private NeatoProcess(System.Diagnostics.Process neatoProcess) + { + this.neatoProcess = neatoProcess; + } + + /// Gets directory where Debugger.AddIn.dll resides private static string getCurrentAssemblyPath() { - return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + return Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); } private static string getNeatoExePath() { - return System.IO.Path.Combine(getCurrentAssemblyPath(), "neato.exe"); + return Path.Combine(getCurrentAssemblyPath(), "neato.exe"); } /// /// Passes given graph to neato and reads output. /// /// Graph in Graphviz dot format. - /// Same graph in Graphviz plain with position information added. + /// Same graph in Graphviz plain format with position information added. public string CalculatePositions(string dotGraph) { - /*using (var writer = new StreamWriter("logIn.gv")) + // write the input to neato.exe to a file for testing purposes + /*using (var writer = new StreamWriter(Path.Combine(getCurrentAssemblyPath(), "logIn.gv"))) { writer.Write(dotGraph); }*/ diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs index 62f8bc54f5..e587fbb569 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs @@ -77,9 +77,9 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer DebugType iEnumerableType, itemType; if (val.Type.ResolveIEnumerableImplementation(out iEnumerableType, out itemType)) { - var lazyListViewWrapper = new LazyListView(this.listView); + var lazyListViewWrapper = new LazyItemsControl(this.listView); var enumerableValuesProvider = new EnumerableValuesProvider(val.ExpressionTree, iEnumerableType, itemType); - lazyListViewWrapper.ItemsSource = new VirtualizingIEnumerable(enumerableValuesProvider.ItemsSource); + lazyListViewWrapper.ItemsSource = enumerableValuesProvider.ItemsSource; gridValuesProvider = enumerableValuesProvider; } else diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/LazyListView.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/LazyListView.cs index 9dc51b7188..9bbd217aeb 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/LazyListView.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/LazyListView.cs @@ -5,6 +5,7 @@ // $Revision$ // using System; +using System.Collections.Generic; using System.Windows.Controls; namespace Debugger.AddIn.Visualizers.GridVisualizer @@ -13,22 +14,28 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer /// ListView that takes VirtualizingIEnumerable as source, /// and requests additional items from the source as needed when scrolling. /// - public class LazyListView + public class LazyItemsControl { - private ListView listView; + private ItemsControl itemsControl; - public LazyListView(ListView wrappedListView) + public LazyItemsControl(ItemsControl wrappedItemsControl) { - if (wrappedListView == null) + if (wrappedItemsControl == null) throw new ArgumentNullException("wrappedListView"); - this.listView = wrappedListView; - this.listView.AddHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler(handleListViewScroll)); + this.itemsControl = wrappedItemsControl; + this.itemsControl.AddHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler(handleListViewScroll)); } - private VirtualizingIEnumerable itemsSource; - public VirtualizingIEnumerable ItemsSource + /// The collection that underlying ItemsControl sees. + private VirtualizingIEnumerable itemsSourceVirtualized; + + private IEnumerable itemsSource; + /// + /// IEnumerable providing all the items. LazyItemsControl pulls next items from this source when scrolled to bottom. + /// + public IEnumerable ItemsSource { get { @@ -37,8 +44,11 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer set { this.itemsSource = value; - this.itemsSource.RequestNextItems(25); - this.listView.ItemsSource = value; + // virtualize IEnumerable and use it as ItemsControl source + // -> ItemsControl sees only a few items, more are added when scrolled to bottom + this.itemsSourceVirtualized = new VirtualizingIEnumerable(value); + this.itemsSourceVirtualized.AddNextItems(25); + this.itemsControl.ItemsSource = this.itemsSourceVirtualized; } } @@ -47,9 +57,9 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer if (e.VerticalChange > 0) { // scrolled to bottom - if (e.VerticalOffset == this.itemsSource.Count - e.ViewportHeight) + if (e.VerticalOffset == this.itemsSourceVirtualized.Count - e.ViewportHeight) { - this.itemsSource.RequestNextItems(1); + this.itemsSourceVirtualized.AddNextItems(1); } } } diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/GridValuesProvider.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/GridValuesProvider.cs index f084359d5c..ce14913e88 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/GridValuesProvider.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/GridValuesProvider.cs @@ -4,13 +4,11 @@ // // $Revision$ // -using Debugger.MetaData; -using Debugger.AddIn.Visualizers.Utils; using System; -using System.Collections; using System.Collections.Generic; -using ICSharpCode.SharpDevelop.Services; +using Debugger.MetaData; using ICSharpCode.NRefactory.Ast; +using Debugger.AddIn.Visualizers.Utils; namespace Debugger.AddIn.Visualizers.GridVisualizer { @@ -20,7 +18,7 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer /// public class GridValuesProvider { - protected readonly Debugger.MetaData.BindingFlags memberBindingFlags = + protected readonly BindingFlags memberBindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Field | BindingFlags.GetProperty; /// Used to quickly find MemberInfo by member name - DebugType.GetMember(name) uses a loop to search members diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/ListValuesProvider.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/ListValuesProvider.cs index db0756eedb..10c48d4e46 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/ListValuesProvider.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/ListValuesProvider.cs @@ -4,14 +4,12 @@ // // $Revision$ // -using Debugger.AddIn.Visualizers.Common; using System; -using System.Collections; -using System.Collections.Generic; +using Debugger.AddIn.Visualizers.Common; using Debugger.AddIn.Visualizers.Utils; using Debugger.MetaData; -using ICSharpCode.SharpDevelop.Services; using ICSharpCode.NRefactory.Ast; +using ICSharpCode.SharpDevelop.Services; namespace Debugger.AddIn.Visualizers.GridVisualizer { diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/VirtualizingIEnumerable.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/VirtualizingIEnumerable.cs index 3f35150137..748948c3af 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/VirtualizingIEnumerable.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Visualizers/GridVisualizer/ValueProviders/VirtualizingIEnumerable.cs @@ -28,7 +28,10 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer this.originalSourceEnumerator = originalSource.GetEnumerator(); } - public void RequestNextItems(int count) + /// + /// Requests next items from underlying IEnumerable source and adds them to the collection. + /// + public void AddNextItems(int count) { for (int i = 0; i < count; i++) {