Nouvelle version du selecteur CodeArchiv

Programmation d'applications complexes
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Nouvelle version du selecteur CodeArchiv

Message par Chris »

J'ai fait une nouvelle version du selecteur de fichiers "CodeArchiv".

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! :lol:

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
  ;}
Dernière modification par Chris le sam. 18/août/2007 22:52, modifié 2 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Nouvelle version du selecteur CodeArchiv

Message par Backup »

Chris a écrit : Deux bugs.

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...
Gnozal pourrai peut etre répondre a cette question puisque c'est lui qui a repris le dev de Japbe :D
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Voilà une idée bien horrible qui pourrait te servir à rafraichir l'autre fenêtre...

Comme ton prog n'a normalement pas le droit de la manipuler, on attache son processus au nôtre, et après on peut faire ce qu'on veut. Ici, je mets sa fenêtre au premier plan.

Code : Tout sélectionner

;retrouve la fenêtre (au passage, qui a un form d'un autre nom) 
;et la met au premier plan. Fait une trentaine d'essais (30 secondes)


; Ces trucs là ne marchent pas...     
; qcm_hwnd.l=getactivewindow_()
; enablewindow_(qcm_hwnd,#TRUE)
; setactivewindow_(qcm_hwnd)
; showWindow_(qcm_hwnd,#SW_SHOWNORMAL)
; setforegroundwindow_(qcm_hwnd)
; BringWindowToTop_(qcm_hwnd)
; SetWindowPos_(qcm_hwnd,#HWND_TOPMOST,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE|#SWP_SHOWWINDOW )

i=0
qcm_hwnd=0

Repeat

  Delay(1000)
  
  qcm_hwnd=FindWindow_("ThunderRT6FormDC",0) ;remplacer ThunderRT6FormDC par le nom de celle de JapBe
  ;Debug qcm_hwnd
  
  i+1

Until qcm_hwnd<>0 Or i>30

;***
;Donne le droit (hérité de la foregroundwindow)
;de mettre une autre fenêtre à l'avant plan.

thread1=GetWindowThreadProcessId_(GetForegroundWindow_(),0)
thread2=GetWindowThreadProcessId_(qcm_hwnd,0)

If thread1<>thread2
  AttachThreadInput_(thread1,thread2,#True)
EndIf

SetForegroundWindow_(qcm_hwnd) : Sleep_(125) ; Delay to stop fast CPU issues.

If thread1<>thread2
  AttachThreadInput_(thread1,thread2,#False) 
EndIf
;***
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

djes a écrit :Voilà une idée bien horrible qui pourrait te servir à rafraichir l'autre fenêtre...
C'était bien vu, mais ça ne marche pas.

J'ai aussi essayé RedrawWindow_(), UpdateWindow_() et un autre, (me rappelle plus lequel). Y a rien qui marche. :(

Merci quand même. Si t'as d'autres idées... :roll:
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Re: Nouvelle version du selecteur CodeArchiv

Message par gnozal »

Chris a écrit : Deux bugs.
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...
Quels boutons ?
Je n'ai aucun problème de rafraichissement quand je minimise/maximise jaPBe ou que je change sa taille (je n'ai pas testé ton outil).
Sous Win9x, il peut être nécessaire de cocher 'Rafraichir toute la fenêtre' dans les options.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Chris a écrit :
djes a écrit :Voilà une idée bien horrible qui pourrait te servir à rafraichir l'autre fenêtre...
C'était bien vu, mais ça ne marche pas.

J'ai aussi essayé RedrawWindow_(), UpdateWindow_() et un autre, (me rappelle plus lequel). Y a rien qui marche. :(

Merci quand même. Si t'as d'autres idées... :roll:
Finalement, j'ai resolu le problème.

Comme j'avais mis un timer qui permettait de vérifier toutes les secondes si jaPBe était toujours ouvert, je lui ai collé un RedrawWindow_() avec le handle de la fenêtre qui supporte les boutons.

Je sais, c'est pas très orthodoxe comme moyen, c'est même plutôt barbare, mais ça marche. :lol:

@gnozal
Je parle des trois boutons de mon appli.
Si tu l'as pas essayée, tu peux pas les voir. :wink:
Répondre