Basic Univers
 ; 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