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.