%%HP: T(3)A(D)F(.);
@
@  Rocker Switch Input routine S. Lui 3/16/97
@  Inputs : x y num clst title bflag oflag pdir par prg
@              x - x coordinate of upper left corner of switch
@	   y - y coordinate of upper left corner of switch
@	   num - number to display
@	   clst - list of character strings to display
@                 if clst is {}, {" "} is used.
@	   title - title string if any or ""
@	   bflag - (1/0) border on/off flag. If there is a 
@	             title, then border is always on
@	   oflag - if = 0, normal operations.
@                  if > 0, display item #oflag and exits.	   
@	       if < 0, normal operations, but display starting at item ABS(oflag)
@	   
@          pdir - if not = {}, specifies the directory path of program to
@	     execute.
@          prg - program to execute.  prg contains init,main,finish sections
@	   par - parameter to pass to prg.
@          inputs to be passed to 'prg':
@	   
@	   init section - par 0 0 1
@	   main section - par num/clst 0/index_of_string_list_hilited 2
@          finish section-par 0 0 3	   
@	   
@  Output : num | string 
@	   num - updated number or
@	   string - string displayed
@

\<< RCLF 0 0 0 0 1 0 0 0 {HOME URPLUI} 0  0 0 0  0  0
   \-> x y nm clst title bflag oflag pdir par prg fs f1 w y1 gg n pt k eg
   udir byg  ng0  ng1  pg igx igy \<< 1 CF


   GROB 3 5 4060706040 'ng0' STO

   GROB 4 5 1030703010 'ng1' STO

   GROB 4 5 90B0F0B090 'pg' STO


   IF 'MORE48D' VTYPE -1 == THEN 
      5 CF ELSE 5 SF END 

   IF oflag 0 < THEN oflag ABS 'n' STO 0 'oflag' STO END

   IF clst {} == THEN {" "} 'clst' STO END
   IF nm 0 == THEN   
      68 'w' STO 
   ELSE
      26 'w' STO 
   END
   PICT x R\->B y R\->B 2 \->LIST
   x w + R\->B y IF title "" \=/ THEN 18 ELSE 10 END + R\->B 2 \->LIST SUB 'gg' STO
   y IF title "" \=/ THEN 11 ELSE 3 END + 'y1' STO
   IF x w + 130 > THEN 1 SF END
   IF 1 FC? THEN
      IF title "" == THEN
        IF y 10 + 63 > THEN 1 SF END
      ELSE
        IF y 18 + 63 > THEN 1 SF END
      END
   END
   IF 1 FC? THEN
     IF nm 0 == title "" \=/ AND THEN "[" clst SIZE \->STR + "]" + title + 'title' STO END
     PICT x R\->B y R\->B 2 \->LIST
     w 1 + R\->B IF title "" \=/ THEN #19d ELSE #11d END BLANK REPL
@  Draw border box outline if bflag is set
     IF bflag THEN 
          IF title "" == THEN
	x R\->B y        R\->B 2 \->LIST   x w + R\->B y        R\->B 2 \->LIST LINE
	x R\->B y 10 + R\->B 2 \->LIST   x w + R\->B y 10 + R\->B 2 \->LIST LINE
	x R\->B y        R\->B 2 \->LIST   x         R\->B y 10 + R\->B 2 \->LIST LINE
	x w + R\->B y R\->B 2 \->LIST   x w + R\->B y 10 + R\->B 2 \->LIST LINE
              y 8 + DUP 2 \->LIST 'igy' STO
          ELSE
	x R\->B y        R\->B 2 \->LIST   x w + R\->B y        R\->B 2 \->LIST LINE
	x R\->B y 8  + R\->B 2 \->LIST   x w + R\->B y 8  + R\->B 2 \->LIST LINE
	x R\->B y 18 + R\->B 2 \->LIST   x w + R\->B y 18 + R\->B 2 \->LIST LINE
	x R\->B y        R\->B 2 \->LIST   x         R\->B y 18 + R\->B 2 \->LIST LINE
	x w + R\->B y R\->B 2 \->LIST   x w + R\->B y 18 + R\->B 2 \->LIST LINE
              y 16 + DUP 2 \->LIST 'igy' STO
          END
          x 2 +   x w + 3 -  2 \->LIST 'igx' STO
     END
     IF title "" \=/ THEN
       4 CF PICT x 2 + R\->B y 2 + R\->B 2 \->LIST  title 1 \->GROB DUP SIZE DROP B\->R
       IF nm 0 == THEN 65 ELSE 23 END IF > THEN
       IF nm 0 == THEN {#0 #0} {#58d #4d} ELSE {#0 #0} {#16d #4d} END SUB 4 SF END GOR
       IF 4 FS? THEN PICT x w + 7 - R\->B y 2 + R\->B 2 \->LIST "..." 1 \->GROB GOR END
     END

     ng1 'eg' STO
     IF nm 0 == THEN
       IF clst SIZE 1 == oflag clst SIZE == OR THEN pg 'eg' STO END
     END

     PICT x 2 + R\->B y1 R\->B 2 \->LIST ng0 GOR
     PICT x IF nm 0 == THEN 64 ELSE 22 END + R\->B y1 R\->B 2 \->LIST 
     eg GOR
     x 6 + R\->B y IF title "" \=/ THEN 11 ELSE 3 END + R\->B 2 \->LIST 'pt' STO

     IF pdir {} \=/ THEN 0 0 BUSY 'byg' STO pdir EVAL par 0 0 1 prg EVAL udir EVAL byg 0 BUSY END 
     6 SF
     DO
@ flash 


          IF f1 0 == oflag 0 == AND THEN
           2 CF 3 SF WHILE 2 FC? REPEAT
            PICT x 2 + R\->B y1 R\->B 2 \->LIST ng0 GXOR
            PICT x IF nm 0 == THEN 64 ELSE 22 END + R\->B y1 R\->B 2 \->LIST 
            eg GXOR
            IF KEY THEN 2 SF DROP ELSE 'f1' INCR IF 10 == THEN 2 SF END END 
            IF  3 FS? THEN 3 CF ELSE 3 SF END 
@           1 WAIT
           END
           IF 3 FC? THEN 
            PICT x 2 + R\->B y1 R\->B 2 \->LIST ng0 GOR
            PICT x IF nm 0 == THEN 64 ELSE 22 END + R\->B y1 R\->B 2 \->LIST 
            eg GOR
           END
           1 'f1' STO
          END

         PICT pt IF nm 0 == THEN #57d #5d ELSE #15d #5d END BLANK REPL
         PICT pt
         IF nm 0 \=/ THEN nm \->STR ELSE 
           clst IF oflag THEN oflag ELSE n END GET 
         END 1 \->GROB 
         IF nm 0 == THEN
           4 CF DUP SIZE DROP B\->R  57  IF > THEN
           {#0 #0} {#50d #4d} SUB 4 SF END REPL
           IF 4 FS? THEN PICT x w + 11 - R\->B y IF title "" \=/ THEN 11 ELSE 3 END + R\->B 2 \->LIST
            "..." 1 \->GROB REPL
           END
         ELSE 
           REPL
         END
         IF oflag NOT THEN
          ng1 'eg' STO
          IF nm 0 == clst SIZE n == AND THEN pg 'eg' STO END
          PICT x IF nm 0 == THEN 64 ELSE 22 END + R\->B y1 R\->B 2 \->LIST 
          eg REPL
         END

         IF pdir {} \=/  6 FS? AND THEN
            0 0 BUSY 'byg' STO pdir EVAL par IF nm 0 == THEN clst n ELSE nm 0 END 2 prg EVAL
            udir EVAL byg 0 BUSY
         END

         IF oflag THEN
            1 SF
         ELSE
          6 CF 
@       DO UNTIL KEY END 'k' STO
@       x y tw rflag xs ys glst  DSPGRBIN
          igx igy 1 1 0 0 GROB 2 1 30 DUP 2 \->LIST DSPGRBIN 'k' STO

          CASE
             k 36 == THEN
                100 .1 BEEP
                IF nm 0 == THEN 'n' INCR IF clst SIZE > THEN 1 'n' STO END
                ELSE nm 1 + 'nm' STO IF nm 9999 > THEN 1 'nm' STO END
                END
                6 SF
             END
             k 34 == THEN
                100 .1 BEEP
                IF nm 0 == THEN 'n' DECR IF 0 == THEN clst SIZE 'n' STO END
                ELSE nm 1 - 'nm' STO IF nm 0 == THEN 9999 'nm' STO END
                END
                6 SF
             END
             k 105 == THEN 1 SF 100 .1 BEEP 120 .1 BEEP END
             k 54 == THEN
              IF title "" \=/ THEN
@                x 4 + y 3 + 1 title DLINE
                   IF 5 FS? THEN   x 4 + y 3 + w 1  title  1 0 0 MORE48D   END 
              END
             END
             k 104 == THEN
@              x 8 + y IF title "" \=/ THEN 12 ELSE 4 END + 1 
                 IF 5 FS? THEN
                   x 8 + y IF title "" \=/ THEN 12 ELSE 4 END + w 1
                   IF nm 0 == THEN clst n GET ELSE nm \->STR END 1 0 0 MORE48D
                 END
             END
             k 95 == THEN
               {"<" ">" " " "T" " " "+" }
               {"<- : GOTO PREVIOUS"
                "-> : GOTO NEXT"
                "ENTER: SELECT/EXIT"
                "VIEW TITLE"
                "SPC: VIEW ITEM"
                "COMMAND HELP"}
                CMDHELP
             END
          END
         END
     UNTIL 1 FS? END
     IF oflag NOT THEN
       IF nm 0 == THEN n ELSE nm END
       PICT x R\->B y R\->B 2 \->LIST gg REPL
     END
     IF pdir {} \=/ THEN 0 0 BUSY 'byg' STO pdir EVAL par 0 0 3 prg EVAL udir EVAL byg 0 BUSY END 
   END
   fs STOF
   \>>
\>>

