[LibEditorPlus] AutoCompletion

Programmation d'applications complexes
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

[LibEditorPlus] AutoCompletion

Message par Progi1984 »

J'ai commencé à coder... l'autocompletion pour LibEditorPlus.

Testez ce code et allez en dessous :

Code : Tout sélectionner

Procedure AC_Callback(hWnd, Msg,  wParam, lParam)
  OriginProc.l= GetProp_(hWnd, "OriginProc")
  Select Msg
    Case #WM_CHAR
      ; position général du curseur
      SendMessage_(hwnd,#EM_GETSEL,@posx,@posy)
      ; Maintenant on récupère l'index de la ligne
      index_line = SendMessage_(hWnd,#EM_LINEFROMCHAR,-1,0)
      ; Position du curseur sur la ligne
      index_char = posx - SendMessage_(hWnd,#EM_LINEINDEX,SendMessage_(hWnd,#EM_LINEFROMCHAR,posy,0),0) 
      ; on récupère le texte de la ligne
      tampon.s=Space(65000)
      PokeW(@tampon,64999)
      SendMessage_(hWnd,#EM_GETLINE,index_line,@tampon)
      If Len(tampon) > 0
        pos1=FindString(tampon," ",index_char+1)
        If pos1 <>index_char+1
          If pos1
            tampon=PeekS(@tampon,pos1-1)
          EndIf
          
          *pointeur=@tampon+Len(tampon)-1
          While *pointeur>=@tampon
            If PeekS(*pointeur,1)=" "
              Break
            EndIf
            *pointeur=*pointeur-1
          Wend
          Longueur = @tampon+Len(tampon)-*pointeur-1
          mot.s = PeekS(*pointeur+1,Longueur)
          If Len(mot) >= 3
            SendMessage_(hWnd,#EM_EXGETSEL,0,@CHARRANGE.CHARRANGE)
            SendMessage_(hWnd,#EM_POSFROMCHAR,@point.point,CHARRANGE\CPmin)
            ClientToScreen_(hWnd,@point.point)
            Debug mot
            ; +5 : doit etre la taille de la bordure de la fenetre
            ; -15 : doit etre la taille de la barre de titre
            ; Debug GetSystemMetrics_(#SM_CXBORDER)
            ListViewGadget(10,point\x-WindowX(0)+GetSystemMetrics_(#SM_CXBORDER),point\y-WindowY(0)-GetSystemMetrics_(#SM_CYSMSIZE)-GetSystemMetrics_(#SM_CYBORDER),50,50)
              For i=0 To 10
                AddGadgetItem(10,i,Str(i))
              Next
          EndIf
        EndIf
        Debug "------"
      EndIf
  EndSelect
  ProcedureReturn CallWindowProc_(OriginProc,hWnd,Msg,wParam,lParam)
EndProcedure
Procedure AC_Start(Gadget)
  OriginProc = SetWindowLong_(GadgetID(Gadget), #GWL_WNDPROC, @AC_Callback())
  SetProp_(GadgetID(Gadget), "OriginProc", OriginProc)
EndProcedure

If OpenWindow(0, 100, 200, 400, 400, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  If CreateGadgetList(WindowID(0))
    EditorGadget(1,10,10,200,200)
    
  EndIf
  AC_Start(1)
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    ElseIf EventID=#PB_Event_Gadget
      GadgetID = EventGadget()
      If GadgetID = 1
        
      EndIf
    EndIf
  Until Quit = 1
EndIf
End
Donc aprés trois caractères, une listview s'affiche...

mais :
- comment la garder au dessus tout en écrivant sur l'editorgadget ?
- comment la placer correctement ?
- comment recevoir dans le AC_CallBack les évènements pour la listview ? (créer un autre callback en subclassing ?)

Merci d'avance pour votre aide...
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: [LibEditorPlus] AutoCompletion

Message par nico »

Progi1984 a écrit : mais :
- comment la garder au dessus tout en écrivant sur l'editorgadget ?
- comment la placer correctement ?
- comment recevoir dans le AC_CallBack les évènements pour la listview ? (créer un autre callback en subclassing ?)

Merci d'avance pour votre aide...
comment la garder au dessus tout en écrivant sur l'editorgadget ?
- Fait une recherche sur SetWindowPos_(.....) une API window, Purebasic à une commande aussi, voir Window.


comment la placer correctement ?:
- Pour bien la placer par rapport à l'écran, c'est assez simple une fois que tu as récupéré la taille de l'écran, tu gères pour que la Listview s'affiche correctement vu que tu connais x et y et la taille du gadget.


- Pour bien la positionner par rapport à la ligne en cours, je vais pas te l'expliquer vu que c'est toi qui fait cette lib (tu sais déjà comment récupérer la police en cours et après calcul ...)


comment recevoir dans le AC_CallBack les évènements pour la listview ?:
- tu crées ta listview dans une autre fenêtre invisible à sa création que tu subclass et quand t'en a besoin tu la fais apparaitre.

Je comprend pas bien pourquoi tu la crées ta listview dans la callback!
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Finalement, grace à Xombie, du code a été réalisé correposndant parfaitement à mes attentes :
http://www.purebasic.fr/english/viewtopic.php?t=23248
Répondre