1 /* pager.c - display very long strings (with scrolling)
2  *
3  * Copyright 1999, 2000  Jochen Voss  */
4 
5 static const  char  rcsid[] = "$Id: pager.c 4839 2003-04-13 16:50:02Z voss $";
6 
7 #ifdef HAVE_CONFIG_H
8 #include <config.h>
9 #endif
10 
11 #include <string.h>
12 
13 #include "moon-buggy.h"
14 #include "copying.h"
15 
16 
17 
18 struct mode *pager_mode;
19 
20 
21 static  int  lines_used, current_line;
22 static  int  mb_lines = 25;
23 
24 
25 static void
print_page(unsigned current_line)26 print_page (unsigned current_line)
27 {
28   int  i;
29 
30   for (i=0; i<mb_lines-3; ++i) {
31     if (current_line + i < lines_used) {
32       mvwaddstr (moon, i, 2, copying_lines[current_line+i]);
33     } else {
34       mvwaddstr (moon, i, 2, "~");
35     }
36     wclrtoeol (moon);
37   }
38   wnoutrefresh (moon);
39 
40   mvwprintw (status, 0, 0, "=== COPYING %3d%% ===  ",
41 	     lines_used==0 ? 100 :(int)(current_line*100.0/(lines_used-1)+.5));
42   wnoutrefresh (status);
43 }
44 
45 static void
pager_redraw(void)46 pager_redraw (void)
47 {
48   mb_lines = LINES;
49   print_page (current_line);
50 }
51 
52 static void
key_handler(game_time t,int val)53 key_handler (game_time t, int val)
54 {
55   switch (val) {
56   case 1:
57     mode_change (title_mode, 0);
58     break;
59   case 2:
60     if (current_line > 0)  --current_line;
61     print_page (current_line);
62     break;
63   case 3:
64     if (current_line < lines_used-1)  ++current_line;
65     print_page (current_line);
66     break;
67   case 4:
68     if (current_line > mb_lines-3) {
69       current_line -= mb_lines-3;
70     } else {
71       current_line = 0;
72     }
73     print_page (current_line);
74     break;
75   case 5:
76     current_line += mb_lines-3;
77     if (current_line >= lines_used) {
78       current_line = lines_used-1;
79       if (current_line < 0)  current_line = 0;
80     }
81     print_page (current_line);
82     break;
83   case 6:
84     current_line = 0;
85     print_page (current_line);
86     break;
87   case 7:
88     current_line = lines_used-1;
89     if (current_line < 0)  current_line = 0;
90     print_page (current_line);
91     break;
92   }
93 }
94 
95 static void
pager_enter(int what)96 pager_enter (int what)
97 {
98   int  i;
99 
100   lines_used = sizeof (copying_lines) / sizeof (const char *);
101   switch (what) {
102   case 0:
103     current_line = 0;
104     break;
105   case 1:
106     current_line = 0;
107     for (i=0; i<lines_used; ++i) {
108       if (strstr (copying_lines[i], "NO WARRANTY")) {
109 	current_line = i;
110 	break;
111       }
112     }
113   default:
114     break;
115   }
116 }
117 
118 static void
pager_leave(void)119 pager_leave (void)
120 {
121   werase (status);
122   wnoutrefresh (status);
123 }
124 
125 void
setup_pager_mode(void)126 setup_pager_mode (void)
127 {
128   pager_mode = new_mode ();
129   pager_mode->enter = pager_enter;
130   pager_mode->leave = pager_leave;
131   pager_mode->redraw = pager_redraw;
132   pager_mode->keypress = key_handler;
133   mode_add_key (pager_mode, mbk_end, "quit", 1);
134   mode_add_key (pager_mode, mbk_up, "up", 2);
135   mode_add_key (pager_mode, mbk_down, "down", 3);
136   mode_add_key (pager_mode, mbk_pageup, "pg up", 4);
137   mode_add_key (pager_mode, mbk_pagedown, "pg down", 5);
138   mode_add_key (pager_mode, mbk_first, "home", 6);
139   mode_add_key (pager_mode, mbk_last, "end", 7);
140   mode_complete (pager_mode);
141 }
142