1217309Snwhitehorn/* 2251843Sbapt * $Id: yesno.c,v 1.57 2012/12/01 01:48:21 tom Exp $ 3217309Snwhitehorn * 4217309Snwhitehorn * yesno.c -- implements the yes/no box 5217309Snwhitehorn * 6251843Sbapt * Copyright 1999-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 dialog box with two buttons - Yes and No. 32217309Snwhitehorn */ 33217309Snwhitehornint 34217309Snwhitehorndialog_yesno(const char *title, const char *cprompt, int height, int width) 35217309Snwhitehorn{ 36217309Snwhitehorn /* *INDENT-OFF* */ 37217309Snwhitehorn static DLG_KEYS_BINDING binding[] = { 38224014Snwhitehorn HELPKEY_BINDINGS, 39217309Snwhitehorn ENTERKEY_BINDINGS, 40251843Sbapt TRAVERSE_BINDINGS, 41217309Snwhitehorn SCROLLKEY_BINDINGS, 42217309Snwhitehorn END_KEYS_BINDING 43217309Snwhitehorn }; 44217309Snwhitehorn /* *INDENT-ON* */ 45217309Snwhitehorn 46217309Snwhitehorn int x, y; 47217309Snwhitehorn int key = 0, fkey; 48217309Snwhitehorn int code; 49251843Sbapt int button = dlg_default_button(); 50217309Snwhitehorn WINDOW *dialog = 0; 51217309Snwhitehorn int result = DLG_EXIT_UNKNOWN; 52217309Snwhitehorn char *prompt = dlg_strclone(cprompt); 53217309Snwhitehorn const char **buttons = dlg_yes_labels(); 54217309Snwhitehorn int min_width = 25; 55217309Snwhitehorn bool show = TRUE; 56217309Snwhitehorn int page, last = 0, offset = 0; 57217309Snwhitehorn 58217309Snwhitehorn#ifdef KEY_RESIZE 59217309Snwhitehorn int req_high = height; 60217309Snwhitehorn int req_wide = width; 61217309Snwhitehorn restart: 62217309Snwhitehorn#endif 63217309Snwhitehorn 64217309Snwhitehorn dlg_tab_correct_str(prompt); 65217309Snwhitehorn dlg_button_layout(buttons, &min_width); 66217309Snwhitehorn dlg_auto_size(title, prompt, &height, &width, 2, min_width); 67217309Snwhitehorn dlg_print_size(height, width); 68217309Snwhitehorn dlg_ctl_size(height, width); 69217309Snwhitehorn 70217309Snwhitehorn x = dlg_box_x_ordinate(width); 71217309Snwhitehorn y = dlg_box_y_ordinate(height); 72217309Snwhitehorn 73217309Snwhitehorn#ifdef KEY_RESIZE 74217309Snwhitehorn if (dialog != 0) 75217309Snwhitehorn dlg_move_window(dialog, height, width, y, x); 76217309Snwhitehorn else 77217309Snwhitehorn#endif 78217309Snwhitehorn { 79217309Snwhitehorn dialog = dlg_new_window(height, width, y, x); 80217309Snwhitehorn dlg_register_window(dialog, "yesno", binding); 81217309Snwhitehorn dlg_register_buttons(dialog, "yesno", buttons); 82217309Snwhitehorn } 83217309Snwhitehorn 84251843Sbapt dlg_draw_box2(dialog, 0, 0, height, width, dialog_attr, border_attr, border2_attr); 85251843Sbapt dlg_draw_bottom_box2(dialog, border_attr, border2_attr, dialog_attr); 86217309Snwhitehorn dlg_draw_title(dialog, title); 87224014Snwhitehorn dlg_draw_helpline(dialog, FALSE); 88217309Snwhitehorn 89251843Sbapt (void) wattrset(dialog, dialog_attr); 90217309Snwhitehorn 91217309Snwhitehorn page = height - (1 + 3 * MARGIN); 92217309Snwhitehorn dlg_draw_buttons(dialog, 93217309Snwhitehorn height - 2 * MARGIN, 0, 94217309Snwhitehorn buttons, button, FALSE, width); 95217309Snwhitehorn 96217309Snwhitehorn while (result == DLG_EXIT_UNKNOWN) { 97217309Snwhitehorn if (show) { 98217309Snwhitehorn last = dlg_print_scrolled(dialog, prompt, offset, 99217309Snwhitehorn page, width, TRUE); 100251843Sbapt dlg_trace_win(dialog); 101217309Snwhitehorn show = FALSE; 102217309Snwhitehorn } 103217309Snwhitehorn key = dlg_mouse_wgetch(dialog, &fkey); 104217309Snwhitehorn if (dlg_result_key(key, fkey, &result)) 105217309Snwhitehorn break; 106217309Snwhitehorn if ((code = dlg_char_to_button(key, buttons)) >= 0) { 107217309Snwhitehorn result = dlg_ok_buttoncode(code); 108217309Snwhitehorn break; 109217309Snwhitehorn } 110217309Snwhitehorn /* handle function keys */ 111217309Snwhitehorn if (fkey) { 112217309Snwhitehorn switch (key) { 113217309Snwhitehorn case DLGK_FIELD_NEXT: 114217309Snwhitehorn button = dlg_next_button(buttons, button); 115217309Snwhitehorn if (button < 0) 116217309Snwhitehorn button = 0; 117217309Snwhitehorn dlg_draw_buttons(dialog, 118217309Snwhitehorn height - 2, 0, 119217309Snwhitehorn buttons, button, 120217309Snwhitehorn FALSE, width); 121217309Snwhitehorn break; 122217309Snwhitehorn case DLGK_FIELD_PREV: 123217309Snwhitehorn button = dlg_prev_button(buttons, button); 124217309Snwhitehorn if (button < 0) 125217309Snwhitehorn button = 0; 126217309Snwhitehorn dlg_draw_buttons(dialog, 127217309Snwhitehorn height - 2, 0, 128217309Snwhitehorn buttons, button, 129217309Snwhitehorn FALSE, width); 130217309Snwhitehorn break; 131217309Snwhitehorn case DLGK_ENTER: 132217309Snwhitehorn result = dlg_yes_buttoncode(button); 133217309Snwhitehorn break; 134217309Snwhitehorn#ifdef KEY_RESIZE 135217309Snwhitehorn case KEY_RESIZE: 136217309Snwhitehorn dlg_clear(); 137217309Snwhitehorn height = req_high; 138217309Snwhitehorn width = req_wide; 139217309Snwhitehorn goto restart; 140217309Snwhitehorn#endif 141217309Snwhitehorn default: 142217309Snwhitehorn if (is_DLGK_MOUSE(key)) { 143217309Snwhitehorn result = dlg_yes_buttoncode(key - M_EVENT); 144217309Snwhitehorn if (result < 0) 145217309Snwhitehorn result = DLG_EXIT_OK; 146217309Snwhitehorn } else if (dlg_check_scrolled(key, last, page, 147217309Snwhitehorn &show, &offset) != 0) { 148217309Snwhitehorn beep(); 149217309Snwhitehorn } 150217309Snwhitehorn break; 151217309Snwhitehorn } 152217309Snwhitehorn } else { 153217309Snwhitehorn beep(); 154217309Snwhitehorn } 155217309Snwhitehorn } 156217309Snwhitehorn 157217309Snwhitehorn dlg_del_window(dialog); 158217309Snwhitehorn dlg_mouse_free_regions(); 159217309Snwhitehorn free(prompt); 160217309Snwhitehorn return result; 161217309Snwhitehorn} 162