Code : Tout sélectionner
;{- Enumerations
;{ Windows
Enumeration
#Window_Editeur
EndEnumeration
;}
;{ Gadgets
Enumeration
#Editor_Alias
#Button_Window_Editeur
EndEnumeration
;}
;}
Global Dim Alias.s(99,1)
Procedure Load_Editeur_Alias()
If OpenFile(0,"Alias.txt")
a=-1
While Eof(0)=0
If a<99
String.s=ReadString(0)
string1.s=StringField(String,1,Chr(9))
string2.s=StringField(String,2,Chr(9))
a=a+1
Alias(a,0)=string1:Alias(a,1)=string2
Else
Break
EndIf
Wend
CloseFile(0)
EndIf
EndProcedure
Procedure Recup_Mot_En_Cours(Fin_Caratere.l)
If Fin_Caratere=0 ; Traitement si la fin du mot est un espace ou un Tab
; On récupère aussi l'index du curseur
SendMessage_(GadgetID(#Editor_Alias),#EM_GETSEL,@Sel_Debut,@Sel_Fin)
index_caractere=Sel_Fin
; Maintenant on récupère l'index de la ligne
index_line = SendMessage_(GadgetID(#Editor_Alias),#EM_LINEFROMCHAR,index_caractere,0)
; On récupère aussi la position du premier caractère de la ligne en cours
First_caratere_in_line=SendMessage_(GadgetID(#Editor_Alias),#EM_LINEINDEX,-1,0)
; ce qui permet ensuite de déterminer la position du caractere dans la ligne
Pos_caractere_in_line = index_caractere - First_caratere_in_line
; on travaille maintenant sur la Phrase
Phrase.s= GetGadgetItemText(#Editor_Alias,index_line,0)
;Debug phrase
Fin_Mot=Pos_caractere_in_line-1 ;on soustrait un caractère correpondant à l'espace ou au tab
Else ; Traitement si la fin du mot est la commande Enter
; On récupère l'index du curseur soustrait de 1 pour se retrouver sur la ligne précédente
SendMessage_(GadgetID(#Editor_Alias),#EM_GETSEL,@Sel_Debut,@Sel_Fin)
index_caractere=Sel_Fin-1
; Maintenant on récupère l'index de la ligne précédente
index_line = SendMessage_(GadgetID(#Editor_Alias),#EM_LINEFROMCHAR,index_caractere,0)
; On récupère aussi la position du premier caractère de la ligne
First_caratere_in_line=SendMessage_(GadgetID(#Editor_Alias),#EM_LINEINDEX,index_line,0)
; ce qui permet ensuite de déterminer la position du caractere dans la ligne
Pos_caractere_in_line = index_caractere - First_caratere_in_line
; on travaille maintenant sur la Phrase
Phrase.s= GetGadgetItemText(#Editor_Alias,index_line,0)
Fin_Mot=Pos_caractere_in_line
EndIf
If phrase=""
ProcedureReturn 0
EndIf
If Fin_Mot>0
; Recherche du début du mot
Offset.l=Fin_Mot
*pointeur=@Phrase+Fin_Mot
While *pointeur>=@Phrase
*pointeur=*pointeur-1
Offset=Offset-1
; On recherche un espace ou une tabulation
If PeekB(*pointeur)=32 Or PeekB(*pointeur)=9
Break
EndIf
Wend
Debut_Mot=Offset+1
Debug Debut_Mot
mot.s= PeekS(@Phrase+ Debut_Mot, Fin_Mot-Debut_Mot)
Debug mot
For a=0 To 99
If Alias.s(a,0)=""
Debug "break"
Break
ElseIf Alias.s(a,0)= mot
Debug mot+" "+Str(Len(mot))
SendMessage_(GadgetID(#Editor_Alias), #EM_SETSEL, Debut_Mot+First_caratere_in_line, Fin_Mot+First_caratere_in_line)
SendMessage_(GadgetID(#Editor_Alias), #EM_REPLACESEL,1,Alias.s(a,1))
SendMessage_(GadgetID(#Editor_Alias),#EM_GETSEL,@Sel_Debut,@Sel_Fin)
Sel_Fin=Sel_Fin+1
SendMessage_(GadgetID(#Editor_Alias),#EM_SETSEL,@Sel_Fin,@Sel_Fin)
Break
EndIf
Next a
EndIf
EndProcedure
Procedure NouvelleProc( Hwnd, msg, wParam, lParam)
;Ici on récupère l'adresse d'origine de la procédure grâce à la
;chaine qui l'identifie: "OriginProc" et le handle de la fenêtre
;voir la fonction SetProp.
OriginProc.l= GetProp_(Hwnd, "OriginProc")
Select msg
Case #WM_CHAR
Enter.l=#False
If wParam=13
Enter.l=#True
EndIf
If wParam=32 Or wParam=13 Or wParam=9
result=CallWindowProc_(OriginProc,Hwnd,msg,wParam,lParam)
Recup_Mot_En_Cours(Enter)
ProcedureReturn result
EndIf
Case #WM_DESTROY
result=CallWindowProc_(OriginProc,Hwnd,msg,wParam,lParam)
;Supprimer avant fermeture du programme la donnée associée à la fenêtre.
SetWindowLong_(Hwnd, #GWL_WNDPROC, OriginProc)
RemoveProp_(Hwnd,"OriginProc")
ProcedureReturn result
EndSelect
;On renvoie tous les autres évènements à la procédure d'origine.
ProcedureReturn CallWindowProc_(OriginProc,Hwnd,msg,wParam,lParam)
EndProcedure
Procedure OpenWindow_Window_Editeur()
If OpenWindow(#Window_Editeur, 381, 209, 398, 217, "Ecrivez sgt ou ggt suivi d'un espace dans l'éditeur", #PB_Window_SystemMenu|#PB_Window_TitleBar)
If CreateGadgetList(WindowID(#Window_Editeur))
EditorGadget(#Editor_Alias, 8, 72, 380, 136)
ButtonGadget(#Button_Window_Editeur, 8, 8, 206, 50, "Editer le Fichier des Alias avec Notepad", #PB_Button_MultiLine)
StickyWindow(#Window_Editeur,1)
;Avec cette fonction, on récupère l'adresse d'origine de la procédure
;pour ensuite la restituer, une fois le traitement terminé.
OriginProc = SetWindowLong_(GadgetID(#Editor_Alias), #GWL_WNDPROC, @NouvelleProc())
;Cette fonction est très utile car elle permet d'associer une nouvelle donnée
;à n'importe quelles fenêtres crées en utlisant une chaine de caractère pour
;l'identification; ça évite d'utiliser une valeur globale.
;Ici on associe la valeur OriginProc identifiée par la chaine "OriginProc"
;au StringGadget
SetProp_(GadgetID(#Editor_Alias), "OriginProc", OriginProc)
EndIf
EndIf
EndProcedure
If CreateFile(0,"Alias.txt")
WriteStringN(0,"sgt"+Chr(9)+"SetGadgetText(")
WriteStringN(0,"ggt"+Chr(9)+"GetGadgetText(")
EndIf
Load_Editeur_Alias()
OpenWindow_Window_Editeur()
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #Button_Window_Editeur
Directory.s=GetCurrentDirectory()
RunProgram("Notepad.exe", "Alias.txt", Directory,#PB_Program_Wait)
SetActiveGadget(#Editor_Alias)
EndSelect
Case #WM_CLOSE
quit=1
EndSelect
Until quit=1