1217309Snwhitehorn/* 2251843Sbapt * $Id: msgbox.c,v 1.75 2012/12/01 01:48:08 tom Exp $ 3217309Snwhitehorn * 4217309Snwhitehorn * msgbox.c -- implements the message box and info box 5217309Snwhitehorn * 6251843Sbapt * Copyright 2000-2011,2012 Thomas E. Dickey 7217309Snwhitehorn * 8217309Snwhitehorn * This program is free software; you can redistribute it and/or modify 9217309Snwhitehorn * it under the terms of the GNU Lesser General Public License, version 2.1 10217309Snwhitehorn * as published by the Free Software Foundation. 11217309Snwhitehorn * 12217309Snwhitehorn * This program is distributed in the hope that it will be useful, but 13217309Snwhitehorn * WITHOUT ANY WARRANTY; without even the implied warranty of 14217309Snwhitehorn * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15217309Snwhitehorn * Lesser General Public License for more details. 16217309Snwhitehorn * 17217309Snwhitehorn * You should have received a copy of the GNU Lesser General Public 18217309Snwhitehorn * License along with this program; if not, write to 19217309Snwhitehorn * Free Software Foundation, Inc. 20217309Snwhitehorn * 51 Franklin St., Fifth Floor 21217309Snwhitehorn * Boston, MA 02110, USA. 22217309Snwhitehorn * 23217309Snwhitehorn * An earlier version of this program lists as authors: 24217309Snwhitehorn * Savio Lam (lam836@cs.cuhk.hk) 25217309Snwhitehorn */ 26217309Snwhitehorn 27217309Snwhitehorn#include <dialog.h> 28217309Snwhitehorn#include <dlg_keys.h> 29217309Snwhitehorn 30217309Snwhitehorn/* 31217309Snwhitehorn * Display a message box. Program will pause and display an "OK" button 32217309Snwhitehorn * if the parameter 'pauseopt' is non-zero. 33217309Snwhitehorn */ 34217309Snwhitehornint 35217309Snwhitehorndialog_msgbox(const char *title, const char *cprompt, int height, int width, 36217309Snwhitehorn int pauseopt) 37217309Snwhitehorn{ 38217309Snwhitehorn /* *INDENT-OFF* */ 39217309Snwhitehorn static DLG_KEYS_BINDING binding[] = { 40224014Snwhitehorn HELPKEY_BINDINGS, 41217309Snwhitehorn ENTERKEY_BINDINGS, 42251843Sbapt TRAVERSE_BINDINGS, 43217309Snwhitehorn SCROLLKEY_BINDINGS, 44217309Snwhitehorn END_KEYS_BINDING 45217309Snwhitehorn }; 46217309Snwhitehorn /* *INDENT-ON* */ 47217309Snwhitehorn 48217309Snwhitehorn int x, y, last = 0, page; 49251843Sbapt int button; 50217309Snwhitehorn int key = 0, fkey; 51217309Snwhitehorn int result = DLG_EXIT_UNKNOWN; 52217309Snwhitehorn WINDOW *dialog = 0; 53217309Snwhitehorn char *prompt = dlg_strclone(cprompt); 54217309Snwhitehorn const char **buttons = dlg_ok_label(); 55217309Snwhitehorn int offset = 0; 56217309Snwhitehorn int check; 57217309Snwhitehorn bool show = TRUE; 58217309Snwhitehorn int min_width = (pauseopt == 1 ? 12 : 0); 59251843Sbapt int save_nocancel = dialog_vars.nocancel; 60251843Sbapt#ifdef KEY_RESIZE 61251843Sbapt int req_high; 62251843Sbapt int req_wide; 63251843Sbapt#endif 64217309Snwhitehorn 65251843Sbapt dialog_vars.nocancel = TRUE; 66251843Sbapt button = dlg_default_button(); 67251843Sbapt 68217309Snwhitehorn#ifdef KEY_RESIZE 69251843Sbapt req_high = height; 70251843Sbapt req_wide = width; 71217309Snwhitehorn restart: 72217309Snwhitehorn#endif 73217309Snwhitehorn 74217309Snwhitehorn dlg_button_layout(buttons, &min_width); 75217309Snwhitehorn 76217309Snwhitehorn dlg_tab_correct_str(prompt); 77217309Snwhitehorn dlg_auto_size(title, prompt, &height, &width, 78217309Snwhitehorn (pauseopt == 1 ? 2 : 0), 79217309Snwhitehorn min_width); 80217309Snwhitehorn dlg_print_size(height, width); 81217309Snwhitehorn dlg_ctl_size(height, width); 82217309Snwhitehorn 83217309Snwhitehorn x = dlg_box_x_ordinate(width); 84217309Snwhitehorn y = dlg_box_y_ordinate(height); 85217309Snwhitehorn 86217309Snwhitehorn#ifdef KEY_RESIZE 87217309Snwhitehorn if (dialog != 0) 88217309Snwhitehorn dlg_move_window(dialog, height, width, y, x); 89217309Snwhitehorn else 90217309Snwhitehorn#endif 91217309Snwhitehorn { 92217309Snwhitehorn dialog = dlg_new_window(height, width, y, x); 93217309Snwhitehorn dlg_register_window(dialog, "msgbox", binding); 94217309Snwhitehorn dlg_register_buttons(dialog, "msgbox", buttons); 95217309Snwhitehorn } 96217309Snwhitehorn page = height - (1 + 3 * MARGIN); 97217309Snwhitehorn 98217309Snwhitehorn dlg_mouse_setbase(x, y); 99217309Snwhitehorn 100251843Sbapt dlg_draw_box2(dialog, 0, 0, height, width, dialog_attr, border_attr, border2_attr); 101217309Snwhitehorn dlg_draw_title(dialog, title); 102217309Snwhitehorn 103251843Sbapt (void) wattrset(dialog, dialog_attr); 104217309Snwhitehorn 105217309Snwhitehorn if (pauseopt) { 106251843Sbapt dlg_draw_bottom_box2(dialog, border_attr, border2_attr, dialog_attr); 107217309Snwhitehorn mouse_mkbutton(height - 2, width / 2 - 4, 6, '\n'); 108217309Snwhitehorn dlg_draw_buttons(dialog, height - 2, 0, buttons, button, FALSE, width); 109224014Snwhitehorn dlg_draw_helpline(dialog, FALSE); 110217309Snwhitehorn 111217309Snwhitehorn while (result == DLG_EXIT_UNKNOWN) { 112217309Snwhitehorn if (show) { 113217309Snwhitehorn last = dlg_print_scrolled(dialog, prompt, offset, 114217309Snwhitehorn page, width, pauseopt); 115251843Sbapt dlg_trace_win(dialog); 116217309Snwhitehorn show = FALSE; 117217309Snwhitehorn } 118217309Snwhitehorn key = dlg_mouse_wgetch(dialog, &fkey); 119217309Snwhitehorn if (dlg_result_key(key, fkey, &result)) 120217309Snwhitehorn break; 121217309Snwhitehorn 122217309Snwhitehorn if (!fkey && (check = dlg_char_to_button(key, buttons)) >= 0) { 123251843Sbapt result = dlg_ok_buttoncode(check); 124217309Snwhitehorn break; 125217309Snwhitehorn } 126217309Snwhitehorn 127217309Snwhitehorn if (fkey) { 128217309Snwhitehorn switch (key) { 129217309Snwhitehorn#ifdef KEY_RESIZE 130217309Snwhitehorn case KEY_RESIZE: 131217309Snwhitehorn dlg_clear(); 132217309Snwhitehorn height = req_high; 133217309Snwhitehorn width = req_wide; 134217309Snwhitehorn show = TRUE; 135217309Snwhitehorn goto restart; 136217309Snwhitehorn#endif 137217309Snwhitehorn case DLGK_FIELD_NEXT: 138217309Snwhitehorn button = dlg_next_button(buttons, button); 139217309Snwhitehorn if (button < 0) 140217309Snwhitehorn button = 0; 141217309Snwhitehorn dlg_draw_buttons(dialog, 142217309Snwhitehorn height - 2, 0, 143217309Snwhitehorn buttons, button, 144217309Snwhitehorn FALSE, width); 145217309Snwhitehorn break; 146217309Snwhitehorn case DLGK_FIELD_PREV: 147217309Snwhitehorn button = dlg_prev_button(buttons, button); 148217309Snwhitehorn if (button < 0) 149217309Snwhitehorn button = 0; 150217309Snwhitehorn dlg_draw_buttons(dialog, 151217309Snwhitehorn height - 2, 0, 152217309Snwhitehorn buttons, button, 153217309Snwhitehorn FALSE, width); 154217309Snwhitehorn break; 155217309Snwhitehorn case DLGK_ENTER: 156251843Sbapt result = dlg_ok_buttoncode(button); 157217309Snwhitehorn break; 158217309Snwhitehorn default: 159251843Sbapt if (is_DLGK_MOUSE(key)) { 160251843Sbapt result = dlg_ok_buttoncode(key - M_EVENT); 161251843Sbapt if (result < 0) 162251843Sbapt result = DLG_EXIT_OK; 163251843Sbapt } else if (dlg_check_scrolled(key, 164251843Sbapt last, 165251843Sbapt page, 166251843Sbapt &show, 167251843Sbapt &offset) == 0) { 168251843Sbapt } else { 169251843Sbapt beep(); 170251843Sbapt } 171217309Snwhitehorn break; 172217309Snwhitehorn } 173217309Snwhitehorn } else { 174217309Snwhitehorn beep(); 175217309Snwhitehorn } 176217309Snwhitehorn } 177217309Snwhitehorn } else { 178217309Snwhitehorn dlg_print_scrolled(dialog, prompt, offset, page, width, pauseopt); 179224014Snwhitehorn dlg_draw_helpline(dialog, FALSE); 180217309Snwhitehorn wrefresh(dialog); 181251843Sbapt dlg_trace_win(dialog); 182217309Snwhitehorn result = DLG_EXIT_OK; 183217309Snwhitehorn } 184217309Snwhitehorn 185217309Snwhitehorn dlg_del_window(dialog); 186217309Snwhitehorn dlg_mouse_free_regions(); 187217309Snwhitehorn free(prompt); 188251843Sbapt 189251843Sbapt dialog_vars.nocancel = save_nocancel; 190251843Sbapt 191217309Snwhitehorn return result; 192217309Snwhitehorn} 193