Autocomplete list pour StringGadget

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Autocomplete list pour StringGadget

Message par Thyphoon »

Je travaille actuellement sur un gros projet. J'avais besoin d'une liste d'autocomplétion (ça s'appelle comme ça?:?)
Mon but était aussi que ce soit le plus possible crossplatforme
Et ce matin j'ai eu une idée .... et voici ce que ça donne a l'arrache?
Qu'en pensez vous? Il y a surement a améliorer la choisi. N’hésitez pas un proposant. Je suis à la recherche de nouvelles améliorations

Edit : 2019-01-16 11h03 Mise à jour du code pour utilisation des fleches une fois la liste affiché
Edit : 2019-01-16 13h07 Mise à jour du code pour qu'il fonctionne sur des gadgets étant sur des fenêtres différentes
Edit : 2019-01-16 15h20 Cette fois ça fonctionne parafaitement ^_^
Edit : 2019-01-16 15h55 Correction du Crash lorsqu'on bouge la fenêtre
Edit : 2019-01-16 16h33 Encore une correction pour un crash si on bouge la fenêtre
Edit : 2019-01-16 16h40 Cache la fenêtre si il n'y a pas de choix proposé !
Edit : 2019-01-16 17h57 Amélioration en suivant les conseils de Srod

Code : Tout sélectionner

; ******************************************************************** 
; Program:           AutoComplete List
; Description:       Add an AutoComplete list to a String gadget 

; Author:            Thyphoon
; Date:              January, 2019
; License:           Free, unrestricted, credit 
;                    appreciated but not required.
; Note:              Please share improvement !
; Thanks to:         Srod
; ******************************************************************** 

EnableExplicit

DeclareModule AutoComplete
  Declare AddAutocompleteWindow(Window.i,Gadget.i,*CallBack,FirstEventKey.l=5000)
  Declare CheckEvent(Event.i)
EndDeclareModule  

Module AutoComplete
  Declare MoveWindow()

  Prototype.s CallBack(String.s)
  
  Structure ac
    Window.i                  ;Original Window
    Gadget.i                  ;Original Gadget
    FirstEventKey.l           ;First Eventkey=Up +1=Down +2=Enter +3=Escape
    CallBack.CallBack         ;CallBack who return choice
  EndStructure
  
  Structure params
    acWindow.i                ;Autocomplete window
    acGadget.i                ;AutoComplete GadgetList
    CurrentName.s             ;CurrentName at last open autocomplete windows
    Map AutoCompleteGadget.ac()
    FirstEventKey.i
  EndStructure
  
  Global params.params
  
  
  Procedure AddAutocompleteWindow(Window.i,Gadget.i,*CallBack,FirstEventKey.l=5000)
    Name.s=Str(Window)+"-"+Str(Gadget)
    params\AutoCompleteGadget(Name)\CallBack=*CallBack
    params\AutoCompleteGadget(Name)\Gadget=Gadget
    params\AutoCompleteGadget(Name)\Window=Window
    params\AutoCompleteGadget(Name)\FirstEventKey=FirstEventKey
    AddKeyboardShortcut(Window, #PB_Shortcut_Up, FirstEventKey)
    AddKeyboardShortcut(Window, #PB_Shortcut_Down, FirstEventKey+1)
    AddKeyboardShortcut(Window, #PB_Shortcut_Return, FirstEventKey+2)
    AddKeyboardShortcut(Window, #PB_Shortcut_Escape, FirstEventKey+3)
  EndProcedure
  
  Procedure RefreshAutocompleteWindow(Name.s)
    Gadget.i=params\AutoCompleteGadget(Name)\Gadget
    X.l=GadgetX(Gadget,#PB_Gadget_ScreenCoordinate)
    Y.l=GadgetY(Gadget,#PB_Gadget_ScreenCoordinate)+GadgetHeight(Gadget)
    W.l=GadgetWidth(Gadget)
    H.l=150
    ResizeWindow(params\acWindow,X,Y,W,H)
    ResizeGadget(params\acGadget,0,0,W,H)
    HideWindow(params\acWindow, #False,#PB_Window_NoActivate)
    StickyWindow(params\acWindow,#True)
  EndProcedure
  
  Procedure UpdateAutocompleteList(Name.s)
    ClearGadgetItems(params\acGadget)
    If params\AutoCompleteGadget(Name)\CallBack<>0
      BackString.s=params\AutoCompleteGadget(Name)\CallBack(GetGadgetText(params\AutoCompleteGadget(Name)\Gadget))
      For n=1 To CountString(BackString,Chr(10))+1
        line.s=StringField(BackString,n,Chr(10))
        If LCase(Left(line,Len(GetGadgetText(params\AutoCompleteGadget(Name)\Gadget))))=LCase(GetGadgetText(params\AutoCompleteGadget(Name)\Gadget))
          AddGadgetItem(params\acGadget,-1,line)
        EndIf 
      Next
      ;Hide Autocomplete Window if no Choice
      If CountGadgetItems(params\acGadget)=0
        HideWindow(params\acWindow,#True)
      Else
        HideWindow(params\acWindow,#False,#PB_Window_NoActivate)
      EndIf 
    Else
      Debug "Error with callback"
    EndIf
  EndProcedure
  
  Procedure OpenAutocompleteWindow(Name.s)
    If params\acGadget>0 And IsGadget(params\acGadget):FreeGadget(params\acGadget):EndIf
    If params\acWindow>0 And IsWindow(params\acWindow):CloseWindow(params\acWindow):EndIf
    params\acWindow=OpenWindow(#PB_Any,0,0,50,50,"AutoComplete",#PB_Window_BorderLess|#PB_Window_NoActivate,WindowID(params\AutoCompleteGadget(Name)\Window));
    If params\acWindow
      params\CurrentName=Name
      SetWindowData(params\acWindow,params\AutoCompleteGadget(Name)\Gadget)
      params\acGadget=ListViewGadget(#PB_Any, 0, 0, 50,50)
    EndIf
    RefreshAutocompleteWindow(Name)
    UpdateAutocompleteList(Name)
    BindEvent(#PB_Event_MoveWindow, @MoveWindow(), params\AutoCompleteGadget(Name)\Window)
  EndProcedure
  
  Procedure CloseAutocompleteWindow(Name.s)
      If params\acGadget>0 And IsGadget(params\acGadget):FreeGadget(params\acGadget):EndIf
      If params\acWindow>0 And IsWindow(params\acWindow):CloseWindow(params\acWindow):EndIf
      UnbindEvent(#PB_Event_MoveWindow, @MoveWindow(), Windows)
  EndProcedure
  
  Procedure MoveWindow()
    If EventWindow()=params\AutoCompleteGadget()\Window And params\acWindow>0 And IsWindow(params\acWindow)
      RefreshAutocompleteWindow(params\CurrentName)
    EndIf
  EndProcedure
  

  Procedure CheckEvent(Event.i)
    Static bbclick.b
    ;-Orignal Gadget Event
    Protected Name.s=Str(EventWindow())+"-"+Str(EventGadget())   
    If FindMapElement(params\AutoCompleteGadget(),Name)
      Select Event
        Case  #PB_Event_Gadget
          Select EventGadget()
              ; Main gadget Event  
            Case params\AutoCompleteGadget()\Gadget
              Select EventType()
                Case #PB_EventType_Focus
                  If params\acWindow=0 Or IsWindow(params\acWindow)=#False
                    If bbclick=#False
                      OpenAutocompleteWindow(Name)
                    Else
                      bbclick=#True
                    EndIf 
                  EndIf 
                Case #PB_EventType_LostFocus
                  If GetActiveGadget()<>params\acGadget
                    CloseAutocompleteWindow(Name)
                    bbclick=#False
                  EndIf  
                Case #PB_EventType_Change
                  If bbclick=#False 
                    If IsWindow(params\acWindow)
                      UpdateAutocompleteList(Name)
                    Else
                      Debug "pas de windows"
                    EndIf
                  Else
                    OpenAutocompleteWindow(Name)
                    bbclick=#False
                  EndIf 
              EndSelect 

          EndSelect 
     EndSelect
    EndIf
    
    Select Event
      ;if Keyword  
      Case #PB_Event_Menu
        Select EventMenu()
          Case params\AutoCompleteGadget(params\CurrentName)\FirstEventKey;UP
            SetGadgetState(params\acGadget,GetGadgetState(params\acGadget)-1)
          Case params\AutoCompleteGadget(params\CurrentName)\FirstEventKey+1;Down
            SetGadgetState(params\acGadget,GetGadgetState(params\acGadget)+1)
          Case params\AutoCompleteGadget(params\CurrentName)\FirstEventKey+2;Enter
            SetGadgetText(params\AutoCompleteGadget()\Gadget,GetGadgetItemText(params\acGadget,GetGadgetState(params\acGadget)))
          Case params\AutoCompleteGadget(params\CurrentName)\FirstEventKey+3;
            CloseAutocompleteWindow(params\CurrentName)
        EndSelect
      Case  #PB_Event_Gadget
        If EventGadget()=params\acGadget
          If EventType()=#PB_EventType_LeftDoubleClick
            SetGadgetText(params\AutoCompleteGadget(params\CurrentName)\Gadget,GetGadgetItemText(params\acGadget,GetGadgetState(params\acGadget)))
            CloseAutocompleteWindow(params\CurrentName)
            bbclick=#True
          EndIf
        EndIf 
    EndSelect  
    
    
    
  EndProcedure  
  
  
EndModule

;- MAIN TEST

CompilerIf #PB_Compiler_IsMainFile 
  
  ; Callback to return keyword list. you must use a database en filter if you want ^_^ 
  Procedure.s ToDisplayInList(String.s)
    ProcedureReturn "Amiga"+Chr(10)+"Amstrad"+Chr(10)+"Atari"+Chr(10)+"Commodore"+Chr(10)+"BeBox"+Chr(10)+"Macintosh"+Chr(10)+"Spectrum"
  EndProcedure
  
  Procedure.s ToDisplayInListB(String.s)
    ProcedureReturn "Alain"+Chr(10)+"Bernard"+Chr(10)+"Charly"+Chr(10)+"David"+Chr(10)+"Eric"+Chr(10)+"Filipe"+Chr(10)+"Horace"+Chr(10)+"Jérome"+Chr(10)+"Kevin"+Chr(10)+"Laurent"+Chr(10)+"Marc"
  EndProcedure
  
  If OpenWindow(0, 200, 200, 800, 100, "AutoComplete Teste", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    StringGadget(1, 10, 10, 380, 26, "")
    StringGadget(2, 410, 10, 380, 26, "")
    
    AutoComplete::AddAutocompleteWindow(0,1,@ToDisplayInList()) ;Just init the gadget who must support AutoComplete list
    AutoComplete::AddAutocompleteWindow(0,2,@ToDisplayInListB())
    Repeat
      Define Event.i = WaitWindowEvent()
      
      
      AutoComplete::CheckEvent(Event)
      
      Select Event
        Case #PB_Event_Gadget
      EndSelect
    Until Event=#PB_Event_CloseWindow
  EndIf
  End
CompilerEndIf
Dernière modification par Thyphoon le mer. 16/janv./2019 17:59, modifié 7 fois.
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Autocomplete list pour StringGadget

Message par boby »

L'utilisation d'une window borderless est probablement la meilleur solution pour ce que tu veux. Quelques petites idées d'amélioration :

Utilise la windowID() de ta fenêtre mère en argument parentID(), ça t'évitera l'ouverture d'une fenêtre supplémentaire dans ta barre de tâches.
Profite d'avoir stocké l'ID de ta fenêtre mère pour bind l'event movewindow, ça te permettra de faire suivre ta fenêtre d'autocompletion en cas de déplacement de la principale.
;TODO how to replace 30 by Window title bar
Malheureusement je ne connais pas d'autres moyen que de passer par l'API de ton OS pour ça. (Pour windows tu auras cette info via GetSystemMetrics pour les autres OS aucune idée...)
Tu peux assez simplement bind / unbind à l'ouverture/fermeture de ta fenêtre autocomplete des keyboardshortcut (touche haut / bas / entrer) pour naviguer dans ta liste d'autocompletion, c'est plus naturel que de devoir cliquer (d'ailleur un double clic semble plus naturel qu'un simple clic gauche).

Bon code à toi !
1) Pour l'instant mon problème c'est comment trouver la hauteur de la barre de titre d'une fenêtre? and also épaisseur of the bord of window from way to positionner correctement to the list.
Bah alors google trad, on fait le boulot qu'à moitié ??
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Autocomplete list pour StringGadget

Message par Ar-S »

Salut Thyphoon, si tu ne l'as pas vu, check mon xyloglottus : http://stock.ldvmultimedia.com/Xyloglottus.zip (source inside)

Code : Tout sélectionner

Note :
Attention, pour rendre xyloglottus compatible x64 veuillez modifier :
Code:
*this\pstr()\prompt = PeekS(PeekL(*ptr))
;par
*this\pstr()\prompt = PeekS(PeekI(*ptr))
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Autocomplete list pour StringGadget

Message par Thyphoon »

Ar-S a écrit :Salut Thyphoon, si tu ne l'as pas vu, check mon xyloglottus : http://stock.ldvmultimedia.com/Xyloglottus.zip (source inside)

Code : Tout sélectionner

Note :
Attention, pour rendre xyloglottus compatible x64 veuillez modifier :
Code:
*this\pstr()\prompt = PeekS(PeekL(*ptr))
;par
*this\pstr()\prompt = PeekS(PeekI(*ptr))
Sympa :D J'avais cherché sur les forums et je l'avais raté :roll:
tu devrais rajouter directement dans le code

Code : Tout sélectionner

CompilerIf #PB_Compiler_Processor=#PB_Processor_x64
    *this\pstr()\prompt = PeekS(PeekI(*ptr))
CompilerElse
     *this\pstr()\prompt = PeekS(PeekL(*ptr))
CompilerEndIf

boby a écrit :L'utilisation d'une window borderless est probablement la meilleur solution pour ce que tu veux. Quelques petites idées d'amélioration :

Utilise la windowID() de ta fenêtre mère en argument parentID(), ça t'évitera l'ouverture d'une fenêtre supplémentaire dans ta barre de tâches.
- Oui ça j'avais déjà modifé :oops:

(c'est quoi ce forum qui me dit Vous pouvez utiliser seulement 3 citation(s). il y avait pas cette limitation avant, pas pratique pour répondre point par point :cry: )
- Très bonne idée pour le suivi de fenêtre et les keyboardshortcut ^_^

- Non mais j'ai d'abord posté sur le forum anglais en pensant être sur le français. Et mon anglais était moyen, je suis effectivement passé par google traduction, et j'ai fait un copier coller du forum anglais a français ici ... et j'ai mal copier lolll (ou mal effacé ce qu'il y avait avant) :oops: :oops:
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Autocomplete list pour StringGadget

Message par Ar-S »

Passe par DeepL pour traduire tu vas être surpris de la qualité.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Autocomplete list pour StringGadget

Message par Thyphoon »

Ar-S a écrit :Passe par DeepL pour traduire tu vas être surpris de la qualité.
Merci :D
Je vais mettre à jour le code... pas encore parfait mais ça fonctionne
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Autocomplete list pour StringGadget

Message par Thyphoon »

Dernière version Et ça fonctionne plutôt bien :mrgreen:

Code : Tout sélectionner

Code mise à jour dans le premier post
Dernière modification par Thyphoon le mer. 16/janv./2019 16:42, modifié 1 fois.
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Autocomplete list pour StringGadget

Message par boby »

Nickel tout ça ! *pouce en l'air*

Si je peut chipoter encore un tout petit peut, ça serait pas mal de n'afficher ta liste que s'il y a au moins une proposition à offrir ^^"
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Autocomplete list pour StringGadget

Message par Micoute »

Pas mal du tout, c'est le principe que j'avais utilisé pour mon conjugueur.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Autocomplete list pour StringGadget

Message par Thyphoon »

boby a écrit :Nickel tout ça ! *pouce en l'air*

Si je peut chipoter encore un tout petit peut, ça serait pas mal de n'afficher ta liste que s'il y a au moins une proposition à offrir ^^"
Effectivement :roll: je vais voir ça
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Autocomplete list pour StringGadget

Message par Thyphoon »

Micoute a écrit :Pas mal du tout, c'est le principe que j'avais utilisé pour mon conjugueur.
merci 8) C'est que l'idée était bonne :P
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Autocomplete list pour StringGadget

Message par Thyphoon »

boby a écrit :Nickel tout ça ! *pouce en l'air*

Si je peut chipoter encore un tout petit peut, ça serait pas mal de n'afficher ta liste que s'il y a au moins une proposition à offrir ^^"
Done

Code : Tout sélectionner

; ******************************************************************** 
; Program:           AutoComplete List
; Description:       Add an AutoComplete list to a String gadget 

; Author:            Thyphoon
; Date:              January, 2019
; License:           Free, unrestricted, credit 
;                    appreciated but not required.
; Note:              Please share improvement !
; ******************************************************************** 

EnableExplicit

DeclareModule AutoComplete
  Declare AddAutocompleteWindow(Window.i,Gadget.i,*CallBack,FirstEventKey.l=5000)
  Declare CheckEvent(Event.i)
EndDeclareModule  

Module AutoComplete
  
  Prototype.s CallBack(String.s)
  
  Structure ac
    Window.i                  ;Original Window
    Gadget.i                  ;Original Gadget
    FirstEventKey.l           ;First Eventkey=Up +1=Down +2=Enter +3=Escape
    CallBack.CallBack         ;CallBack who return choice
  EndStructure
  
  Structure params
    acWindow.i                ;Autocomplete window
    acGadget.i                ;AutoComplete GadgetList
    CurrentName.s             ;CurrentName at last open autocomplete windows
    Map AutoCompleteGadget.ac()
    FirstEventKey.i
  EndStructure
  
  Global params.params
  
  
  Procedure AddAutocompleteWindow(Window.i,Gadget.i,*CallBack,FirstEventKey.l=5000)
    Name.s=Str(Window)+"-"+Str(Gadget)
    params\AutoCompleteGadget(Name)\CallBack=*CallBack
    params\AutoCompleteGadget(Name)\Gadget=Gadget
    params\AutoCompleteGadget(Name)\Window=Window
    params\AutoCompleteGadget(Name)\FirstEventKey=FirstEventKey
    AddKeyboardShortcut(Window, #PB_Shortcut_Up, FirstEventKey)
    AddKeyboardShortcut(Window, #PB_Shortcut_Down, FirstEventKey+1)
    AddKeyboardShortcut(Window, #PB_Shortcut_Return, FirstEventKey+2)
    AddKeyboardShortcut(Window, #PB_Shortcut_Escape, FirstEventKey+3)
  EndProcedure
  
  Procedure RefreshAutocompleteWindow(Name.s)
    Gadget.i=params\AutoCompleteGadget(Name)\Gadget
    Windows.i=params\AutoCompleteGadget(Name)\Window
    Debug Gadget
    X.l=WindowX(Windows,#PB_Window_InnerCoordinate)+GadgetX(Gadget)
    Y.l=WindowY(Windows,#PB_Window_InnerCoordinate)+GadgetY(Gadget)+GadgetHeight(Gadget)
    W.l=GadgetWidth(Gadget)
    H.l=150
    ResizeWindow(params\acWindow,X,Y,W,H)
    ResizeGadget(params\acGadget,0,0,W,H)
    HideWindow(params\acWindow, #False,#PB_Window_NoActivate)
    StickyWindow(params\acWindow,#True)
  EndProcedure
  
  Procedure UpdateAutocompleteList(Name.s)
    ClearGadgetItems(params\acGadget)
    If params\AutoCompleteGadget(Name)\CallBack<>0
      BackString.s=params\AutoCompleteGadget(Name)\CallBack(GetGadgetText(params\AutoCompleteGadget(Name)\Gadget))

      For n=1 To CountString(BackString,Chr(10))+1
        line.s=StringField(BackString,n,Chr(10))
        If LCase(Left(line,Len(GetGadgetText(params\AutoCompleteGadget(Name)\Gadget))))=LCase(GetGadgetText(params\AutoCompleteGadget(Name)\Gadget))
          AddGadgetItem(params\acGadget,-1,line)
        EndIf 
      Next
      ;Hide Autocomplete Window if no Choice
      If CountGadgetItems(params\acGadget)=0
        HideWindow(params\acWindow,#True)
      Else
        HideWindow(params\acWindow,#False,#PB_Window_NoActivate)
      EndIf 
    Else
      Debug "Error with callback"
    EndIf
  EndProcedure
  
  Procedure OpenAutocompleteWindow(Name.s)
    If params\acGadget>0 And IsGadget(params\acGadget):FreeGadget(params\acGadget):EndIf
    If params\acWindow>0 And IsWindow(params\acWindow):CloseWindow(params\acGadget):EndIf
    params\acWindow=OpenWindow(#PB_Any,0,0,50,50,"AutoComplete",#PB_Window_BorderLess|#PB_Window_NoActivate,WindowID(Window));
    If params\acWindow
      params\CurrentName=Name
      SetWindowData(params\acWindow,params\AutoCompleteGadget(Name)\Gadget)
      params\acGadget=ListViewGadget(#PB_Any, 0, 0, 50,50)
    EndIf
    RefreshAutocompleteWindow(Name)
    UpdateAutocompleteList(Name)
  EndProcedure
  
  Procedure CloseAutocompleteWindow(Name.s)
      Gadget.i=params\AutoCompleteGadget(Name)\Gadget
      Windows.i=params\AutoCompleteGadget(Name)\Window
      If params\acGadget>0 And IsGadget(params\acGadget):FreeGadget(params\acGadget):EndIf
      If params\acWindow>0 And IsWindow(params\acWindow):CloseWindow(params\acWindow):EndIf
  EndProcedure
  
  Procedure CheckEvent(Event.i)
    Static bbclick.b
    ;-Orignal Gadget Event
    Protected Name.s=Str(EventWindow())+"-"+Str(EventGadget())   
    If FindMapElement(params\AutoCompleteGadget(),Name)
      Select Event
        Case  #PB_Event_Gadget
          Select EventGadget()
              ; Main gadget Event  
            Case params\AutoCompleteGadget()\Gadget
              Select EventType()
                Case #PB_EventType_Focus
                  If params\acWindow=0 Or IsWindow(params\acWindow)=#False
                    If bbclick=#False
                      OpenAutocompleteWindow(Name)
                    Else
                      bbclick=#True
                    EndIf 
                  EndIf 
                Case #PB_EventType_LostFocus
                  If GetActiveGadget()<>params\acGadget
                    CloseAutocompleteWindow(Name)
                    bbclick=#False
                  EndIf  
                Case #PB_EventType_Change
                  If bbclick=#False 
                    If IsWindow(params\acWindow)
                      UpdateAutocompleteList(Name)
                    Else
                      Debug "pas de windows"
                    EndIf
                  Else
                    OpenAutocompleteWindow(Name)
                    bbclick=#False
                  EndIf 
              EndSelect 

          EndSelect 
     EndSelect
    EndIf
    
    Select Event
      ;If Original Window Move  
      Case #PB_Event_MoveWindow,#PB_Event_SizeWindow 
        If EventWindow()=params\AutoCompleteGadget()\Window And params\acWindow>0 And IsWindow(params\acWindow)
          RefreshAutocompleteWindow(params\CurrentName)
        EndIf
      ;if Keyword  
      Case #PB_Event_Menu
        Select EventMenu()
          Case params\AutoCompleteGadget(params\CurrentName)\FirstEventKey;UP
            SetGadgetState(params\acGadget,GetGadgetState(params\acGadget)-1)
          Case params\AutoCompleteGadget(params\CurrentName)\FirstEventKey+1;Down
            SetGadgetState(params\acGadget,GetGadgetState(params\acGadget)+1)
          Case params\AutoCompleteGadget(params\CurrentName)\FirstEventKey+2;Enter
            SetGadgetText(params\AutoCompleteGadget()\Gadget,GetGadgetItemText(params\acGadget,GetGadgetState(params\acGadget)))
          Case params\AutoCompleteGadget(params\CurrentName)\FirstEventKey+3;
            CloseAutocompleteWindow(params\CurrentName)
        EndSelect
      Case  #PB_Event_Gadget
        If EventGadget()=params\acGadget
          If EventType()=#PB_EventType_LeftDoubleClick
            SetGadgetText(params\AutoCompleteGadget(params\CurrentName)\Gadget,GetGadgetItemText(params\acGadget,GetGadgetState(params\acGadget)))
            CloseAutocompleteWindow(params\CurrentName)
            bbclick=#True
          EndIf
        EndIf 
    EndSelect  
    
    
    
  EndProcedure  
  
  
EndModule

;- MAIN TEST

CompilerIf #PB_Compiler_IsMainFile 
  
  ; Callback to return keyword list. you must use a database en filter if you want ^_^ 
  Procedure.s ToDisplayInList(String.s)
    ProcedureReturn "Amiga"+Chr(10)+"Amstrad"+Chr(10)+"Atari"+Chr(10)+"Commodore"+Chr(10)+"BeBox"+Chr(10)+"Macintosh"+Chr(10)+"Spectrum"
  EndProcedure
  
  Procedure.s ToDisplayInListB(String.s)
    ProcedureReturn "Alain"+Chr(10)+"Bernard"+Chr(10)+"Charly"+Chr(10)+"David"+Chr(10)+"Eric"+Chr(10)+"Filipe"+Chr(10)+"Horace"+Chr(10)+"Jérome"+Chr(10)+"Kevin"+Chr(10)+"Laurent"+Chr(10)+"Marc"
  EndProcedure
  
  If OpenWindow(0, 200, 200, 800, 300, "AutoComplete Teste", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    StringGadget(1, 10, 10, 380, 26, "")
    StringGadget(2, 410, 10, 380, 26, "")
    
    
    AutoComplete::AddAutocompleteWindow(0,1,@ToDisplayInList()) ;Just init the gadget who must support AutoComplete list
    AutoComplete::AddAutocompleteWindow(0,2,@ToDisplayInListB())
    Repeat
      Define Event.i = WaitWindowEvent()
      
      
      AutoComplete::CheckEvent(Event)
      
      Select Event
        Case #PB_Event_Gadget
      EndSelect
      
    Until Event=#PB_Event_CloseWindow
  EndIf
  End
CompilerEndIf
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Autocomplete list pour StringGadget

Message par boby »

Nice job, ça fonctione bien, c'est facile à utiliser et c'est cross OS.

Merci du partage de code ^^"
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Autocomplete list pour StringGadget

Message par Thyphoon »

boby a écrit :Nice job, ça fonctione bien, c'est facile à utiliser et c'est cross OS.

Merci du partage de code ^^"
Merci :mrgreen: ! j'ai plein de code a partager :roll: Mon problème c'est le temps.
J'ai un module pour utiliser Exiftool de façon simple et efficace, Un Module pour afficher des vignettes, et plein de fonctions sympa... Faudrait juste que je nettoie un peu les codes avant
Tout ça me sert pour un projet plus vaste. une application pour remplacer Feu Picasa de Google.
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Autocomplete list pour StringGadget

Message par Ar-S »

ça marche au poil bravo.
Juste un peu étrange le décalage de déplacement de la "fenêtre editor" ou apparaissent les différents mots si on déplace la fenêtre mère alors qu'on a pas sélectionné de mots.
Image

P.S : un bon gestionnaire exif. Je suis preneur. :mrgreen:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre