msgbox.c revision 217309
1215976Sjmallett/* 2232812Sjmallett * $Id: msgbox.c,v 1.64 2010/01/15 10:50:17 tom Exp $ 3215976Sjmallett * 4215976Sjmallett * msgbox.c -- implements the message box and info box 5215976Sjmallett * 6215976Sjmallett * Copyright 2000-2009,2010 Thomas E. Dickey 7215976Sjmallett * 8215976Sjmallett * This program is free software; you can redistribute it and/or modify 9215976Sjmallett * it under the terms of the GNU Lesser General Public License, version 2.1 10215976Sjmallett * as published by the Free Software Foundation. 11215976Sjmallett * 12215976Sjmallett * This program is distributed in the hope that it will be useful, but 13215976Sjmallett * WITHOUT ANY WARRANTY; without even the implied warranty of 14215976Sjmallett * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15215976Sjmallett * Lesser General Public License for more details. 16215976Sjmallett * 17215976Sjmallett * You should have received a copy of the GNU Lesser General Public 18232812Sjmallett * License along with this program; if not, write to 19215976Sjmallett * Free Software Foundation, Inc. 20215976Sjmallett * 51 Franklin St., Fifth Floor 21215976Sjmallett * Boston, MA 02110, USA. 22215976Sjmallett * 23215976Sjmallett * An earlier version of this program lists as authors: 24215976Sjmallett * Savio Lam (lam836@cs.cuhk.hk) 25215976Sjmallett */ 26215976Sjmallett 27215976Sjmallett#include <dialog.h> 28215976Sjmallett#include <dlg_keys.h> 29232812Sjmallett 30215976Sjmallett/* 31215976Sjmallett * Display a message box. Program will pause and display an "OK" button 32215976Sjmallett * if the parameter 'pauseopt' is non-zero. 33215976Sjmallett */ 34215976Sjmallettint 35215976Sjmallettdialog_msgbox(const char *title, const char *cprompt, int height, int width, 36215976Sjmallett int pauseopt) 37215976Sjmallett{ 38215976Sjmallett /* *INDENT-OFF* */ 39215976Sjmallett static DLG_KEYS_BINDING binding[] = { 40215976Sjmallett ENTERKEY_BINDINGS, 41215976Sjmallett DLG_KEYS_DATA( DLGK_ENTER, ' ' ), 42215976Sjmallett SCROLLKEY_BINDINGS, 43215976Sjmallett DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_DOWN ), 44215976Sjmallett DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_RIGHT ), 45215976Sjmallett DLG_KEYS_DATA( DLGK_FIELD_NEXT, TAB ), 46215976Sjmallett DLG_KEYS_DATA( DLGK_FIELD_PREV, KEY_UP ), 47215976Sjmallett DLG_KEYS_DATA( DLGK_FIELD_PREV, KEY_BTAB ), 48215976Sjmallett DLG_KEYS_DATA( DLGK_FIELD_PREV, KEY_LEFT ), 49215976Sjmallett END_KEYS_BINDING 50215976Sjmallett }; 51215976Sjmallett /* *INDENT-ON* */ 52215976Sjmallett 53215976Sjmallett int x, y, last = 0, page; 54215976Sjmallett int button = 0; 55215976Sjmallett int key = 0, fkey; 56215976Sjmallett int result = DLG_EXIT_UNKNOWN; 57215976Sjmallett WINDOW *dialog = 0; 58215976Sjmallett char *prompt = dlg_strclone(cprompt); 59215976Sjmallett const char **buttons = dlg_ok_label(); 60215976Sjmallett int offset = 0; 61215976Sjmallett int check; 62215976Sjmallett bool show = TRUE; 63232812Sjmallett int min_width = (pauseopt == 1 ? 12 : 0); 64215976Sjmallett 65215976Sjmallett#ifdef KEY_RESIZE 66215976Sjmallett int req_high = height; 67215976Sjmallett int req_wide = width; 68215976Sjmallett restart: 69215976Sjmallett#endif 70215976Sjmallett 71232816Sjmallett dlg_button_layout(buttons, &min_width); 72215976Sjmallett 73232816Sjmallett dlg_tab_correct_str(prompt); 74215976Sjmallett dlg_auto_size(title, prompt, &height, &width, 75215976Sjmallett (pauseopt == 1 ? 2 : 0), 76232812Sjmallett min_width); 77232812Sjmallett dlg_print_size(height, width); 78215976Sjmallett dlg_ctl_size(height, width); 79215976Sjmallett 80215976Sjmallett x = dlg_box_x_ordinate(width); 81215976Sjmallett y = dlg_box_y_ordinate(height); 82215976Sjmallett 83215976Sjmallett#ifdef KEY_RESIZE 84215976Sjmallett if (dialog != 0) 85215976Sjmallett dlg_move_window(dialog, height, width, y, x); 86215976Sjmallett else 87215976Sjmallett#endif 88215976Sjmallett { 89215976Sjmallett dialog = dlg_new_window(height, width, y, x); 90232812Sjmallett dlg_register_window(dialog, "msgbox", binding); 91215976Sjmallett dlg_register_buttons(dialog, "msgbox", buttons); 92215976Sjmallett } 93215976Sjmallett page = height - (1 + 3 * MARGIN); 94215976Sjmallett 95215976Sjmallett dlg_mouse_setbase(x, y); 96215976Sjmallett 97215976Sjmallett dlg_draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); 98215976Sjmallett dlg_draw_title(dialog, title); 99215976Sjmallett 100215976Sjmallett wattrset(dialog, dialog_attr); 101215976Sjmallett 102215976Sjmallett if (pauseopt) { 103215976Sjmallett dlg_draw_bottom_box(dialog); 104215976Sjmallett mouse_mkbutton(height - 2, width / 2 - 4, 6, '\n'); 105215976Sjmallett dlg_draw_buttons(dialog, height - 2, 0, buttons, button, FALSE, width); 106215976Sjmallett 107215976Sjmallett while (result == DLG_EXIT_UNKNOWN) { 108215976Sjmallett if (show) { 109215976Sjmallett last = dlg_print_scrolled(dialog, prompt, offset, 110215976Sjmallett page, width, pauseopt); 111215976Sjmallett show = FALSE; 112215976Sjmallett } 113215976Sjmallett key = dlg_mouse_wgetch(dialog, &fkey); 114215976Sjmallett if (dlg_result_key(key, fkey, &result)) 115215976Sjmallett break; 116232812Sjmallett 117215976Sjmallett if (!fkey && (check = dlg_char_to_button(key, buttons)) >= 0) { 118215976Sjmallett result = check ? DLG_EXIT_HELP : DLG_EXIT_OK; 119215976Sjmallett break; 120215976Sjmallett } 121215976Sjmallett 122215976Sjmallett if (fkey) { 123215976Sjmallett switch (key) { 124215976Sjmallett#ifdef KEY_RESIZE 125215976Sjmallett case KEY_RESIZE: 126215976Sjmallett dlg_clear(); 127215976Sjmallett height = req_high; 128215976Sjmallett width = req_wide; 129215976Sjmallett show = TRUE; 130215976Sjmallett goto restart; 131215976Sjmallett#endif 132215976Sjmallett case DLGK_FIELD_NEXT: 133215976Sjmallett button = dlg_next_button(buttons, button); 134215976Sjmallett if (button < 0) 135215976Sjmallett button = 0; 136215976Sjmallett dlg_draw_buttons(dialog, 137215976Sjmallett height - 2, 0, 138215976Sjmallett buttons, button, 139215976Sjmallett FALSE, width); 140215976Sjmallett break; 141215976Sjmallett case DLGK_FIELD_PREV: 142215976Sjmallett button = dlg_prev_button(buttons, button); 143215976Sjmallett if (button < 0) 144215976Sjmallett button = 0; 145232812Sjmallett dlg_draw_buttons(dialog, 146215976Sjmallett height - 2, 0, 147215976Sjmallett buttons, button, 148215976Sjmallett FALSE, width); 149215976Sjmallett break; 150215976Sjmallett case DLGK_ENTER: 151215976Sjmallett result = button ? DLG_EXIT_HELP : DLG_EXIT_OK; 152215976Sjmallett break; 153215976Sjmallett case DLGK_MOUSE(0): 154215976Sjmallett result = DLG_EXIT_OK; 155215976Sjmallett break; 156215976Sjmallett case DLGK_MOUSE(1): 157215976Sjmallett result = DLG_EXIT_HELP; 158215976Sjmallett break; 159215976Sjmallett default: 160215976Sjmallett if (dlg_check_scrolled(key, 161215976Sjmallett last, 162215976Sjmallett page, 163215976Sjmallett &show, 164215976Sjmallett &offset) == 0) 165215976Sjmallett break; 166215976Sjmallett beep(); 167215976Sjmallett break; 168215976Sjmallett } 169215976Sjmallett } else { 170215976Sjmallett beep(); 171215976Sjmallett } 172215976Sjmallett } 173215976Sjmallett } else { 174215976Sjmallett dlg_print_scrolled(dialog, prompt, offset, page, width, pauseopt); 175215976Sjmallett wrefresh(dialog); 176215976Sjmallett result = DLG_EXIT_OK; 177232812Sjmallett } 178232812Sjmallett 179215976Sjmallett dlg_del_window(dialog); 180215976Sjmallett dlg_mouse_free_regions(); 181215976Sjmallett free(prompt); 182215976Sjmallett return result; 183215976Sjmallett} 184215976Sjmallett