How to find all selected items in a ListView

Mac OSX specific forum
User avatar
Shardik
Addict
Addict
Posts: 1989
Joined: Thu Apr 21, 2005 2:38 pm
Location: Germany

How to find all selected items in a ListView

Post by Shardik »

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):

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
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... :wink:

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
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3870
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Re: How to find all selected items in a ListView

Post by wilbert »

For those interested, the Cocoa version using CocoaMessage
http://www.purebasic.fr/english/viewtop ... 19&t=50795

Code: Select all

EnableExplicit

Procedure ListSelectedItems(ListViewID.i)
  
  Protected.i SelectedIndexes = CocoaMessage(0, GadgetID(ListViewID), "selectedRowIndexes")
  Protected.i RowIndex = CocoaMessage(0, SelectedIndexes, "firstIndex")
  
  If RowIndex = #NSNotFound
    Debug "No items are currently selected!"
  Else
    Repeat
      Debug GetGadgetItemText(ListViewID, RowIndex)
      RowIndex = CocoaMessage(0, SelectedIndexes, "indexGreaterThanIndex:", RowIndex)
    Until RowIndex = #NSNotFound
  EndIf
  Debug ""
  
EndProcedure

Define.i i

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
Post Reply