Page 1 sur 1

[LibEditorPlus] AutoCompletion

Publié : lun. 14/août/2006 11:15
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...

Re: [LibEditorPlus] AutoCompletion

Publié : lun. 28/août/2006 19:41
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!

Publié : mar. 29/août/2006 8:00
par Progi1984
Finalement, grace à Xombie, du code a été réalisé correposndant parfaitement à mes attentes :
http://www.purebasic.fr/english/viewtopic.php?t=23248