00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
#include "dialog.h"
00060
00061 static int menu_width,
item_x;
00062
00063
00064
00065
00066
static void
00067 print_item (WINDOW * win,
const char *item,
int choice,
int selected,
int hotkey)
00068 {
00069
int j;
00070
char menu_item[
menu_width+1];
00071
00072 strncpy(menu_item, item,
menu_width);
00073 menu_item[
menu_width] = 0;
00074 j =
first_alpha(menu_item,
"YyNnMm");
00075
00076
00077 wattrset (win,
menubox_attr);
00078 wmove (win, choice, 0);
00079
#if OLD_NCURSES
00080
{
00081
int i;
00082
for (i = 0; i <
menu_width; i++)
00083 waddch (win,
' ');
00084 }
00085
#else
00086
wclrtoeol(win);
00087
#endif
00088
wattrset (win, selected ?
item_selected_attr :
item_attr);
00089 mvwaddstr (win, choice,
item_x, menu_item);
00090
if (hotkey) {
00091 wattrset (win, selected ?
tag_key_selected_attr :
tag_key_attr);
00092 mvwaddch(win, choice,
item_x+j, menu_item[j]);
00093 }
00094
if (selected) {
00095 wmove (win, choice,
item_x+1);
00096 wrefresh (win);
00097 }
00098 }
00099
00100
00101
00102
00103
static void
00104 print_arrows (WINDOW * win,
int item_no,
int scroll,
00105
int y,
int x,
int height)
00106 {
00107
int cur_y, cur_x;
00108
00109 getyx(win, cur_y, cur_x);
00110
00111 wmove(win, y, x);
00112
00113
if (scroll > 0) {
00114 wattrset (win,
uarrow_attr);
00115 waddch (win,
ACS_UARROW);
00116 waddstr (win,
"(-)");
00117 }
00118
else {
00119 wattrset (win,
menubox_attr);
00120 waddch (win,
ACS_HLINE);
00121 waddch (win,
ACS_HLINE);
00122 waddch (win,
ACS_HLINE);
00123 waddch (win,
ACS_HLINE);
00124 }
00125
00126 y = y + height + 1;
00127 wmove(win, y, x);
00128
00129
if ((height < item_no) && (scroll + height < item_no)) {
00130 wattrset (win,
darrow_attr);
00131 waddch (win,
ACS_DARROW);
00132 waddstr (win,
"(+)");
00133 }
00134
else {
00135 wattrset (win,
menubox_border_attr);
00136 waddch (win,
ACS_HLINE);
00137 waddch (win,
ACS_HLINE);
00138 waddch (win,
ACS_HLINE);
00139 waddch (win,
ACS_HLINE);
00140 }
00141
00142 wmove(win, cur_y, cur_x);
00143 }
00144
00145
00146
00147
00148
static void
00149 print_buttons (WINDOW *win,
int height,
int width,
int selected)
00150 {
00151
int x = width / 2 - 16;
00152
int y = height - 2;
00153
00154
print_button (win,
"Select", y, x, selected == 0);
00155
print_button (win,
" Exit ", y, x + 12, selected == 1);
00156
print_button (win,
" Help ", y, x + 24, selected == 2);
00157
00158 wmove(win, y, x+1+12*selected);
00159 wrefresh (win);
00160 }
00161
00162
00163
00164
00165
int
00166 dialog_menu (
const char *title,
const char *prompt,
int height,
int width,
00167
int menu_height,
const char *current,
int item_no,
00168
const char *
const * items)
00169
00170 {
00171
int i, j, x, y, box_x, box_y;
00172
int key = 0, button = 0, scroll = 0, choice = 0, first_item = 0, max_choice;
00173 WINDOW *dialog, *
menu;
00174 FILE *f;
00175
00176 max_choice =
MIN (menu_height, item_no);
00177
00178
00179 x = (COLS - width) / 2;
00180 y = (LINES - height) / 2;
00181
00182
draw_shadow (stdscr, y, x, height, width);
00183
00184 dialog = newwin (height, width, y, x);
00185 keypad (dialog, TRUE);
00186
00187
draw_box (dialog, 0, 0, height, width,
dialog_attr,
border_attr);
00188 wattrset (dialog,
border_attr);
00189 mvwaddch (dialog, height - 3, 0,
ACS_LTEE);
00190
for (i = 0; i < width - 2; i++)
00191 waddch (dialog,
ACS_HLINE);
00192 wattrset (dialog,
dialog_attr);
00193 wbkgdset (dialog,
dialog_attr & A_COLOR);
00194 waddch (dialog,
ACS_RTEE);
00195
00196
if (title != NULL && strlen(title) >= width-2 ) {
00197
00198
char * title2 = malloc(width-2+1);
00199 memcpy( title2, title, width-2 );
00200 title2[width-2] =
'\0';
00201 title = title2;
00202 }
00203
00204
if (title != NULL) {
00205 wattrset (dialog,
title_attr);
00206 mvwaddch (dialog, 0, (width - strlen(title))/2 - 1,
' ');
00207 waddstr (dialog, (
char *)title);
00208 waddch (dialog,
' ');
00209 }
00210
00211 wattrset (dialog,
dialog_attr);
00212
print_autowrap (dialog, prompt, width - 2, 1, 3);
00213
00214
menu_width = width - 6;
00215 box_y = height - menu_height - 5;
00216 box_x = (width -
menu_width) / 2 - 1;
00217
00218
00219 menu = subwin (dialog, menu_height,
menu_width,
00220 y + box_y + 1, x + box_x + 1);
00221 keypad (menu, TRUE);
00222
00223
00224
draw_box (dialog, box_y, box_x, menu_height + 2,
menu_width + 2,
00225
menubox_border_attr,
menubox_attr);
00226
00227
00228
00229
00230
00231
item_x = 0;
00232
for (i = 0; i < item_no; i++) {
00233
item_x =
MAX (
item_x,
MIN(
menu_width, strlen (items[i * 2 + 1]) + 2));
00234
if (strcmp(current, items[i*2]) == 0) choice = i;
00235 }
00236
00237
item_x = (
menu_width -
item_x) / 2;
00238
00239
00240
if ( (f=fopen(
"lxdialog.scrltmp",
"r")) != NULL ) {
00241
if ( (fscanf(f,
"%d\n",&scroll) == 1) && (scroll <= choice) &&
00242 (scroll+max_choice > choice) && (scroll >= 0) &&
00243 (scroll+max_choice <= item_no) ) {
00244 first_item = scroll;
00245 choice = choice - scroll;
00246 fclose(f);
00247 }
else {
00248 scroll=0;
00249 remove(
"lxdialog.scrltmp");
00250 fclose(f);
00251 f=NULL;
00252 }
00253 }
00254
if ( (choice >= max_choice) || (f==NULL && choice >= max_choice/2) ) {
00255
if (choice >= item_no-max_choice/2)
00256 scroll = first_item = item_no-max_choice;
00257
else
00258 scroll = first_item = choice - max_choice/2;
00259 choice = choice - scroll;
00260 }
00261
00262
00263
for (i=0; i < max_choice; i++) {
00264
print_item (menu, items[(first_item + i) * 2 + 1], i, i == choice,
00265 (items[(first_item + i)*2][0] !=
':'));
00266 }
00267
00268 wnoutrefresh (menu);
00269
00270
print_arrows(dialog, item_no, scroll,
00271 box_y, box_x+
item_x+1, menu_height);
00272
00273
print_buttons (dialog, height, width, 0);
00274 wmove (menu, choice,
item_x+1);
00275 wrefresh (menu);
00276
00277
while (key !=
ESC) {
00278 key = wgetch(menu);
00279
00280
if (key < 256 && isalpha(key)) key = tolower(key);
00281
00282
if (strchr(
"ynm", key))
00283 i = max_choice;
00284
else {
00285
for (i = choice+1; i < max_choice; i++) {
00286 j =
first_alpha(items[(scroll+i)*2+1],
"YyNnMm");
00287
if (key == tolower(items[(scroll+i)*2+1][j]))
00288
break;
00289 }
00290
if (i == max_choice)
00291
for (i = 0; i < max_choice; i++) {
00292 j =
first_alpha(items[(scroll+i)*2+1],
"YyNnMm");
00293
if (key == tolower(items[(scroll+i)*2+1][j]))
00294
break;
00295 }
00296 }
00297
00298
if (i < max_choice ||
00299 key == KEY_UP || key == KEY_DOWN ||
00300 key ==
'-' || key ==
'+' ||
00301 key == KEY_PPAGE || key == KEY_NPAGE) {
00302
00303
print_item (menu, items[(scroll+choice)*2+1], choice, FALSE,
00304 (items[(scroll+choice)*2][0] !=
':'));
00305
00306
if (key == KEY_UP || key ==
'-') {
00307
if (choice < 2 && scroll) {
00308
00309 scrollok (menu, TRUE);
00310 wscrl (menu, -1);
00311 scrollok (menu, FALSE);
00312
00313 scroll--;
00314
00315
print_item (menu, items[scroll * 2 + 1], 0, FALSE,
00316 (items[scroll*2][0] !=
':'));
00317 }
else
00318 choice =
MAX(choice - 1, 0);
00319
00320 }
else if (key == KEY_DOWN || key ==
'+') {
00321
00322
print_item (menu, items[(scroll+choice)*2+1], choice, FALSE,
00323 (items[(scroll+choice)*2][0] !=
':'));
00324
00325
if ((choice > max_choice-3) &&
00326 (scroll + max_choice < item_no)
00327 ) {
00328
00329 scrollok (menu, TRUE);
00330 scroll (menu);
00331 scrollok (menu, FALSE);
00332
00333 scroll++;
00334
00335
print_item (menu, items[(scroll+max_choice-1)*2+1],
00336 max_choice-1, FALSE,
00337 (items[(scroll+max_choice-1)*2][0] !=
':'));
00338 }
else
00339 choice =
MIN(choice+1, max_choice-1);
00340
00341 }
else if (key == KEY_PPAGE) {
00342 scrollok (menu, TRUE);
00343
for (i=0; (i < max_choice); i++) {
00344
if (scroll > 0) {
00345 wscrl (menu, -1);
00346 scroll--;
00347
print_item (menu, items[scroll * 2 + 1], 0, FALSE,
00348 (items[scroll*2][0] !=
':'));
00349 }
else {
00350
if (choice > 0)
00351 choice--;
00352 }
00353 }
00354 scrollok (menu, FALSE);
00355
00356 }
else if (key == KEY_NPAGE) {
00357
for (i=0; (i < max_choice); i++) {
00358
if (scroll+max_choice < item_no) {
00359 scrollok (menu, TRUE);
00360 scroll(menu);
00361 scrollok (menu, FALSE);
00362 scroll++;
00363
print_item (menu, items[(scroll+max_choice-1)*2+1],
00364 max_choice-1, FALSE,
00365 (items[(scroll+max_choice-1)*2][0] !=
':'));
00366 }
else {
00367
if (choice+1 < max_choice)
00368 choice++;
00369 }
00370 }
00371
00372 }
else
00373 choice = i;
00374
00375
print_item (menu, items[(scroll+choice)*2+1], choice, TRUE,
00376 (items[(scroll+choice)*2][0] !=
':'));
00377
00378
print_arrows(dialog, item_no, scroll,
00379 box_y, box_x+
item_x+1, menu_height);
00380
00381 wnoutrefresh (dialog);
00382 wrefresh (menu);
00383
00384
continue;
00385 }
00386
00387
switch (key) {
00388
case KEY_LEFT:
00389
case TAB:
00390
case KEY_RIGHT:
00391 button = ((key == KEY_LEFT ? --button : ++button) < 0)
00392 ? 2 : (button > 2 ? 0 : button);
00393
00394
print_buttons(dialog, height, width, button);
00395 wrefresh (menu);
00396
break;
00397
case ' ':
00398
case 's':
00399
case 'y':
00400
case 'n':
00401
case 'm':
00402
00403
if ( (f=fopen(
"lxdialog.scrltmp",
"w")) != NULL ) {
00404 fprintf(f,
"%d\n",scroll);
00405 fclose(f);
00406 }
00407 delwin (dialog);
00408 fprintf(stderr,
"%s\n", items[(scroll + choice) * 2]);
00409
switch (key) {
00410
case 's':
return 3;
00411
case 'y':
return 3;
00412
case 'n':
return 4;
00413
case 'm':
return 5;
00414
case ' ':
return 6;
00415 }
00416
return 0;
00417
case 'h':
00418
case '?':
00419 button = 2;
00420
case '\n':
00421 delwin (dialog);
00422
if (button == 2)
00423 fprintf(stderr,
"%s \"%s\"\n",
00424 items[(scroll + choice) * 2],
00425 items[(scroll + choice) * 2 + 1] +
00426
first_alpha(items[(scroll + choice) * 2 + 1],
""));
00427
else
00428 fprintf(stderr,
"%s\n", items[(scroll + choice) * 2]);
00429
00430 remove(
"lxdialog.scrltmp");
00431
return button;
00432
case 'e':
00433
case 'x':
00434 key =
ESC;
00435
case ESC:
00436
break;
00437 }
00438 }
00439
00440 delwin (dialog);
00441 remove(
"lxdialog.scrltmp");
00442
return -1;
00443 }