Code: Select all
; http://freak.coolfreepages.com/code/TreeViewStuff.html
; Author: Freak
; Update V4 and Improvement : Progi1984
; Date: 17. May 2003
; Date: 27. Nov 2006
; These Structures are needed for: TVAddItem(), TVGetItemName() and TVSetItemName()
; *****************************************
;
Structure TVITEM
mask.l
hItem.l
state.l
stateMask.l
pszText.l
cchTextMax.l
iImage.l
iSelectedImage.l
cChildren.l
lParam.l
EndStructure
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: hItem2 = 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: hItem2 = 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: hItem2 = 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: hItem2 = 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: hItem2 = 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: hItem2 = 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: hItem2 = 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
If OpenWindow(0, 0, 0, 355, 200, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
TreeGadget(0, 10, 10, 160, 160)
For a = 0 To 10
AddGadgetItem (0, -1, "Elément normal "+Str(a), 0, 0)
AddGadgetItem (0, -1, "Noeud "+Str(a), 0, 0)
AddGadgetItem (0, -1, "Sous-élément 1", 0, 1)
AddGadgetItem (0, -1, "Sous-élément 2", 0, 1)
AddGadgetItem (0, -1, "Sous-élément 3", 0, 1)
AddGadgetItem (0, -1, "Sous-élément 4", 0, 1)
AddGadgetItem (0, -1, "Fichier "+Str(a), 0, 0)
Next
ButtonGadget(1, 170,000,90,40,"TVAddItem")
ButtonGadget(2, 170,040,90,40,"TVDeleteItem")
ButtonGadget(3, 170,080,90,40,"TVShowItem")
ButtonGadget(4, 170,120,90,40,"TVGetItemName")
ButtonGadget(5, 170,160,90,40,"TVSetItemName")
ButtonGadget(6, 260,000,90,40,"TVExpandNode")
ButtonGadget(7, 260,040,90,40,"TVExpandAll")
ButtonGadget(8, 260,080,90,40,"TVSortNode")
ButtonGadget(9, 260,120,90,40,"TVSortAll")
Repeat
Event = WaitWindowEvent()
If Event=#PB_Event_Gadget
Select EventGadget()
Case 1
TVAddItem(0,0,"My Text By Button 1",0, #False)
; #true for OpenFlag add a child at the position's item
Case 2
TVDeleteItem(0,0)
Case 3
TVShowItem(0,2)
Case 4
Debug TVGetItemName(0,1)
Case 5
TVSetItemName(0,0,"My Text By Button 5")
Case 6
TVExpandNode(0,1,#True)
; #false retract the node
Case 7
TVExpandAll(0)
Case 8
TVSortNode(0,0,#True)
Case 9
TVSortAll(0)
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
EndIf