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.
