|
|
@ -355,7 +355,7 @@ namespace ICSharpCode.TreeView |
|
|
|
|
|
|
|
|
|
|
|
if (Root != null && !ShowRoot) { |
|
|
|
if (Root != null && !ShowRoot) { |
|
|
|
e.Handled = true; |
|
|
|
e.Handled = true; |
|
|
|
Root.CanDrop(e, Root.Children.Count); |
|
|
|
e.Effects = Root.GetDropEffect(e, Root.Children.Count); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -365,10 +365,12 @@ namespace ICSharpCode.TreeView |
|
|
|
|
|
|
|
|
|
|
|
if (Root != null && !ShowRoot) { |
|
|
|
if (Root != null && !ShowRoot) { |
|
|
|
e.Handled = true; |
|
|
|
e.Handled = true; |
|
|
|
Root.InternalDrop(e, Root.Children.Count); |
|
|
|
e.Effects = Root.GetDropEffect(e, Root.Children.Count); |
|
|
|
|
|
|
|
if (e.Effects != DragDropEffects.None) |
|
|
|
|
|
|
|
Root.InternalDrop(e, Root.Children.Count); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
internal void HandleDragEnter(SharpTreeViewItem item, DragEventArgs e) |
|
|
|
internal void HandleDragEnter(SharpTreeViewItem item, DragEventArgs e) |
|
|
|
{ |
|
|
|
{ |
|
|
|
HandleDragOver(item, e); |
|
|
|
HandleDragOver(item, e); |
|
|
@ -377,14 +379,16 @@ namespace ICSharpCode.TreeView |
|
|
|
internal void HandleDragOver(SharpTreeViewItem item, DragEventArgs e) |
|
|
|
internal void HandleDragOver(SharpTreeViewItem item, DragEventArgs e) |
|
|
|
{ |
|
|
|
{ |
|
|
|
HidePreview(); |
|
|
|
HidePreview(); |
|
|
|
|
|
|
|
e.Effects = DragDropEffects.None; |
|
|
|
|
|
|
|
|
|
|
|
var target = GetDropTarget(item, e); |
|
|
|
var target = GetDropTarget(item, e); |
|
|
|
if (target != null) { |
|
|
|
if (target != null) { |
|
|
|
e.Handled = true; |
|
|
|
e.Handled = true; |
|
|
|
|
|
|
|
e.Effects = target.Effect; |
|
|
|
ShowPreview(target.Item, target.Place); |
|
|
|
ShowPreview(target.Item, target.Place); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
internal void HandleDrop(SharpTreeViewItem item, DragEventArgs e) |
|
|
|
internal void HandleDrop(SharpTreeViewItem item, DragEventArgs e) |
|
|
|
{ |
|
|
|
{ |
|
|
|
try { |
|
|
|
try { |
|
|
@ -393,6 +397,7 @@ namespace ICSharpCode.TreeView |
|
|
|
var target = GetDropTarget(item, e); |
|
|
|
var target = GetDropTarget(item, e); |
|
|
|
if (target != null) { |
|
|
|
if (target != null) { |
|
|
|
e.Handled = true; |
|
|
|
e.Handled = true; |
|
|
|
|
|
|
|
e.Effects = target.Effect; |
|
|
|
target.Node.InternalDrop(e, target.Index); |
|
|
|
target.Node.InternalDrop(e, target.Index); |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (Exception ex) { |
|
|
|
} catch (Exception ex) { |
|
|
@ -400,7 +405,7 @@ namespace ICSharpCode.TreeView |
|
|
|
throw; |
|
|
|
throw; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
internal void HandleDragLeave(SharpTreeViewItem item, DragEventArgs e) |
|
|
|
internal void HandleDragLeave(SharpTreeViewItem item, DragEventArgs e) |
|
|
|
{ |
|
|
|
{ |
|
|
|
HidePreview(); |
|
|
|
HidePreview(); |
|
|
@ -414,6 +419,7 @@ namespace ICSharpCode.TreeView |
|
|
|
public double Y; |
|
|
|
public double Y; |
|
|
|
public SharpTreeNode Node; |
|
|
|
public SharpTreeNode Node; |
|
|
|
public int Index; |
|
|
|
public int Index; |
|
|
|
|
|
|
|
public DragDropEffects Effect; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
DropTarget GetDropTarget(SharpTreeViewItem item, DragEventArgs e) |
|
|
|
DropTarget GetDropTarget(SharpTreeViewItem item, DragEventArgs e) |
|
|
@ -485,13 +491,14 @@ namespace ICSharpCode.TreeView |
|
|
|
GetNodeAndIndex(item, place, out node, out index); |
|
|
|
GetNodeAndIndex(item, place, out node, out index); |
|
|
|
|
|
|
|
|
|
|
|
if (node != null) { |
|
|
|
if (node != null) { |
|
|
|
e.Effects = DragDropEffects.None; |
|
|
|
var effect = node.GetDropEffect(e, index); |
|
|
|
if (node.CanDrop(e, index)) { |
|
|
|
if (effect != DragDropEffects.None) { |
|
|
|
DropTarget target = new DropTarget() { |
|
|
|
DropTarget target = new DropTarget() { |
|
|
|
Item = item, |
|
|
|
Item = item, |
|
|
|
Place = place, |
|
|
|
Place = place, |
|
|
|
Node = node, |
|
|
|
Node = node, |
|
|
|
Index = index |
|
|
|
Index = index, |
|
|
|
|
|
|
|
Effect = effect |
|
|
|
}; |
|
|
|
}; |
|
|
|
targets.Add(target); |
|
|
|
targets.Add(target); |
|
|
|
} |
|
|
|
} |
|
|
@ -614,45 +621,78 @@ namespace ICSharpCode.TreeView |
|
|
|
|
|
|
|
|
|
|
|
static void HandleExecuted_Cut(object sender, ExecutedRoutedEventArgs e) |
|
|
|
static void HandleExecuted_Cut(object sender, ExecutedRoutedEventArgs e) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
e.Handled = true; |
|
|
|
|
|
|
|
SharpTreeView treeView = (SharpTreeView)sender; |
|
|
|
|
|
|
|
var nodes = treeView.GetTopLevelSelection().ToArray(); |
|
|
|
|
|
|
|
if (nodes.Length > 0) |
|
|
|
|
|
|
|
nodes[0].Cut(nodes); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void HandleCanExecute_Cut(object sender, CanExecuteRoutedEventArgs e) |
|
|
|
static void HandleCanExecute_Cut(object sender, CanExecuteRoutedEventArgs e) |
|
|
|
{ |
|
|
|
{ |
|
|
|
e.CanExecute = false; |
|
|
|
SharpTreeView treeView = (SharpTreeView)sender; |
|
|
|
|
|
|
|
var nodes = treeView.GetTopLevelSelection().ToArray(); |
|
|
|
|
|
|
|
e.CanExecute = nodes.Length > 0 && nodes[0].CanCut(nodes); |
|
|
|
|
|
|
|
e.Handled = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void HandleExecuted_Copy(object sender, ExecutedRoutedEventArgs e) |
|
|
|
static void HandleExecuted_Copy(object sender, ExecutedRoutedEventArgs e) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
e.Handled = true; |
|
|
|
|
|
|
|
SharpTreeView treeView = (SharpTreeView)sender; |
|
|
|
|
|
|
|
var nodes = treeView.GetTopLevelSelection().ToArray(); |
|
|
|
|
|
|
|
if (nodes.Length > 0) |
|
|
|
|
|
|
|
nodes[0].Copy(nodes); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void HandleCanExecute_Copy(object sender, CanExecuteRoutedEventArgs e) |
|
|
|
static void HandleCanExecute_Copy(object sender, CanExecuteRoutedEventArgs e) |
|
|
|
{ |
|
|
|
{ |
|
|
|
e.CanExecute = false; |
|
|
|
SharpTreeView treeView = (SharpTreeView)sender; |
|
|
|
|
|
|
|
var nodes = treeView.GetTopLevelSelection().ToArray(); |
|
|
|
|
|
|
|
e.CanExecute = nodes.Length > 0 && nodes[0].CanCopy(nodes); |
|
|
|
|
|
|
|
e.Handled = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void HandleExecuted_Paste(object sender, ExecutedRoutedEventArgs e) |
|
|
|
static void HandleExecuted_Paste(object sender, ExecutedRoutedEventArgs e) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
SharpTreeView treeView = (SharpTreeView)sender; |
|
|
|
|
|
|
|
var data = Clipboard.GetDataObject(); |
|
|
|
|
|
|
|
if (data != null) { |
|
|
|
|
|
|
|
var selectedNode = (treeView.SelectedItem as SharpTreeNode) ?? treeView.Root; |
|
|
|
|
|
|
|
if (selectedNode != null) |
|
|
|
|
|
|
|
selectedNode.Paste(data); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
e.Handled = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void HandleCanExecute_Paste(object sender, CanExecuteRoutedEventArgs e) |
|
|
|
static void HandleCanExecute_Paste(object sender, CanExecuteRoutedEventArgs e) |
|
|
|
{ |
|
|
|
{ |
|
|
|
e.CanExecute = false; |
|
|
|
SharpTreeView treeView = (SharpTreeView)sender; |
|
|
|
|
|
|
|
var data = Clipboard.GetDataObject(); |
|
|
|
|
|
|
|
if (data == null) { |
|
|
|
|
|
|
|
e.CanExecute = false; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
var selectedNode = (treeView.SelectedItem as SharpTreeNode) ?? treeView.Root; |
|
|
|
|
|
|
|
e.CanExecute = selectedNode != null && selectedNode.CanPaste(data); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
e.Handled = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void HandleExecuted_Delete(object sender, ExecutedRoutedEventArgs e) |
|
|
|
static void HandleExecuted_Delete(object sender, ExecutedRoutedEventArgs e) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
e.Handled = true; |
|
|
|
SharpTreeView treeView = (SharpTreeView)sender; |
|
|
|
SharpTreeView treeView = (SharpTreeView)sender; |
|
|
|
foreach (SharpTreeNode node in treeView.GetTopLevelSelection().ToArray()) |
|
|
|
var nodes = treeView.GetTopLevelSelection().ToArray(); |
|
|
|
node.Delete(); |
|
|
|
if (nodes.Length > 0) |
|
|
|
|
|
|
|
nodes[0].Delete(nodes); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void HandleCanExecute_Delete(object sender, CanExecuteRoutedEventArgs e) |
|
|
|
static void HandleCanExecute_Delete(object sender, CanExecuteRoutedEventArgs e) |
|
|
|
{ |
|
|
|
{ |
|
|
|
SharpTreeView treeView = (SharpTreeView)sender; |
|
|
|
SharpTreeView treeView = (SharpTreeView)sender; |
|
|
|
e.CanExecute = treeView.GetTopLevelSelection().All(node => node.CanDelete()); |
|
|
|
var nodes = treeView.GetTopLevelSelection().ToArray(); |
|
|
|
|
|
|
|
e.CanExecute = nodes.Length > 0 && nodes[0].CanDelete(nodes); |
|
|
|
|
|
|
|
e.Handled = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// <summary>
|
|
|
|