Page 1 sur 1

Trier des fichier dans une listicongadget

Publié : jeu. 29/janv./2004 10:34
par Le Soldat Inconnu
Salut,

voici un code très compliqué, je le reconnait mais qui permet de classer des fichier dans une listicongadget d'une manière intéressante.

tout d'abord le code ensuite les explications

Code : Tout sélectionner

Procedure.l Triage(Liste.l, Colonne.l, File.s)
  ; Cette procedure permet de connaître la position à laquelle ajouté un élément dans une liste
  ; Elle trie les éléments de manière à placer les fichiers comme si il était dans un arbre
  ; Liste : Numéro de la liste
  ; Colonne : Colonne qui sert de référence
  ; File : nom du fichier à ajouté et que l'on souhaite placé correctement dans la liste
  
  File = "#\" + LCase(File)
  Path.s = GetPathPart(Left(File, Len(File) - 1))
  Debug "Path = " + path
  ExistPath.s = ""
  Index = 1
  Depart = 0
  NbElement = CountGadgetItems(Liste) - 1
  Fin = NbElement
  Debug depart
  Debug fin
  
  ; La première partie du code consiste à connaitre la partie du nom du fichier qui existe déjà 
  ; dans la liste. puis de connaitre la plage dans laquelle cette partie de fichier est présente (par exemple du 2 au 5ième éléments de la liste)

  Repeat
    Partie1.s = StringField(Path, Index, "\")
    Debug "Partie1 = " + partie1
    If Partie1 <> ""
      Test_Ok = 0
      For n = Depart To Fin
        File2.s = LCase("#\" + GetGadgetItemText(liste, n, Colonne))
        Debug "File2 = " + File2
        Partie2.s = StringField(GetPathPart(File2), Index, "\")
        Debug "Partie2 = " + partie2 + "   (index="+ Str(index) + ")"
        If Test_Ok = 0 And Partie1 = Partie2
          Test_Ok = 1
          Depart2 = n
        EndIf
        If Partie1 = Partie2
          Fin2 = n
        EndIf
      Next
      Debug "Depart2 = " + Str(Depart2)
      Debug "Fin2 = " + Str(Fin2)
      Depart = Depart2
      Fin = Fin2
    EndIf
    ExistPath2.s = ExistPath + Partie1 + "\"
    If Partie1 <> "" And FindString(LCase("#\" + GetGadgetItemText(liste, Depart, Colonne)), ExistPath2, 1) = 1
      ExistPath = ExistPath2
      Index + 1
    EndIf
  Until Partie1 = "" Or FindString(LCase("#\" + GetGadgetItemText(liste, Depart, Colonne)), ExistPath2, 1) = 0
  
  ; On affiche ici les résultats de la première partie de l'algo
  Debug ">> Depart = " + Str(depart)
  Debug ">> Fin = " + Str(fin)
  Debug ">> ExistPath = " + ExistPath
  
  ; la deuxième partie du code consiste à placé le fichier parmi ceux qui possède un morceau identique
  ; donc les dossiers en premier et les fichiers après
  ; la comparaison s'effectue uniquement sur la partie de l'adresse du fichiers ou dossier qui suit la partie déjà existante du fichiers ou dossiers
  
  Partie1.s = StringField(File, Index, "\")
  Type1.s = Mid(File, Len(ExistPath + Partie1) + 1, 1)
  Debug "Index = " + Str(Index)
  Debug "Partie1 = " + partie1
  Debug File
  Debug ExistPath + Partie1
  Debug "Type1 = '" + type1 + "'"
  
  Depart = Depart - 1
  Repeat
    Depart + 1
    File2.s = LCase("#\" + GetGadgetItemText(liste, Depart, Colonne))
    Partie2.s = StringField(File2, Index, "\")
    Longueur.l = Len(ExistPath + Partie2)
    If Longueur < Len(File2)
      Type2.s = Mid(File2, Longueur + 1, 1)
    Else
      Type2.s = Mid(File2, Longueur, 1)
      If Type2 <> "\" : Type2 = "" : EndIf
    EndIf
    Debug "File2 = " + File2
    Debug "Partie2 = " + Partie2
    Debug "Type2 = '" + Type2 + "'"
  Until (Type1 = Type2 And Partie1 <= Partie2) Or (Type1 = "\" And Type2 = "") Or Depart > Fin Or Depart > NbElement
  
  Debug ">> Depart = " + Str(depart)
  Debug "--------------------"
  
  ProcedureReturn Depart
EndProcedure





Procedure ListIconGadgetXP(GadgetID.l, x.l, y.l, tx.l, ty.l, colonne.s, largeur.l, options.l)
  ListIconGadget(GadgetID, x, y, tx, ty, colonne, largeur, options)
  #LVM_SETEXTENDEDLISTVIEWSTYLE = 4150 : #LVS_EX_SUBITEMIMAGES = 2
  hImageListS.l = SHGetFileInfo_("c:\", 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX | #SHGFI_SMALLICON)
  ImageList_SetBkColor_(hImageListS, #CLR_NONE)
  SendMessage_(GadgetID(GadgetID), #LVM_SETIMAGELIST, #LVSIL_SMALL, hImageListS)
  SendMessage_(GadgetID(GadgetID), #LVM_SETEXTENDEDLISTVIEWSTYLE, #LVS_EX_SUBITEMIMAGES, #LVS_EX_SUBITEMIMAGES)
EndProcedure

Procedure AddGadgetItemXP(GadgetID.l, Pos.l, Texte.s, IconPath.s)
  SHGetFileInfo_(IconPath, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX | #SHGFI_SMALLICON)
  If Pos = -1
    Pos = CountGadgetItems(GadgetID) + 1
  EndIf
  
  Structure LVITEM
    mask.l
    iItem.l
    iSubitem.l
    state.l
    stateMask.l
    pszText.l
    cchTextMax.l
    iImage.l
    lParam.l
    iIndent.l
    iGroupId.l
    cColumns.l
    puColumns.l
  EndStructure
  
  var.LVITEM
  Var\mask = #LVIF_IMAGE | #LVIF_TEXT
  Var\iSubItem = 0
  Var\iItem = Pos
  Var\pszText = @Texte
  Var\iImage = InfosFile\iIcon
  Sendmessage_(GadgetID(GadgetID), #LVM_INSERTITEM, 0, @Var)
EndProcedure

Procedure Open_Window()
  
  If OpenWindow(0, 0, 0, 500, 200, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Ajouter des fichiers par glisser déposer")
    DragAcceptFiles_(WindowID(), #TRUE) ; activez le glisser déposer
    SetWindowPos_(WindowID(), -1, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE) ; fenêtre toujours au premier plan
    If CreateGadgetList(WindowID())
      ListIconGadgetXP(1, 0, 0, 500, 200, "Fichiers", 495, 0) ; crée une listicongadget avec icônes systèmes
    EndIf
  EndIf
EndProcedure


Procedure DragAndDrop()
  dropped.l = EventwParam()
  num.l = DragQueryFile_(dropped, -1, "", 0)
  For index = 0 To num - 1
    size.l = DragQueryFile_(dropped, index, 0, 0)
    filename.s = Space(size)
    DragQueryFile_(dropped, index, filename, size + 1)
    
    If FileSize(filename) = -2
      If Right(filename, 1) <> "\" : filename = filename + "\" : EndIf
    EndIf
    
    ; Attention, un dossier doit obligatoirement se finir par un \ sinon l'algo plante
    Position = Triage(1, 0, Filename)
    AddGadgetItemXP(1, Position, filename, filename)
    
  Next
  DragFinish_(dropped)
EndProcedure

;- debut du programme
Open_Window()

Repeat
  Event = WaitWindowEvent()
  
  If Event = #WM_DROPFILES : DragAndDrop() : EndIf
  
Until Event = #PB_EventCloseWindow

End
Vous ajouter des fichier ou des dossier en vrac par glisser déposer et vous regarder ce qui ce passe