Respects existing state to combine values (doesn't simply overwrite), so for example if it's collapsed or expanded and you select/deselect it it will stay collapsed/expanded.
[Update] in Windows i think this is possible with a single SendMessage call and using "-1" as the control id - for an example (using listview instead of treeview but probably just requires different variant of the same message) see here
There are just 4 simple functions, but here is a full demo:
Code: Select all
;=====================================================================================================
Procedure TreeExpandAllItems(TreeId)
Protected CurItem.i, CurState.i, ItemCnt.i = CountGadgetItems(TreeId)
If ItemCnt <= 0: ProcedureReturn: EndIf
For CurItem = 0 To ItemCnt-1
CurState = GetGadgetItemState(TreeId, CurItem)
CurState = CurState ! #PB_Tree_Collapsed
If CurState & #PB_Tree_Checked
CurState = #PB_Tree_Checked | #PB_Tree_Expanded
ElseIf CurState & #PB_Tree_Inbetween
CurState = #PB_Tree_Inbetween | #PB_Tree_Expanded
Else
CurState = #PB_Tree_Expanded
EndIf
SetGadgetItemState(TreeId, CurItem, CurState)
Next
EndProcedure
Procedure TreeCollapseAllItems(TreeId)
Protected CurItem.i, CurState.i, ItemCnt.i = CountGadgetItems(TreeId)
If ItemCnt <= 0: ProcedureReturn: EndIf
For CurItem = 0 To ItemCnt-1
CurState = GetGadgetItemState(TreeId, CurItem)
CurState = CurState ! #PB_Tree_Expanded
If CurState & #PB_Tree_Checked
CurState = #PB_Tree_Checked | #PB_Tree_Collapsed
ElseIf CurState & #PB_Tree_Inbetween
CurState = #PB_Tree_Inbetween | #PB_Tree_Collapsed
Else
CurState = #PB_Tree_Collapsed
EndIf
SetGadgetItemState(TreeId, CurItem, CurState)
Next
EndProcedure
Procedure TreeDeselectAllItems(TreeId)
Protected CurItem.i, CurState.i, ItemCnt.i = CountGadgetItems(TreeId)
If ItemCnt <= 0: ProcedureReturn: EndIf
For CurItem = 0 To ItemCnt-1
CurState = GetGadgetItemState(TreeId, CurItem)
CurState = CurState ! #PB_Tree_Checked
SetGadgetItemState(TreeId, CurItem, CurState)
Next
EndProcedure
Procedure TreeSelectAllItems(TreeId)
Protected CurItem.i, CurState.i, ItemCnt.i = CountGadgetItems(TreeId)
If ItemCnt <= 0: ProcedureReturn: EndIf
For CurItem = 0 To ItemCnt-1
CurState = GetGadgetItemState(TreeId, CurItem)
CurState = CurState | #PB_Tree_Checked
SetGadgetItemState(TreeId, CurItem, CurState)
Next
EndProcedure
;=====================================================================================================
Enumeration FormWindow
#DlgMain
EndEnumeration
Enumeration FormGadget
#Tree1
#btnExpand
#btnCollapse
#btnSelect
#btnDeselect
EndEnumeration
Declare btnExpand(EventType)
Declare btnCollapse(EventType)
Declare btnDeselect(EventType)
Declare btnSelect(EventType)
Procedure OpenDlgMain(x = 0, y = 0, width = 530, height = 370)
OpenWindow(#DlgMain, x, y, width, height, "Tree Select, Deselect, Expand, Collapse", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_WindowCentered)
TreeGadget(#Tree1, 0, 0, 530, 330, #PB_Tree_CheckBoxes)
ButtonGadget(#btnExpand, 60, 340, 80, 20, "Expand all")
ButtonGadget(#btnCollapse, 150, 340, 80, 20, "Collapse all")
ButtonGadget(#btnSelect, 290, 340, 80, 20, "Select all")
ButtonGadget(#btnDeselect, 380, 340, 80, 20, "Deselect all")
EndProcedure
Procedure DlgMain_Events(event)
Select event
Case #PB_Event_CloseWindow
ProcedureReturn #False
Case #PB_Event_Menu
Select EventMenu()
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case #btnExpand
btnExpand(EventType())
Case #btnCollapse
btnCollapse(EventType())
Case #btnSelect
btnSelect(EventType())
Case #btnDeselect
btnDeselect(EventType())
EndSelect
EndSelect
ProcedureReturn #True
EndProcedure
Procedure btnExpand(EventType)
TreeExpandAllItems(#Tree1)
EndProcedure
Procedure btnCollapse(EventType)
TreeCollapseAllItems(#Tree1)
EndProcedure
Procedure btnDeselect(EventType)
TreeDeselectAllItems(#Tree1)
EndProcedure
Procedure btnSelect(EventType)
TreeSelectAllItems(#Tree1)
EndProcedure
Procedure FillTreeWithDemoItems(TreeId)
Protected lTreeItem, lRootNode, lSubNode
For lRootNode = 1 To 3
AddGadgetItem (TreeId, -1, "Root " + Str(lRootNode) + " <TreeItem index "+Str(lTreeItem)+">", 0, 0)
lTreeItem + 1
For lSubNode = 1 To 4
AddGadgetItem (TreeId, -1, "Subnode " + Str(lSubNode) + " of Root " + Str(lRootNode) + " <TreeItem index "+Str(lTreeItem)+">", 0, 1)
lTreeItem + 1
Next
SetGadgetItemState(TreeId,lTreeItem - lSubNode,#PB_Tree_Expanded) ;expand the node now we've finished adding to it
Next lRootNode
EndProcedure
OpenDlgMain()
FillTreeWithDemoItems(#Tree1)
Repeat
event = WaitWindowEvent()
Until DlgMain_Events(event) = #False
End