/*  selectwm - X11 window manager selector
 *
 *  Copyright (C) 1999-2004  Luc Dufresne - luc@ordiluc.net
 *                           26, rue des Comices
 *                           59650 Villeneuve d'Ascq
 *                           FRANCE
 *
 *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  See the file COPYING
 */

#include "define.h"

#include <gtk/gtk.h>

#include "misc.h"
#include "callbacks.h"

void messagebox (const gchar *msg, GtkMessageType  type) {
	GtkWidget *dialog;
	dialog = gtk_message_dialog_new ( NULL , GTK_DIALOG_MODAL, type, GTK_BUTTONS_CLOSE, msg);

	g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (gtk_widget_destroy), NULL);
	gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
	gtk_widget_show (dialog);
}

gint askbox (const gchar *msg) {
	GtkWidget *dialog;
	gint i;
	
	dialog = gtk_message_dialog_new ( NULL , GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, msg);
	gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
	i = gtk_dialog_run (GTK_DIALOG (dialog));
	gtk_widget_destroy (dialog);
	return i;
}

void set_defaultwm (GtkListStore *store, GtkTreeIter *iter) {
	GdkColor color = { 0, 0, 0, 0xFFFF };
	gtk_list_store_set (store, iter,
			C_DEFAULT, TRUE,
			C_COLOR, &color, -1); 
}

void remove_defaultwm (GtkTreeModel *model) {
	GdkColor color = { 0, 0, 0, 0};
	GtkTreeIter iter;

	gtk_tree_model_get_iter_first (model, &iter);
	do {
			gtk_list_store_set (GTK_LIST_STORE (model), &iter,
			C_DEFAULT, FALSE,
			C_COLOR, &color, -1);
	} while (gtk_tree_model_iter_next (model, &iter));
}

static void make_edit_config_window (GtkWidget *w, gpointer data) {
	GtkWidget *window, *hbox, *vbox, *vbox2, *win_vbox, *spin, *label, *radio1, *radio2, *radio3, *frame, *btn, *bbox, *notebook;
	GtkObject *adj;
	config *selectwm_config = (config *) data;
	ch_options choptions;
	
	gtk_timeout_remove (selectwm_config->timer);
	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
	gtk_window_set_modal (GTK_WINDOW (window), TRUE);
	g_signal_connect (G_OBJECT (window), "destroy",
		  G_CALLBACK (gtk_main_quit),
		  &window);
	gtk_window_set_title (GTK_WINDOW (window), _("Preferences"));
	gtk_container_set_border_width (GTK_CONTAINER (window), 5);
	gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
	gtk_window_set_resizable (GTK_WINDOW (window), 0);

	win_vbox = gtk_vbox_new (FALSE , 0);
	gtk_container_add (GTK_CONTAINER (window), win_vbox);
	
	notebook = gtk_notebook_new ();

	gtk_container_add (GTK_CONTAINER (win_vbox), notebook);

	/*  page de configuration  */

	frame = gtk_frame_new (NULL);
	gtk_container_set_border_width (GTK_CONTAINER (frame), 5);	
	gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, gtk_label_new (_("Config")));
	
	vbox = gtk_vbox_new (FALSE, 5);
	gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);		
	gtk_container_add (GTK_CONTAINER (frame), vbox);
	
	hbox = gtk_hbox_new (FALSE, 5);
	gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);

	adj = gtk_adjustment_new (selectwm_config->delay, 0.0, 3600.0, 0.1, 1.0, 0.0);
	spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1.0, 1);	
	gtk_box_pack_start (GTK_BOX (hbox), spin, FALSE, FALSE, 0);
	
	label = gtk_label_new (_("Timeout in seconds (0 = infinite)"));
	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);

	frame = gtk_frame_new (_("\"Go back...\" button"));
	gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
	
	vbox2 = gtk_vbox_new (FALSE, 0);
	gtk_container_set_border_width (GTK_CONTAINER (vbox2), 5);		
	gtk_container_add (GTK_CONTAINER (frame), vbox2);
	
	label = gtk_label_new (_("State of the \"Go back to selectwm when\nthe WM exits\" button when selectwm starts"));
	gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, FALSE, 0);

	radio1 = gtk_radio_button_new_with_mnemonic (NULL,_("_Checked"));
	g_signal_connect (G_OBJECT (radio1), "clicked", G_CALLBACK (gob1_callback), selectwm_config);
	radio2 = gtk_radio_button_new_with_mnemonic (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio1)),_("_Not checked"));
	g_signal_connect (G_OBJECT (radio2), "clicked", G_CALLBACK (gob2_callback), selectwm_config);
	radio3 = gtk_radio_button_new_with_mnemonic (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio2)),_("_Remember last state"));
	g_signal_connect (G_OBJECT (radio3), "clicked", G_CALLBACK (gob3_callback), selectwm_config);

	switch (selectwm_config->goback_btn) {
		case 1:
			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio1), TRUE);
			break;
		case 2:
			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio2), TRUE);
			break;
		case 3:
			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio3), TRUE);
			break;
	}
	
	gtk_box_pack_start (GTK_BOX (vbox2), radio1, TRUE, TRUE, 0);
	gtk_box_pack_start (GTK_BOX (vbox2), radio2, TRUE, TRUE, 0);
	gtk_box_pack_start (GTK_BOX (vbox2), radio3, TRUE, TRUE, 0);
	
	/*   page 'about'   */

	frame = gtk_frame_new (NULL);
	gtk_container_set_border_width (GTK_CONTAINER (frame), 5);	
	gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, gtk_label_new (_("About")));

	hbox = gtk_hbox_new (FALSE, 0);
	gtk_container_add (GTK_CONTAINER (frame), hbox);

	gtk_box_pack_start (GTK_BOX (hbox),
			gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG),
			TRUE, TRUE, 0);
	
	label = gtk_label_new (""PACKAGE" "VERSION"\nhttp://ordiluc.net/selectwm/\n\nCopyright (c) 1999-2004\nLuc Dufresne <luc@ordiluc.net>");
	gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_CENTER);
	gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);

	bbox = gtk_hbutton_box_new ();
	gtk_box_pack_start (GTK_BOX (win_vbox), bbox, FALSE, FALSE, 0);
	gtk_container_set_border_width (GTK_CONTAINER (bbox), 10);
	gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_SPREAD );
	btn = gtk_button_new_from_stock (GTK_STOCK_OK);
	choptions.window = window;
	choptions.spin = spin;
	choptions.selectwm_config = selectwm_config;
	g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK(change_options), &choptions);
	GTK_WIDGET_SET_FLAGS (btn, GTK_CAN_DEFAULT);
	gtk_container_add (GTK_CONTAINER (bbox), btn);
	gtk_widget_grab_default (btn);
	btn = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
	g_signal_connect_swapped (G_OBJECT (btn), "clicked", G_CALLBACK(gtk_widget_destroy), window);
	gtk_container_add (GTK_CONTAINER (bbox), btn);

	GTK_WIDGET_SET_FLAGS (btn, GTK_CAN_DEFAULT);

	gtk_widget_show_all (win_vbox);
	gtk_widget_show (window);
	gtk_main ();
}

void cell_edited (GtkCellRendererText *cell, const gchar *path_string, const gchar *new_text, gpointer data)
{
	GtkTreeModel *model = (GtkTreeModel *) data;
	GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
	GtkTreeIter iter;
	gchar *old_text;

	gint *column;

	column = g_object_get_data (G_OBJECT (cell), "column");
	gtk_tree_model_get_iter (model, &iter, path);
	
	gtk_tree_model_get (model, &iter, column, &old_text, -1);
	g_free (old_text);

	gtk_list_store_set (GTK_LIST_STORE (model), &iter, column, new_text, -1);
	gtk_tree_path_free (path);
}

static void add_columns (config *selectwm_config) {
	GtkCellRenderer *renderer;
	GtkTreeViewColumn *column;

	renderer = gtk_cell_renderer_pixbuf_new ();
	column = gtk_tree_view_column_new_with_attributes (NULL, renderer, "pixbuf", C_ICON, NULL);
	gtk_tree_view_append_column (GTK_TREE_VIEW (selectwm_config->treeview), column);
	
	renderer = gtk_cell_renderer_text_new ();
	g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (cell_edited), selectwm_config->model);
	column = gtk_tree_view_column_new_with_attributes (NULL, renderer, "text", C_DESC, "editable", C_EDITABLE, "foreground-gdk", C_COLOR, NULL);
	g_object_set_data (G_OBJECT (renderer), "column", (gint *) C_DESC);
	gtk_tree_view_append_column (GTK_TREE_VIEW (selectwm_config->treeview), column);
}	

GtkWidget * make_main_window (config *selectwm_config) {
	GtkWidget *scroll, *vbox, *hbox, *confbtn, *quitbtn, *restart;
	
	selectwm_config->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title (GTK_WINDOW (selectwm_config->window), ""PACKAGE" "VERSION"");
	g_signal_connect (G_OBJECT (selectwm_config->window), "destroy", G_CALLBACK (quit_selectwm), selectwm_config);
	
	gtk_container_set_border_width (GTK_CONTAINER (selectwm_config->window), 2);
	gtk_window_set_position (GTK_WINDOW (selectwm_config->window), GTK_WIN_POS_CENTER);
	
	vbox = gtk_vbox_new (FALSE, 0);
	gtk_container_add (GTK_CONTAINER (selectwm_config->window), vbox);

	scroll = gtk_scrolled_window_new (NULL, NULL);
	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_IN);

	gtk_box_pack_start (GTK_BOX (vbox), scroll, TRUE, TRUE, 0);
	gtk_widget_show (scroll);
	gtk_widget_set_size_request (scroll, 150, 150);
	
	selectwm_config->model = GTK_TREE_MODEL (gtk_list_store_new (N_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, GDK_TYPE_COLOR, G_TYPE_BOOLEAN));
	selectwm_config->treeview = gtk_tree_view_new_with_model (selectwm_config->model);
	gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (selectwm_config->treeview), TRUE);
	gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (selectwm_config->treeview), FALSE);
	gtk_tree_view_set_reorderable (GTK_TREE_VIEW (selectwm_config->treeview), TRUE);
	gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (selectwm_config->treeview)), GTK_SELECTION_SINGLE);
	add_columns (selectwm_config);
	g_signal_connect (G_OBJECT (selectwm_config->treeview), "button_press_event", G_CALLBACK (list_click), selectwm_config);
	g_signal_connect (G_OBJECT (selectwm_config->treeview), "key_press_event", G_CALLBACK (list_enter), selectwm_config);
	gtk_container_add (GTK_CONTAINER (scroll), selectwm_config->treeview);
	
	selectwm_config->label = gtk_label_new ("");
	gtk_box_pack_start (GTK_BOX (vbox), selectwm_config->label, FALSE, FALSE, 0);

	restart = gtk_check_button_new_with_mnemonic (_("_Go back to selectwm\nwhen the WM exits"));
	gtk_box_pack_start (GTK_BOX (vbox), restart, FALSE, FALSE, 0);

	g_signal_connect (G_OBJECT (restart), "toggled", G_CALLBACK(goback_callback), selectwm_config);
	
	hbox = gtk_hbox_new (FALSE, 0);
	gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
	gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);

	quitbtn = gtk_button_new_from_stock (GTK_STOCK_QUIT);
	g_signal_connect (G_OBJECT (quitbtn), "clicked", G_CALLBACK (quit_selectwm), selectwm_config);
	gtk_box_pack_start (GTK_BOX (hbox), quitbtn, TRUE, TRUE, 2);
	confbtn = gtk_button_new_from_stock (GTK_STOCK_PREFERENCES);
	g_signal_connect (G_OBJECT (confbtn), "clicked", G_CALLBACK (make_edit_config_window), selectwm_config);
	gtk_box_pack_start (GTK_BOX (hbox), confbtn, TRUE, TRUE, 2);

	gtk_widget_show_all (vbox);

	return restart;
}


syntax highlighted by Code2HTML, v. 0.9.1