BBjSpinner Example

REM Spinner sample

USE java.util.HashMap

REM Obtain the instance of the BBjAPI object
LET myAPI!=BBjAPI()

REM Open the SysGui device
SYSGUI=UNT
OPEN (SYSGUI)"X0"

REM Obtain the instance of the BBjSysGui object
LET mySysGui!=myAPI!.getSysGui()

REM Set addWindow param values
X=200
Y=200
WIDTH=350
HEIGHT=250
TITLE$="Programming Languages"

REM Set the current context
mySysGui!.setContext(0)

REM Create a window
myWindow! = mySysGui!.addWindow(X,Y,WIDTH,HEIGHT,TITLE$,$00010083$)

REM Create programming language data
myLangList! = myAPI!.makeVector()
myDescMap! = new HashMap()

dummy = fnAddLanguage(myLangList!,
:                     myDescMap!,
:                     "BBx",
:                     "A Business BASIC developed by BASIS International, Ltd.")

dummy = fnAddLanguage(myLangList!,
:                     myDescMap!,
:                     "Java",
:                     "An Object-Oriented C++ derivative developed by Sun Microsystems")

dummy = fnAddLanguage(myLangList!,
:                     myDescMap!,
:                     "C++",
:                     "A low-level object oriented language developed by Bjarne Stroustrup")

REM Mask for inpute's
mask$ = "XXXXXXXXXXXXXXXXXXX"
REM Create the spinner
myLangSpinner! = myWindow!.addInputESpinner(101, 10, 10, 96, 25, $$, mask$, " ", myLangList!)

REM Create the inpute for the name
myLangName! = myWindow!.addInputE(103, 10, 45, 80, 25, $$, mask$, " ", myLangList!.get(0))

REM Create the CEDIT for the description
firstDesc$ = myDescMap!.get(myLangList!.get(0))
myLangDesc! = myWindow!.addCEdit(104, 10, 80, 240, 160, firstDesc$)
myLangDesc!.setLineWrap(1)

REM Create a button for controlling the slideshow
mySlideshowButton! = myWindow!.addButton(102, 220, 10, 120, 25, "Start Slideshow")

REM Create a button for adding new languages
myAddButton! = myWindow!.addButton(105, 260, 80, 80, 25, "Add")

REM Create a button for deleting existing languages
myRemoveButton! = myWindow!.addButton(106, 260, 115, 80, 25, "Remove")

REM Set callbacks
myWindow!.setCallback(myWindow!.ON_CLOSE,"APP_CLOSE")
myLangSpinner!.setCallback(myLangSpinner!.ON_SPIN, "SPIN")
myAddButton!.setCallback(myAddButton!.ON_BUTTON_PUSH, "ADD_LANGUAGE")
myRemoveButton!.setCallback(myRemoveButton!.ON_BUTTON_PUSH, "REMOVE_LANGUAGE")
mySlideshowButton!.setCallback(myRemoveButton!.ON_BUTTON_PUSH, "SLIDESHOW")


PROCESS_EVENTS

REM Callback for the ON_SPIN event
SPIN:
    REM Get the BBjSpinEvent
    ev! = myAPI!.getLastEvent()

    REM Get the text from the event and associated description
    currentValue$ = ev!.getText()
    currentDesc$ = myDescMap!.get(currentValue$)

    REM Set the name and description in the inpute and CEdit
    myLangName!.setText(currentValue$)
    myLangDesc!.setText(currentDesc$)
    RETURN
    
REM Callback for myAddButton! ON_BUTTON_PUSH
ADD_LANGUAGE:
    REM Check for existence of language, no duplicates
    langName$ = myLangName!.getText().trim()
    IF (myDescMap!.containsKey(langName$))
        A = MSGBOX("Already have a language " + langName$)
    ELSE
        REM Otherwise, add it to the list
        langDesc$ = myLangDesc!.getText()

        REM Get a copy of the current list, and add the new langauge
        myLangList! = myLangSpinner!.getSpinList()
        dummy = fnAddLanguage(myLangList!, myDescMap!, langName$, langDesc$)

        REM Set the modified list to be the current list
        myLangSpinner!.setSpinList(myLangList!)

        REM Find the new item's index and set the spinner on the new value
        index = myLangList!.indexOf(langName$)
        myLangSpinner!.setListIndex(index)
    ENDIF
    RETURN

REMOVE_LANGUAGE:
    REM Get a copy of the list and the current item's index
    myLangList! = myLangSpinner!.getSpinList()
    index = myLangSpinner!.getListIndex()

    REM Remove that index from the spin list
    myLangList!.remove(index)

    REM set the modified spin list on the spinner
    myLangSpinner!.setSpinList(myLangList!)
    value$ = myLangSpinner!.getText()
    myLangName!.setText(value$)
    myLangDesc!.setText(myDescMap!.get(value$))
    RETURN

SLIDESHOW:
    REM If we show "Start", start the slide show
    IF mySlideshowButton!.getText().startsWith("Start")

        REM Set the opposite action text on the button
        mySlideshowButton!.setText("Stop Slideshow")

        REM Disable the editing buttons
        myAddButton!.setEnabled(0)
        myRemoveButton!.setEnabled(0)

        REM Add the timer for the slideshow
        myAPI!.createTimer("timer", 3, "SLIDESHOW_TIMER")
    ELSE

        REM Set the opposite action text on the button
        mySlideshowButton!.setText("Start Slideshow")

        REM Remove the timer
        myAPI!.removeTimer("timer")

        REM Re-enable the editing buttons
        myAddButton!.setEnabled(1)
        myRemoveButton!.setEnabled(1)
    ENDIF
    RETURN

SLIDESHOW_TIMER:
    REM Ignore leftover timer event
    IF (! myAddButton!.isEnabled())
        REM If at the end
        IF (myLangSpinner!.getListIndex() = myLangSpinner!.getSpinList().size() - 1)
            REM roll around to the top
            myLangSpinner!.setListIndex(0)
        ELSE
            REM Otherwise, spin up
            myLangSpinner!.spin(1)
        ENDIF

        REM Note: the spin() method does not fire an event
        REM Must synchronize the fields manually

        myLangName$ = myLangSpinner!.getText()
        myLangName!.setText(myLangName$)
        myLangDesc!.setText(myDescMap!.get(myLangName$))
    ENDIF
    RETURN

APP_CLOSE:
    RELEASE

REM Utility function to add a language to the list and the description to
REM the map.
DEF fnAddLanguage(p_list!, p_map!, p_lang$, p_langDesc$)
    p_list!.add(p_lang$)
    p_map!.put(p_lang$, p_langDesc$)
    RETURN 0
FNEND




______________________________________________________________________________________

Copyright BASIS International Ltd. BBj®, Visual PRO/5®, PRO/5®, and BBx® are registered trademarks.