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.