123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- /* pageview.c - Implementation of the PagedViewer() system. */
- #include <string.h>
- #include "opendoor.h"
- #include "pageview.h"
- char bTitleColor = 0x0c;
- char bTitleLineColor = 0x04;
- char bNumberColor = 0x0a;
- char bTextColor = 0x02;
- char bPromptColor = 0x0f;
- int PagedViewer(
- int nInitialLine, /* Zero-based initial line number. */
- int nTotalLines, /* Total line count. */
- void (*pDisplayCallback)(int nLine, void *pData),
- void *pCallbackData, /* Data to pass to callback func. */
- BOOL bAllowSelection, /* TRUE if selection is permitted. */
- char *pszTitle, /* Title string, or NULL. */
- int nPageSize) /* # of lines to display per page. */
- {
- int nCurrentPage = 0;
- int nScreenLine;
- int nAbsoluteLine;
- char chPressed;
- char bCanPageDown;
- char bCanPageUp;
- /* Determine current page from initial line number, if specified. */
- if(nInitialLine != NO_LINE)
- {
- nCurrentPage = nInitialLine / nPageSize;
- }
- /* Loop until user makes a selection, or chooses to quit. */
- for(;;)
- {
- /* Display the current page. */
- /* Clear the screen */
- od_printf("\n\r");
- od_clr_scr();
- /* If a title has been specified, then display it. */
- if(pszTitle != NULL)
- {
- od_set_attrib(bTitleColor);
- od_repeat(' ', (80 - strlen(pszTitle)) / 2);
- od_disp_str(pszTitle);
- od_printf("\n\r");
- od_set_attrib(bTitleLineColor);
- if(od_control.user_ansi || od_control.user_avatar)
- {
- od_repeat(196, 79);
- }
- else
- {
- od_repeat('-', 79);
- }
- od_printf("\n\r");
- }
- /* Display the lines on this page. */
- nAbsoluteLine = nCurrentPage * nPageSize;
- nScreenLine = 0;
- while(nScreenLine < nPageSize && nAbsoluteLine < nTotalLines)
- {
- /* If selection is permitted, display an identifier for each line. */
- if(bAllowSelection)
- {
- od_set_attrib(bNumberColor);
- if(nScreenLine < 9)
- {
- od_printf("%d. ", nScreenLine + 1);
- }
- else
- {
- od_printf("%c. ", 'A' + (nScreenLine - 9));
- }
- }
- /* Display the line itself. */
- od_set_attrib(bTextColor);
- (*pDisplayCallback)(nAbsoluteLine, pCallbackData);
- od_printf("\n\r");
- /* Move to next line. */
- nScreenLine++;
- nAbsoluteLine++;
- }
- /* Determine whether user can page up or down from this page. */
- bCanPageDown = nCurrentPage < (nTotalLines - 1) / nPageSize;
- bCanPageUp = nCurrentPage > 0;
- /* Display prompt at bottom of screen. */
- od_set_attrib(bPromptColor);
- od_printf("\n\r[Page %d of %d] ", nCurrentPage + 1,
- ((nTotalLines - 1) / nPageSize) + 1);
- if(bAllowSelection)
- {
- od_printf("Choose an option or");
- }
- else
- {
- od_printf("Available options:");
- }
- if(bCanPageDown)
- {
- od_printf(" [N]ext page,");
- }
- if(bCanPageUp)
- {
- od_printf(" [P]revious page,");
- }
- od_printf(" [Q]uit.");
- /* Loop until the user makes a valid choice. */
- for(;;)
- {
- /* Get key from user */
- chPressed = toupper(od_get_key(TRUE));
- if(chPressed == 'Q')
- {
- /* If user chooses to quit, then return without a selection. */
- od_printf("\n\r");
- return(NO_LINE);
- }
- else if(chPressed == 'P' && bCanPageUp)
- {
- /* Move to previous page and redraw screen. */
- --nCurrentPage;
- break;
- }
- else if(chPressed == 'N' && bCanPageDown)
- {
- /* Move to next page and redraw screen. */
- ++nCurrentPage;
- break;
- }
- else if(bAllowSelection
- && (
- (chPressed >= '1' && chPressed <= '9')
- || (chPressed >= 'A' && chPressed <= 'M')
- )
- )
- {
- /* If user pressed a possible line key, and selection is */
- /* enabled, try translating character to a line number. */
- if(chPressed >= '1' && chPressed <= '9')
- {
- nScreenLine = chPressed - '1';
- }
- else
- {
- nScreenLine = 9 + (chPressed - 'A');
- }
- /* Calculate absolute line number. */
- nAbsoluteLine = nScreenLine + (nCurrentPage * nPageSize);
- /* If selected line is within range, then return selected line */
- /* number. */
- if(nScreenLine < nPageSize && nAbsoluteLine < nTotalLines)
- {
- od_printf("\n\r");
- return(nAbsoluteLine);
- }
- }
- }
- }
- }
|