/*  selectwm - X11 window manager selector
 *
 *  Copyright (C) 1999-2003  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 <string.h>
#include <gtk/gtk.h>

#include "misc.h"
#include "miscui.h"

void insert_item (config *selectwm_config, const gchar *cmd, const gchar *dsc) {
	GtkTreeIter iter;
	GdkColor color = { 0, 0, 0, 0};
	
	gtk_list_store_append (GTK_LIST_STORE (selectwm_config->model), &iter);

	gtk_list_store_set (GTK_LIST_STORE (selectwm_config->model), &iter, 
			C_ICON, gtk_widget_render_icon (selectwm_config->window, "gtk-execute", GTK_ICON_SIZE_MENU, NULL),
			C_DESC, dsc,
			C_CMD, cmd ,
			C_DEFAULT, FALSE,
			C_COLOR, &color,
			C_EDITABLE, TRUE, -1);
}

typedef struct _browse_data {
	GtkWidget *window;
	GtkWidget *entry;
} browse_data;

static void browse_ok (GtkWidget *w, gpointer data) {
	browse_data *bdata = (browse_data *) data;
	
	gtk_entry_set_text (GTK_ENTRY (bdata->entry), gtk_file_selection_get_filename (GTK_FILE_SELECTION (bdata->window)));
	gtk_widget_destroy (bdata->window);
}

static void browse (GtkWidget *entry) {
	GtkWidget *filew;
	browse_data bdata;
        
        filew = gtk_file_selection_new (_("Select a window manager"));
	gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (filew));
        gtk_window_set_modal (GTK_WINDOW (filew), TRUE);
	g_signal_connect (G_OBJECT (filew), "destroy", G_CALLBACK (gtk_main_quit), filew);
	gtk_window_set_position (GTK_WINDOW (filew), GTK_WIN_POS_MOUSE);

	bdata.window = filew;
	bdata.entry = entry;
	g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (filew)->ok_button), "clicked", G_CALLBACK (browse_ok), &bdata);
        
        g_signal_connect_swapped (G_OBJECT (GTK_FILE_SELECTION (filew)->cancel_button), "clicked", G_CALLBACK (gtk_widget_destroy), GTK_OBJECT (filew));
        
        gtk_widget_show (filew);
	gtk_main ();
}

static void add_edit_gui (GtkWidget **window, GtkWidget **entry1, GtkWidget **entry2, const gchar *title, const gchar *btn) {
	GtkWidget *hbox, *label;
	
	*window = gtk_dialog_new_with_buttons (title, NULL, GTK_DIALOG_MODAL, btn, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_FIND, GTK_RESPONSE_HELP, NULL);
        gtk_window_set_position (GTK_WINDOW (*window), GTK_WIN_POS_CENTER);

	hbox = gtk_hbox_new (FALSE, 0);
	gtk_box_pack_start (GTK_BOX (GTK_DIALOG (*window)->vbox), hbox, FALSE, FALSE, 0);

	*entry2 = gtk_entry_new ();
	gtk_box_pack_start (GTK_BOX (hbox), *entry2, FALSE, FALSE, 0);
	label = gtk_label_new (_(" Description"));
	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);

	hbox = gtk_hbox_new (FALSE, 0);
	gtk_box_pack_start (GTK_BOX (GTK_DIALOG (*window)->vbox), hbox, FALSE, FALSE, 0);
	
	*entry1 = gtk_entry_new ();
	gtk_box_pack_start (GTK_BOX (hbox), *entry1, FALSE, FALSE, 0);
	label = gtk_label_new (_(" Command"));
	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
}

void add_edit (gboolean edit, gpointer data) {
	GtkWidget *window, *entry1, *entry2;
	config * selectwm_config = (config *) data;
	GtkTreeIter iter;
	GtkTreeModel *model;
	gchar *desc, *cmd;
	const gchar *desc2, *cmd2;

	if (edit && !gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (selectwm_config->treeview)), &model, &iter)) return;

	if (edit) {
		add_edit_gui (&window, &entry1, &entry2, _("Edit Item"), GTK_STOCK_OK);
		gtk_tree_model_get (model, &iter, C_CMD, &cmd, C_DESC, &desc , -1);
		gtk_entry_set_text (GTK_ENTRY (entry2), desc);
		gtk_entry_set_text (GTK_ENTRY (entry1), cmd);
		g_free (desc);
		g_free (cmd);
	} else
		add_edit_gui (&window, &entry1, &entry2, _("Add item"), GTK_STOCK_ADD);

	gtk_widget_show_all (window);
retry:
	switch (gtk_dialog_run (GTK_DIALOG (window))) {
		case GTK_RESPONSE_OK:
			cmd2 = gtk_entry_get_text (GTK_ENTRY (entry1));
			desc2 = gtk_entry_get_text (GTK_ENTRY (entry2));
			if (0 == strcmp (cmd2, "") || 0 == strcmp (desc2, "")) goto retry;
			if (edit) gtk_list_store_set (GTK_LIST_STORE (model), &iter, C_DESC, desc2, C_CMD, cmd2, -1);
				else insert_item (selectwm_config, cmd2, desc2);
			break;
		case GTK_RESPONSE_HELP:
			browse (entry1);
			goto retry;
	}
	gtk_widget_destroy (window);
}

void add_item (GtkWidget *w, gpointer data) {
	add_edit (FALSE, data);
}

void edit_item (GtkWidget *w, gpointer data) {
	add_edit (TRUE, data);
}

void delete_item (GtkWidget *w, gpointer data) {
	config *selectwm_config = (config *) data;
	GtkTreeIter iter;
	GtkTreeModel *model;

	if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (selectwm_config->treeview)), &model, &iter)) {
		gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
	}
}

void default_item (GtkWidget *w, gpointer data) {
	GString *buf;
	config *selectwm_config = (config *) data;
	gchar *desc;
	GtkTreeIter iter;
	GtkTreeModel *model;
	
	if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (selectwm_config->treeview)), &model, &iter)) {
		remove_defaultwm (selectwm_config->model);
		set_defaultwm (GTK_LIST_STORE (model), &iter);

		buf = g_string_new ("");
	        gtk_tree_model_get (model, &iter, C_DESC, &desc , -1);
		g_string_printf (buf,_("\"%s\" is now the default window manager"), desc);
		messagebox (buf->str, GTK_MESSAGE_INFO);
		g_free (desc);
		g_string_free (buf, TRUE);
	}
}


syntax highlighted by Code2HTML, v. 0.9.1