|
|
@ -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) |
|
|
|
{ |
|
|
|
{ |
|
|
|