Page 1 of 1

AutoComplete StringGadget [Maybe Cross-Platform]

Posted: Fri Oct 16, 2009 11:34 am
by thyphoon
hello

Excuse me for my bad english !

It's a test to add Autocomplete on StringGadget without window API.
it's not perfect, but it's work !

you can use Up and Down key to select on the Autocomplete Gadget and Return Or Tab to valid !
You can chose with mouse but theire are some problème is another gadget is under the Autocomplete Gadget ...

i don't know if this code run ok under Linux or MacOs !

Code: Select all

#Gdt_AutoComplete=999 ; The AutoComplete GadgetID


Structure AutoComplete 
  FocusGadgetID.i  ; The current Gadget
EndStructure
Global AutoComplete.AutoComplete


Structure AutoCompleteGadgetList
  GadgetID.i      ; Gadget who Enable Autocomplete
  *Function       ; Pointer to Refresh Autocmplete Gadget function [No Impemented] ;See RefreshAutoComplete()
EndStructure
Global NewList AutoCompleteGadgetList.AutoCompleteGadgetList()

; Function ton Refresh AutoComplete Gadget
Procedure RefreshAutoComplete()
  If IsGadget(#Gdt_AutoComplete)
  Selecttxt.s=GetGadgetText(AutoComplete\FocusGadgetID)
  ClearGadgetItems(#Gdt_AutoComplete)
  Dim Selection.s(10)
  Selection(0)="Cinéma"
  Selection(1)="histoire"
  Selection(2)="Purebasic"
  Selection(3)="Amiga"
  Selection(4)="Aliens"
  Debug Selecttxt
  For z=0 To 9
    Debug LCase(Selection(z))+"=?"+LCase(Selecttxt)
    If FindString(LCase(Selection(z)),LCase(Selecttxt),-1)
      AddGadgetItem(#Gdt_AutoComplete, -1,Selection(z))
    EndIf
  Next
  SetGadgetState(#Gdt_AutoComplete,0)
EndIf
EndProcedure

Procedure InitAutoComplete(Window.i)
  AddKeyboardShortcut(0, #PB_Shortcut_Down, 63999)
  AddKeyboardShortcut(0, #PB_Shortcut_Up, 63998)
  AddKeyboardShortcut(0, #PB_Shortcut_Return, 63997)
  AddKeyboardShortcut(0, #PB_Shortcut_Tab, 63996)
EndProcedure

;Create the AutoComplete Gadget
Procedure AutoCompleteStart(Gadget)
  AutoComplete\FocusGadgetID=Gadget
  ListViewGadget(#Gdt_AutoComplete, GadgetX(Gadget), GadgetY(Gadget)+GadgetHeight(Gadget), GadgetWidth(Gadget),100)
  RefreshAutoComplete()
EndProcedure
  
  ;Destory the AutoComplete Gadget
Procedure AutocompleteEnd()
    FreeGadget(#Gdt_AutoComplete)
    AutoComplete\FocusGadgetID=-1
EndProcedure

;Test if this gadget have autocomplete active
Procedure IsAutoCompleteGadget(GadgetID.l)
  ForEach AutoCompleteGadgetList()
    If AutoCompleteGadgetList()\GadgetID=GadgetID
      ProcedureReturn #True
    EndIf
  Next
  ProcedureReturn #False
EndProcedure


;Active autocomplete on Gadget, 
Procedure AddAutoCompleteToGadget(GadgetID.l,*Function)
  AddElement(AutoCompleteGadgetList())
  AutoCompleteGadgetList()\GadgetID=GadgetID
  AutoCompleteGadgetList()\Function=*Function
EndProcedure

Macro AutoCompeteEvent(EventID)
  If IsAutoCompleteGadget(GetActiveGadget())
    
    Select EventType()
      Case #PB_EventType_Focus 
        If GetActiveGadget()<>AutoComplete\FocusGadgetID
          AutoCompleteStart(EventGadget())
        EndIf
      
      Case #PB_EventType_LostFocus
        If GetActiveGadget()<>#Gdt_AutoComplete
          AutocompleteEnd()
        EndIf
      Case #PB_EventType_Change
        If IsGadget(#Gdt_AutoComplete)=#False
          AutoCompleteStart(GetActiveGadget())
        EndIf
        RefreshAutoComplete()
    EndSelect
              
    If EventType()= #PB_EventType_Change
      RefreshAutoComplete()
    EndIf
  EndIf
    
  If (GetActiveGadget()=#Gdt_AutoComplete Or IsAutoCompleteGadget(GetActiveGadget()) )And EventID = #PB_Event_Menu
    Select EventMenu() 
      Case 63999 ; Down Key 
        SetGadgetState(#Gdt_AutoComplete,GetGadgetState(#Gdt_AutoComplete)+1)
      Case 63998 ; Up Key
        SetGadgetState(#Gdt_AutoComplete,GetGadgetState(#Gdt_AutoComplete)-1)
      Case 63997 ; Enter Key
        SetGadgetText(AutoComplete\FocusGadgetID,GetGadgetText(#Gdt_AutoComplete))
        AutocompleteEnd()
      Case 63996 ; Tab Key
        SetGadgetText(AutoComplete\FocusGadgetID,GetGadgetText(#Gdt_AutoComplete))
        AutocompleteEnd()
        NextGadget=GetActiveGadget()+1
        If IsGadget(NextGadget)
          SetActiveGadget(NextGadget)
        EndIf
        
    EndSelect
  EndIf
        
  If EventID = #PB_Event_Gadget And EventGadget()=#Gdt_AutoComplete
    SetGadgetText(AutoComplete\FocusGadgetID,GetGadgetText(#Gdt_AutoComplete))
  EndIf
EndMacro


;#######
#WindowWidth  = 390
#WindowHeight = 350

If OpenWindow(0, 100, 200, #WindowWidth, #WindowHeight, "PureBasic - Gadget Demonstration", #PB_Window_MinimizeGadget)
    
  Top = 10
  GadgetHeight = 24

  Frame3DGadget(#PB_Any, 10, Top, 370, 290, "Player...") : Top+20

  StringGadget(1,  20, 10, 200, GadgetHeight, "")
  StringGadget(2,  20, 40, 200, GadgetHeight, "")
  StringGadget(3,  20, 70, 200, GadgetHeight, "")
  ButtonGadget(8, #WindowWidth-100, #WindowHeight-36, 80, 24, "Quit")



InitAutoComplete(0) ;initalise autocomplete on Window 0
AddAutoCompleteToGadget(1,@RefreshAutoComplete()) ; active Autocomplet on gadget 1
AddAutoCompleteToGadget(3,@RefreshAutoComplete()) ; Active Autocomplet on gadget 2
  Repeat
    EventID = WaitWindowEvent()
    
    AutoCompeteEvent(EventID)
    ;#####################
 
       
    If EventID = #PB_Event_Gadget

      Select EventGadget()
        Case 0

        Case 2 
          
        Case 3

        Case 8 ; Quit...
          EventID = #PB_Event_CloseWindow

     EndSelect

    EndIf

  Until EventID = #PB_Event_CloseWindow

EndIf

End 

Re: AutoComplete StringGadget [Maybe Cross-Platform]

Posted: Sat Oct 17, 2009 5:22 am
by idle
looks pretty good, thanks

I noticed a redraw issues if you move the mouse over the list when it's covering another string gadget.
not sure why it's doing it will look at it a bit later to see if I can fix it

Re: AutoComplete StringGadget [Maybe Cross-Platform]

Posted: Thu Dec 03, 2009 7:46 am
by GBeebe
Works in Ubuntu Linux. Made some changes you may be interested in.

Code: Select all

;Selection() no longer has a fixed number of elements.
Global NewList Selection.s()

;A procedure to add elements to Selection()
Procedure AddToSelection(text.s)
    AddElement(Selection.s()) : Selection() = text.s
EndProcedure

AddToSelection("Cinéma")
AddToSelection("histoire")
AddToSelection("Purebasic")
AddToSelection("Amiga")
AddToSelection("Aliens")
AddToSelection("Alien")

;you can also sort the list alphabetically.
SortList(Selection(), #PB_Sort_NoCase | #PB_Sort_Ascending)


; Function ton Refresh AutoComplete Gadget
Procedure RefreshAutoComplete()
  If IsGadget(#Gdt_AutoComplete)
  Selecttxt.s=GetGadgetText(AutoComplete\FocusGadgetID)
  ClearGadgetItems(#Gdt_AutoComplete)
  
  ;Debug Selecttxt
  ForEach Selection()
    ;Debug LCase(Selection(z))+"=?"+LCase(Selecttxt)
    If FindString(LCase(Selection()),LCase(Selecttxt),-1)
      AddGadgetItem(#Gdt_AutoComplete, -1,Selection())
    EndIf
  Next
  SetGadgetState(#Gdt_AutoComplete,0)
EndIf
EndProcedure

Re: AutoComplete StringGadget [Maybe Cross-Platform]

Posted: Thu Dec 03, 2009 8:44 am
by thyphoon
Great !!! :)

I merge your code with Mine ! run fine with Windows and Linux !! :)

Code: Select all

;Selection() no longer has a fixed number of elements.
Global NewList Selection.s()

;A procedure to add elements to Selection()
Procedure AddToSelection(text.s)
    AddElement(Selection.s()) : Selection() = text.s
EndProcedure

AddToSelection("Cinéma")
AddToSelection("histoire")
AddToSelection("Purebasic")
AddToSelection("Amiga")
AddToSelection("Aliens")
AddToSelection("Alien")

;you can also sort the list alphabetically.
SortList(Selection(), #PB_Sort_NoCase | #PB_Sort_Ascending)

#Gdt_AutoComplete=999 ; The AutoComplete GadgetID


Structure AutoComplete
  FocusGadgetID.i  ; The current Gadget
EndStructure
Global AutoComplete.AutoComplete


Structure AutoCompleteGadgetList
  GadgetID.i      ; Gadget who Enable Autocomplete
  *Function       ; Pointer to Refresh Autocmplete Gadget function [No Impemented] ;See RefreshAutoComplete()
EndStructure
Global NewList AutoCompleteGadgetList.AutoCompleteGadgetList()

; Function ton Refresh AutoComplete Gadget
Procedure RefreshAutoComplete()
  If IsGadget(#Gdt_AutoComplete)
  Selecttxt.s=GetGadgetText(AutoComplete\FocusGadgetID)
  ClearGadgetItems(#Gdt_AutoComplete)
 
  ;Debug Selecttxt
  ForEach Selection()
    ;Debug LCase(Selection(z))+"=?"+LCase(Selecttxt)
    If FindString(LCase(Selection()),LCase(Selecttxt),-1)
      AddGadgetItem(#Gdt_AutoComplete, -1,Selection())
    EndIf
  Next
  SetGadgetState(#Gdt_AutoComplete,0)
EndIf
EndProcedure

Procedure InitAutoComplete(Window.i)
  AddKeyboardShortcut(0, #PB_Shortcut_Down, 63999)
  AddKeyboardShortcut(0, #PB_Shortcut_Up, 63998)
  AddKeyboardShortcut(0, #PB_Shortcut_Return, 63997)
  AddKeyboardShortcut(0, #PB_Shortcut_Tab, 63996)
EndProcedure

;Create the AutoComplete Gadget
Procedure AutoCompleteStart(Gadget)
  AutoComplete\FocusGadgetID=Gadget
  ListViewGadget(#Gdt_AutoComplete, GadgetX(Gadget), GadgetY(Gadget)+GadgetHeight(Gadget), GadgetWidth(Gadget),100)
  RefreshAutoComplete()
EndProcedure
 
  ;Destory the AutoComplete Gadget
Procedure AutocompleteEnd()
    FreeGadget(#Gdt_AutoComplete)
    AutoComplete\FocusGadgetID=-1
EndProcedure

;Test if this gadget have autocomplete active
Procedure IsAutoCompleteGadget(GadgetID.l)
  ForEach AutoCompleteGadgetList()
    If AutoCompleteGadgetList()\GadgetID=GadgetID
      ProcedureReturn #True
    EndIf
  Next
  ProcedureReturn #False
EndProcedure


;Active autocomplete on Gadget,
Procedure AddAutoCompleteToGadget(GadgetID.l,*Function)
  AddElement(AutoCompleteGadgetList())
  AutoCompleteGadgetList()\GadgetID=GadgetID
  AutoCompleteGadgetList()\Function=*Function
EndProcedure

Macro AutoCompeteEvent(EventID)
  If IsAutoCompleteGadget(GetActiveGadget())
   
    Select EventType()
      Case #PB_EventType_Focus
        If GetActiveGadget()<>AutoComplete\FocusGadgetID
          AutoCompleteStart(EventGadget())
        EndIf
     
      Case #PB_EventType_LostFocus
        If GetActiveGadget()<>#Gdt_AutoComplete
          AutocompleteEnd()
        EndIf
      Case #PB_EventType_Change
        If IsGadget(#Gdt_AutoComplete)=#False
          AutoCompleteStart(GetActiveGadget())
        EndIf
        RefreshAutoComplete()
    EndSelect
             
    If EventType()= #PB_EventType_Change
      RefreshAutoComplete()
    EndIf
  EndIf
   
  If (GetActiveGadget()=#Gdt_AutoComplete Or IsAutoCompleteGadget(GetActiveGadget()) )And EventID = #PB_Event_Menu
    Select EventMenu()
      Case 63999 ; Down Key
        SetGadgetState(#Gdt_AutoComplete,GetGadgetState(#Gdt_AutoComplete)+1)
      Case 63998 ; Up Key
        SetGadgetState(#Gdt_AutoComplete,GetGadgetState(#Gdt_AutoComplete)-1)
      Case 63997 ; Enter Key
        SetGadgetText(AutoComplete\FocusGadgetID,GetGadgetText(#Gdt_AutoComplete))
        AutocompleteEnd()
      Case 63996 ; Tab Key
        SetGadgetText(AutoComplete\FocusGadgetID,GetGadgetText(#Gdt_AutoComplete))
        AutocompleteEnd()
        NextGadget=GetActiveGadget()+1
        If IsGadget(NextGadget)
          SetActiveGadget(NextGadget)
        EndIf
       
    EndSelect
  EndIf
       
  If EventID = #PB_Event_Gadget And EventGadget()=#Gdt_AutoComplete
    SetGadgetText(AutoComplete\FocusGadgetID,GetGadgetText(#Gdt_AutoComplete))
  EndIf
EndMacro


;#######
#WindowWidth  = 390
#WindowHeight = 350

If OpenWindow(0, 100, 200, #WindowWidth, #WindowHeight, "PureBasic - Gadget Demonstration", #PB_Window_MinimizeGadget)
   
  Top = 10
  GadgetHeight = 24

  Frame3DGadget(#PB_Any, 10, Top, 370, 290, "Player...") : Top+20

  StringGadget(1,  20, 10, 200, GadgetHeight, "")
  StringGadget(2,  20, 40, 200, GadgetHeight, "")
  StringGadget(3,  20, 70, 200, GadgetHeight, "")
  ButtonGadget(8, #WindowWidth-100, #WindowHeight-36, 80, 24, "Quit")



InitAutoComplete(0) ;initalise autocomplete on Window 0
AddAutoCompleteToGadget(1,@RefreshAutoComplete()) ; active Autocomplet on gadget 1
AddAutoCompleteToGadget(3,@RefreshAutoComplete()) ; Active Autocomplet on gadget 2
  Repeat
    EventID = WaitWindowEvent()
   
    AutoCompeteEvent(EventID)
    ;#####################

       
    If EventID = #PB_Event_Gadget

      Select EventGadget()
        Case 0

        Case 2
         
        Case 3

        Case 8 ; Quit...
          EventID = #PB_Event_CloseWindow

     EndSelect

    EndIf

  Until EventID = #PB_Event_CloseWindow

EndIf

End 

Re: AutoComplete StringGadget [Maybe Cross-Platform]

Posted: Thu Dec 03, 2009 4:09 pm
by Perkin
Just had an error. :(

line 164 - #Gadget is not intialised

I ran code, went to last entry, pressed 'a' then tab, then pressed tab again, .....Error
should just be a simple check in AutoCompeteEvent proc.