How to find all selected items in a ListView
Posted: Sat Sep 22, 2012 12:45 pm
If you want to find all selected items in a ListViewGadget defined with #PB_ListView_MultiSelect, you may use the following code in Carbon or Cocoa (to select multiple items you have to hold down the <Cmd> key while clicking onto an item):
In the above code you iterate over all items in the ListView and check if the flag #PB_ListIcon_Selected is set. Note that a flag #PB_ListView_Selected doesn't exist, but #PB_ListIcon_Selected seems to work as well in a ListView too... 
But you may hit performance problems in ListViews with lots of items. Therefore in Carbon based programs you may use the API function GetDataBrowserItems() to detect all selected items (this works similar for ListIconGadgets and TreeViewGadgets):
Code: Select all
EnableExplicit
Define i.L
Define ItemCount.L
OpenWindow(0, 270, 100, 210, 284, "Multi-selection demo")
ListViewGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 50, #PB_ListView_MultiSelect)
ButtonGadget(1, (WindowWidth(0) - 140) / 2, WindowHeight(0) - 31, 140, 20, "List selected items")
For i = 1 To 12
AddGadgetItem (0, -1, "Item " + Str(i) )
Next
SetGadgetState(0, 6)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = 1
If EventType() = #PB_EventType_LeftClick
ItemCount = 0
Debug "Selected items:"
For i = 0 To CountGadgetItems(0)
If GetGadgetItemState(0, i) & #PB_ListIcon_Selected
Debug GetGadgetItemText(0, i)
ItemCount + 1
EndIf
Next i
If ItemCount = 0
Debug "No items are currently selected!"
EndIf
Debug ""
EndIf
EndIf
EndSelect
ForEver

But you may hit performance problems in ListViews with lots of items. Therefore in Carbon based programs you may use the API function GetDataBrowserItems() to detect all selected items (this works similar for ListIconGadgets and TreeViewGadgets):
Code: Select all
EnableExplicit
#kDataBrowserItemIsSelected = 1
ImportC ""
DisposeHandle(Handle.L)
GetDataBrowserItems(DataBrowserRef.L, ItemID.L, Recurse.L, ItemState.L, ItemArrayHandle)
GetDataBrowserTableViewItemRow(DataBrowserRef.L, ItemID.L, *RowIndex)
GetHandleSize(Handle.L)
NewHandle(Size.L)
EndImport
Procedure ListSelectedItems(ListViewID.L)
Protected i.L
Protected ItemArrayHandle.L
Protected ItemID.L
Protected NumHandles.L
Protected Result.L
Protected RowIndex.L
ItemArrayHandle = NewHandle(0)
If ItemArrayHandle = 0
Debug "Error: No memory available anymore!"
Else
If GetDataBrowserItems(GadgetID(ListViewID), 0, #True, #kDataBrowserItemIsSelected, ItemArrayHandle) = 0
NumHandles = GetHandleSize(ItemArrayHandle) / SizeOf(ItemID)
If NumHandles = 0
Debug "No items are currently selected!"
Else
Debug "Selected items:"
For i = 0 To NumHandles - 1
ItemID = PeekL(PeekL(ItemArrayHandle) + i * SizeOf(ItemID))
If GetDataBrowserTableViewItemRow(GadgetID(ListViewID), ItemID, @RowIndex) = 0
Debug GetGadgetItemText(ListViewID, RowIndex)
EndIf
Next i
EndIf
EndIf
Debug ""
DisposeHandle(ItemArrayHandle)
EndIf
EndProcedure
Define i.L
OpenWindow(0, 270, 100, 210, 284, "Multi-selection demo")
ListViewGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 50, #PB_ListView_MultiSelect)
ButtonGadget(1, (WindowWidth(0) - 140) / 2, WindowHeight(0) - 31, 140, 20, "List selected items")
For i = 1 To 12
AddGadgetItem (0, -1, "Item " + Str(i) )
Next
SetGadgetState(0, 6)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = 1
If EventType() = #PB_EventType_LeftClick
ListSelectedItems(0)
EndIf
EndIf
EndSelect
ForEver