/*	$Id: dialog_screen.c,v 1.3 2009/03/05 11:50:39 monaka Exp $	*/

/*
 * Copyright (c) 2002-2003 NONAKA Kimihiro
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "compiler.h"

#include "gtk2/xnp2.h"
#include "gtk2/gtk_menu.h"

#include "np2.h"
#include "dosio.h"
#include "pccore.h"
#include "iocore.h"

#include "palettes.h"
#include "scrndraw.h"

#include "sysmng.h"


/*
 * Video
 */
static GtkWidget *video_lcd_checkbutton;
static GtkWidget *video_lcd_reverse_checkbutton;
static GtkWidget *video_skipline_checkbutton;
static GtkObject *video_skipline_ratio_adj;

/*
 * Chip
 */
static GtkWidget *chip_enable_color16_checkbutton;
static gint chip_uPD72020;
static gint chip_gc_kind;

/*
 * Timing
 */
static const char *timing_waitclock_str[] = {
	"T-RAM", "V-RAM", "GRCG"
};

static GtkObject *timing_waitclock_adj[NELEMENTS(timing_waitclock_str)];
static GtkObject *timing_realpal_adj;


static void
ok_button_clicked(GtkButton *b, gpointer d)
{
	/* Video */
	gint video_lcd;
	gint video_lcdrev;
	gint video_skipline;
	guint video_skipline_ratio;

	/* Chip */
	gint chip_color16;

	/* Timing */
	guint timing_waitclock[NELEMENTS(timing_waitclock_str)];
	guint timing_realpal;

	/* common */
	BOOL renewal;
	int i;

	UNUSED(b);

	/* Video tab */
	video_lcd = GTK_TOGGLE_BUTTON(video_lcd_checkbutton)->active;
	video_lcdrev = GTK_TOGGLE_BUTTON(video_lcd_reverse_checkbutton)->active;
	video_skipline = GTK_TOGGLE_BUTTON(video_skipline_checkbutton)->active;
	video_skipline_ratio = (guint)GTK_ADJUSTMENT(video_skipline_ratio_adj)->value;

	renewal = FALSE;
	if (np2cfg.skipline != video_skipline) {
		np2cfg.skipline = video_skipline;
		renewal = TRUE;
	}
	if (np2cfg.skiplight != video_skipline_ratio) {
		np2cfg.skiplight = video_skipline_ratio;
		renewal = TRUE;
	}
	if (renewal) {
		pal_makeskiptable();
	}
	if (video_lcd) {
		video_lcd |= video_lcdrev ? 2 : 0;
	}
	if (np2cfg.LCD_MODE != video_lcd) {
		np2cfg.LCD_MODE |= video_lcd;
		pal_makelcdpal();
		renewal = TRUE;
	}

	if (renewal) {
		sysmng_update(SYS_UPDATECFG);
		scrndraw_redraw();
	}

	/* Chip tab */
	chip_color16 = GTK_TOGGLE_BUTTON(chip_enable_color16_checkbutton)->active;

	renewal = FALSE;
	if (np2cfg.uPD72020 != chip_uPD72020) {
		np2cfg.uPD72020 = chip_uPD72020;
		gdc_restorekacmode();
		gdcs.grphdisp |= GDCSCRN_ALLDRAW2;
		renewal = TRUE;
	}
	if ((np2cfg.grcg & 3) != chip_gc_kind) {
		np2cfg.grcg = (np2cfg.grcg & ~3) | chip_gc_kind;
		gdcs.grphdisp |= GDCSCRN_ALLDRAW2;
		renewal = TRUE;
	}
	if (np2cfg.color16 != chip_color16) {
		np2cfg.color16 = chip_color16;
		renewal = TRUE;
	}

	if (renewal) {
		sysmng_update(SYS_UPDATECFG);
	}

	/* Timing tab */
	timing_realpal = ((guint)GTK_ADJUSTMENT(timing_realpal_adj)->value) + 32;

	renewal = FALSE;
	for (i =  0; i < NELEMENTS(timing_waitclock_str); i++) {
		timing_waitclock[i] = (guint)GTK_ADJUSTMENT(timing_waitclock_adj[i])->value;
		if (np2cfg.wait[i * 2] != timing_waitclock[i]) {
			np2cfg.wait[i * 2] = timing_waitclock[i];
			np2cfg.wait[i * 2 + 1] = 1;
			renewal = TRUE;
		}
	}
	if (np2cfg.realpal != timing_realpal) {
		np2cfg.realpal = timing_realpal;
		renewal = TRUE;
	}

	if (renewal) {
		sysmng_update(SYS_UPDATECFG);
	}

	gtk_widget_destroy((GtkWidget *)d);
}

static void
dialog_destroy(GtkWidget *w, GtkWidget **wp)
{

	UNUSED(wp);

	install_idle_process();
	gtk_widget_destroy(w);
}

static void
lcd_checkbutton_clicked(GtkCheckButton *b, gpointer d)
{

	gtk_widget_set_sensitive((GtkWidget *)d, GTK_TOGGLE_BUTTON(b)->active);
}

static void
uPD72020_radiobutton_clicked(GtkButton *b, gpointer d)
{

	UNUSED(b);

	chip_uPD72020 = (gint)d;
}

static void
gc_radiobutton_clicked(GtkButton *b, gpointer d)
{

	UNUSED(b);

	chip_gc_kind = (gint)d;
}

static GtkWidget*
create_video_note(void)
{
	GtkWidget *main_widget;
	GtkWidget *ratio_label;
	GtkWidget *ratio_scale;
	GtkWidget *ratio_hbox;

	main_widget = gtk_vbox_new(FALSE, 0);
	gtk_container_set_border_width(GTK_CONTAINER(main_widget), 3);
	gtk_widget_show(main_widget);

	video_lcd_checkbutton =
	    gtk_check_button_new_with_label("Liquid Crystal Display");
	gtk_widget_show(video_lcd_checkbutton);
	gtk_box_pack_start(GTK_BOX(main_widget), video_lcd_checkbutton,
	    FALSE, FALSE, 0);
	if (np2cfg.LCD_MODE & 1) {
		g_signal_emit_by_name(GTK_OBJECT(video_lcd_checkbutton),
		    "clicked");
	}

	video_lcd_reverse_checkbutton =
	    gtk_check_button_new_with_label("Reverse");
	gtk_widget_show(video_lcd_reverse_checkbutton);
	gtk_box_pack_start(GTK_BOX(main_widget), video_lcd_reverse_checkbutton,
	    FALSE, FALSE, 0);
	gtk_container_set_border_width(
	    GTK_CONTAINER(video_lcd_reverse_checkbutton), 5);
	if (np2cfg.LCD_MODE & 1) {
		if (np2cfg.LCD_MODE & 2) {
			g_signal_emit_by_name(
			  GTK_OBJECT(video_lcd_reverse_checkbutton), "clicked");
		}
	} else {
		gtk_widget_set_sensitive(video_lcd_reverse_checkbutton, FALSE);
	}
	g_signal_connect(GTK_OBJECT(video_lcd_checkbutton), "clicked",
	    G_CALLBACK(lcd_checkbutton_clicked),
	    (gpointer)video_lcd_reverse_checkbutton);

	video_skipline_checkbutton =
	    gtk_check_button_new_with_label("Use skipline revisions");
	gtk_widget_show(video_skipline_checkbutton);
	gtk_box_pack_start(GTK_BOX(main_widget), video_skipline_checkbutton,
	    FALSE, FALSE, 0);
	if (np2cfg.skipline) {
		g_signal_emit_by_name(GTK_OBJECT(video_skipline_checkbutton),
		    "clicked");
	}

	ratio_hbox = gtk_hbox_new(FALSE, 0);
	gtk_widget_show(ratio_hbox);
	gtk_box_pack_start(GTK_BOX(main_widget), ratio_hbox, FALSE, FALSE, 0);

	ratio_label = gtk_label_new("Ratio");
	gtk_widget_show(ratio_label);
	gtk_box_pack_start(GTK_BOX(ratio_hbox), ratio_label, TRUE, TRUE, 0);

	video_skipline_ratio_adj = gtk_adjustment_new(np2cfg.skiplight,
	    0.0, 255.0, 1.0, 1.0, 0.0);
	ratio_scale = gtk_hscale_new(GTK_ADJUSTMENT(video_skipline_ratio_adj));
	gtk_scale_set_default_values(GTK_SCALE(ratio_scale));
	gtk_scale_set_digits(GTK_SCALE(ratio_scale), 0);
	gtk_box_pack_start(GTK_BOX(ratio_hbox), ratio_scale, TRUE, TRUE, 0);
	gtk_widget_show(ratio_scale);

	return main_widget;
}

static GtkWidget*
create_chip_note(void)
{
	static char *gdc_str[] = { "uPD7220", "uPD72020" };
	static char *gc_str[] = { "None", "GRCG", "GRCG+", "EGC" };
	GtkWidget *main_widget;
	GtkWidget *gdc_frame;
	GtkWidget *gdc_hbox;
	GtkWidget *upd72020_radiobutton[NELEMENTS(gdc_str)];
	GtkWidget *gc_frame;
	GtkWidget *gc_hbox;
	GtkWidget *gc_radiobutton[NELEMENTS(gc_str)];
	int i;

	main_widget = gtk_vbox_new(FALSE, 0);
	gtk_container_set_border_width(GTK_CONTAINER(main_widget), 5);
	gtk_widget_show(main_widget);

	/*
	 * Graphic Display Contoller
	 */
	gdc_frame = gtk_frame_new("Graphic Display Controller");
	gtk_widget_show(gdc_frame);
	gtk_box_pack_start(GTK_BOX(main_widget), gdc_frame, TRUE, TRUE, 2);

	gdc_hbox = gtk_hbox_new(FALSE, 0);
	gtk_container_set_border_width(GTK_CONTAINER(gdc_hbox), 5);
	gtk_widget_show(gdc_hbox);
	gtk_container_add(GTK_CONTAINER(gdc_frame), gdc_hbox);

	for (i = 0; i < NELEMENTS(gdc_str); i++) {
		upd72020_radiobutton[i] = gtk_radio_button_new_with_label_from_widget(i > 0 ? GTK_RADIO_BUTTON(upd72020_radiobutton[i-1]) : NULL, gdc_str[i]);
		gtk_widget_show(upd72020_radiobutton[i]);
		gtk_box_pack_start(GTK_BOX(gdc_hbox), upd72020_radiobutton[i], TRUE, FALSE, 0);
		g_signal_connect(GTK_OBJECT(upd72020_radiobutton[i]), "clicked",
		    G_CALLBACK(uPD72020_radiobutton_clicked), (gpointer)i);
	}
	g_signal_emit_by_name(GTK_OBJECT(upd72020_radiobutton[np2cfg.uPD72020 ? 1 : 0]), "clicked");

	/*
	 * Graphic Charger
	 */
	gc_frame = gtk_frame_new("Graphic Charger");
	gtk_widget_show(gc_frame);
	gtk_box_pack_start(GTK_BOX(main_widget), gc_frame, TRUE, TRUE, 2);

	gc_hbox = gtk_hbox_new(FALSE, 0);
	gtk_container_set_border_width(GTK_CONTAINER(gc_hbox), 5);
	gtk_widget_show(gc_hbox);
	gtk_container_add(GTK_CONTAINER(gc_frame), gc_hbox);

	for (i = 0; i < NELEMENTS(gc_str); i++) {
		gc_radiobutton[i] = gtk_radio_button_new_with_label_from_widget(i > 0 ? GTK_RADIO_BUTTON(gc_radiobutton[i-1]) : NULL, gc_str[i]);
		gtk_widget_show(gc_radiobutton[i]);
		gtk_box_pack_start(GTK_BOX(gc_hbox), gc_radiobutton[i], TRUE, FALSE, 0);
		g_signal_connect(GTK_OBJECT(gc_radiobutton[i]), "clicked",
		G_CALLBACK(gc_radiobutton_clicked), (gpointer)i);
	}
	g_signal_emit_by_name(GTK_OBJECT(gc_radiobutton[np2cfg.grcg & 3]), "clicked");

	/*
	 * Use 16 colors
	 */
	chip_enable_color16_checkbutton = gtk_check_button_new_with_label("Enable 16color (PC-9801-24)");
	gtk_widget_show(chip_enable_color16_checkbutton);
	gtk_box_pack_start(GTK_BOX(main_widget), chip_enable_color16_checkbutton, FALSE, FALSE, 2);
	if (np2cfg.color16) {
		g_signal_emit_by_name(GTK_OBJECT(chip_enable_color16_checkbutton), "clicked");
	}

	return main_widget;
}

static GtkWidget*
create_timing_note(void)
{
	GtkWidget *main_widget;
	struct {
		GtkWidget *name_label;
		GtkWidget *clock_scale;
		GtkWidget *clock_label;
	} waitclk[NELEMENTS(timing_waitclock_str)];
	GtkWidget *realpal_label;
	GtkWidget *realpal_scale;
	int i;

	main_widget = gtk_table_new(5, 5, FALSE);
	gtk_widget_show(main_widget);

	for (i = 0; i < NELEMENTS(timing_waitclock_str); i++) {
		waitclk[i].name_label = gtk_label_new(timing_waitclock_str[i]);
		gtk_widget_show(waitclk[i].name_label);
		gtk_table_attach(GTK_TABLE(main_widget), waitclk[i].name_label,
		    0, 1, i, i + 1,
		    GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 10, 0);

		timing_waitclock_adj[i] = gtk_adjustment_new(np2cfg.wait[i * 2], 0.0, 32.0, 1.0, 1.0, 0.0);
		waitclk[i].clock_scale = gtk_hscale_new(GTK_ADJUSTMENT(timing_waitclock_adj[i]));
		gtk_widget_show(waitclk[i].clock_scale);
		gtk_scale_set_default_values(GTK_SCALE(waitclk[i].clock_scale));
		gtk_scale_set_digits(GTK_SCALE(waitclk[i].clock_scale), 0);
		gtk_table_attach_defaults(GTK_TABLE(main_widget),
		    waitclk[i].clock_scale, 1, 4, i, i + 1);

		waitclk[i].clock_label = gtk_label_new("clock");
		gtk_misc_set_alignment(GTK_MISC(waitclk[i].clock_label),
		    0.1, 0.5);
		gtk_widget_show(waitclk[i].clock_label);
		gtk_table_attach_defaults(GTK_TABLE(main_widget),
		    waitclk[i].clock_label, 4, 5, i, i + 1);
	}

	realpal_label = gtk_label_new("RealPalettes Adjust");
	gtk_misc_set_alignment(GTK_MISC(realpal_label), 0.0, 1.0);
	gtk_widget_show(realpal_label);
	gtk_table_attach_defaults(GTK_TABLE(main_widget), realpal_label,
	     0, 5, 3, 4);

	timing_realpal_adj = gtk_adjustment_new(np2cfg.realpal - 32,
	    -32.0, 32.0, 1.0, 1.0, 0.0);
	realpal_scale = gtk_hscale_new(GTK_ADJUSTMENT(timing_realpal_adj));
	gtk_widget_show(realpal_scale);
	gtk_scale_set_default_values(GTK_SCALE(realpal_scale));
	gtk_scale_set_digits(GTK_SCALE(realpal_scale), 0);
	gtk_table_attach_defaults(GTK_TABLE(main_widget), realpal_scale,
	     1, 5, 4, 5);

	return main_widget;
}

void
create_screen_dialog(void)
{
	GtkWidget* screen_dialog;
	GtkWidget *main_widget;
	GtkWidget* screen_notebook;
	GtkWidget* video_note;
	GtkWidget* chip_note;
	GtkWidget* timing_note;
	GtkWidget *confirm_widget;
	GtkWidget *ok_button;
	GtkWidget *cancel_button;

	uninstall_idle_process();

	screen_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(screen_dialog), "Screen option");
	gtk_window_set_position(GTK_WINDOW(screen_dialog), GTK_WIN_POS_CENTER);
	gtk_window_set_modal(GTK_WINDOW(screen_dialog), TRUE);
	gtk_window_set_resizable(GTK_WINDOW(screen_dialog), FALSE);
	gtk_container_set_border_width(GTK_CONTAINER(screen_dialog), 5);

	g_signal_connect(GTK_OBJECT(screen_dialog), "destroy",
	    G_CALLBACK(dialog_destroy), NULL);

	main_widget = gtk_vbox_new(FALSE, 0);
	gtk_widget_show(main_widget);
	gtk_container_add(GTK_CONTAINER(screen_dialog), main_widget);

	screen_notebook = gtk_notebook_new();
	gtk_widget_show(screen_notebook);
	gtk_box_pack_start(GTK_BOX(main_widget),screen_notebook, TRUE, TRUE, 0);

	/* "Video" note */
	video_note = create_video_note();
	gtk_notebook_append_page(GTK_NOTEBOOK(screen_notebook), video_note, gtk_label_new("Video"));

	/* "Chip" note */
	chip_note = create_chip_note();
	gtk_notebook_append_page(GTK_NOTEBOOK(screen_notebook), chip_note, gtk_label_new("Chip"));

	/* "Timing" note */
	timing_note = create_timing_note();
	gtk_notebook_append_page(GTK_NOTEBOOK(screen_notebook), timing_note, gtk_label_new("Timing"));

	/*
	 * OK, Cancel button
	 */
	confirm_widget = gtk_hbox_new(FALSE, 0);
	gtk_container_set_border_width(GTK_CONTAINER(confirm_widget), 2);
	gtk_widget_show(confirm_widget);
	gtk_box_pack_start(GTK_BOX(main_widget), confirm_widget, TRUE, TRUE, 0);

	cancel_button = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
	gtk_widget_show(cancel_button);
	gtk_box_pack_end(GTK_BOX(confirm_widget),cancel_button,FALSE, FALSE, 0);
	GTK_WIDGET_SET_FLAGS(cancel_button, GTK_CAN_DEFAULT);
	g_signal_connect_swapped(GTK_OBJECT(cancel_button), "clicked",
	    G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(screen_dialog));

	ok_button = gtk_button_new_from_stock(GTK_STOCK_OK);
	gtk_widget_show(ok_button);
	gtk_box_pack_end(GTK_BOX(confirm_widget), ok_button, FALSE, FALSE, 0);
	g_signal_connect(GTK_OBJECT(ok_button), "clicked",
	    G_CALLBACK(ok_button_clicked), (gpointer)screen_dialog);
	GTK_WIDGET_SET_FLAGS(ok_button, GTK_CAN_DEFAULT);
	GTK_WIDGET_SET_FLAGS(ok_button, GTK_HAS_DEFAULT);
	gtk_widget_grab_default(ok_button);

	gtk_widget_show_all(screen_dialog);
}
