home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 99.img / PDOX3-09.ZIP / TOOLKIT2 / POPUP.SC < prev    next >
Text File  |  1989-09-15  |  12KB  |  253 lines

  1. ; Copyright (c) 1987-1989 Borland International.  All Rights Reserved.
  2. ;
  3. ; General permission to re-distribute all or part of this script is granted,
  4. ; provided that this statement, including the above copyright notice, is not
  5. ; removed.  You may add your own copyright notice to secure copyright
  6. ; protection for new matter that you add to this script, but Borland
  7. ; International will not support, nor assume any legal responsibility for,
  8. ; material added or changes made to this script.
  9. ;
  10. ; Revs.:  MJP 5/20/87, DCY 12/15/88
  11. ; ****************************************************************************
  12. ; This procedure creates and fills the arrays POPUPLIST, POPUPSTART, POPUPLEN,
  13. ; and POPUPNUMBER, with information from (and about) the specified tables.
  14. ; These arrays are then used by the procedure Popup to cause a popup menu to
  15. ; be created.  The procedure also reads in the Popup procedures themselves.
  16. ;
  17. ; This procedure must be called once before the Popup procedure is invoked
  18. ; (generally at the beginning of the main program) while sysmode()="Main".  It
  19. ; is called by executing the command:  SetPopup(Tables), where Tables is a
  20. ; string in the form:
  21. ;                      Table1, Table2, ... , TableN   (N<=10)
  22. ;
  23. ; The information in each of the tables specified by "Tables" will be used to
  24. ; define a seperate pop-up menu.  NOTE:  If the information in the tables is
  25. ; static (not subject to change), then the need to call this procedure at run-
  26. ; time may be eliminated.  To do this, simply call this procedure once, and
  27. ; follow the procedure call with the command:  SAVEVARS POPUPLIST,POPUPSTART,
  28. ; POPUPLEN,POPUPNUMBER.  Then simply read in the values of these arrays into
  29. ; your program.  Last, remember to read in the procedures Popup, PopDraw, and
  30. ; PopRedraw from the toolkit library.
  31. ;
  32.  
  33. Proc SetPopup(Tables)
  34.    Private;Tables,            ;List of tables for which to define popup menus
  35.            TempName,          ;Array which stores the names of each table
  36.            NumMenus,          ;Number of tables specified in "Tables" arg.
  37.            NumItems,          ;Number of items in current table
  38.            CurrTable,         ;Current table being looked at
  39.            X                  ;Loop index
  40.    Array TempName[10]
  41.    Array PopupStart[10]       ;Stores pointer to beginning of item list
  42.    Array PopupNumber[10]      ;Stores number of items in menu list
  43.    Array PopupLen[10]         ;Stores length of longest menu choice
  44.    NumMenus=0
  45.    NumItems=0
  46.    Tables=Tables+","
  47.    While match(Tables,"..,..",CurrTable,Tables)    ;Process each table name
  48.       If not istable(CurrTable)
  49.          Then Quit "Table "+CurrTable+" does not exist."
  50.       Endif
  51.       NumMenus=NumMenus+1                          ;Update which menu this is
  52.       TempName[NumMenus]=CurrTable
  53.       PopupStart[NumMenus]=NumItems               ;NumItems is a running total
  54.       NumItems=NumItems+nrecords(CurrTable)
  55.    Endwhile
  56.    If NumItems<>0
  57.       Then Array PopupList[NumItems]  ;Stores all line items from data tables
  58.    Endif
  59.    For X from 1 to NumMenus
  60.       If isempty(TempName[X])
  61.          Then PopupNumber[X]=0
  62.          Else View TempName[X]
  63.               Right
  64.               PopupNumber[X]=0
  65.               PopupLen[X]=0
  66.               Scan
  67.                  PopupLen[X]=max(PopupLen[X],len([])+4)      ;Update max width
  68.                  PopupNumber[X]=PopupNumber[X]+1
  69.                  PopupList[PopupNumber[X]+PopupStart[X]]=[]  ;Store line item
  70.               Endscan
  71.               PopupLen[X]=max(PopupLen[X],10)
  72.               ClearImage
  73.       Endif
  74.    Endfor
  75.    If not isassigned(TKLibName)
  76.       Then TKLibName=sdir()+"Toolkit"
  77.    Endif
  78.    If isfile(TKLibName+".LIB")
  79.       Then Readlib TKLibName Popup,PopDraw,PopRedraw
  80.       Else Message "Library "+TKLibName+" does not exist."
  81.            Debug
  82.    Endif
  83. Endproc
  84.  
  85. ; This procedure creates a pop-up window.  It is intended to be used during
  86. ; data entry (or edit), but can be used in virtually any mode.
  87. ;
  88. ; Within the popup window are menu choices which can be selected by moving the
  89. ; cursor using Up, Down, PgUp, PgDn, Home, and End.  The information for the
  90. ; procedure is contained in four array variables (PopupList, PopupStart,
  91. ; PopupLen, and PopupNumber) which are set by the SetPopup procedure.
  92. ;
  93. ; Popup takes the following arguments:
  94. ;   R--   Row position of the upper left corner where menu is to be drawn.
  95. ;   C--   Column position of the upper left corner where menu is to be drawn.
  96. ;   Num-- Number of pop-up menu.  This corresponds to the position of the
  97. ;         table name in the arguement passed to the SetPopup procedure.  (For
  98. ;         example, if we say:  SetPopup("x,y,z"), then to create a menu
  99. ;         with information from the table "y" we say:  Popup(R,C,2,Size).)
  100. ;   Size- Vertical size of the menu.  This is the number of selections that
  101. ;         will be displayed at one time.  Choices will scroll up and down to
  102. ;         reveal other choices.  It is recommended that 8088-class computers
  103. ;         only provide menus with as many choices as will fit on the screen,
  104. ;         and set Size equal to 9999 to disable scrolling.
  105. ;
  106. Proc Popup(R,C,Num,Size)
  107.    Private;R,       ;Row position of popup window
  108.           ;C,       ;Column position of popup window
  109.           ;Num,     ;Popup menu number
  110.           ;Size,    ;Number of choices to be displayed at one time
  111.            Char,    ;Last key that was pressed
  112.            MenuPos, ;Current position within menu
  113.            Choice,  ;Current menu selection
  114.            X        ;Counter
  115.    If PopupNumber[Num]=0
  116.       Then Return ""
  117.    Endif
  118.    If Size>PopupNumber[Num]
  119.       Then Size=PopupNumber[Num]
  120.    Endif
  121.    Echo Off
  122.    Cursor Off
  123.    @0,0
  124.    ?? "Highlight the appropriate selection using the cursor movement keys."
  125.    Clear Eol
  126.    ? "Press [Enter] to accept, [Esc] to cancel menu selection."
  127.    Clear Eol
  128.    ;Draw menu box
  129.    Canvas Off
  130.    SetMargin C
  131.    @R,C
  132.    ?? "╔",fill("═",PopupLen[Num]-2),"╗"
  133.    ? "║ CHOOSE:",spaces(PopupLen[Num]-10),"║"
  134.    ? "╟",fill("─",PopupLen[Num]-2),"╢"
  135.    For X from 1 to Size
  136.       ? "║ ",substr(strval(PopupList[PopupStart[Num]+X])+
  137.              spaces(PopupLen[Num]),1,PopupLen[Num]-3),"║"
  138.    Endfor
  139.    ?  "╚",fill("═",PopupLen[Num]-2),"╝"
  140.    SetMargin Off
  141.    If Size<>PopupNumber[Num]      ;Is there more data that can't be displayed?
  142.       Then @R+2+Size,C+1
  143.            ?? ""                 ;Show that more items exist below
  144.    Endif
  145.    Canvas On
  146.    MenuPos=1
  147.    Choice=1
  148.    While True
  149.       Style Reverse               ;Highlight current selection
  150.       PopDraw()
  151.       Style
  152.       Char=getchar()
  153.       Switch
  154.          Case Char=-72:                         ;Key was [Up]
  155.             If Choice=1                         ;Are we already at the top?
  156.                Then Beep
  157.                Else If MenuPos>1                ;Can we move within the menu?
  158.                        Then PopDraw()           ; Yes- Blank current selection
  159.                             MenuPos=MenuPos-1   ;      Move window position
  160.                        Else PopRedraw(Choice-2) ; No-  Redraw entire menu
  161.                     Endif
  162.                     Choice=Choice-1             ;Select new choice
  163.             Endif
  164.          Case Char=-80:                         ;Key was [Down]
  165.             If Choice=PopupNumber[Num]          ;Are we already at the bottom?
  166.                Then Beep
  167.                Else If MenuPos<Size             ;Can we move within the menu?
  168.                        Then PopDraw()           ; Yes- Blank current selection
  169.                             MenuPos=MenuPos+1   ;      Move window position
  170.                        Else PopRedraw(Choice-Size+1); No-  Redraw entire menu
  171.                     Endif
  172.                     Choice=Choice+1             ;Select new choice
  173.             Endif
  174.          Case Char=-71:                         ;Key was [Home]
  175.             If MenuPos=Choice                   ;Is first selection on screen?
  176.                Then PopDraw()                   ; Yes- Blank current selection
  177.                Else PopRedraw(0)                ; No-  Redraw menu from start
  178.             Endif
  179.             MenuPos=1                           ;Position at first item
  180.             Choice=1                            ;Select first item
  181.          Case Char=-79:                         ;Key was [End]
  182.             If Choice+Size-MenuPos=PopupNumber[Num];Last selection on screen?
  183.                Then PopDraw()                   ; Yes- Blank current selection
  184.                Else PopRedraw(PopupNumber[Num]-Size); No-  Redraw end of menu
  185.             Endif
  186.             MenuPos=Size                        ;Position at bottom of menu
  187.             Choice=PopupNumber[Num]             ;Select last item
  188.          Case Char=-73:                         ;Key was [PgUp]
  189.             If MenuPos=Choice                   ;Are we within first screen?
  190.                Then Beep                        ; Yes- Disallow PgUp
  191.                Else If Choice-MenuPos-Size>0
  192.                        Then Choice=Choice-MenuPos-Size+1
  193.                        Else Choice=1
  194.                     Endif
  195.                     PopRedraw(Choice-1)         ; No-  Redraw previous page
  196.                     MenuPos=1                   ;   Position on that item
  197.             Endif
  198.          Case Char=-81:                         ;Key was [PgDn]
  199.             If Choice+Size-MenuPos=PopupNumber[Num];Are we within last screen?
  200.                Then Beep                           ; Yes- Disallow PgDn
  201.                Else If PopupNumber[Num]-Size<Choice+Size-MenuPos
  202.                        Then Choice=PopupNumber[Num]-Size+1
  203.                        Else Choice=Choice+Size-MenuPos+1
  204.                     Endif
  205.                     PopRedraw(Choice-1)            ; No- Redraw next page
  206.                     MenuPos=1                      ;     Position on that item
  207.             Endif
  208.          Case Char=13:                          ;Key was [Enter]
  209.             Cursor Normal
  210.             Return PopupList[PopupStart[Num]+Choice]       ;Return selection
  211.          Case Char=27:                          ;Key was [Esc]
  212.             Cursor Normal
  213.             Return ""
  214.          Otherwise:                             ;Illegal key
  215.             Beep
  216.       Endswitch
  217.    Endwhile
  218. Endproc
  219.  
  220. ; This procedure is used by the Popup procedure.  It positions the cursor and
  221. ; redraws current menu item (in either inverse or normal text).
  222. ;
  223. Proc PopDraw()
  224.    @MenuPos+R+2,C+2
  225.    ?? PopupList[PopupStart[Num]+Choice]
  226. Endproc
  227.  
  228. ; This procedure is used by the PopUp procedure.  It redraws the entire
  229. ; contents of the popup window.
  230. ;
  231. Proc PopRedraw(Start)
  232. ;Private Start           ;Location within PopupList to begin redraw
  233.    Canvas Off
  234.    SetMargin C+2
  235.    @ R+2,C+2
  236.    For Z from 1 to Size            ;Redraw all information in the menu box
  237.       ? substr(strval(PopupList[PopupStart[Num]+Start+Z])+
  238.         spaces(PopupLen[Num]),1,PopupLen[Num]-3)
  239.    Endfor
  240.    SetMargin Off
  241.    @R+3,C+1
  242.    If Start=0          ;Are there records above?
  243.       Then ?? " "      ; No- Remove up arrow
  244.       Else ?? ""      ; Yes- Place up arrow to signify more records
  245.    Endif
  246.    @R+Size+2,C+1
  247.    If Start+Size=PopupNumber[Num]  ;Are there records below?
  248.       Then ?? " "                  ; No- Remove down arrow
  249.       Else ?? ""                  ; Yes- Place down arrow to signify more
  250.    Endif
  251.    Canvas On
  252. Endproc
  253.