Multiselection in Explorergadget

Just starting out? Need help? Post your questions and find answers here.
freak
PureBasic Team
PureBasic Team
Posts: 5944
Joined: Fri Apr 25, 2003 5:21 pm
Location: Germany

Post by freak »

As the name allready states, this flag us for the treegadget :wink:
There is no support for checkboxes in the explorer gadget.


However, you can easily add it like this:

Code: Select all

#LVM_SETEXTENDEDLISTVIEWSTYLE = #LVM_FIRST + 54
#LVS_EX_CHECKBOXES = 4

#Explorer = 0
#Button = 1
#List = 2

If OpenWindow(0, 0, 0, 600, 600, #PB_Window_Screencentered|#PB_Window_SystemMenu, "")
  If CreateGadgetList(WindowID())    
    
    ExplorerListGadget(#Explorer, 5, 5, 590, 380, "C:\")
    
    ; Enable the checkboxes in the Explorergadget:
    SendMessage_(GadgetID(#Explorer), #LVM_SETEXTENDEDLISTVIEWSTYLE, #LVS_EX_CHECKBOXES, #LVS_EX_CHECKBOXES)    
    
    ; for the test
    ButtonGadget(#Button, 5, 390, 80, 20, "Show selected")
    ListViewGadget(#List, 5, 415, 590, 180)
            
    Repeat
      Event = WaitWindowEvent()
      
      If Event = #PB_EventGadget And EventGadgetID() = #Button
      
        ClearGadgetItemList(#List)
        
        ; loop through all displayed items
        For i = 0 To CountGadgetItems(#Explorer)-1
        
          ; get the checkbox state
          state = SendMessage_(GadgetID(#Explorer), #LVM_GETITEMSTATE, i, #LVIS_STATEIMAGEMASK)
          
          If state >> 12 > 1
            ; checkbox is checked
            AddGadgetItem(#List, -1, GetGadgetText(#Explorer)+GetGadgetItemText(#Explorer, i, 0))
          EndIf
        
        Next i
        
      
      EndIf
      
    Until Event = #PB_EventCloseWindow
  EndIf
EndIf

End   

Here's another example for ExplorerTreeGadget(), which i wrote a while
ago for the german forum:

Code: Select all

#FileTree = 1
#List = 2
#Button = 3

#TVS_CHECKBOXES = $100

; rekursiver scan durch das explorertreegadget:
Procedure ScanTree(hItem)

  hItem = SendMessage_(GadgetID(#FileTree), #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
  While hItem
 
    ; daten über das item lesen
    item.TV_ITEM\mask = #TVIF_CHILDREN|#TVIF_HANDLE|#TVIF_STATE
    item\hItem = hItem
    item\statemask = #TVIS_STATEIMAGEMASK
    SendMessage_(GadgetID(#FileTree), #TVM_GETITEM, 0, @item)
   
    ; ist die checkbox gesetzt??
    If ((item\state >> 12) -1)
     
      ; item selektieren, um per GetGAdgetText(#FileTree) den pfad zu bekommen
      SendMessage_(GadgetID(#FileTree), #TVM_SELECTITEM, #TVGN_CARET, hItem)
     
      ; Pfad abspeichern
      AddGadgetItem(#List, -1, GetGadgetText(#FileTree))
    EndIf
   
    ; wenn das item childitems hat, suche dort fortsetzen:
    If item\cChildren > 0
      ScanTree(hItem)
    EndIf
   
    ; nextes item
    hItem = SendMessage_(GadgetID(#FileTree), #TVM_GETNEXTITEM, #TVGN_NEXT, hItem)
  Wend

EndProcedure


If OpenWindow(0, 0, 0, 300, 600, #PB_Window_SystemMenu|#PB_Window_Screencentered, "Path Requester")
  If CreateGadgetList(WindowID())
 
    ExplorerTreeGadget(#FileTree, 5, 5, 290, 275, "", #PB_Explorer_NoFiles)
   
    ; checkboxes aktivieren
    styles = GetWindowLong_(GadgetID(#FileTree), #GWL_STYLE)
    SetWindowLong_(GadgetID(#FileTree), #GWL_STYLE, styles | #TVS_CHECKBOXES)
   
    ButtonGadget(#Button, 215, 285, 80, 20, "Ok")
    ListViewGadget(#List, 5, 310, 290, 285)
   
    Repeat
      Event = WaitWindowEvent()
     
      If Event = #PB_EventGadget And EventGadgetID() = #Button
     
        ClearGadgetItemList(#List)
       
        ; das selektierte item wird beim scan verändert -> abspeichern
        selected = SendMessage_(GadgetID(#FileTree), #TVM_GETNEXTITEM, #TVGN_CARET, 0)               
       
        ; suche beim root item starten
        root = SendMessage_(GadgetID(#FileTree), #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
       
        ; rekursiven scan durch alle items und childitems
        ScanTree(root)
       
        ; selektiertes item zurücksetzen
        SendMessage_(GadgetID(#FileTree), #TVM_SELECTITEM, #TVGN_CARET, selected)
       
     
      EndIf
     
    Until Event = #PB_EventCLoseWindow
   
 
  EndIf
EndIf
End

Timo
quidquid Latine dictum sit altum videtur
zikitrake
Addict
Addict
Posts: 876
Joined: Thu Mar 25, 2004 2:15 pm
Location: Spain

Post by zikitrake »

freak wrote:As the name allready states....

Freak, In your second code, are there any option to select all child (and subchild) items when a CheckBox of an object is checked?.

Thank you
PB 6.21 beta, PureVision User
Post Reply