; Autor : Nico
; Date : 04/02/2007
;{- 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
; IDE Options = PureBasic v4.00 (Windows - x86)
; CursorPosition = 1
; Folding = --
; EnableAsm
; EnableThread