Code archives/BlitzPlus Gui/Move TreeViewNode
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
This code will move a treeview node up and down in a treeview hierarchy. It will cross parent boundaries and ignore collapsed nodes, so the node responds in a logical manner. Because there is no command to retrieve a treeview node's icon, icons must be manually reset after a treeview node is moved. The code frees the old node and creates a new one in the correct place. This code will not currently work on OSX because there is no way I know of to retrieve the treeview node's expanded state. | |||||
SuperStrict Import maxgui.drivers Private Function TreeViewNodeExpanded:Int(node:TGadget) ?win32 Return TWindowsTreeNode(node)._expanded ? EndFunction Function ListTreeNodes(node:TGadget,nodeofinterest:TGadget,depth:Int=0) treeviewnodearray=treeviewnodearray[..treeviewnodearray.length+1] treeviewnodearray[treeviewnodearray.length-1]=node treeviewnodedepth=treeviewnodedepth[..treeviewnodedepth.length+1] treeviewnodedepth[treeviewnodedepth.length-1]=depth If nodeofinterest<>node If TreeViewNodeExpanded(node) For node=EachIn node.kids ListTreeNodes(node,nodeofinterest,depth+1) Next EndIf EndIf EndFunction Function GetTreeViewNodeIndex:Int(gadget:TGadget) Local n:Int Local child:TGadget For child=EachIn gadget.parent.kids If child=gadget Return n n:+1 Next Return -1 EndFunction Function CopyNodes(src:TGadget,dst:TGadget) Local srcchild:TGadget Local dstchild:TGadget For srcchild=EachIn src.kids dstchild=AddTreeViewNode(GadgetText(srcchild),dst,,GadgetExtra(srcchild)) CopyNodes(srcchild,dstchild) Next If TreeViewNodeExpanded(src) ExpandTreeViewNode dst EndFunction Global treeviewnodearray:TGadget[] Global treeviewnodedepth:Int[] Public Function MoveTreeViewNodeUp:TGadget(node:TGadget,tree:TGadget)',Filter:Int(node:TGadget)=Null) Local n:Int Local prevnode:TGadget Local root:TGadget Local i:Int,m:Int Local child:TGadget Local newnode:TGadget Local restoreselected:Int If node=SelectedTreeViewNode(tree) restoreselected=True treeviewnodearray=Null treeviewnodedepth=Null root=TreeViewRoot(tree) For child=EachIn root.kids ListTreeNodes(child,node) Next For n=0 To treeviewnodearray.length-1 If treeviewnodearray[n]=node If n>0 prevnode=treeviewnodearray[n-1] If prevnode.parent i=GetTreeViewNodeIndex(prevnode) If treeviewnodedepth[n-1]>treeviewnodedepth[n] If treeviewnodedepth[n-1]-treeviewnodedepth[n]=1 newnode=AddTreeViewNode(GadgetText(node),prevnode.parent,,GadgetExtra(node)) Else For m=1 To (treeviewnodedepth[n-1]-treeviewnodedepth[n]) prevnode=prevnode.parent Next newnode=AddTreeViewNode(GadgetText(node),prevnode,,GadgetExtra(node)) EndIf Else newnode=InsertTreeViewNode(i,GadgetText(node),prevnode.parent,,GadgetExtra(node)) EndIf Exit EndIf EndIf Exit EndIf Next If newnode CopyNodes(node,newnode) FreeGadget node If restoreselected SelectTreeViewNode newnode Return newnode Else Return node EndIf EndFunction Function MoveTreeViewNodeDown:TGadget(node:TGadget,tree:TGadget)',Filter:Int(node:TGadget)=Null) Local n:Int Local nextnode:TGadget Local root:TGadget Local i:Int Local child:TGadget Local newnode:TGadget Local restoreselected:Int If node=SelectedTreeViewNode(tree) restoreselected=True treeviewnodearray=Null treeviewnodedepth=Null root=TreeViewRoot(tree) For child=EachIn root.kids ListTreeNodes(child,node) Next If GetTreeViewNodeIndex(node)=node.parent.kids.count()-1 i=GetTreeViewNodeIndex(node.parent) newnode=InsertTreeViewNode(i+1,GadgetText(node),node.parent.parent,,GadgetExtra(node)) Else For n=0 To treeviewnodearray.length-1 If treeviewnodearray[n]=node If n<treeviewnodearray.length-1 nextnode=treeviewnodearray[n+1] If nextnode.parent i=GetTreeViewNodeIndex(nextnode) If TreeViewNodeExpanded(nextnode) If treeviewnodedepth[n+1]=treeviewnodedepth[n]-1 newnode=InsertTreeViewNode(i,GadgetText(node),nextnode.parent,,GadgetExtra(node)) Else newnode=InsertTreeViewNode(0,GadgetText(node),nextnode,,GadgetExtra(node)) EndIf Else If treeviewnodedepth[n+1]<treeviewnodedepth[n] newnode=InsertTreeViewNode(i,GadgetText(node),nextnode.parent,,GadgetExtra(node)) Else newnode=InsertTreeViewNode(i+1,GadgetText(node),nextnode.parent,,GadgetExtra(node)) EndIf EndIf Exit EndIf Else If node.parent.parent newnode=AddTreeViewNode(GadgetText(node),node.parent.parent,,GadgetExtra(node)) Exit EndIf EndIf Exit EndIf Next EndIf If newnode CopyNodes(node,newnode) FreeGadget node If restoreselected SelectTreeViewNode newnode Return newnode Else Return node EndIf EndFunction |
Comments
| ||
Is there a simple source code available that demonstrates the usage? |
Code Archives Forum