- Remplacé les valeurs des constantes par leurs noms : c'est plus propre et plus lisible
- Modifié le code pour qu'il n'y ait plus de plantage quand la longueur du texte dépasse 65000 caractères
- Ajouté un paramètre pour qu'on puisse indenter les commentaires ou pas (moi j'aime bien quand il sont alignés sur le code)
- Mis sous forme de constantes les paramètres qui sont des constantes (question de clarté)
- Ajouté une petite bidouille pour que AutoIndent marche sur son propre code (c'était quand même dommage que ça le fasse pas !)
- Modifié le code pour qu'on puisse indenter une sélection (et pas toujours le code en totalité) : là, ça devient vraiment trés pratique
Code : Tout sélectionner
;*********************************************************************************************
;* Il est Possible de passer en Paramètre le nombre de Blanc correspondant à l'indentation ! *
;* La valeur par défaut (#Tab) est de "2" mais ne demande qu'à être modifiée *
;* Si #IndentComment = 1, les commentaires sont indentés, sinon ils restent alignés à gauche *
;* Programme développé par Brossden - Modifications mineures apportées par Zapman *
;*********************************************************************************************
Global Res.l, Deb.l, Fin.l , Hwnd, Handle.l, LineIndent.s, ProgText.s,Txt.s, Prog.s, RC.s, Blanc.l, Cde.s, Pos.l, Fin.l, DejaCom.b
#Tab=2
#IndentComment=1
#RC = Chr(13)+Chr(10)
Blanc=0
Dejacom = 0
;********************************************************
; Recherche de la Fenêtre contenant le texte à Indenter *
;********************************************************
Hwnd = FindWindow_( 0, 0 )
While Hwnd <> 0
Txt = Space(256)
GetWindowText_(Hwnd, Txt, 256)
Hwnd = GetWindow_(Hwnd, #GW_HWNDNEXT)
If FindString(UCase(Txt),"PUREBASIC - ",1) = 1 And FindString(UCase(Txt),"DEBUG",1) =0
Handle=Hwnd
Hwnd=0
EndIf
If FindString(UCase(Txt),"JaPBe",1) = 1 And FindString(UCase(Txt),"DEBUG",1) =0
Handle=Hwnd
Hwnd=0
EndIf
Wend
;*****************************************************
;* Activation de la Fenêtre de Programme à Indenter *
;* Copie du Texte du Programme dans le presse-papier *
;* puis du contenu du presse-papier dans ProgText *
;*****************************************************
SetFocus_(Handle)
ProgText=""
If OpenClipboard_(WindowID())
EmptyClipboard_() ; On vide le presse-papier
CloseClipboard_()
; On commence par faire un "copier" pour voir si l'utilisateur avait sélectionné un texte
Res = Keybd_Event_(#VK_CONTROL,0,0,0)+ Keybd_Event_(#VK_C,0,0,0)+Keybd_Event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0)
Delay(200) ; Il faut laisser assez de temps pour les textes longs
; ProgText=GetClipboardText()+#RC+#RC ; Plante quand le texte est trop grand
; On utilise donc une méthode un peu plus complexe mais qui permet de limiter
; la taille du texte lu.
OpenClipboard_(WindowID())
*hmem = GetClipboardData_(#CF_TEXT)
*D=GlobalLock_(*hmem)
If *D
ProgText = PeekS(*D,60000) ; limite à 60000 caractères
GlobalUnlock_(*hmem)
EndIf
CloseClipboard_()
; Si il n'y avait rien de sélectionné, on fait "Tout sélectionner", puis "Copier"
If ProgText=""
Res = Keybd_Event_(#VK_CONTROL,0,0,0)+ Keybd_Event_(#VK_A,0,0,0)+ Keybd_Event_(#VK_C,0,0,0)+Keybd_Event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0)
Delay(200) ; Il faut laisser assez de temps pour les textes longs
; ProgText=GetClipboardText()+#RC+#RC ; Plante quand le texte est trop grand
; On utilise donc une méthode un peu plus complexe mais qui permet de limiter
; la taille du texte lu.
OpenClipboard_(WindowID())
*hmem = GetClipboardData_(#CF_TEXT)
*D=GlobalLock_(*hmem)
If *D
ProgText = PeekS(*D,60000) ; limite à 60000 caractères
GlobalUnlock_(*hmem)
EndIf
CloseClipboard_()
EndIf
If Len(ProgText)=60000 ; le texte est plus grand que notre limite
ProgText=""
; On crée une fenêtre pour faire passer AutoIndent au premier plan
hw=OpenWindow(30, 0, 0, 20, 20, #PB_Window_ScreenCentered | #PB_Window_TitleBar , "AutoIndent")
SetForegroundWIndow_(hw)
MessageRequester("Erreur / Error", "Désolé, ce texte est trop long. Procédez par morceau.", 0)
CloseWindow(30)
EndIf
If ProgText<>""
ProgText=ProgText+#RC+#RC
;**************************
;* Sauvegarde de sécurité *
;**************************
If CreateFile(#1,"c:\sauvegarde.bak")
WriteString(Progtext)
CloseFile(#1)
EndIf
;*****************************************
;* Mise en Forme du texte et Indentation *
;*****************************************
Prog=""
Deb = 1
voir=0
Fin = FindString(ProgText,#RC,Deb)
While fin + 2 < Len(ProgText)
LineIndent = Trim(Mid(ProgText,deb,fin-deb))
If LineIndent > ""
Pos.l = FindString(LineIndent," ",1)
If Pos = 0
Cde = LineIndent
Else
Cde=Left(LineIndent,Pos-1)
EndIf
Pos.l = FindString(LineIndent,".",1) ; Pour gérer le cas du "Procedure.s", par exemple
If Pos
Cde=Left(Cde,Pos-1)
EndIf
Cde=UCase(Cde)
ChaineRech$="*ENDIF*ENDSELECT*ELSE*CASE*WEND*NEXT*UNTIL*DEFAULT*ELSEIF*ENDPROCEDURE*ENDSTRUCTURE*ENDDATASECTION*"
Cde2$="*"+Cde+"*"
If FindString(ChaineRech$,Cde2$,1)
Blanc - #Tab
EndIf
If Blanc < 0 : blanc=0: EndIf
If #IndentComment
Prog + Space(Blanc) + LineIndent +#RC
Else
If Left(Cde,1)=";"
If DejaCom = 0 : DejaCom =1 : Prog + #RC : EndIf
Prog + LineIndent +#RC
Else
If dejaCom=1 : Prog + #RC : EndIf
DejaCom=0
Prog + Space(Blanc) + LineIndent +#RC
EndIf
EndIf
ChaineRech$="*IF*FOREACH*REPEAT*WHILE*FOR*SELECT*ELSE*CASE*DEFAULT*ELSEIF*PROCEDURE*STRUCTURE*DATASECTION*"
If FindString(ChaineRech$,"*"+Cde+"*",1)>0
addtab=1
p=FindString(UCase(LineIndent),"UNTIL",1)
If p And Mid(LineIndent,(p-1),1)<>Chr(34) ; Chr(34) est le caractère ". Ce test permet à AutoIndent de marcher quand on le test avec son propre code.
addtab=0
EndIf
p=FindString(UCase(LineIndent),"ENDIF",1)
If p And Mid(LineIndent,(p-1),1)<>Chr(34); Chr(34) est le caractère ". Ce test permet à AutoIndent de marcher quand on le test avec son propre code.
addtab=0
EndIf
If addtab
Blanc + #Tab
EndIf
EndIf
EndIf
deb = fin+2
fin = FindString(ProgText,#RC,deb)
Wend
;*********************************************************
;* Remplacement du programme Actuel par le texte indenté *
;*********************************************************
OpenClipboard_(WindowID())
EmptyClipboard_()
SetClipboardData_(#CF_TEXT,@Prog)
CloseClipboard_()
SetFocus_(Handle)
Res = Keybd_Event_(#VK_CONTROL,0,0,0)+Keybd_Event_(#VK_V,0,0,0)
Delay(200)
Res = Keybd_Event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0)
EndIf
Else
; On crée une fenêtre pour faire passer AutoIndent au premier plan
hw=OpenWindow(30, 0, 0, 20, 20, #PB_Window_ScreenCentered | #PB_Window_TitleBar , "AutoIndent")
SetForegroundWIndow_(hw)
MessageRequester("Erreur / Error", "Impossible d'ouvrir le presse-papier !", 0)
CloseWindow(30)
EndIf
Merci Brossden pour ton super boulot.