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