Kamal 120 posts since
Oct 17, 2007
1.
Re: how to drag and drop a in Tree control? May 8, 2008 6:42 AM
Here is an example. Note that I have subclassed TreeNode for draggable nodes that can be dragged, but not for the Nodes where you can drop (like the "Vegetables I Like" node. The code below should be used just as an idea to extend on).
{curl 6.0 applet}
{curl-file-attributes character-encoding = "windows-latin-1"}
{define-class package TreeNodeDataFrame {inherits Frame}
field constant public tree-node:DragableTreeNode
{constructor package {default tree-node:DragableTreeNode, node-data:any}
set self.tree-node = tree-node
{construct-super
dragee = {ImageDragee drag-graphic = {Frame color = "black", node-data}},
node-data
}
}
}
{define-class package DragableTreeNode {inherits DefaultTreeNode}
field private data-frame:TreeNodeDataFrame
field constant public original-node-data:any
{constructor package {default
node-data:any = null,
...
}
set self.original-node-data = node-data
set self.data-frame = {TreeNodeDataFrame self, node-data}
{construct-super
node-data = self.data-frame,
...
}
}
}
{def target-tree-node =
{TreeNode
node-data =
{Frame
"Vegetables I Like",
{on e:DragOver do
{e.will-accept-drop?
{proc
{type:Type, x:Distance, y:Distance,
effect:#DragEffect
}:DragEffect
{if {type.subtype-of? TreeNodeDataFrame} then
{return drag-effect-move}
else
{return drag-effect-none}
}
}
}
},
{on e:Drop do
{e.accept-drop
{proc
{a:any,
x:Distance,
y:Distance,
effect:#DragEffect
}:DropResult
{return
{DropResultCopy
action =
{proc {}:void
{type-switch a
case data-frame:TreeNodeDataFrame do
{target-tree-node.append data-frame.tree-node}
}
}
}
}
}
}
}
},
{TreeNode node-data="Potato"}
}
}
{TreeControl
data-model =
{TreeModel
root =
{TreeNode node-data="Food",
{TreeNode node-data = "Vegetables",
{DragableTreeNode node-data ="Squash"},
{DragableTreeNode node-data="Tomatoes"},
{DragableTreeNode node-data="Cucumbers"}
},
target-tree-node
}
}
}