/*
 *  yesno.c -- implements the yes/no box
 *
 *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
 *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  as published by the Free Software Foundation; either version 2
 *  of the License, or (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */



#include "dialog.h"  // 包含对话框库的头文件



/*
 * Display termination buttons
 */
static void print_buttons(WINDOW * dialog, int height, int width, int selected)
{
	int x = width / 2 - 10;  // 计算 "Yes" 按钮的起始位置
	int y = height - 2;  // 计算按钮的垂直位置

	print_button(dialog, gettext(" Yes "), y, x, selected == 0);  // 打印 "Yes" 按钮
	print_button(dialog, gettext("  No  "), y, x + 13, selected == 1);  // 打印 "No" 按钮

	wmove(dialog, y, x + 1 + 13 * selected);  // 移动光标到选中的按钮
	wrefresh(dialog);  // 刷新窗口以显示更改
}

/*
 * Display a dialog box with two buttons - Yes and No
 */
int dialog_yesno(const char *title, const char *prompt, int height, int width)
{
	int i, x, y, key = 0, button = 0;  // 定义变量用于存储位置、按键和按钮状态
	WINDOW *dialog;  // 定义对话框窗口

do_resize:
	if (getmaxy(stdscr) < (height + YESNO_HEIGTH_MIN))
		return -ERRDISPLAYTOOSMALL;  // 如果屏幕高度不足以显示对话框，返回错误
	if (getmaxx(stdscr) < (width + YESNO_WIDTH_MIN))
		return -ERRDISPLAYTOOSMALL;  // 如果屏幕宽度不足以显示对话框，返回错误

	/* center dialog box on screen */
	x = (getmaxx(stdscr) - width) / 2;  // 计算对话框的水平中心位置
	y = (getmaxy(stdscr) - height) / 2;  // 计算对话框的垂直中心位置

	draw_shadow(stdscr, y, x, height, width);  // 绘制对话框阴影

	dialog = newwin(height, width, y, x);  // 创建对话框窗口
	keypad(dialog, TRUE);  // 启用键盘输入处理

	draw_box(dialog, 0, 0, height, width,
		 dlg.dialog.atr, dlg.border.atr);  // 绘制对话框边框
	wattrset(dialog, dlg.border.atr);  // 设置边框属性
	mvwaddch(dialog, height - 3, 0, ACS_LTEE);  // 添加左下角字符
	for (i = 0; i < width - 2; i++)
		waddch(dialog, ACS_HLINE);  // 添加水平线
	wattrset(dialog, dlg.dialog.atr);  // 设置对话框属性
	waddch(dialog, ACS_RTEE);  // 添加右下角字符

	print_title(dialog, title, width);  // 打印标题

	wattrset(dialog, dlg.dialog.atr);  // 设置对话框属性
	print_autowrap(dialog, prompt, width - 2, 1, 3);  // 打印提示信息

	print_buttons(dialog, height, width, 0);  // 打印底部按钮

	while (key != KEY_ESC) {
		key = wgetch(dialog);  // 获取用户按键输入
		switch (key) {
		case 'Y':
		case 'y':
			delwin(dialog);  // 删除对话框窗口
			return 0;  // 返回0表示 "Yes" 按钮被选中
		case 'N':
		case 'n':
			delwin(dialog);  // 删除对话框窗口
			return 1;  // 返回1表示 "No" 按钮被选中

		case TAB:
		case KEY_LEFT:
		case KEY_RIGHT:
			button = ((key == KEY_LEFT ? --button : ++button) < 0) ? 1 : (button > 1 ? 0 : button);

			print_buttons(dialog, height, width, button);  // 打印按钮
			wrefresh(dialog);  // 刷新窗口以显示更改
			break;
		case ' ':
		case '\n':
			delwin(dialog);  // 删除对话框窗口
			return button;  // 返回按钮状态
		case KEY_ESC:
			key = on_key_esc(dialog);  // 处理 ESC 键
			break;
		case KEY_RESIZE:
			delwin(dialog);  // 删除对话框窗口
			on_key_resize();  // 处理窗口大小变化
			goto do_resize;  // 重新调整对话框大小
		}
	}

	delwin(dialog);  // 删除对话框窗口
	return key;		/* ESC pressed */  // 返回 ESC 键
}