%%HP: T(3)A(D)F(.);
\<<
@
@ CHOOSES - HP49G Version 10/7/01 S. Lui
@ CHOOSE 1.0 by Stan Lui 5/24/98
@ This function is a HP48SX GUI control which provides the
@ following functions:
@ function 1.  Choose only ONE of the displayed items (option buttons)
@ function 2.  Pick one or more of the displayed items (checkboxs)
@ CHOOSE can display multiple pages of items.  Up to 5 items
@ are displayed in one page.
@ input: s t dval1  dval2  f
@          s  - a list of item title strings. Example : {"item#1" "item#2"}
@          t  - the title of the chooser to display. Example : "Play again?"
@          dval1 - the default selected item index to begin for function 1
@          dval2 - the default picked item(s) to begin for function 2,
@                     this is a list of values of zeros and ones, where one
@                     means the corresponding item is picked. Example: { 1 0 1 1}
@          f - 1- use function 1, 2 - use function 2
@  output: 
@       no error return : val  errcode
@             val = If f=1, the selected item index
@             val = If f=2, the list of items with zeros and ones, where one
@                     means the corresponding item is picked
@	  errcode = 0
@
@       error return : errcode
@             errcode = -1 : if f=2, and the number of elements in s and 
@                      the number of elements in dval2 does not match
@
@  Program Usage:
@    Active Keys:  The following keys are active with CHOOSE:
@      > (right arrow key): display the next page of option buttons/checkboxs
@      < (left arrow key): display the previous page
@      up arrow key: move up one item 
@      down arrow key: move down one item
@      SPC: toggle a checkbox (this key is inactive for option buttons)
@      ENTER: to exit the control
@      Note: for the option button control, the current item is always selected.
@


RCLF PICT {# 3d,# 4d} {# 127d,# 61d} SUB 0 0 0 0 0 0 0 0 0
{11 24 37 50 0 } {11 21 31 41 51} 

GROB 9 9 C70028009310D710D710D71093102800C700

GROB 9 9 C7002800101010101010101010102800C700

GROB 9 9 FF101010141056105310D110D0101010FF10

GROB 9 9 FF101010101010101010101010101010FF10

GROB 2 3 103010

GROB 2 3 203020

GROB 105 9 3333333333333333333333333B1010000000000000000000000000100000000000000000000000000000100000000000000000000000001000000000000000000000000000001000000000000000000000000010000000000000000000000000000010000000000000000000000000103333333333333333333333333B10

{}
\-> 
s t dval1 dval2 f fs g tg ni di totn k di0 y nd si y1 y2
cirg1 cirg0 sqr1 sqr0 cg1 cg0 dotbx glst
\<<


s SIZE 'totn' STO 3 CF IF totn 5 \>= THEN 3 SF END
IF f 1 == THEN IF dval1 0 \<= THEN 1 'dval1' STO END END

8 CF
IF f 2 == THEN IF dval2 SIZE totn \=/ THEN
 IF 'DSPERR' VTYPE -1 \=/ THEN "CHOOSE" -1 DSPERR END
 8 SF -1 END END

IF 8 FC? THEN 
\<<
  2 CF 0 'di' STO    4 CF 5 CF
  PICT {# 8d,# 11d} # 115d 
  CASE
    totn 4 \>= THEN #49d END
    totn 3 == THEN #35d END
    #22d
  END BLANK REPL
  WHILE 2 FC? REPEAT
     'di' INCR DROP 'ni' INCR DROP
     IF 3 FC? THEN y1 ELSE y2 END di GET 'y' STO
     PICT # 8d y R\->B 2 \->LIST  
     IF f 1 == THEN IF dval1 ni == THEN cirg1 ELSE cirg0 END ELSE
      IF dval2 ni GET THEN sqr1 ELSE sqr0 END END REPL
     PICT #20d y 2 + R\->B 2 \->LIST
     IF 6 FS? THEN
       20 120 1 s ni GET  GETSTR
       IF "" \=/ THEN " ..." + END 1 \->GROB
     ELSE
       s ni GET 1 \->GROB DUP SIZE DROP B\->R IF 101 > THEN
           {#0 #0} {#100d #4d} SUB END
     END
     REPL
     IF 3 FC? THEN IF di totn == THEN 2 SF END ELSE
       IF ni totn == di 5 == OR THEN 2 SF END END 
  END
  IF 3 FS? totn 5 > AND THEN
    PICT {# 124d,# 6d} IF ni totn < THEN cg1 5 SF ELSE #2d #3d BLANK END REPL
    PICT {# 5d,# 6d} IF ni 5 > THEN cg0 4 SF ELSE #2d #3d BLANK END REPL
  END
  di 'nd' STO 1 'di' STO
\>> 

\<< 0 \-> g \<<
  IF di0 THEN
    IF 3 FC? THEN y1 ELSE y2 END di0 GET 'y' STO
    PICT #20d y 2 + R\->B 2 \->LIST #120d y 6 + R\->B 2 \->LIST SUB 'g' STO
    PICT # 18d y R\->B 2 \->LIST # 105d # 9d BLANK REPL
    PICT #20d y 2 + R\->B 2 \->LIST g REPL
  END
  IF 3 FC? THEN y1 ELSE y2 END di GET 'y' STO
  PICT #20d y 2 + R\->B 2 \->LIST #120d y 6 + R\->B 2 \->LIST SUB 'g' STO
  PICT #18d y R\->B 2 \->LIST dotbx {#2d #2d} g REPL REPL
\>> \>>

\<<
     PICT #8d IF 3 FC? THEN y1 ELSE y2 END
     dval1 IF 3 FS? THEN 5 MOD END IF DUP NOT THEN DROP 5 END
     GET R\->B 2 \->LIST cirg0 REPL
\>>

\<<
      PICT #8d IF 3 FC? THEN y1 ELSE y2 END di GET R\->B 2 \->LIST
      cirg1 REPL
     ni nd di - -  'dval1' STO
\>>

\-> disp update  drw0 drw1 \<<
@IF 'MORE48D' VTYPE -1 == 'GETSTR' VTYPE -1 == OR THEN 6 CF ELSE 6 SF END
6 SF
CASE
 totn 4 \>= THEN
   PICT {# 3d,# 4d} # 125d # 58d BLANK REPL
   {# 3d,# 4d} {# 127d,# 61d} BOX
 END
 totn 3 == THEN
   PICT {# 3d,# 4d} # 125d # 45d BLANK REPL
   {# 3d,# 4d} {# 127d,# 48d} BOX
 END
 PICT {# 3d,# 4d} # 125d # 32d BLANK REPL
 {# 3d,# 4d} {# 127d,# 35d} BOX
END

PICT {#13d #0} {#117d #3d} SUB 'tg' STO
PICT {# 13d,# 0d} # 105d # 9d BLANK REPL
{# 13d,# 0d} {# 117d,# 8d} BOX
PICT
IF 6 FS? THEN
  15 115 1 t GETSTR IF "" \=/ THEN " ..." + END 1 \->GROB
ELSE
  t 1 \->GROB DUP IF SIZE DROP B\->R 101 > THEN
    {#0 #0} {#100d #4d} SUB END
END 
DUP SIZE DROP B\->R 101 SWAP - 2 / 15 + R\->B #2d 2 \->LIST SWAP REPL

IF f 1 == THEN
 dval1 1 - 5 / IP 5 * 'ni' STO disp EVAL 
 dval1 5 MOD IF DUP NOT THEN DROP 5 END
 'di' STO 
ELSE
 disp EVAL
END 

@ determine grob list for input
  PICT {# 15d,# 2d} {# 115d,# 6d} SUB 
  # 101d # 5d BLANK {#0d #0d} "PRESS + FOR COMMAND HELP"
  1 \->GROB REPL
  2 \->LIST 'glst' STO

update EVAL
1 CF
WHILE 1 FC? REPEAT


@ZKEYLABELS 30 6591303 -1 -16777216 9 20 "View Title" 41 "Help" 43 "View Item" 44 "Select/Deselect Item" 45 "Exit Choose" 46 "Up" 47 "Prev Page" 48 "Next Page" 49 "Down" 

  7 CF
@     xp yp tw rflag xs ys glst
        15 2  2 0 101 5 glst  DSPGRBIN  'k' STO
  CASE
    k 95 == THEN
       {" " " " " " " " "." " " "T" " " "+" }
       {"UP: UP ONE ITEM"
        "DOWN: DOWN ONE ITEM"
        "|> : NEXT PAGE"
        "<| : BACK PAGE"
        "VIEW SELECTED ITEM DETAIL"
        "SPC: SELECT/DESELECT ITEM"
        "VIEW TITLE IN DETAIL"
        "ENTER: EXIT CHOOSE"
        "CHOOSE COMMAND HELP"} CMDHELP
    END
    k 35 == THEN
      IF nd 1 \=/ THEN
         IF f 1 == THEN drw0 EVAL END
         di 'di0' STO 
         IF 'di'  INCR nd > THEN 1 'di' STO END
         update EVAL
         IF f 1 == THEN drw1 EVAL END
      ELSE 7 SF END
    END
    k 25 == THEN
      IF nd 1 \=/ THEN
         IF f 1 == THEN drw0 EVAL END
         di 'di0' STO
         IF 'di' DECR 0  == THEN nd 'di' STO END
         update EVAL
         IF f 1 == THEN drw1 EVAL END
      ELSE 7 SF END
    END
    k 36 == THEN
      IF 5 FS? THEN
         disp EVAL
         0 'di0' STO update EVAL
         IF f 1 == THEN drw1 EVAL END
      ELSE 7 SF END
    END
    k 34 == THEN
      IF 4 FS? THEN
        ni nd - 5 - 'ni' STO disp EVAL
        0 'di0' STO update EVAL
        IF f 1 == THEN drw1 EVAL END
      ELSE 7 SF END
    END

    k 104 == f 2 == AND THEN
      ni nd di - - 'si' STO
      dval2 si DUP2  IF GET THEN 0 ELSE 1 END PUT 'dval2' STO 
      PICT #8d IF 3 FC? THEN y1 ELSE y2 END di GET R\->B 2 \->LIST
      IF dval2 si GET THEN sqr1 ELSE sqr0 END REPL
    END
    k 103 == THEN
      IF 6 FS? THEN
        20  IF 3 FC? THEN y1 ELSE y2 END di GET 2 + 105 1 s ni nd di - - GET 1 0 0  MORE48D 
      END
    END
    k 54 == THEN
      IF 6 FS? THEN  15 2 105 1  t  1 0 0  MORE48D END
    END
    k 105 == THEN
      1 SF

@ZKEYLABELSOFF 
    END    
  END
  IF  7 FS? THEN 100 .1 BEEP END
END
 
IF f 1 == THEN dval1 ELSE dval2 END 0
PICT {#13d #0} tg REPL PICT {#3d #4d} g REPL
\>>

END fs STOF
\>>
\>>

