Page 1 of 1

How to create this treeview?

Posted: Wed Jul 27, 2005 3:24 pm
by Kukulkan
Hi,

I have a problem which proves to be quite obstinate in the meantime. I have the following data (strings with paths from a file). They are all in a linked list, sorted by name:

Code: Select all

\BBU\ANGEBOTE\
\DURY\
\DURY\ERGEBNISSE\
\TEST\YTNEF\
\TEST\WMPARSER\
\TEST\LIBYTNEF-1.5.TAR\LIBYTNEF-1.5\LIBYTNEF-1.5\
\TESTS\
These values should get shown in a treeview like this:

Image

Please notice, that for ERGEBNISSE the parent may be seperately given (DURY). As you can see for YTNEF this is not everytime given. (TEST is not seperately given).

I have done this some time ago with the key- and parent- methods of every entry in VB. I simply don't get it to run in PureBasic.

Second problem:
If an entry is marked, I must therefore get the whole path (eg \TEST\WMPARSER\). This was the FullPath- method of the TreeViews in VB. I would do this with a key-value (if the PB-TreeView would have something like this...).

Now, how can I get the values right into the treeview? And how can I get the selected full path?

Kukulkan

Posted: Wed Jul 27, 2005 3:50 pm
by gnozal
Maybe this code can help you ( author 'Le Soldat Inconnu' from http://purebasic.hmt-forum.com/viewtopi ... highlight= )

Code: Select all

NewList RechercheFichier.s() 

Procedure RechercheFichiers(Num.l, Dossier.s) 
  
  If Right(Dossier, 1) <> "\" : Dossier + "\" : EndIf ; On s'assure qu'il y a bien un \ à la fin du nom du dossier 
  
  If ExamineDirectory(Num, Dossier, "*.*") 
    Repeat 
      FileType = NextDirectoryEntry() 
      
      If FileType = 1 
        ; On a un fichier 
        Name.s = DirectoryEntryName() 
        AddElement(RechercheFichier()) 
        RechercheFichier() = ReplaceString(Left(Dossier, Len(Dossier) - 1), "\", "\?1?") + "\?2?" + Name 
        ; 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 
      ElseIf FileType = 2 
        ; On a un dossier 
        Name.s = DirectoryEntryName() 
        If Name <> "." And Name <> ".." 
          AddElement(RechercheFichier()) 
          RechercheFichier() = ReplaceString(Dossier, "\", "\?1?") + Name 
          
          ; On lance l'analyse sur ce nouveau dossier (analyse récursive) 
          RechercheFichiers(Num + 1, Dossier + Name) 
          
          ; On réactive le dossier de recherche en cours 
          UseDirectory(Num) 
          
        EndIf 
      EndIf 
      
    Until FileType = 0 
  EndIf 

  If Num = 0 
    ; si on a finit la recherche 
    
    ; 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() = RemoveString(RemoveString(RemoveString(RechercheFichier(), "?1?"), "?2?"), Dossier) 
    Next 
  EndIf 
  
EndProcedure 


; On donne le nom du dossier dont on souhaite lister le contenu 
Dossier.s = "C:\Program Files\PureBasic\catalogs\" 
If Right(Dossier, 1) <> "\" : Dossier + "\" : EndIf ; On s'assure qu'il y a bien un \ à la fin du nom du dossier 

; On lance la recherche 
; Le premier paramêtre doit toujours être égal à 0 
RechercheFichiers(0, Dossier) 


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

; ListIconGadget(0, 0, 0, 500, 200, "Fichiers et dossiers", 470, #PB_ListIcon_FullRowSelect) 

TreeGadget(0, 0, 0, 500, 200) 

; On rempli la liste de fichier 
HideGadget(0, 1) ; Le fait de cacher le gadget permet de le remplir plus rapidement 
Nb_Dossier = 0 
n = 0 
ForEach RechercheFichier() 
  Temp = CountString(RechercheFichier(), "\") 
  If Temp < Nb_Dossier 
    Nb_Dossier - 1 
    CloseTreeGadgetNode(0) 
    AddGadgetItem(0, n, RechercheFichier()) 
  ElseIf Temp > Nb_Dossier 
    Nb_Dossier + 1 
    OpenTreeGadgetNode(0) 
    AddGadgetItem(0, n, RechercheFichier()) 
    SetGadgetItemState(0, n - 1, #PB_Tree_Expanded) 
  Else 
    AddGadgetItem(0, n, RechercheFichier()) 
  EndIf 
  
  n + 1 
  
Next 

SetGadgetState(0, 0) 

HideGadget(0, 0) 

Repeat 
  Event = WaitWindowEvent() 
  
Until Event = #PB_Event_CloseWindow