SUBROUTINE PAGING(MAIN.TITLE,X1,Y1,X2,Y2,SCREEN.NAME,DATA.ARRAY,COL.HEADER,COL.WIDTH,
COL.FORMAT,COL.JUST,PAGE.NO,PAGE.TOTAL,OTHERVALID,PAGE.OPTION)
* Name - PAGING
* Called By - Various Routines
* Description - Pages file of details from which item can be selected
* Version - 10 Nov 2000 - Nine Elms Solutions Ltd
*<----------------------------------- COPYRIGHT NOTICE ----------------------------------->
* Copyright 2000 - email code@nineelms.com
*
* THIS HEADER MUST REMAIN INTACT IN THIS AND ANY CHANGED VERSION OF THIS ROUTINE
*
* PAGING may be used and modified free of charge by anyone so long as this
* copyright notice and comments above remain intact. By using this code you
* agree to indemnify Nine Elms Solutions Ltd from any liability that may arise from its use.
*
* Selling the code for this program without prior written consent is
* expressly forbidden. In other words, please ask first before you try and
* make money off my program.
*
* Obtain permission before redistributing this software over the Internet or
* in any other medium. In all cases copyright and the header must remain intact
*
*<------------------------------------ PROGRAMMER NOTES ------------------------------------>
* ARGUMENT LIST:-
* : MAIN.TITLE - Title For Screen Layout
*
* : X1, Y1 - Coordinates For Top Left Hand of screen.
* For a full screen, set X1 to 'FULL.SCREEN'
*
* : X2, Y2 - Coordinates For Bottom Right of Screen
*
* : SCREEN.NAME - The unique letter identifier (used to generate line nos)
*
* : DATA.ARRAY - Array For Paging Function.
* Related attributes form the column data.
*
* : COL.HEADER - Column Titles in attribute format
*
* : COL.WIDTH - Column Width in attribute format
*
* : COL.FORMAT - Column Format in attribute format
*
* : COL.JUST - Column Justification in attribute format
*
* : PAGE.NO - Page Number To Display From
*
* : PAGE.TOTAL - Passed back to calling prog
*
* : OTHERVALID - Other chars used in Validation
* If the word REFRESH is included then this indicates that
* the user is to be RETURNED to the calling program to REFRESH
* variable contents whenever PAGE 1 is redisplayed
*
* : PAGE.OPTION - Returns back the option chosen from a full screen.
* If a 'NEW' option is also required, set it to 'NEW'.
* If no numbers are to be displayed, set PAGE.OPTION
* to "NO.NUMBERS" in calling program.
*
*<------------------------------------------------------------------------------------------>
EQU TILDE TO CHAR(126)
EQU BUZ TO CHAR(7), SVM TO CHAR(252), VM TO CHAR(253), AM TO CHAR(254)
REVON = '' ;* Set to your own Preference
REVOFF = '' ;* Set to your own Preference
EOL = @(-4)
EOS = @(-3)
ESC = CHAR(27)
PROMPT ""
TODAY = OCONV(DATE(),'D2')
IF INDEX(OTHERVALID,'REFRESH',1) THEN
REFRESH.FLAG = 1
OTHERVALID = CHANGE(OTHERVALID,'REFRESH','')
END ELSE
REFRESH.FLAG = 0
END
FILEIT = 'FI'
VOIDIT = '*'
ICOMS = '*+-'
ERR = 0 ;* Set Error as FALSE
ERR.MSG = ""
REPLY = ""
IF PAGE.OPTION[1,3] # "NEW" AND PAGE.OPTION # "NO.NUMBERS" THEN PAGE.OPTION = ""
IF PAGE.OPTION = "NO.NUMBERS" THEN
EXTRA = 0
END ELSE
EXTRA = 6
END
*
ERROR = ""
*
* Call Subroutines
*
GOSUB INITIALISATION
GOSUB DISPLAY.COLUMN.HEADINGS
GOSUB DISPLAY.DATA
*
IF FULL.SCREEN THEN
GOSUB PROMPT.OPTIONS
END
*
RETURN
*
* Subroutines
*
INITIALISATION:
IF X1 = "FULL.SCREEN" THEN
FULL.SCREEN = 1
X1 = 1
Y1 = 3
X2 = 79
Y2 = 20
END ELSE
IF X1 = 'FULL.SCREENP' THEN
X1 = 1
FULL.SCREEN = 2
END ELSE
FULL.SCREEN = 0
END
END
PAGE.WIDTH = X2 - X1
*
* Process column data. Find the column heading with the most
* lines. See how many sections can fit in the page width.
*
SECTION.WIDTH = 0
MAX.COL.LINES = 0
COLUMNS = DCOUNT(COL.HEADER,AM)
TOTAL.DATA = 0
FOR COL = 1 TO COLUMNS
SECTION.WIDTH = SECTION.WIDTH + COL.WIDTH
+ 1
COL.LINES = DCOUNT(COL.HEADER,VM)
IF COL.LINES > MAX.COL.LINES THEN
MAX.COL.LINES = COL.LINES
END
*
* Determine the Maximum number of Data Lines to be displayed
*
IF TOTAL.DATA < DCOUNT(DATA.ARRAY,VM) THEN
TOTAL.DATA = DCOUNT(DATA.ARRAY,VM)
END
NEXT COL
*
SECTION.WIDTH = SECTION.WIDTH + EXTRA
SECTIONS = INT(PAGE.WIDTH/SECTION.WIDTH)
IF SECTIONS = 0 THEN SECTIONS = 1
SECTION.SPACE = PAGE.WIDTH - (SECTION.WIDTH * SECTIONS)
IF SECTIONS THEN
SECTION.SPACE = INT(SECTION.SPACE / SECTIONS)
END ELSE
SECTION.SPACE = 0
END
DATA.PER.PAGE = (Y2 - Y1 - MAX.COL.LINES) * SECTIONS
IF PAGE.NO = "" THEN PAGE.NO = 1
PAGE.TOTAL = INT(TOTAL.DATA/DATA.PER.PAGE)
IF PAGE.TOTAL * DATA.PER.PAGE # TOTAL.DATA THEN
PAGE.TOTAL = PAGE.TOTAL + 1
END
IF PAGE.TOTAL = 0 THEN PAGE.TOTAL = 1
*
RETURN
DISPLAY.COLUMN.HEADINGS:
* -----------------------
IF FULL.SCREEN THEN
IF FULL.SCREEN = 1 THEN
CRT @(0,3):EOS:
END ELSE
CRT @(0,Y1):EOS:
END
END
CRT @(X1,Y1):MAIN.TITLE:
*
ROW = Y1 + 1
START.COL = X1 + EXTRA
START.SECTION = START.COL
FOR COL.LINES = 1 TO MAX.COL.LINES
FOR SECTION = 1 TO SECTIONS
IF SECTION = 1 THEN PRINT @(0,ROW):@(-4):
FOR COLUMN = 1 TO COLUMNS
COLUMN.HEAD = COL.HEADER
CRT @(START.COL,ROW):COL.HEADER[1,COL.WIDTH]:" ":
START.COL = START.COL + COL.WIDTH + 1
NEXT COLUMN
START.SECTION = START.SECTION + SECTION.WIDTH + SECTION.SPACE
START.COL = START.SECTION
NEXT SECTION
START.COL = X1 + EXTRA
START.SECTION = START.COL
ROW = ROW + 1
NEXT COL.LINES
*
RETURN
DISPLAY.DATA:
* ------------
IF PAGE.OPTION = 'REFRESH' THEN
SCREEN.TERMINATED = 1
RETURN
END
PAGE.INFO = ''"L#1":"Page ":PAGE.NO 'R#3':" of ":PAGE.TOTAL"L#3"
CRT @(X2-16,Y1):PAGE.INFO"L#16":
*
END.OF.PAGE = 0
ROW = Y1 + 1
START.COL = X1
START.ROW = Y1 + MAX.COL.LINES + 1
VALUE = (PAGE.NO * DATA.PER.PAGE) - DATA.PER.PAGE + 1
END.VALUE = VALUE + DATA.PER.PAGE
START.SECTION = START.COL
PRINT.PAGE = ""
END.OF.DATA = 0
*
IF TOTAL.DATA = 0 THEN
END.OF.PAGE = 1
END
*
FOR Y.LINE = START.ROW TO Y2
CRT @(1,Y.LINE):EOL:
NEXT Y.LINE
*
FOR SECTION = 1 TO SECTIONS UNTIL END.OF.PAGE
FOR ROW = START.ROW TO Y2 UNTIL END.OF.PAGE
WIDTH.BLANKED = 0
FOR COLUMN = 1 TO COLUMNS UNTIL END.OF.PAGE
DATA.DISP = DATA.ARRAY
IF VALUE = (END.VALUE+1) OR VALUE = (TOTAL.DATA+1) THEN
END.OF.PAGE = 1
END ELSE
IF COL.FORMAT # "" THEN
DATA.DISP = OCONV(DATA.DISP,COL.FORMAT)
END
SPCE = COL.WIDTH - LEN(DATA.DISP)
IF COL.JUST = "R" THEN
DATA.DISP = SPACE(SPCE):DATA.DISP
END ELSE
DATA.DISP = DATA.DISP:SPACE(SPCE)
END
IF COLUMN = 1 THEN
IF NOT(END.OF.DATA) THEN
IF PAGE.OPTION = "NO.NUMBERS" THEN
LINE.NO = ""
END ELSE
LINE.NO = (SCREEN.NAME:VALUE:".") "R#5"
END
PRINT.PAGE = PRINT.PAGE:@(START.COL,ROW):LINE.NO:" ":DATA.DISP[1,COL.WIDTH]:" "
START.COL = START.COL + COL.WIDTH + EXTRA + 1
END ELSE
IF PAGE.OPTION = "NO.NUMBERS" THEN
LINE.NO = ""
END ELSE
LINE.NO = SPACE(4)
END
IF SECTIONS = 1 THEN
PRINT.PAGE = PRINT.PAGE:@(START.COL,ROW):@(-4)
END ELSE
PRINT.PAGE = PRINT.PAGE:@(START.COL,ROW):SPACE(SECTION.WIDTH+1)
END
WIDTH.BLANKED = 1
END
END ELSE
IF NOT(WIDTH.BLANKED) THEN
PRINT.PAGE = PRINT.PAGE:@(START.COL,ROW):DATA.DISP[1,COL.WIDTH]:" "
START.COL = START.COL + COL.WIDTH + 1
END
END
END
NEXT COLUMN
VALUE = VALUE + 1
START.COL = START.SECTION
NEXT ROW
START.ROW = Y1 + MAX.COL.LINES + 1
START.SECTION = START.SECTION + SECTION.WIDTH + SECTION.SPACE
START.COL = START.SECTION
NEXT SECTION
*
IF TOTAL.DATA # 0 THEN
PRINT PRINT.PAGE:
END
*
RETURN
PROMPT.OPTIONS:
* --------------
TOTAL.OPTIONS = TOTAL.DATA
IF TOTAL.OPTIONS = 0 THEN
A.RANGE = ""
END ELSE
A.RANGE = ",A1 to A":TOTAL.OPTIONS
VALID.OPTION = ""
FOR A = 1 TO TOTAL.OPTIONS
VALID.OPTION = VALID.OPTION:"A":A:","
NEXT A
END
*
OPTS = ''
IF PAGE.OPTION[1,3] = "NEW" THEN
PROMPT.LINE = "Enter Field No, 'NEW' to create"
IF PAGE.OPTION[4,2] = 'FI' THEN
PROMPT.LINE = PROMPT.LINE :", '":FILEIT:"' to FILE"
OPTS = '*'
END
PROMPT.LINE = PROMPT.LINE : " or '":VOIDIT:"' to Exit"
END ELSE
IF NOT(EXTRA) THEN
PROMPT.LINE = "'":VOIDIT:"' to Exit"
END ELSE
PROMPT.LINE = "Enter Field No or '":VOIDIT:"' To Exit : "
END
END
PROMPT.POS = LEN(PROMPT.LINE)
IF PROMPT.POS GT 75 THEN
PROMPT.POS = 75
PROMPT.LINE = PROMPT.LINE[1,75]
END
*
SCREEN.TERMINATED = 0
CALL USEROPTS('*+-':OTHERVALID:OPTS)
LOOP UNTIL SCREEN.TERMINATED DO
MSGG = PROMPT.LINE
REPLY = ''
SPCS = INT((79-PROMPT.POS)/2)
PPOS = PROMPT.POS + SPCS + 2
CRT @(0,23):SPACE(SPCS):MSGG:EOL:
CRT @(PPOS,23):;INPUT REPLY
BEGIN CASE
CASE REPLY = VOIDIT
PAGE.OPTION = "E"
SCREEN.TERMINATED = 1
*
CASE REPLY = FILEIT AND PAGE.OPTION[4,2] = 'FI'
PAGE.OPTION = FILEIT
SCREEN.TERMINATED = 1
*
CASE REPLY = "NEW" AND PAGE.OPTION[1,3] = 'NEW'
PAGE.OPTION = "NEW"
SCREEN.TERMINATED = 1
*
CASE REPLY = 'AB' OR REPLY = '-' OR REPLY = 'B'
OLD.PAGE.NO = PAGE.NO
IF PAGE.NO = 1 THEN
PAGE.NO = PAGE.TOTAL
END ELSE
PAGE.NO = PAGE.NO - 1
END
IF PAGE.NO = 1 AND REFRESH.FLAG THEN PAGE.OPTION = 'REFRESH'
IF PAGE.OPTION = 'REFRESH' THEN
SCREEN.TERMINATED = 1
END ELSE
IF PAGE.NO # OLD.PAGE.NO THEN
GOSUB DISPLAY.DATA
END
END
*
CASE REPLY = 'AF' OR REPLY = '+' OR REPLY = 'F'
OLD.PAGE.NO = PAGE.NO
IF PAGE.NO = PAGE.TOTAL THEN
IF REFRESH.FLAG THEN PAGE.OPTION = 'REFRESH'
PAGE.NO = 1
END ELSE
PAGE.NO = PAGE.NO + 1
END
IF PAGE.OPTION = 'REFRESH' THEN
SCREEN.TERMINATED = 1
END ELSE
IF PAGE.NO # OLD.PAGE.NO THEN
GOSUB DISPLAY.DATA
END
END
*
CASE REPLY MATCHES "1A0N" AND REPLY[1,1] = "A" AND EXTRA
OPTION = REPLY[2,3] * 1
IF OPTION GE 0 AND OPTION LE TOTAL.OPTIONS THEN
PAGE.OPTION = OPTION
SCREEN.TERMINATED = 1
END
*
CASE REPLY MATCHES "1N0N" AND EXTRA ;* Numeric Only Selection
OPTION = REPLY*1
IF OPTION GE 0 AND OPTION LE TOTAL.OPTIONS THEN
PAGE.OPTION = OPTION
SCREEN.TERMINATED = 1
END
*
CASE INDEX(OTHERVALID,REPLY,1)
PAGE.OPTION = REPLY
SCREEN.TERMINATED = 1
*
END CASE
*
REPEAT
*
RETURN
END