Vous ne vous en souvenez peut-être pas, mais j'avais fait ça la première fois dans un ComboBox, et c'était pas très pratique.
Je l'ai refait dans un TreeGadget, et là, c'est nettement mieux.
Il se loge toujours dans la barre d'outils de jaPBe, et il crée directement une copie du fichier dans l'éditeur.
Deux bugs.
1 - On ne peut plus l'utiliser avec l'éditeur de PureBasic : Ca plante. Pourquoi? Mystère!
Le code concernant l'éditeur de Pure est commenté pour le moment.
[Résolu] 2 - Quand on minimise jaPBe ou qu'on modifie sa taille, les boutons disparaissent. Il faut passer la souris au dessus des boutons pour qu'il reviennent.
Faudrait trouver le moyen de rafraichir la fenêtre de l'éditeur. Si vous avez une idée...
'fin... bref! Voilà le code.
Si vous utilisez jaPBe et que vous avez CodeArchiv, pouvez-vous le tester?
Double-click sur un fichier pour le copier dans jaPBe
Click droit sur un fichier pour le visualiser dans l'éditeur à droite de la fenêtre.
Le bouton "Ouvrir" sert à ouvrir et à refermer la fenêtre, et le bouton "Quitter"...
Incroyable, non!

Code : Tout sélectionner
;{- Enumération des Constantes
Enumeration ; Fenêtres
#Win_Main
#Win_Buttons
EndEnumeration
Enumeration ; Gadgets
#Tree
#Edit
#Split
#Btn_Open
#Btn_Quit
EndEnumeration
Enumeration 1 ;Editeurs
#JaPBe
#PureBasic
EndEnumeration
;}
;{- Constantes diverses
#ImgFold = 0
#ImgFile = 1
#WMCD_InsertText = 2
;}
;{- Déclaration des procédures
Declare EnumChildProc(hWind.l, lParam.l)
Declare EnumWindowProc(hWind.l, lParam.l)
Declare.s ListFiles(Directory.s, Nb.l, Ext.s)
Declare SendDatasToEditor(MainWin.l, Datas$, Mode.l)
Declare FileStreamIn(FileID.l, file.s, gadget.l, Mode.l)
Declare StreamFileIn_Callback(hFile.l, pbBuff.l, cb.l, pcb.l)
Declare TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
;}
;{- Variables
Global Class$
Global hToolBar.l
Global hCommand
;}
;{- Structures, Listes et Tableaux
;/ La liste chainée, couplée à une structure, permet de récupérer plusieurs des caractéristiques
;/ concernant les fichiers.
Structure Fichiers
NomFichier.s
Chemin.s
Niveau.l
Type.b
EndStructure
Global NewList Arbre.Fichiers()
;}
;{- Mutex pour détecter si CodArchiv-List est déjà ouvert
hMutex = CreateMutex_(0, 0, "CodeArchiv-List")
If GetLastError_() = #ERROR_ALREADY_EXISTS
MessageRequester("Stop","CodeArchiv-List est déjà ouvert",#MB_OK|#MB_ICONERROR) : End
EndIf
;}
;{- Images du TreeGadget
; If CreateImage(#ImgFile, 16, 16)
; StartDrawing(ImageOutput(#ImgFile))
; Box(0, 0, 16, 16, $FFFFFF)
; DrawText(3,0,"F", $0000FF)
; StopDrawing()
; EndIf
;
; If CreateImage(#ImgFold, 16, 16)
; StartDrawing(ImageOutput(#ImgFold))
; Box(0, 0, 16, 16, $FFFFFF)
; DrawText(3,0,"D", $FF0000)
; StopDrawing()
; EndIf
LoadImage(#ImgFile, "File.ico")
LoadImage(#ImgFold, "Folder.ico")
;}
;{- Initialisation
If OpenPreferences("CA_List.pref")
PreferenceGroup("Config")
Rep_Ini$ = ReadPreferenceString("Chemin",ExePath$)
Editeur = ReadPreferenceLong("Editeur",1)
ClosePreferences()
Else
Rep_Ini$ = PathRequester("Sélectionnez le dossier contenant CodeArchiv", ExePath$)
OpenWindow(0,0,0,160,70,"Choisissez l'éditeur",#PB_Window_TitleBar|#PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
TextGadget(0,10,10,140,35,"Sélectionnez l'éditeur utilisé"+Chr(10)+"dans la liste",#PB_Text_Center)
ComboBoxGadget(1,10,40,140,100)
AddGadgetItem(1,-1,"JaPBe")
; AddGadgetItem(1,-1,"PureBasic")
; SetGadgetState(1, 0)
EndIf
Repeat
Select WindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case 1
If EventType() = #PB_EventType_RightClick
Editeur = GetGadgetState(1)+1
Close = #True
EndIf
EndSelect
EndSelect
Until Close
CloseWindow(0)
CreatePreferences("CA_List.pref")
PreferenceGroup("Config")
WritePreferenceString("Chemin",Rep_Ini$)
WritePreferenceLong("Editeur",Editeur)
ClosePreferences()
EndIf
;}
;{- Détection de la barre d'outils de l'éditeur
If Editeur = #JaPBe
Class$ = "WindowClass_7;jaPBe V3;PureContainer"
ElseIf Editeur = #PureBasic
Class$ = "WindowClass_2;PureBasic;ToolbarWindow32"
EndIf
*Class = AllocateMemory(128)
PokeS(*Class, Class$)
EnumWindows_(@EnumWindowProc(),*Class)
;}
;{- Procédures
Procedure EnumChildProc(hWind, lParam)
BufClass$ = Space(128) : GetClassName_(hWind, @BufClass$, 128)
If BufClass$ = PeekS(lParam)
hToolBar = hWind : Result = #False
Else
Result = #True
EndIf
EnumChildWindows_ (hWind, @EnumChildProc(), lParam)
ProcedureReturn Result
EndProcedure
Procedure EnumWindowProc(hWind, lParam)
Param$ = PeekS(lParam)
Class$ = StringField(Param$,1,";")
Title$ = StringField(Param$,2,";")
Object$ = StringField(Param$,3,";")
*Object = AllocateMemory(128) : PokeS(*Object, Object$)
BufClass$ = Space(128) : BufTitle$ = Space(128)
GetClassName_(hWind, @BufClass$, 128) : GetWindowText_(hWind, @BufTitle$, 128)
If FindString(BufTitle$, "PureBasic", 1)
BufTitle$ = "PureBasic"
EndIf
If FindString(BufTitle$, "jaPBe V3", 1)
BufTitle$ = "jaPBe V3"
EndIf
If BufClass$ = Class$ And BufTitle$ = Title$
Global hMain = hWind : Result = #False : EnumChildWindows_(hWind, @EnumChildProc(),*Object)
Else
FreeMemory(*Object) : Result = #True
EndIf
ProcedureReturn Result
EndProcedure
Procedure SendDatasToEditor(MainWin, Datas$, Mode.l)
RunOneWin = FindWindow_(@"WindowClass_0",@"jaPBe-RunOneWindow")
If RunOneWin
If Datas$
cd.COPYDATASTRUCT
cd\dwData = Mode
cd\cbData = Len(Datas$)+1
cd\lpData = @Datas$
SendMessage_(RunOneWin, #WM_COPYDATA, MainWin, cd)
EndIf
EndIf
EndProcedure
Procedure.s ListFiles(Directory.s, Nb.l, Ext.s)
If Right(Directory, 1) <> "\" : Directory + "\" : EndIf
If ExamineDirectory(Nb, Directory, "*.*")
While NextDirectoryEntry(Nb)
If DirectoryEntryName(Nb) <> "." And DirectoryEntryName(Nb) <> ".."
If DirectoryEntryType(Nb) = #PB_DirectoryEntry_File And GetExtensionPart(DirectoryEntryName(Nb)) = Ext
; ------------ Les fichiers ------------
AddElement(Arbre())
Arbre()\NomFichier = DirectoryEntryName(Nb)
Arbre()\Chemin = Directory+DirectoryEntryName(Nb)
Arbre()\Niveau = Nb
Arbre()\Type = 1
; ------------ ************ ------------
EndIf
If DirectoryEntryType(Nb) = #PB_DirectoryEntry_Directory
; ------------ Les dossiers ------------
AddElement(Arbre())
Arbre()\NomFichier = DirectoryEntryName(Nb)
Arbre()\Chemin = Directory + DirectoryEntryName(Nb)
Arbre()\Niveau = Nb
Arbre()\Type = 0
; ------------ ************ ------------
ListFiles(Directory + DirectoryEntryName(Nb), Nb + 1, Ext)
EndIf
EndIf
Wend
FinishDirectory(Nb)
EndIf
EndProcedure
Procedure StreamFileIn_Callback(hFile, pbBuff, cb, pcb)
ProcedureReturn ReadFile_(hFile, pbBuff, cb, pcb, 0)!1
EndProcedure
Procedure FileStreamIn(FileID.l, file.s, gadget.l, Mode.l)
; Protected File
; Protected FileID
; Protected gadget
Protected StreamData.EDITSTREAM
If Mode <> #SF_RTF : Mode = #SF_TEXT : EndIf
If ReadFile(FileID, file)
StreamData\dwCookie = FileID(FileID)
StreamData\dwError = #Null
StreamData\pfnCallback = @StreamFileIn_Callback()
SendMessage_(GadgetID(gadget), #EM_STREAMIN, Mode, @StreamData)
CloseFile(FileID)
EndIf
EndProcedure
Procedure TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
Select uMsg
Case #WM_TIMER
Select idEvent
Case 1
t$ = Space(128) : GetWindowText_(FindWindow_("WindowClass_7", #Null),@t$, 128)
If Left(t$, 8) <> "jaPBe V3" : End
Else
RedrawWindow_(hCommand, 0, 0,#RDW_INTERNALPAINT|#RDW_INVALIDATE|#RDW_ALLCHILDREN )
EndIf
EndSelect
EndSelect
EndProcedure
;}
;{- Initialisation
;{/ Fenêtre principale
If OpenWindow(#Win_Main, 550, 100, 750, 430, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered, hToolBar)
If CreateGadgetList(WindowID(#Win_Main))
TreeGadget(#Tree, 5, 5, 300, 420)
EditorGadget(#Edit, 310, 5, 435, 420)
SplitterGadget(#Split, 5,5,740,420, #Tree ,#Edit, #PB_Splitter_Vertical)
SetGadgetAttribute(#Split, #PB_Splitter_FirstMinimumSize, 30)
SetGadgetAttribute(#Split, #PB_Splitter_SecondMinimumSize, 30)
EndIf
StickyWindow(#Win_Main, 1)
HideWindow(#Win_Main, 1)
EndIf;}
;{/ Fenêtre de commande
If OpenWindow(#Win_Buttons, 550, 1, 130, 20, "", #WS_POPUP, hToolBar)
hCommand = WindowID(#Win_Buttons)
If CreateGadgetList(hCommand)
ButtonGadget(#Btn_Open, 0, 0, 60, 20, "Ouvrir", #PB_Button_Toggle)
ButtonGadget(#Btn_Quit, 65, 0, 60, 20, "Quitter")
EndIf
StickyWindow(#Win_Buttons, 1)
SetParent_(hCommand, hToolBar)
EndIf
;}
;{/ Récupération des fichiers
Extension$ = "pb"
ListFiles(Rep_Ini$, 0, Extension$)
;}
;{/ Affichage des fichiers dans le TreeGadget
ForEach Arbre()
If Arbre()\Type = 0
AddGadgetItem(#Tree, -1, Arbre()\NomFichier, ImageID(#ImgFold), Arbre()\Niveau)
Else
AddGadgetItem(#Tree, -1, Arbre()\NomFichier, ImageID(#ImgFile), Arbre()\Niveau)
EndIf
Next
;}
;}
;{- Boucle
SetTimer_(WindowID(#Win_Main), 1, 1000, @TimerProc())
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case #Tree
Select EventType()
;{/ Clic droit sur un nom de fichier
Case #PB_EventType_RightClick
ForEach Arbre()
If GetGadgetItemText(#Tree, GetGadgetState(#Tree),0) = Arbre()\NomFichier
SelectElement(Arbre(), ListIndex(Arbre())) : Break
EndIf
Next
ClearGadgetItemList(#Edit)
FileStreamIn(0, Arbre()\Chemin, #Edit, #SF_TEXT);}
;{/ Double clic sur un nom de fichier
Case #PB_EventType_LeftDoubleClick
ForEach Arbre()
If GetGadgetItemText(#Tree, GetGadgetState(#Tree),0) = Arbre()\NomFichier
SelectElement(Arbre(), ListIndex(Arbre())) : Break
EndIf
Next
If ReadFile(0, Arbre()\Chemin)
Size.l = Lof(0) +1
*Buffer = AllocateMemory(Size)
ReadData(0, *Buffer, Size)
CloseFile(0)
EndIf;}
;{/ Choix de l'éditeur. (PureBasic non fonctionnel pour le moment)
If Editeur = #JaPBe
SendDatasToEditor(#Win_Main, PeekS(*Buffer), 5)
FreeMemory(*Buffer)
;/ Pour le moment, le programme ne fonctionne que pour jaPBe
; ElseIf Editeur = #PureBasic
; SetClipboardText(PeekS(*Buffer))
;
; ; Création du nouvel onglet
; keybd_event_(#VK_CONTROL, 0, 0, 0)
; keybd_event_($4E, 0, 0, 0)
; keybd_event_(#VK_CONTROL, 0, #KEYEVENTF_KEYUP, 0)
; Delay(50)
;
; ;Copie du texte dans l'onglet
; keybd_event_(#VK_CONTROL, 0, 0, 0)
; keybd_event_($56, 0, 0, 0)
; keybd_event_(#VK_CONTROL, 0, #KEYEVENTF_KEYUP, 0)
; Delay(50)
;
; FreeMemory(*Buffer)
EndIf ;}
EndSelect
;{/ Gadgets
Case #Btn_Open
Select GetGadgetState(#Btn_Open)
Case 1 : HideWindow(#Win_Main, 0) : SetGadgetText(#Btn_Open, "Fermer")
Case 0 : HideWindow(#Win_Main, 1) : SetGadgetText(#Btn_Open, "Ouvrir")
EndSelect
Case #Btn_Quit
Select MessageRequester("Quitter le programme", "Voulez-vous réellement quitter CodeArchiv-List ?", #MB_ICONQUESTION|#PB_MessageRequester_YesNo)
Case #IDYES
quit = #True
EndSelect ;}
EndSelect
Case #PB_Event_CloseWindow
HideWindow(#Win_Main, 1)
SetGadgetState(#Btn_Open, 0) : SetGadgetText(#Btn_Open, "Ouvrir")
EndSelect
Until quit
End
;}