Page 1 of 1

Autocomplete object

Posted: Sat Oct 25, 2003 11:44 am
by Justin
Code updated For 5.20+

Just to play a little with the new functions. An object that makes an autocomplete in an editbox / listbox. It's a working example, note that you have to use setsel() if the selected listbox index changes outside the object, i did this to improve the speed, rather than checking the selected index for every edit change inside the object. Only for windows.

Code: Select all

;Autocomplete object
;Justin 10/03

Interface IPBAutoComplete
  FindStr(str$)
  SetEdit(id)
  SetListBox(id)
  SetSel(isel)
EndInterface

Structure PBAutoCompleteFunctions
  FindStr.l
  SetEdit.l
  SetListBox.l
  SetSel.l
EndStructure

Structure OPBAutoComplete
  *VTable.PBAutoCompleteFunctions
  hwndedit.l
  hwndlistbox.l
  idedit.l
  idlistbox.l
  iselected.l
EndStructure

;finds and select the passed string
Procedure FindStr(*Object.OPBAutoComplete,str$)
  hwndlistbox=*Object\hwndlistbox
  istr=SendMessage_(hwndlistbox,#LB_FINDSTRING,-1,str$)
  If istr<>-1
    ;skip if item is selected
    If *Object\iselected=istr : ProcedureReturn : EndIf
    textlen=Len(str$)
    
    newtextlen=SendMessage_(hwndlistbox,#LB_GETTEXTLEN,istr,0)      
    seltextlen=newtextlen-textlen
    
    ;select
    SendMessage_(hwndlistbox,#LB_SETCURSEL,istr,0)
    ;set edit text
    SetGadgetText(*Object\idedit,GetGadgetItemText(*Object\idlistbox,istr,-1))
    ;set selected text
    SendMessage_(*Object\hwndedit,#EM_SETSEL,textlen,newtextlen)
    
    ;update index
    *Object\iselected=istr
  EndIf
EndProcedure

;sets the editbox for this object
;id : editbox id
Procedure SetEdit(*Object.OPBAutoComplete,id)
  *Object\idedit=id
  *Object\hwndedit=GadgetID(id)
EndProcedure

;sets the listbox for this object
;id : listbox id
Procedure SetListBox(*Object.OPBAutoComplete,id)
  *Object\idlistbox=id
  *Object\hwndlistbox=GadgetID(id)
EndProcedure

;sets the selected listbox index
;iselected : index of selected item
;you are responsable to update this index every time it changes
;-1 = no selection
Procedure SetSel(*Object.OPBAutoComplete,iselected)
  *Object\iselected=iselected
EndProcedure

PBAutoCompleteFunctions.PBAutoCompleteFunctions\FindStr=@FindStr()
PBAutoCompleteFunctions.PBAutoCompleteFunctions\SetEdit=@SetEdit()
PBAutoCompleteFunctions.PBAutoCompleteFunctions\SetListBox=@SetListBox()
PBAutoCompleteFunctions.PBAutoCompleteFunctions\SetSel=@SetSel()

OPBAutoComplete.OPBAutoComplete\VTable=PBAutoCompleteFunctions

;-----------------------------------------------------------------
;CODE

;GADGET IDs
#String0=0
#ListView1=1

;WINDOW ID
#Window1=0

;WINDOW
OpenWindow(#Window1,150,70,550,350,"Auto Complete",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_TitleBar)
CreateGadgetList(WindowID(#Window1))

StringGadget(#String0,10,8,310,24,"")
ListViewGadget(#ListView1,11,49,308,262)

AddGadgetItem(#ListView1,-1,"Red")
AddGadgetItem(#ListView1,-1,"Green")
AddGadgetItem(#ListView1,-1,"Blue")
AddGadgetItem(#ListView1,-1,"Yellow")
AddGadgetItem(#ListView1,-1,"Black")
AddGadgetItem(#ListView1,-1,"White")
AddGadgetItem(#ListView1,-1,"Pink")
AddGadgetItem(#ListView1,-1,"Purple")
AddGadgetItem(#ListView1,-1,"Gray")
AddGadgetItem(#ListView1,-1,"Orange")


;create object
OAutoCP.IPBAutoComplete=@OPBAutoComplete

;init object
OAutoCP\SetEdit(#String0)
OAutoCP\SetListBox(#ListView1)
OAutoCP\SetSel(-1) ;no items selected

;EVENT LOOP
Repeat
  EvID=WaitWindowEvent()
  Select EvID
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #String0
          Select EventType()
            Case #PB_EventType_Change
              str$=GetGadgetText(#String0)       
              OAutoCP\FindStr(str$)      
          EndSelect
          
        Case #ListView1 ;important to update selected index in object
          isel=GetGadgetState(#ListView1)
          ;update selected index
          OAutoCP\SetSel(isel)
          ;set selected in edit
          str$=GetGadgetItemText(#ListView1,isel,-1)
          SetGadgetText(#String0,str$)         
      EndSelect
  EndSelect
Until EvID=#PB_Event_CloseWindow