00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "dialog.h"
00025
00026 static int list_width, check_x, item_x, checkflag;
00027
00028
00029
00030
00031 static void
00032 print_item (WINDOW * win, const char *item, int status,
00033 int choice, int selected)
00034 {
00035 int i;
00036
00037
00038 wattrset (win, menubox_attr);
00039 wmove (win, choice, 0);
00040 for (i = 0; i < list_width; i++)
00041 waddch (win, ' ');
00042
00043 wmove (win, choice, check_x);
00044 wattrset (win, selected ? check_selected_attr : check_attr);
00045 if (checkflag == FLAG_CHECK)
00046 wprintw (win, "[%c]", status ? 'X' : ' ');
00047 else
00048 wprintw (win, "(%c)", status ? 'X' : ' ');
00049
00050 wattrset (win, selected ? tag_selected_attr : tag_attr);
00051 mvwaddch(win, choice, item_x, item[0]);
00052 wattrset (win, selected ? item_selected_attr : item_attr);
00053 waddstr (win, (char *)item+1);
00054 if (selected) {
00055 wmove (win, choice, check_x+1);
00056 wrefresh (win);
00057 }
00058 }
00059
00060
00061
00062
00063 static void
00064 print_arrows (WINDOW * win, int choice, int item_no, int scroll,
00065 int y, int x, int height)
00066 {
00067 wmove(win, y, x);
00068
00069 if (scroll > 0) {
00070 wattrset (win, uarrow_attr);
00071 waddch (win, ACS_UARROW);
00072 waddstr (win, "(-)");
00073 }
00074 else {
00075 wattrset (win, menubox_attr);
00076 waddch (win, ACS_HLINE);
00077 waddch (win, ACS_HLINE);
00078 waddch (win, ACS_HLINE);
00079 waddch (win, ACS_HLINE);
00080 }
00081
00082 y = y + height + 1;
00083 wmove(win, y, x);
00084
00085 if ((height < item_no) && (scroll + choice < item_no - 1)) {
00086 wattrset (win, darrow_attr);
00087 waddch (win, ACS_DARROW);
00088 waddstr (win, "(+)");
00089 }
00090 else {
00091 wattrset (win, menubox_border_attr);
00092 waddch (win, ACS_HLINE);
00093 waddch (win, ACS_HLINE);
00094 waddch (win, ACS_HLINE);
00095 waddch (win, ACS_HLINE);
00096 }
00097 }
00098
00099
00100
00101
00102 static void
00103 print_buttons( WINDOW *dialog, int height, int width, int selected)
00104 {
00105 int x = width / 2 - 11;
00106 int y = height - 2;
00107
00108 print_button (dialog, "Select", y, x, selected == 0);
00109 print_button (dialog, " Help ", y, x + 14, selected == 1);
00110
00111 wmove(dialog, y, x+1 + 14*selected);
00112 wrefresh (dialog);
00113 }
00114
00115
00116
00117
00118
00119 int
00120 dialog_checklist (const char *title, const char *prompt, int height, int width,
00121 int list_height, int item_no, const char * const * items, int flag)
00122
00123 {
00124 int i, x, y, box_x, box_y;
00125 int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status;
00126 WINDOW *dialog, *list;
00127
00128 checkflag = flag;
00129
00130
00131 if ((status = malloc (sizeof (int) * item_no)) == NULL) {
00132 endwin ();
00133 fprintf (stderr,
00134 "\nCan't allocate memory in dialog_checklist().\n");
00135 exit (-1);
00136 }
00137
00138
00139 for (i = 0; i < item_no; i++) {
00140 status[i] = !strcasecmp (items[i * 3 + 2], "on");
00141 if (!choice && status[i])
00142 choice = i;
00143 }
00144
00145 max_choice = MIN (list_height, item_no);
00146
00147
00148 x = (COLS - width) / 2;
00149 y = (LINES - height) / 2;
00150
00151 draw_shadow (stdscr, y, x, height, width);
00152
00153 dialog = newwin (height, width, y, x);
00154 keypad (dialog, TRUE);
00155
00156 draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
00157 wattrset (dialog, border_attr);
00158 mvwaddch (dialog, height-3, 0, ACS_LTEE);
00159 for (i = 0; i < width - 2; i++)
00160 waddch (dialog, ACS_HLINE);
00161 wattrset (dialog, dialog_attr);
00162 waddch (dialog, ACS_RTEE);
00163
00164 if (title != NULL && strlen(title) >= width-2 ) {
00165
00166 char * title2 = malloc(width-2+1);
00167 memcpy( title2, title, width-2 );
00168 title2[width-2] = '\0';
00169 title = title2;
00170 }
00171
00172 if (title != NULL) {
00173 wattrset (dialog, title_attr);
00174 mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
00175 waddstr (dialog, (char *)title);
00176 waddch (dialog, ' ');
00177 }
00178
00179 wattrset (dialog, dialog_attr);
00180 print_autowrap (dialog, prompt, width - 2, 1, 3);
00181
00182 list_width = width - 6;
00183 box_y = height - list_height - 5;
00184 box_x = (width - list_width) / 2 - 1;
00185
00186
00187 list = subwin (dialog, list_height, list_width, y+box_y+1, x+box_x+1);
00188
00189 keypad (list, TRUE);
00190
00191
00192 draw_box (dialog, box_y, box_x, list_height + 2, list_width + 2,
00193 menubox_border_attr, menubox_attr);
00194
00195
00196 check_x = 0;
00197 for (i = 0; i < item_no; i++)
00198 check_x = MAX (check_x, + strlen (items[i * 3 + 1]) + 4);
00199
00200 check_x = (list_width - check_x) / 2;
00201 item_x = check_x + 4;
00202
00203 if (choice >= list_height) {
00204 scroll = choice - list_height + 1;
00205 choice -= scroll;
00206 }
00207
00208
00209 for (i = 0; i < max_choice; i++) {
00210 print_item (list, items[(scroll+i) * 3 + 1],
00211 status[i+scroll], i, i == choice);
00212 }
00213
00214 print_arrows(dialog, choice, item_no, scroll,
00215 box_y, box_x + check_x + 5, list_height);
00216
00217 print_buttons(dialog, height, width, 0);
00218
00219 wnoutrefresh (list);
00220 wnoutrefresh (dialog);
00221 doupdate ();
00222
00223 while (key != ESC) {
00224 key = wgetch (dialog);
00225
00226 for (i = 0; i < max_choice; i++)
00227 if (toupper(key) == toupper(items[(scroll+i)*3+1][0]))
00228 break;
00229
00230
00231 if ( i < max_choice || key == KEY_UP || key == KEY_DOWN ||
00232 key == '+' || key == '-' ) {
00233 if (key == KEY_UP || key == '-') {
00234 if (!choice) {
00235 if (!scroll)
00236 continue;
00237
00238 if (list_height > 1) {
00239
00240 print_item (list, items[scroll * 3 + 1],
00241 status[scroll], 0, FALSE);
00242 scrollok (list, TRUE);
00243 wscrl (list, -1);
00244 scrollok (list, FALSE);
00245 }
00246 scroll--;
00247 print_item (list, items[scroll * 3 + 1],
00248 status[scroll], 0, TRUE);
00249 wnoutrefresh (list);
00250
00251 print_arrows(dialog, choice, item_no, scroll,
00252 box_y, box_x + check_x + 5, list_height);
00253
00254 wrefresh (dialog);
00255
00256 continue;
00257 } else
00258 i = choice - 1;
00259 } else if (key == KEY_DOWN || key == '+') {
00260 if (choice == max_choice - 1) {
00261 if (scroll + choice >= item_no - 1)
00262 continue;
00263
00264 if (list_height > 1) {
00265
00266 print_item (list, items[(scroll + max_choice - 1) * 3 + 1],
00267 status[scroll + max_choice - 1],
00268 max_choice - 1, FALSE);
00269 scrollok (list, TRUE);
00270 scroll (list);
00271 scrollok (list, FALSE);
00272 }
00273 scroll++;
00274 print_item (list, items[(scroll + max_choice - 1) * 3 + 1],
00275 status[scroll + max_choice - 1],
00276 max_choice - 1, TRUE);
00277 wnoutrefresh (list);
00278
00279 print_arrows(dialog, choice, item_no, scroll,
00280 box_y, box_x + check_x + 5, list_height);
00281
00282 wrefresh (dialog);
00283
00284 continue;
00285 } else
00286 i = choice + 1;
00287 }
00288 if (i != choice) {
00289
00290 print_item (list, items[(scroll + choice) * 3 + 1],
00291 status[scroll + choice], choice, FALSE);
00292
00293 choice = i;
00294 print_item (list, items[(scroll + choice) * 3 + 1],
00295 status[scroll + choice], choice, TRUE);
00296 wnoutrefresh (list);
00297 wrefresh (dialog);
00298 }
00299 continue;
00300 }
00301 switch (key) {
00302 case 'H':
00303 case 'h':
00304 case '?':
00305 delwin (dialog);
00306 free (status);
00307 return 1;
00308 case TAB:
00309 case KEY_LEFT:
00310 case KEY_RIGHT:
00311 button = ((key == KEY_LEFT ? --button : ++button) < 0)
00312 ? 1 : (button > 1 ? 0 : button);
00313
00314 print_buttons(dialog, height, width, button);
00315 wrefresh (dialog);
00316 break;
00317 case 'S':
00318 case 's':
00319 case ' ':
00320 case '\n':
00321 if (!button) {
00322 if (flag == FLAG_CHECK) {
00323 status[scroll + choice] = !status[scroll + choice];
00324 wmove (list, choice, check_x);
00325 wattrset (list, check_selected_attr);
00326 wprintw (list, "[%c]", status[scroll + choice] ? 'X' : ' ');
00327 } else {
00328 if (!status[scroll + choice]) {
00329 for (i = 0; i < item_no; i++)
00330 status[i] = 0;
00331 status[scroll + choice] = 1;
00332 for (i = 0; i < max_choice; i++)
00333 print_item (list, items[(scroll + i) * 3 + 1],
00334 status[scroll + i], i, i == choice);
00335 }
00336 }
00337 wnoutrefresh (list);
00338 wrefresh (dialog);
00339
00340 for (i = 0; i < item_no; i++) {
00341 if (status[i]) {
00342 if (flag == FLAG_CHECK) {
00343 fprintf (stderr, "\"%s\" ", items[i * 3]);
00344 } else {
00345 fprintf (stderr, "%s", items[i * 3]);
00346 }
00347
00348 }
00349 }
00350 }
00351 delwin (dialog);
00352 free (status);
00353 return button;
00354 case 'X':
00355 case 'x':
00356 key = ESC;
00357 case ESC:
00358 break;
00359 }
00360
00361
00362 doupdate ();
00363 }
00364
00365
00366 delwin (dialog);
00367 free (status);
00368 return -1;
00369 }