Browse Source

(SharpTreeView) fix #555: ILSpy crashes when deleting more than a screenful of assemblies

pull/569/head
Siegfried Pammer 10 years ago
parent
commit
daf973b0d5
  1. 29
      SharpTreeView/SharpTreeView.cs

29
SharpTreeView/SharpTreeView.cs

@ -120,6 +120,7 @@ namespace ICSharpCode.TreeView
} }
TreeFlattener flattener; TreeFlattener flattener;
bool updatesLocked;
void Reload() void Reload()
{ {
@ -148,18 +149,24 @@ namespace ICSharpCode.TreeView
selectedOldItems.Add(node); selectedOldItems.Add(node);
} }
} }
if (selectedOldItems != null) { if (!updatesLocked && selectedOldItems != null) {
var list = SelectedItems.Cast<SharpTreeNode>().Except(selectedOldItems).ToList(); var list = SelectedItems.Cast<SharpTreeNode>().Except(selectedOldItems).ToList();
SetSelectedItems(list); UpdateFocusedNode(list, Math.Max(0, e.OldStartingIndex - 1));
}
}
}
void UpdateFocusedNode(List<SharpTreeNode> newSelection, int topSelectedIndex)
{
if (updatesLocked) return;
SetSelectedItems(newSelection ?? Enumerable.Empty<SharpTreeNode>());
if (SelectedItem == null) { if (SelectedItem == null) {
// if we removed all selected nodes, then move the focus to the node // if we removed all selected nodes, then move the focus to the node
// preceding the first of the old selected nodes // preceding the first of the old selected nodes
SelectedIndex = Math.Max(0, e.OldStartingIndex - 1); SelectedIndex = topSelectedIndex;
FocusNode((SharpTreeNode)SelectedItem); FocusNode((SharpTreeNode)SelectedItem);
} }
} }
}
}
protected override DependencyObject GetContainerForItemOverride() protected override DependencyObject GetContainerForItemOverride()
{ {
@ -631,9 +638,19 @@ namespace ICSharpCode.TreeView
static void HandleExecuted_Delete(object sender, ExecutedRoutedEventArgs e) static void HandleExecuted_Delete(object sender, ExecutedRoutedEventArgs e)
{ {
SharpTreeView treeView = (SharpTreeView)sender; SharpTreeView treeView = (SharpTreeView)sender;
foreach (SharpTreeNode node in treeView.GetTopLevelSelection().ToArray()) treeView.updatesLocked = true;
int selectedIndex = -1;
try {
foreach (SharpTreeNode node in treeView.GetTopLevelSelection().ToArray()) {
if (selectedIndex == -1)
selectedIndex = treeView.flattener.IndexOf(node);
node.Delete(); node.Delete();
} }
} finally {
treeView.updatesLocked = false;
treeView.UpdateFocusedNode(null, Math.Max(0, selectedIndex - 1));
}
}
static void HandleCanExecute_Delete(object sender, CanExecuteRoutedEventArgs e) static void HandleCanExecute_Delete(object sender, CanExecuteRoutedEventArgs e)
{ {

Loading…
Cancel
Save