A lot of TreeView Stuff :-)
Posted: Sun Aug 25, 2002 11:12 pm
Code updated For 5.20+
Restored from previous forum. Originally posted by freak.
Hi all,
I've been playing around with the TreeViewGadget, and found, that
there was a lot of stuff missing.
I also couldn't get SetGadgetItemText() and GetGadgetItemText() to
work with the TreeView.
So I had to write my own procedures.
Here they are, some more are going to follow, if i have some more time.
Use them as you want, replys and suggestions are welcome.
--------------------------------
Programming today is a race between software engineers striving to build bigger and
better idiot-proof programs and the universe trying to produce bigger and better idiots.
...So far, the universe is winning.
Restored from previous forum. Originally posted by freak.
Hi all,
I've been playing around with the TreeViewGadget, and found, that
there was a lot of stuff missing.
I also couldn't get SetGadgetItemText() and GetGadgetItemText() to
work with the TreeView.
So I had to write my own procedures.
Here they are, some more are going to follow, if i have some more time.
Use them as you want, replys and suggestions are welcome.
Code: Select all
; These Structures are needed for: TVAddItem(), TVGetItemName() and TVSetItemName()
; *****************************************
;
;
Structure TVINSERTSTRUCT
hParent.l
hInsertAfter.l
item.TVITEM
EndStructure
;
;
;
;
Procedure TVAddItem(gadget.l, position.l, text.s, hImg.l, openflag.l)
;
; Insert a Item in a TreeView Gadget.
; not like AddGadgetItem(), this one supports the position parameter.
;
; Usage:
;***********
; gadget.l = PB Gadget Number
; position.l = Item to insert the new one after (starting with 0)
; text.s = Item Text
; hImg.l = ImageID if Image to display
; openflag.l = If #TRUE, a new TreeViewNode is created at 'position.l' and the new Item
; is added as it's Child, if #FALSE, the new one is just inserted after the 'position.l'
; Item.
;
; Note: The hImg.l parameter is only supported, if there are allready some Items with Images.
;
hwndTV.l = GadgetID(gadget)
hRoot.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
hItem = hRoot: hParent.l = 0
For i.l = 0 To position-1
hItem2.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
Repeat
If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
If hItem2 = #Null: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
Until hItem2 <> #Null
hItem = hItem2
Next i
lpis.TVINSERTSTRUCT
If openflag = #True
pitem.TVITEM
pitem\mask = #TVIF_CHILDREN | #TVIF_HANDLE
pitem\hItem = hItem
pitem\cChildren = 1
SendMessage_(hwndTV, #TVM_SETITEM, 0, @pitem)
lpis\hParent = hItem
lpis\hInsertAfter = hItem
Else
lpis\hParent = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem)
lpis\hInsertAfter = hItem
EndIf
lpis\item\mask = #TVIF_TEXT
If hImg <> 0
himl.l = SendMessage_(hwndTV, #TVM_GETIMAGELIST, #TVSIL_NORMAL ,0)
If himl <> #Null
lpis\item\mask | #TVIF_IMAGE
iImage.l = ImageList_AddIcon_(himl, hImg)
lpis\item\iImage = iImage
lpis\item\iSelectedImage = iImage
EndIf
EndIf
lpis\item\cchTextMax = Len(text)
lpis\item\pszText = @text
SendMessage_(hwndTV, #TVM_INSERTITEM, 0, @lpis)
EndProcedure
;
;
;
;
Procedure TVDeleteItem(gadget.l, item.l)
;
; Deletes a TreeViewItem.
;
;Usage:
;**************
; gadget.l = PB Gadget Number
; item.l = Item to delete (starting with 0)
;
hwndTV.l = GadgetID(gadget)
hItem.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
For i.l = 0 To item-1
hItem2.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
Repeat
If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
If hItem2 = #Null: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
Until hItem2 <> #Null
hItem = hItem2
Next i
SendMessage_(hwndTV, #TVM_DELETEITEM, 0, hItem)
EndProcedure
;
;
;
;
Procedure TVShowItem(gadget.l, item.l)
;
; Makes sure, an Item is visible. If necessary, the List is expanded and scrolled, so
; the User can see the Item
;
;Usage:
;************
; gadget.l = PB Gadget Number
; item.l = Item to make visible.
;
hwndTV.l = GadgetID(gadget)
hItem.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
For i.l = 0 To item-1
hItem2.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
Repeat
If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
If hItem2 = #Null: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
Until hItem2 <> #Null
hItem = hItem2
Next i
SendMessage_(hwndTV, #TVM_ENSUREVISIBLE, 0, hItem)
EndProcedure
;
;
;
;
;
Procedure.s TVGetItemName(gadget.l, item.l)
;
; Get the Name of a TreeViewItem. (I couldn't get GetGadgetItemText() to work, so i use this one)
;
;Usage:
;*************
; gadget.l = PB Gadget Number
; item.l = Item to get the Text of (starting with 0)
;
hwndTV.l = GadgetID(gadget)
hItem.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
For i.l = 0 To item-1
hItem2.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
Repeat
If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
If hItem2 = #Null: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
Until hItem2 <> #Null
hItem = hItem2
Next i
text.s = Space(999)
pitem.TVITEM
pitem\mask = #TVIF_TEXT
pitem\hItem = hItem
pitem\pszText = @text
pitem\cchTextMax = 999
SendMessage_(hwndTV, #TVM_GETITEM, 0, @pitem)
ProcedureReturn PeekS(pitem\pszText)
EndProcedure
;
;
;
;
Procedure TVSetItemName(gadget.l, item.l, text.s)
;
; Set the Text of a TreeViewItem. (I couldn't get SetGadgetItemText() to work, so i use this one)
;
;Usage:
;*************
; gadget.l = PB Gadget Number
; item.l = Item to set the Text of (starting with 0)
;
hwndTV.l = GadgetID(gadget)
hItem.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
For i.l = 0 To item-1
hItem2.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
Repeat
If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
If hItem2 = #Null: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
Until hItem2 <> #Null
hItem = hItem2
Next i
pitem.TVITEM
pitem\mask = #TVIF_TEXT
pitem\hItem = hItem
pitem\pszText = @text
pitem\cchTextMax = Len(text)
SendMessage_(hwndTV, #TVM_SETITEM, 0, @pitem)
EndProcedure
;
;
;
;
Procedure TVExpandNode(gadget.l, item.l, flag.l)
;
; Expands, or collapses a TreeViewNode.
;
;Usage:
;*************
; gadget.l = PB Gadget Number
; item.l = Item to expand/collapse
; flag.l = If 0: the Node collapses
; If 1: the Node is expanded
; If 2: the Node is expanded, if it was collapsed, and it's collapsed, if it was expanded
;
hwndTV.l = GadgetID(gadget)
hItem.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
For i.l = 0 To item-1
hItem2.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
Repeat
If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
If hItem2 = #Null: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
Until hItem2 <> #Null
hItem = hItem2
Next i
If flag = 1
SendMessage_(hwndTV, #TVM_EXPAND, #TVE_EXPAND, hItem)
ElseIf flag=2
SendMessage_(hwndTV, #TVM_EXPAND, #TVE_TOGGLE, hItem)
Else
SendMessage_(hwndTV, #TVM_EXPAND, #TVE_COLLAPSE, hItem)
EndIf
EndProcedure
;
;
;
;
Procedure TVExpandAll(gadget.l)
;
; Expands the whole TreeView, good for using, after it was created, to show the whole tree.
;
; Usage:
;************
; gadget.l = PB GAdget Number
;
hwndTV.l = GadgetID(gadget)
hRoot.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
hItem.l = hRoot
Repeat
SendMessage_(hwndTV, #TVM_EXPAND, #TVE_EXPAND, hItem)
hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXTVISIBLE , hItem)
Until hItem = #Null
SendMessage_(hwndTV, #TVM_ENSUREVISIBLE, 0, hRoot)
EndProcedure
;
;
;
;
Procedure TVSortNode(gadget.l, item.l, flag.l)
;
; Sorts all child Items of a TreeViewNode.
;
;Usage:
;***********
; gadget.l = PB Gadget Number
; item.l = Item where the Node Starts (the one with the '+')
; flag.l = If #TRUE, all SubNodes are Sorted, too.
; = If #FALSE, only the direct child Items of this Node are sorted.
;
hwndTV.l = GadgetID(gadget)
hItem.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
For i.l = 0 To item-1
hItem2.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
Repeat
If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
If hItem2 = #Null: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
Until hItem2 <> #Null
hItem = hItem2
Next i
SendMessage_(hwndTV, #TVM_SORTCHILDREN, flag, hItem)
EndProcedure
;
;
;
;
Procedure TVSortAll(gadget.l)
;
; Sorts the whole TreeView. This can also be done by 'TVSortNode(gadget.l, 0, #TRUE)', but
; this one is much less code :)
;
;Usage:
;***********;
; gadget.l = PB Gadget Number
;
hwndTV.l = GadgetID(gadget)
hRoot.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
SendMessage_(hwndTV, #TVM_SORTCHILDREN, #True, hRoot)
EndProcedure
--------------------------------
Programming today is a race between software engineers striving to build bigger and
better idiot-proof programs and the universe trying to produce bigger and better idiots.
...So far, the universe is winning.