Browse Source

Adds a uniqueness semantic to the navigation history, by removing the previous state (by the selected nodes) from the prior history.

pull/132/head
Alex Lyman 14 years ago
parent
commit
130258d949
  1. 3
      ILSpy/ILSpy.csproj
  2. 19
      ILSpy/MainWindow.xaml.cs
  3. 4
      ILSpy/NavigationHistory.cs
  4. 28
      ILSpy/NavigationState.cs

3
ILSpy/ILSpy.csproj

@ -120,6 +120,7 @@
<Compile Include="LoadedAssembly.cs" /> <Compile Include="LoadedAssembly.cs" />
<Compile Include="NativeMethods.cs" /> <Compile Include="NativeMethods.cs" />
<Compile Include="NavigationHistory.cs" /> <Compile Include="NavigationHistory.cs" />
<Compile Include="NavigationState.cs" />
<Compile Include="OpenFromGacDialog.xaml.cs"> <Compile Include="OpenFromGacDialog.xaml.cs">
<DependentUpon>OpenFromGacDialog.xaml</DependentUpon> <DependentUpon>OpenFromGacDialog.xaml</DependentUpon>
<SubType>Code</SubType> <SubType>Code</SubType>
@ -272,4 +273,4 @@
<Folder Include="XmlDoc" /> <Folder Include="XmlDoc" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project> </Project>

19
ILSpy/MainWindow.xaml.cs

@ -46,8 +46,7 @@ namespace ICSharpCode.ILSpy
/// </summary> /// </summary>
partial class MainWindow : Window partial class MainWindow : Window
{ {
NavigationHistory<Tuple<List<SharpTreeNode>, DecompilerTextViewState>> history = NavigationHistory<NavigationState> history = new NavigationHistory<NavigationState>();
new NavigationHistory<Tuple<List<SharpTreeNode>, DecompilerTextViewState>>();
ILSpySettings spySettings; ILSpySettings spySettings;
SessionSettings sessionSettings; SessionSettings sessionSettings;
AssemblyListManager assemblyListManager; AssemblyListManager assemblyListManager;
@ -334,7 +333,7 @@ namespace ICSharpCode.ILSpy
{ {
if (e.OldItems != null) if (e.OldItems != null)
foreach (LoadedAssembly asm in e.OldItems) foreach (LoadedAssembly asm in e.OldItems)
history.RemoveAll(n => n.Item1.Any(nd => nd.AncestorsAndSelf().OfType<AssemblyTreeNode>().Any(a => a.LoadedAssembly == asm))); history.RemoveAll(n => n.TreeNodes.Any(nd => nd.AncestorsAndSelf().OfType<AssemblyTreeNode>().Any(a => a.LoadedAssembly == asm)));
} }
void LoadInitialAssemblies() void LoadInitialAssemblies()
@ -510,7 +509,7 @@ namespace ICSharpCode.ILSpy
return; return;
if (recordHistory) if (recordHistory)
history.Record(Tuple.Create(treeView.SelectedItems.OfType<SharpTreeNode>().ToList(), decompilerTextView.GetState())); history.Record(new NavigationState(treeView.SelectedItems.OfType<SharpTreeNode>(), decompilerTextView.GetState()));
if (treeView.SelectedItems.Count == 1) { if (treeView.SelectedItems.Count == 1) {
ILSpyTreeNode node = treeView.SelectedItem as ILSpyTreeNode; ILSpyTreeNode node = treeView.SelectedItem as ILSpyTreeNode;
@ -584,22 +583,20 @@ namespace ICSharpCode.ILSpy
void NavigateHistory(bool forward) void NavigateHistory(bool forward)
{ {
var currentSelection = treeView.SelectedItems.OfType<SharpTreeNode>().ToList(); var combinedState = new NavigationState(treeView.SelectedItems.OfType<SharpTreeNode>(), decompilerTextView.GetState());
var state = decompilerTextView.GetState();
var combinedState = Tuple.Create(currentSelection, state);
history.Record(combinedState, replace: true, clearForward: false); history.Record(combinedState, replace: true, clearForward: false);
var newState = forward ? history.GoForward() : history.GoBack(); var newState = forward ? history.GoForward() : history.GoBack();
ignoreDecompilationRequests = true; ignoreDecompilationRequests = true;
treeView.SelectedItems.Clear(); treeView.SelectedItems.Clear();
foreach (var node in newState.Item1) foreach (var node in newState.TreeNodes)
{ {
treeView.SelectedItems.Add(node); treeView.SelectedItems.Add(node);
} }
if (newState.Item1.Count > 0) if (newState.TreeNodes.Any())
treeView.FocusNode(newState.Item1[0]); treeView.FocusNode(newState.TreeNodes.First());
ignoreDecompilationRequests = false; ignoreDecompilationRequests = false;
DecompileSelectedNodes(newState.Item2, false); DecompileSelectedNodes(newState.ViewState, false);
} }
#endregion #endregion

4
ILSpy/NavigationHistory.cs

@ -12,7 +12,7 @@ namespace ICSharpCode.ILSpy
/// Stores the navigation history. /// Stores the navigation history.
/// </summary> /// </summary>
internal sealed class NavigationHistory<T> internal sealed class NavigationHistory<T>
where T : class where T : class, IEquatable<T>
{ {
private const double NavigationSecondsBeforeNewEntry = 0.5; private const double NavigationSecondsBeforeNewEntry = 0.5;
@ -68,6 +68,8 @@ namespace ICSharpCode.ILSpy
if (current != null) if (current != null)
back.Add(current); back.Add(current);
// We only store a record once, and ensure it is on the top of the stack, so we just remove the old record
back.Remove(node);
current = node; current = node;
} }

28
ILSpy/NavigationState.cs

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ICSharpCode.ILSpy.TextView;
using ICSharpCode.TreeView;
namespace ICSharpCode.ILSpy
{
public class NavigationState : IEquatable<NavigationState>
{
private HashSet<SharpTreeNode> treeNodes;
public IEnumerable<SharpTreeNode> TreeNodes { get { return treeNodes; } }
public DecompilerTextViewState ViewState { get; private set; }
public NavigationState(IEnumerable<SharpTreeNode> treeNodes, DecompilerTextViewState viewState)
{
this.treeNodes = new HashSet<SharpTreeNode>(treeNodes);
ViewState = viewState;
}
public bool Equals(NavigationState other)
{
// TODO: should this care about the view state as well?
return this.treeNodes.SetEquals(other.treeNodes);
}
}
}
Loading…
Cancel
Save