home *** CD-ROM | disk | FTP | other *** search
- /* 026 6-Jan-87 ovfmove.c
-
- Copyright (c) 1987 by Blue Sky Software. All rights reserved.
- */
-
- #include <stdio.h>
- #include "ov.h"
-
- /* The following define will effect the speed of some screen updates - for
- the PC set it to 1 - make it higher for slower terminals with hardware
- (firmware?) scrolling */
-
- #define SCROLL_LIMIT 1 /* #lines to update b 4 just rewritting screen */
-
- extern WINDOW cw;
- extern FILE_ENT files[];
-
-
- /******************************************************************************
- ** M O V E _ F I L E **
- *****************************************************************************/
-
- move_file(move_cmd) /* move the file pointer around, scroll if needed */
- register int move_cmd;
- {
-
- register int dif;
- int currow, scrolled = FALSE;
- int last_idx, wrap_factor, redisplayed = FALSE;
-
- if (cw.nfiles == 0) /* don't even try if no files in dir */
- return;
-
- if (move_cmd == PGUP || move_cmd == PGDN) { /* special case PgUp & PgDn */
- pagedisp(move_cmd); /* all done by pagedisp() */
- return;
- }
-
- last_idx = cw.curidx; /* remember where we were */
-
- wrap_factor = (cw.nrows * cw.ncols) - 1; /* used for right/left wrap */
-
- /* translate left/right movement to up/down if only 1 column displayed */
-
- if (cw.ncols == 1)
- move_cmd = move_cmd == RIGHT ? DOWN : (move_cmd == LEFT ? UP : move_cmd);
-
- switch (move_cmd) {
-
- case LEFT: /* left arrow */
- cw.curidx -= cw.nrows;
- if (cw.curidx < 0) {
- cw.curidx += wrap_factor;
- while (cw.curidx >= cw.nfiles)
- cw.curidx -= cw.nrows;
- if (cw.curidx == cw.nfiles - cw.nrows - 1)
- cw.curidx += cw.nrows;
- }
- break;
-
- case RIGHT: /* right arrow */
- cw.curidx += cw.nrows;
- if (cw.curidx >= cw.nfiles) {
- cw.curidx -= wrap_factor;
- while (cw.curidx < 0)
- cw.curidx += cw.nrows;
- if (cw.curidx == cw.nrows)
- cw.curidx = 0;
- }
- break;
-
- case UP: /* up arrow */
- cw.curidx--;
- if (cw.curidx < 0)
- cw.curidx = cw.nfiles-1;
- break;
-
- case DOWN: /* down arrow */
- cw.curidx++;
- if (cw.curidx >= cw.nfiles)
- cw.curidx = 0;
- break;
-
- case HOME: /* home key */
- cw.curidx = 0;
- break;
-
- case END: /* end key */
- cw.curidx = cw.nfiles - 1;
- break;
- }
-
- /* scroll or redisplay the screen if the current position is not displayed */
-
- if (!on_screen(cw.curidx)) { /* screen need to be adjusted? */
-
- /* if the display needs to be adjusted by less than SCROLL_LIMIT
- rows in the display area, use the scroll routines, otherwise
- just redisplay using new nbase value */
-
- currow = idx2lr(cw.curidx); /* needed several times below */
-
- dif = (currow < cw.nbase) ? currow - cw.nbase :
- currow - cw.nbase - cw.ndrows + 1;
-
- if (abs(dif) <= SCROLL_LIMIT) { /* scroll? */
-
- fp_off(last_idx); /* this way, ptr doesn't move */
-
- if (dif > 0)
- while (dif--)
- scroll_dn();
- else
- while (dif++)
- scroll_up();
- scrolled = TRUE; /* saves a call to fp_on() */
-
- } else { /* redisplay screen */
-
- adjust_window(); /* recalc cw.nbase, etc */
- update_window(1); /* redisplay file names */
- redisplayed = TRUE; /* avoid extra fp_*() calls */
- }
- }
-
- /* deselect the last item if the file pointer has moved and the last
- item is still displayed (and the screen wasn't adjusted) */
-
- if (!redisplayed && !scrolled && cw.curidx != last_idx &&
- on_screen(last_idx))
- fp_off(last_idx);
-
- /* highlight the current file if the file pointer moved and the screen
- wasn't adjusted (adjustments set the pointer) */
-
- if (!redisplayed && !scrolled && cw.curidx != last_idx)
- fp_on(cw.curidx);
- }
-
-
- /*****************************************************************************
- P A G E D I S P
- *****************************************************************************/
-
- static int
- pagedisp(dir) /* page the file display indicated direction */
- int dir;
- {
- int newidx;
- register int newnbase = cw.nbase;
-
- if (dir == PGUP) { /* page up a screen? */
-
- newnbase -= cw.ndrows; /* backup a screen */
-
- } else { /* must want to page down */
-
- newnbase += cw.ndrows;
- if (newnbase + cw.ndrows > cw.nrows) /* don't leave part of the */
- newnbase = cw.nrows - cw.ndrows; /* screen blank if avoidable */
- }
-
- if (newnbase < 0) /* adjustments can go too far */
- newnbase = 0;
-
- if (newnbase == cw.nbase) { /* is the page the same? */
- if (dir == PGUP) /* up direction? */
- newidx = newnbase; /* yes, goto top to page */
- else
- newidx = cw.nfiles - 1; /* no, goto last file */
- fp_off(cw.curidx); /* move file pointer */
- fp_on(cw.curidx = newidx);
-
- } else { /* the page base changed, redisplay window */
-
- cw.nbase = newnbase; /* this is the one to use now */
- if (!on_screen(cw.curidx)) /* will the old current file show? */
- cw.curidx = newnbase; /* if not, we know this one will */
- update_window(1); /* display names at new offset */
- }
- }
-
-
- /******************************************************************************
- F P _ O N / O F F
- *****************************************************************************/
-
- int ALTCALL
- fp_on(i) /* turn on the file pointer */
- register int i;
- {
- gotorc(idx2sr(i),idx2sc(i));
- disp_file(&files[i],1);
- if (cw.showall)
- disp_path(i);
- }
-
- int ALTCALL
- fp_off(i) /* turn off the file pointer */
- register int i;
- {
- gotorc(idx2sr(i),idx2sc(i));
- disp_file(&files[i],0);
- }
-
-
- /******************************************************************************
- O N _ S C R E E N
- *****************************************************************************/
-
- int ALTCALL
- on_screen(idx) /* determine if file[idx] is currently displayed */
- register int idx;
- {
- /* this used to be a macro, but it generates a lot of code */
-
- return(idx2lr(idx) >= idx2lr(cw.nbase) &&
- idx2lr(idx) <= min(cw.nrows-1,idx2lr(cw.nbase)+cw.ndrows-1));
- }
-
-
- /******************************************************************************
- ** S C R O L L _ U P **
- *****************************************************************************/
-
- static int
- scroll_up() { /* scroll the file display up */
-
- register int m;
-
- cw.nbase -= 1;
- insert_line(cw.fnrow+1,cw.ndrows-1);
-
- gotorc(cw.fnrow,0); /* cursor to first display position */
-
- /* display a row of file names */
-
- for (m = cw.nbase; m < cw.nfiles; m += cw.nrows)
- disp_file(&files[m],m == cw.curidx);
-
- if (cw.showall)
- disp_path(cw.curidx);
- }
-
-
- /******************************************************************************
- ** S C R O L L _ D N **
- *****************************************************************************/
-
- static int
- scroll_dn() { /* scroll the file display down */
-
- register int m;
-
- cw.nbase += 1;
- delete_line(cw.fnrow,cw.ndrows-1);
-
- gotorc(cw.fnrow+cw.ndrows-1,0); /* cursor to the last display line */
-
- /* display a row of file names */
-
- for (m = cw.nbase + cw.ndrows - 1; m < cw.nfiles; m += cw.nrows)
- disp_file(&files[m],m == cw.curidx);
-
- if (cw.showall)
- disp_path(cw.curidx);
- }
-
-