January 26, 2021, 12:49:26 PM

Author Topic: [bmx] Move TreeViewNode by JoshK [ 1+ years ago ]  (Read 631 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] Move TreeViewNode by JoshK [ 1+ years ago ]
« on: June 29, 2017, 12:28:39 AM »
Title : Move TreeViewNode
Author : JoshK
Posted : 1+ years ago

Description : 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.


Code :
Code: BlitzMax
  1. SuperStrict
  2.  
  3. Import maxgui.drivers
  4.  
  5. Private
  6.  
  7. Function TreeViewNodeExpanded:Int(node:TGadget)
  8.         ?win32
  9.         Return TWindowsTreeNode(node)._expanded
  10.         ?
  11. EndFunction
  12.  
  13. Function ListTreeNodes(node:TGadget,nodeofinterest:TGadget,depth:Int=0)
  14.         treeviewnodearray=treeviewnodearray[..treeviewnodearray.length+1]
  15.         treeviewnodearray[treeviewnodearray.length-1]=node
  16.         treeviewnodedepth=treeviewnodedepth[..treeviewnodedepth.length+1]
  17.         treeviewnodedepth[treeviewnodedepth.length-1]=depth            
  18.         If nodeofinterest<>node
  19.                 If TreeViewNodeExpanded(node)
  20.                         For node=EachIn node.kids
  21.                                 ListTreeNodes(node,nodeofinterest,depth+1)
  22.                         Next
  23.                 EndIf
  24.         EndIf
  25. EndFunction
  26.  
  27. Function GetTreeViewNodeIndex:Int(gadget:TGadget)
  28.         Local n:Int
  29.         Local child:TGadget
  30.        
  31.         For child=EachIn gadget.parent.kids
  32.                 If child=gadget Return n
  33.                 n:+1
  34.         Next
  35.         Return -1
  36. EndFunction
  37.  
  38. Function CopyNodes(src:TGadget,dst:TGadget)
  39.         Local srcchild:TGadget
  40.         Local dstchild:TGadget
  41.                
  42.         For srcchild=EachIn src.kids
  43.                 dstchild=AddTreeViewNode(GadgetText(srcchild),dst,,GadgetExtra(srcchild))
  44.                 CopyNodes(srcchild,dstchild)
  45.         Next
  46.         If TreeViewNodeExpanded(src) ExpandTreeViewNode dst
  47. EndFunction
  48.  
  49. Global treeviewnodearray:TGadget[]
  50. Global treeviewnodedepth:Int[]
  51.  
  52. Public
  53.  
  54. Function MoveTreeViewNodeUp:TGadget(node:TGadget,tree:TGadget)',Filter:Int(node:TGadget)=Null)
  55.         Local n:Int
  56.         Local prevnode:TGadget
  57.         Local root:TGadget
  58.         Local i:Int,m:Int
  59.         Local child:TGadget
  60.         Local newnode:TGadget
  61.         Local restoreselected:Int
  62.        
  63.         If node=SelectedTreeViewNode(tree) restoreselected=True
  64.         treeviewnodearray=Null 
  65.         treeviewnodedepth=Null 
  66.         root=TreeViewRoot(tree)
  67.         For child=EachIn root.kids
  68.                 ListTreeNodes(child,node)
  69.         Next
  70.         For n=0 To treeviewnodearray.length-1
  71.                 If treeviewnodearray[n]=node
  72.                         If n>0
  73.                                 prevnode=treeviewnodearray[n-1]
  74.                                 If prevnode.parent
  75.                                         i=GetTreeViewNodeIndex(prevnode)
  76.                                         If treeviewnodedepth[n-1]>treeviewnodedepth[n]
  77.                                                 If treeviewnodedepth[n-1]-treeviewnodedepth[n]=1
  78.                                                         newnode=AddTreeViewNode(GadgetText(node),prevnode.parent,,GadgetExtra(node))
  79.                                                 Else
  80.                                                         For m=1 To (treeviewnodedepth[n-1]-treeviewnodedepth[n])
  81.                                                                 prevnode=prevnode.parent
  82.                                                         Next
  83.                                                         newnode=AddTreeViewNode(GadgetText(node),prevnode,,GadgetExtra(node))
  84.                                                 EndIf
  85.                                         Else
  86.                                                 newnode=InsertTreeViewNode(i,GadgetText(node),prevnode.parent,,GadgetExtra(node))                                              
  87.                                         EndIf
  88.                                         Exit
  89.                                 EndIf
  90.                         EndIf
  91.                         Exit
  92.                 EndIf
  93.         Next
  94.         If newnode
  95.                 CopyNodes(node,newnode)
  96.                 FreeGadget node
  97.                 If restoreselected SelectTreeViewNode newnode
  98.                 Return newnode
  99.         Else
  100.                 Return node
  101.         EndIf
  102. EndFunction
  103.  
  104. Function MoveTreeViewNodeDown:TGadget(node:TGadget,tree:TGadget)',Filter:Int(node:TGadget)=Null)
  105.         Local n:Int
  106.         Local nextnode:TGadget
  107.         Local root:TGadget
  108.         Local i:Int
  109.         Local child:TGadget
  110.         Local newnode:TGadget
  111.         Local restoreselected:Int
  112.        
  113.         If node=SelectedTreeViewNode(tree) restoreselected=True
  114.         treeviewnodearray=Null 
  115.         treeviewnodedepth=Null 
  116.         root=TreeViewRoot(tree)
  117.         For child=EachIn root.kids
  118.                 ListTreeNodes(child,node)
  119.         Next
  120.        
  121.         If GetTreeViewNodeIndex(node)=node.parent.kids.count()-1
  122.                 i=GetTreeViewNodeIndex(node.parent)
  123.                 newnode=InsertTreeViewNode(i+1,GadgetText(node),node.parent.parent,,GadgetExtra(node))
  124.         Else
  125.                 For n=0 To treeviewnodearray.length-1
  126.                         If treeviewnodearray[n]=node
  127.                                 If n<treeviewnodearray.length-1
  128.                                         nextnode=treeviewnodearray[n+1]
  129.                                         If nextnode.parent
  130.                                                 i=GetTreeViewNodeIndex(nextnode)                                       
  131.                                                 If TreeViewNodeExpanded(nextnode)
  132.                                                         If treeviewnodedepth[n+1]=treeviewnodedepth[n]-1
  133.                                                                 newnode=InsertTreeViewNode(i,GadgetText(node),nextnode.parent,,GadgetExtra(node))
  134.                                                         Else
  135.                                                                 newnode=InsertTreeViewNode(0,GadgetText(node),nextnode,,GadgetExtra(node))
  136.                                                         EndIf
  137.                                                 Else
  138.                                                         If treeviewnodedepth[n+1]<treeviewnodedepth[n]
  139.                                                                 newnode=InsertTreeViewNode(i,GadgetText(node),nextnode.parent,,GadgetExtra(node))
  140.                                                         Else
  141.                                                                 newnode=InsertTreeViewNode(i+1,GadgetText(node),nextnode.parent,,GadgetExtra(node))                                            
  142.                                                         EndIf
  143.                                                 EndIf
  144.                                                 Exit
  145.                                         EndIf
  146.                                 Else
  147.                                         If node.parent.parent
  148.                                                 newnode=AddTreeViewNode(GadgetText(node),node.parent.parent,,GadgetExtra(node))
  149.                                                 Exit
  150.                                         EndIf
  151.                                 EndIf
  152.                                 Exit
  153.                         EndIf
  154.                 Next
  155.         EndIf
  156.         If newnode
  157.                 CopyNodes(node,newnode)
  158.                 FreeGadget node
  159.                 If restoreselected SelectTreeViewNode newnode
  160.                 Return newnode
  161.         Else
  162.                 Return node
  163.         EndIf
  164. EndFunction


Comments :


Grisu(Posted 1+ years ago)

 Is there a simple source code available that demonstrates the usage?


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal