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