Basic Univers
Enumeration
  #RechercheFichier_Tree
 
  ;- Images
  ; TreeGadget
  #Fichier0
  #Fichier1
  #Dossier0
  #Dossier1
  #Fichier0_Selected
  #Fichier1_Selected
  #Dossier0_Selected
  #Dossier1_Selected
  #Tree_Glyph_Closed
  #Tree_Glyph_Opened
EndEnumeration

;- Contantes et variables de paramétrage
Global RechercheFichier_Espace.l
Global ColorBackGround_Selected.l, ColorBackGround_Normal.l, ColorBorder_Selected.l, ColorBorder_Normal.l
#RechercheFichier_EspacePx = 8

#CheckBox_Size            = 12 ; Taille des boite à cocher
#ColorBackGround_Selected = $707070 ; Couleur de fond du texte sélectionné
#ColorBackGround_Normal   = $E0FFFF ; Couleur de fond du texte normal
#ColorBorder_Normal       = $FFFFFF ; Couleur de bordure du texte sélectionné
#ColorBorder_Selected     = 0 ; Couleur de bordure du texte normal
#ColorText_NormalSelected = $FFFFFF ; Couleur du texte sélectionné
#ColorText_Normal         = 0 ; couleur du texte normal
ColorBackGround_Selected  = CreateSolidBrush_(#ColorBackGround_Selected)
ColorBackGround_Normal    = CreateSolidBrush_(#ColorBackGround_Normal)
ColorBorder_Selected      = CreateSolidBrush_(#ColorBorder_Selected)
ColorBorder_Normal        = CreateSolidBrush_(#ColorBorder_Normal)
#ColorCheckBox_Element    = $74C274 ; Couleur de l'élement signifiant que la case est cochée
#ColorCheckBox_Border     = 0 ; Couleur de bordure des boites à cocher
#ColorCheckBox_Selected   = $74D6FF ; Coleur des boites à cocher sélectionnées

#Tree_Glyph_Space = 19 ; décalage en pixel après chaque noeuds

;- Polices de caractère
Global FontID_Defaut.l
FontID_Defaut = GetStockObject_(#DEFAULT_GUI_FONT)


; Cette liste va recevoir le contenu du dossier dans lequel on a lancé la recherche
Structure InfoFichier
  Nom.s
  Type.l
  Info1.l
  Info2.l
  Niveau.l
EndStructure
NewList RechercheFichier.InfoFichier()
Global DossierRecherche.s

Procedure.l TreeGadget_CustomDraw(WindowID.l, Message.l, wParam.l, lParam.l)
  #NM_CUSTOMDRAW = #NM_FIRST - 12
  #CDDS_ITEM = $10000
  #CDDS_SUBITEM = $20000
  #CDDS_PREPAINT = $1
  #CDDS_POSTPAINT = $2
  #CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT
  #CDDS_ITEMPOSTPAINT = #CDDS_ITEM | #CDDS_POSTPAINT
  #CDDS_SUBITEMPREPAINT = #CDDS_SUBITEM | #CDDS_ITEMPREPAINT
  #CDRF_DODEFAULT = $0
  #CDRF_NEWFONT = $2
  #CDRF_SKIPDEFAULT = $4
  #CDRF_NOTIFYITEMDRAW = $20
  #CDRF_NOTIFYPOSTPAINT = $10
  #CDRF_NOTIFYSUBITEMDRAW = $20
  #CDRF_NOTIFYPOSTERASE = $40
  #CDIS_SELECTED = $1
  #CDIS_CHECKED = $8
 
  Select Message
    Case #WM_NOTIFY
      *TVCDHeader.NMTVCUSTOMDRAW = lParam
      If *TVCDHeader\nmcd\hdr\hWndFrom = GadgetID(#RechercheFichier_Tree) And * TVCDHeader\nmcd\hdr\code = #NM_CUSTOMDRAW
        Select *TVCDHeader\nmcd\dwDrawStage
           
          Case #CDDS_PREPAINT
            ProcedureReturn #CDRF_NOTIFYITEMDRAW
           
          Case #CDDS_ITEMPREPAINT
            ; Modifier la couleur de fond
            ; *TVCDHeader\clrTextBk = RGB(255, 255, 223)
            ; Modifier la couleur du texte
            ; *TVCDHeader\clrText = RGB(0, 0, 0)
            ; Modifier la police
            ; SelectObject_(*TVCDHeader\nmcd\hDC, FontBold)
           
            ; Le numéro de la ligne affichée
            Item.l = TreeGadgetItemNumber(#RechercheFichier_Tree, *TVCDHeader\nmcd\dwItemSpec)
            If Item >= 0 And * TVCDHeader\nmcd\rc\Right <> 0
              ; *TVCDHeader\nmcd\rc\Right <> 0
              ; Quand le TreeGadget est trop petit pour afficher le texte en entier, un ToolTip apparait et dans ce cas la zone de dessin est nulle
              ; il faut donc filtrer cet affichage
             
              Level.l = *TVCDHeader\iLevel ; Le niveau de l'item (dans combien de noeuds il se trouve)
              *TVCDHeader\nmcd\rc\Left - GetScrollPos_(GadgetID(#RechercheFichier_Tree), #SB_HORZ) ; Prendre en compte le décalage horizontal (la ScrollBar horizontale)
             
              ; On sélectionne l'élément dans la liste
              SelectElement(RechercheFichier(), Item)
             
              ; On regarde si on a associé un icône à l'élément
              pitem.TV_ITEM\mask = #TVIF_IMAGE
              pitem\hItem = *TVCDHeader\nmcd\dwItemSpec
              SendMessage_(GadgetID(#RechercheFichier_Tree), #TVM_GETITEM, 0, pitem)
              If pitem\iImage = 0 ; Si pas d'icône
                Fichier.s = DossierRecherche + RechercheFichier()\Nom ; on récupère le nom du fichier
                SHGetFileInfo_(Fichier, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_SMALLICON) ; on extrait l'icône associé au fichier
                pitem.TV_ITEM\mask = #TVIF_IMAGE | #TVIF_SELECTEDIMAGE
                pitem\iImage = InfosFile\iIcon
                pitem\iSelectedImage = InfosFile\iIcon
                SendMessage_(GadgetID(#RechercheFichier_Tree), #TVM_SETITEM, 0, pitem) ; On mets l'icône sur l'item
              EndIf
             
              ; Le niveau de l'item (on décale l'affichage en fonction du nombre de noeuds avant l'item)
              *TVCDHeader\nmcd\rc\Left + Level * #Tree_Glyph_Space
             
              ; On dessine les textes sans couleur de fond
              SetBkMode_(*TVCDHeader\nmcd\hDC, #TRANSPARENT)
             
              ItemExpanded = GetGadgetItemState(#RechercheFichier_Tree, Item)
              ItemSelected = ItemExpanded & #PB_Tree_Selected ; Si la ligne est sélectionnée
              ItemExpanded = ItemExpanded & #PB_Tree_Expanded ; Si la ligne est déployée (pour les dossier)
             
              ; On choisi les couleurs du cadre autour du texte et la couleur du texte
              If ItemSelected
                ColorBackGround = ColorBackGround_Selected ; Couleur de fond
                ColorBorder = ColorBorder_Selected ; Couleur de bordure
                SetTextColor_(*TVCDHeader\nmcd\hDC, #ColorText_NormalSelected) ; Couleur du texte
              Else
                ColorBackGround = ColorBackGround_Normal
                ColorBorder = ColorBorder_Normal
                SetTextColor_(*TVCDHeader\nmcd\hDC, #ColorText_Normal)
              EndIf
             
              ; On choisi les images des boites à cocher
              If RechercheFichier()\Type = 1 ; Si on a un fichier
                If ItemSelected
                  If RechercheFichier()\Info1
                    Image1 = #Fichier1_Selected
                  Else
                    Image1 = #Fichier0_Selected
                  EndIf
                  If RechercheFichier()\Info2
                    Image2 = #Fichier1_Selected
                  Else
                    Image2 = #Fichier0_Selected
                  EndIf
                Else
                  If RechercheFichier()\Info1
                    Image1 = #Fichier1
                  Else
                    Image1 = #Fichier0
                  EndIf
                  If RechercheFichier()\Info2
                    Image2 = #Fichier1
                  Else
                    Image2 = #Fichier0
                  EndIf
                EndIf
              Else ; Si on a un dossier
                If ItemSelected
                  If RechercheFichier()\Info1
                    Image1 = #Dossier1_Selected
                  Else
                    Image1 = #Dossier0_Selected
                  EndIf
                  If RechercheFichier()\Info2
                    Image2 = #Dossier1_Selected
                  Else
                    Image2 = #Dossier0_Selected
                  EndIf
                Else
                  If RechercheFichier()\Info1
                    Image1 = #Dossier1
                  Else
                    Image1 = #Dossier0
                  EndIf
                  If RechercheFichier()\Info2
                    Image2 = #Dossier1
                  Else
                    Image2 = #Dossier0
                  EndIf
                EndIf
               
                ; On dessine le noeud
                If ItemExpanded
                  Image = #Tree_Glyph_Opened
                Else
                  Image = #Tree_Glyph_Closed
                EndIf
                DrawState_(*TVCDHeader\nmcd\hDC, 0, 0, UseImage(Image), 0, *TVCDHeader\nmcd\rc\Left, *TVCDHeader\nmcd\rc\Top, 19, 16, #DST_BITMAP | #DSS_NORMAL)
              EndIf
             
              *TVCDHeader\nmcd\rc\Left + #Tree_Glyph_Space
             
              ; On dessine les boites à cocher
              DrawState_(*TVCDHeader\nmcd\hDC, 0, 0, UseImage(Image1), 0, *TVCDHeader\nmcd\rc\Left, *TVCDHeader\nmcd\rc\Top +(16 - #CheckBox_Size) / 2, #CheckBox_Size, #CheckBox_Size, #DST_BITMAP | #DSS_NORMAL)
              ; DrawState_(*TVCDHeader\nmcd\hDC, 0, 0, UseImage(Image2), 0, *TVCDHeader\nmcd\rc\Left + #CheckBox_Size + 1, *TVCDHeader\nmcd\rc\Top + (16 - #CheckBox_Size) / 2, #CheckBox_Size, #CheckBox_Size, #DST_BITMAP | #DSS_NORMAL)
             
              ; On dessine l'icône
              himl = SendMessage_(GadgetID(Gadget), #TVM_GETIMAGELIST, #TVSIL_NORMAL, 0)
              ImageList_Draw_(himl, pitem\iImage, *TVCDHeader\nmcd\hDC, *TVCDHeader\nmcd\rc\Left + #CheckBox_Size + 8, *TVCDHeader\nmcd\rc\Top, #ILD_NORMAL)
             
              ; On regarde la longueur en pixel du texte
              Txt.s = GetFilePart(RechercheFichier()\Nom)
              GetTextExtentPoint32_(*TVCDHeader\nmcd\hDC, Txt, Len(Txt), TxtSize.SIZE)
             
              ; On dessine le cadre autour du texte
              *TVCDHeader\nmcd\rc\Left + #CheckBox_Size + 8 + 16 + 3
              *TVCDHeader\nmcd\rc\Right = *TVCDHeader\nmcd\rc\Left + 6 + TxtSize\cx
              FillRect_(*TVCDHeader\nmcd\hDC, *TVCDHeader\nmcd\rc, ColorBackGround) ; Le fond
              FrameRect_(*TVCDHeader\nmcd\hDC, *TVCDHeader\nmcd\rc, ColorBorder) ; La bordure
             
              ; On dessine le texte
              *TVCDHeader\nmcd\rc\Left + 3
              DrawTextEx_(*TVCDHeader\nmcd\hDC, Txt, - 1, *TVCDHeader\nmcd\rc, #DT_EXPANDTABS | #DT_VCENTER | #DT_SINGLELINE | Alignement, 0)
            EndIf
            ProcedureReturn #CDRF_SKIPDEFAULT
           
        EndSelect
      EndIf
     
  EndSelect
 
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure



Procedure AddTreeGadgetImageList(Gadget)
  himl = SendMessage_(GadgetID(Gadget), #TVM_GETIMAGELIST, #TVSIL_NORMAL, 0)
  If himl = 0 ; Pas d'imagelist associé au TreeGadget
    himl = SHGetFileInfo_("", 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX | #SHGFI_SMALLICON)
    SendMessage_(GadgetID(Gadget), #TVM_SETIMAGELIST, #TVSIL_NORMAL, himl) ; On associe l'imagelist avec le gadget
    SetWindowCallback( @TreeGadget_CustomDraw()) ; Cette callback sert à personnaliser l'apparence du TreeGadget
  EndIf
EndProcedure



Procedure AnalyseDossier(Num, Dossier.s)
  If Right(Dossier, 1) <> "\" : Dossier + "\" : EndIf
 
  ; Le dossier 2
  Dossier2.s = RemoveString(Dossier, DossierRecherche)
  Dossier3.s = ReplaceString(Left(Dossier2, Len(Dossier2) - 1), "\", "\?1?")
  ; on met ?1? devant le nom des dossier et ?2? devant le nom des fichiers
  ; Ainsi lors du tri des données, les dossiers seront placés avant les fichiers
  ; Il suffira ensuite de supprimer les ?1? et ?2? des noms de fichiers ou dossiers
  ; Le caratère ? n'étant pas utilisable dans les noms de fichiers, cet ajout ne présente aucun problème
  If Dossier3
    Dossier3 = "?1?" + Dossier3 + "\"
  EndIf
 
  If ExamineDirectory(Num, Dossier, "*.*")
    Repeat
      FileType = NextDirectoryEntry()
      If FileType = 1
        ; On a un fichier
        Name.s = DirectoryEntryName()
        AddElement(RechercheFichier())
        RechercheFichier()\Nom = Dossier3 + "?2?" + Name
        RechercheFichier()\Type = 1
      ElseIf FileType = 2
        ; On a un dossier
        Name.s = DirectoryEntryName()
        If Name <> "." And Name <> ".."
          AddElement(RechercheFichier())
          RechercheFichier()\Nom = Dossier3 + "?1?" + Name
          RechercheFichier()\Type = 2
         
          ; On lance l'analyse sur ce nouveau dossier (analyse récursive)
          AnalyseDossier(Num + 1, Dossier + Name)
          ; On réactive le dossier de recherche en cours
          UseDirectory(Num)
        EndIf
      EndIf
    Until FileType = 0
  EndIf
EndProcedure



Procedure RechercheFichiers(Dossier.s)
 
  If Right(Dossier, 1) <> "\" : Dossier + "\" : EndIf ; On s'assure qu'il y a bien un \ à la fin du nom du dossier
 
  AddTreeGadgetImageList(#RechercheFichier_Tree)
  ClearGadgetItemList(#RechercheFichier_Tree)
  ClearList(RechercheFichier())
 
  DossierRecherche = Dossier
 
  AnalyseDossier(0, Dossier)
 
  ; On tri les noms de fichiers et dossiers
  ; Je passe ici par un SortStructuredList car SortList à une erreur dans PB 3.93 avec le tri de listes chainés contenant du texte, ceci doit-être résolu pour les future version.
  SortStructuredList(RechercheFichier(), 2, 0, #PB_Sort_String)
 
  ; On retire les ?1? et ?2?, et également l'adresse du dossier d'origine
  ForEach RechercheFichier()
    RechercheFichier()\Nom = RemoveString(RemoveString(RechercheFichier()\Nom, "?1?"), "?2?")
  Next
 
  ; On rempli la liste de fichier
  HideGadget(#RechercheFichier_Tree, 1) ; Le fait de cacher le gadget permet de le remplir plus rapidement
  Nb_Dossier = 0
  n = 0
  Txt.s = Space(RechercheFichier_Espace)
  ForEach RechercheFichier()
    RechercheFichier()\Niveau = CountString(RechercheFichier()\Nom, "\") ; On regarde le niveau de l'élément
    If RechercheFichier()\Niveau < Nb_Dossier
      Nb_Dossier - 1
      CloseTreeGadgetNode(#RechercheFichier_Tree)
      AddGadgetItem(#RechercheFichier_Tree, n, Txt + GetFilePart(RechercheFichier()\Nom) + Txt)
    ElseIf RechercheFichier()\Niveau > Nb_Dossier
      Nb_Dossier + 1
      OpenTreeGadgetNode(#RechercheFichier_Tree)
      AddGadgetItem(#RechercheFichier_Tree, n, Txt + GetFilePart(RechercheFichier()\Nom) + Txt)
      SetGadgetItemState(#RechercheFichier_Tree, n - 1, #PB_Tree_Expanded)
    Else
      AddGadgetItem(#RechercheFichier_Tree, n, Txt + GetFilePart(RechercheFichier()\Nom) + Txt)
    EndIf
    n + 1
  Next
 
  ; Les icônes ne sont pas affichées ici, elles sont gérer par la callback
  ; Pourquoi ?
  ; Les icônes sont très long à charger, donc plutot que de récupérer les icônes de tous les éléments
  ; La callback récupère les icônes uniquement pour les éléments affichés
  ; Ce qui donne un gain de temps considérable
 
  SetGadgetState(#RechercheFichier_Tree, 0) ; On sélectionne le premier élément
 
  HideGadget(#RechercheFichier_Tree, 0)
 
EndProcedure








; Ouvre une fenêtre
If OpenWindow(0, 0, 0, 200, 250, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered, "Recherche fichiers") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf


;{ Nombre d'espace nécessaire au décalage des textes du TreeGadget
; A quoi sert ceci ?
; Comme je dessine entièreement le TreeGadget, la longueur de la ligne n'est pas forcément identiques à la ligne standard
; Alors j'ajoute des espaces pour ajusté la longueur
StartDrawing(WindowOutput())
  DrawingFont(FontID_Defaut)
  RechercheFichier_Espace = 0
  Repeat
    RechercheFichier_Espace + 1
  Until TextLength(Space(RechercheFichier_Espace)) >=(#RechercheFichier_EspacePx + 2 * #CheckBox_Size) / 2
StopDrawing()
Debug RechercheFichier_Espace
; RechercheFichier_Espace = 10
;}
;{ Création des images du TreeGadget
CreateImage(#Fichier0, #CheckBox_Size, #CheckBox_Size)
StartDrawing(ImageOutput())
  Box(0, 0, #CheckBox_Size, #CheckBox_Size, $FFFFFF)
  DrawingMode(4)
  Box(0, 0, #CheckBox_Size, #CheckBox_Size, #ColorCheckBox_Border)
StopDrawing()
CreateImage(#Fichier1, #CheckBox_Size, #CheckBox_Size)
StartDrawing(ImageOutput())
  Box(0, 0, #CheckBox_Size, #CheckBox_Size, $FFFFFF)
  Box(2, 2, #CheckBox_Size - 4, #CheckBox_Size - 4, #ColorCheckBox_Element)
  DrawingMode(4)
  Box(0, 0, #CheckBox_Size, #CheckBox_Size, #ColorCheckBox_Border)
StopDrawing()

CreateImage(#Dossier0, #CheckBox_Size, #CheckBox_Size)
StartDrawing(ImageOutput())
  Box(0, 0, #CheckBox_Size, #CheckBox_Size, $FFFFFF)
  DrawingMode(4)
  Circle(#CheckBox_Size / 2, #CheckBox_Size / 2, #CheckBox_Size / 2, #ColorCheckBox_Border)
StopDrawing()
CreateImage(#Dossier1, #CheckBox_Size, #CheckBox_Size)
StartDrawing(ImageOutput())
  Box(0, 0, #CheckBox_Size, #CheckBox_Size, $FFFFFF)
  Circle(#CheckBox_Size / 2, #CheckBox_Size / 2, #CheckBox_Size / 2 - 2, #ColorCheckBox_Element)
  DrawingMode(4)
  Circle(#CheckBox_Size / 2, #CheckBox_Size / 2, #CheckBox_Size / 2, #ColorCheckBox_Border)
StopDrawing()

CreateImage(#Fichier0_Selected, #CheckBox_Size, #CheckBox_Size)
StartDrawing(ImageOutput())
  Box(0, 0, #CheckBox_Size, #CheckBox_Size, $FFFFFF)
  Box(1, 1, #CheckBox_Size - 2, #CheckBox_Size - 2, #ColorCheckBox_Selected)
  DrawingMode(4)
  Box(0, 0, #CheckBox_Size, #CheckBox_Size, #ColorCheckBox_Border)
StopDrawing()
CreateImage(#Fichier1_Selected, #CheckBox_Size, #CheckBox_Size)
StartDrawing(ImageOutput())
  Box(0, 0, #CheckBox_Size, #CheckBox_Size, $FFFFFF)
  Box(1, 1, #CheckBox_Size - 2, #CheckBox_Size - 2, #ColorCheckBox_Selected)
  Box(2, 2, #CheckBox_Size - 4, #CheckBox_Size - 4, #ColorCheckBox_Element)
  DrawingMode(4)
  Box(0, 0, #CheckBox_Size, #CheckBox_Size, #ColorCheckBox_Border)
StopDrawing()

CreateImage(#Dossier0_Selected, #CheckBox_Size, #CheckBox_Size)
StartDrawing(ImageOutput())
  Box(0, 0, #CheckBox_Size, #CheckBox_Size, $FFFFFF)
  Circle(#CheckBox_Size / 2, #CheckBox_Size / 2, #CheckBox_Size / 2, #ColorCheckBox_Selected)
  DrawingMode(4)
  Circle(#CheckBox_Size / 2, #CheckBox_Size / 2, #CheckBox_Size / 2, #ColorCheckBox_Border)
StopDrawing()
CreateImage(#Dossier1_Selected, #CheckBox_Size, #CheckBox_Size)
StartDrawing(ImageOutput())
  Box(0, 0, #CheckBox_Size, #CheckBox_Size, $FFFFFF)
  Circle(#CheckBox_Size / 2, #CheckBox_Size / 2, #CheckBox_Size / 2, #ColorCheckBox_Selected)
  Circle(#CheckBox_Size / 2, #CheckBox_Size / 2, #CheckBox_Size / 2 - 2, #ColorCheckBox_Element)
  DrawingMode(4)
  Circle(#CheckBox_Size / 2, #CheckBox_Size / 2, #CheckBox_Size / 2, #ColorCheckBox_Border)
StopDrawing()

CreateImage(#Tree_Glyph_Closed, 19, 16)
StartDrawing(ImageOutput())
  Box(0, 0, 19, 16, $FFFFFF)
  DrawingMode(4)
  Box(5, 4, 9, 9, 0)
  Line(9, 6, 0, 5, 0)
  Line(7, 8, 5, 0, 0)
StopDrawing()

CreateImage(#Tree_Glyph_Opened, 19, 16)
StartDrawing(ImageOutput())
  Box(0, 0, 19, 16, $FFFFFF)
  DrawingMode(4)
  Box(5, 4, 9, 9, 0)
  Line(7, 8, 5, 0, 0)
StopDrawing()

;}


TreeGadget(#RechercheFichier_Tree, 0, 0, 200, 200, #PB_Tree_AlwaysShowSelection)

Temps1 = ElapsedMilliseconds()

; On lance la recherche
; Vous devez mettre ici le dossier de votre choix
; 3700 fichiers en 16 secondes sur mon 900mhz
RechercheFichiers("F:\Program Files\MSN Gaming Zone")

Temps2 = ElapsedMilliseconds()

TextGadget(#PB_Any, 0, 200, 200, 15, Str(CountList(RechercheFichier())) + " fichiers et dossiers")
TextGadget(#PB_Any, 0, 215, 200, 15, Str(Temps2 - Temps1) + " ms")

Repeat
  Event = WaitWindowEvent()
 
  Select Event
    Case #PB_EventGadget
      Select EventGadgetID()
        Case #RechercheFichier_Tree
          Select EventType()
            Case #PB_EventType_LeftClick
              GetCursorPos_( @MouseClic.TV_HITTESTINFO\pt) ; Coordonnée de la souris
              ScreenToClient_(GadgetID(#RechercheFichier_Tree), @MouseClic\pt) ; On convertit les coordonnées par rapport au gadget
              SendMessage_(GadgetID(#RechercheFichier_Tree), #TVM_HITTEST, 0, MouseClic) ; On récupère le handle de l'élément cliqué
              Item = TreeGadgetItemNumber(#RechercheFichier_Tree, MouseClic\hItem) ; On récupère le numéro de l'item cliqué
              If Item >= 0
                SetGadgetState(#RechercheFichier_Tree, Item) ; On sélectionne l'item (FULLROWSELECT)
               
                SelectElement(RechercheFichier(), Item) ; on récupère l'élément de la liste
                ; Debug RechercheFichier()\nom
               
                MouseClic\pt\X + GetScrollPos_(GadgetID(#RechercheFichier_Tree), #SB_HORZ) ; prise en compte du décalage du à la ScrollBar verticale
               
                ; Si on clique sur la première case à cocher
                If MouseClic\pt\X >= RechercheFichier()\Niveau * #Tree_Glyph_Space + #Tree_Glyph_Space And MouseClic\pt\X < RechercheFichier()\Niveau * #Tree_Glyph_Space + #Tree_Glyph_Space + #CheckBox_Size
                  ; On change l'état de la case à cocher
                  RechercheFichier()\Info1 = 1 - RechercheFichier()\Info1
                  InvalidateRect_(GadgetID(#RechercheFichier_Tree), 0, 0) ; On dit de redessiner le gadget
               
                  ; Si on clique sur la deuxième case à cocher
                ElseIf MouseClic\pt\X >= RechercheFichier()\Niveau * #Tree_Glyph_Space + #Tree_Glyph_Space + #CheckBox_Size + 1 And MouseClic\pt\X < RechercheFichier()\Niveau * #Tree_Glyph_Space + #Tree_Glyph_Space + #CheckBox_Size * 2 + 1
                  ; On change l'état de la case à cocher
                  RechercheFichier()\Info2 = 1 - RechercheFichier()\Info2
                  InvalidateRect_(GadgetID(#RechercheFichier_Tree), 0, 0) ; On dit de redessiner le gadget
                EndIf
              EndIf
          EndSelect
      EndSelect
  EndSelect
 
Until Event = #PB_Event_CloseWindow

; Mais impossible de faire ce que je veux :
; Cad créer un treegadget
; Ajouter des items avec icone et image attaché !
; Puis modifier les images quand je le veux !


; SI Régis, tu passes par là, Help me !