Code archives/BlitzPlus Gui/Move TreeViewNode

This code has been declared by its author to be Public Domain code.

Download source code

Move TreeViewNode by JoshK2011
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

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


Code Archives Forum