/*  Copyright (C) 2001-2002  Kenichi Suto
 *
 *  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.
*/

#include "defs.h"
#include "global.h"

#include "websearch.h"


static GtkWidget *web_dlg;
static GtkWidget *ctree_web;
static GtkWidget *entry_group_name;
static GtkWidget *entry_engine_name;
static GtkWidget *entry_engine_home;
static GtkWidget *entry_engine_pre;
static GtkWidget *entry_engine_post;
static GtkWidget *entry_engine_glue;
static GtkWidget *combo_charcode;
static GtkCTreeNode *current_node=NULL;

GList *web_list = NULL;

extern GtkWidget *web_pane;


void print_weblist()
{
	GList *group_item;
	GList *member_item;
	WEB_GROUP *group;
	WEB_MEMBER *member;

	g_print("\n*** web group information ***\n");

        group_item = g_list_first(web_list);
	while(group_item != NULL){
		g_print("* GROUP *\n");
		group = (WEB_GROUP *)(group_item->data);
		if(group == NULL) {
			g_print("error : data is NULL\n");
			continue;
		}		
		g_print("name = %s\n", group->name);
		member_item = group->member;
		while(member_item != NULL){
			g_print("* MEMBER *\n");
			member = (WEB_MEMBER *)(member_item->data);
			if(member == NULL) {
				g_print("error : data is NULL\n");
				continue;
			}
			printf("name = %s\n", member->name);
			printf("home = %s\n", member->home);
			printf("pre = %s\n", member->pre);
			printf("post = %s\n", member->post);
			printf("glue = %s\n", member->glue);
			printf("charcode = %s\n", member->charcode);
			member_item = g_list_next(member_item);
		}
		printf("\n");

		group_item = g_list_next(group_item);
	}

	g_print("\n*** end ***\n");
}


static void recursive_func(GtkCTree *ctree, GtkCTreeNode *node, gpointer data)
{
	gchar *text;
	gboolean is_leaf;
	GList *item;
	WEB_GROUP *group;
	WEB_MEMBER *member;

	gtk_ctree_get_node_info(ctree, node, &text, NULL, NULL, NULL, NULL, NULL, &is_leaf, NULL);

	if(is_leaf == TRUE){
		// $B%0%k!<%W$G$J$$>l9g(B
		member = gtk_ctree_node_get_row_data(GTK_CTREE(ctree_web), node);
		item = g_list_last(web_list);
		group = (WEB_GROUP *)(item->data);
		group->member = g_list_append(group->member, member);
	} else {
		// $B%0%k!<%W$N>l9g(B
		group = gtk_ctree_node_get_row_data(GTK_CTREE(ctree_web), node);
		g_list_free(group->member);
		group->member = NULL;
		web_list = g_list_append(web_list, group);
		
	}

}


static void ok_web(GtkWidget *widget,gpointer *data){
	GtkWidget *parent;


	g_list_free(web_list);
	web_list = NULL;

	gtk_ctree_pre_recursive(GTK_CTREE(ctree_web),  NULL, recursive_func, NULL);

	gtk_grab_remove(web_dlg);
	gtk_widget_destroy(GTK_WIDGET(web_dlg));

	save_weblist();


	parent = web_tree->parent;

	gtk_container_remove(GTK_CONTAINER(parent), web_tree);
	if(GTK_IS_WIDGET(web_tree))
		gtk_widget_destroy(web_tree);
	web_tree = create_web_tree();
	gtk_widget_set_usize(GTK_WIDGET(web_tree), 200, 350);
	gtk_container_add(GTK_CONTAINER(parent), web_tree);
	gtk_widget_show_all(web_tree);


}

static void delete_event( GtkWidget *widget,
		   GdkEvent  *event,
		   gpointer   data )
{
	save_weblist();
}

static void clear_group(GtkCTree *ctree, GtkCTreeNode *list){
	gtk_ctree_remove_node(GTK_CTREE(ctree),list);
}


static void show_group_tree()
{

	WEB_GROUP *group;
	WEB_MEMBER *member;
	char *text[1];
	GtkCTreeNode *node=NULL, *leaf=NULL;
	GList *member_item;
	GList *group_item;

	gtk_clist_freeze(GTK_CLIST(ctree_web));

	// $B$^$:$OA4It%/%j%"$9$k(B

	while(1){
		node = gtk_ctree_node_nth(GTK_CTREE(ctree_web), 0);
		if(node == NULL)
			break;
		gtk_ctree_post_recursive(GTK_CTREE(ctree_web), 
					 node, 
					 (GtkCTreeFunc)clear_group, 
					 NULL);

	}

	group_item = g_list_first(web_list);
	while(group_item != NULL){
		group = (WEB_GROUP *)(group_item->data);

		text[0] = group->name;

		node = gtk_ctree_insert_node(GTK_CTREE(ctree_web), 
				      NULL, //parent
				      NULL, //sibling
				      text, //text
				      0,    //spacing
				      NULL, NULL,
				      NULL, NULL,
				      FALSE,//is leaf
				      TRUE);//expanded
		gtk_ctree_node_set_row_data(GTK_CTREE(ctree_web), node, group_item->data);
		leaf = NULL;

		member_item = ((WEB_GROUP *)(group_item->data))->member;
		while(member_item != NULL){
			member = (WEB_MEMBER *)(member_item->data);
			text[0] = member->name;
			leaf = gtk_ctree_insert_node(GTK_CTREE(ctree_web), 
					      node, //parent
					      NULL, //sibling
					      text, //text
					      0,    //spacing
					      NULL, NULL,
					      NULL, NULL,
					      TRUE,//is leaf
					      TRUE);//expanded

			gtk_ctree_node_set_row_data(GTK_CTREE(ctree_web), leaf, member);
			member_item = g_list_next(member_item);
		}
		group_item = g_list_next(group_item);
	}

	gtk_clist_thaw(GTK_CLIST(ctree_web));
}



static void add_group(GtkWidget *widget,gpointer *data)
{
	char *name;
	char *text[1];
	WEB_GROUP *group;
	GtkCTreeNode *node;


	name = gtk_entry_get_text(GTK_ENTRY(entry_group_name));
	remove_space(name);
	if(strlen(name) == 0){
	  return;
	}
	text[0] = name;


	group = (WEB_GROUP *)calloc(sizeof(WEB_GROUP), 1);
	group->name = strdup(name);
	web_list = g_list_append(web_list, group);

	node = gtk_ctree_insert_node(GTK_CTREE(ctree_web), 
				     NULL, //parent
				     NULL, //sibling
				     text, //text
				     0,    //spacing
				     NULL, NULL,
				     NULL, NULL,
				     FALSE,//is leaf
				     TRUE);//expanded
	gtk_ctree_node_set_row_data(GTK_CTREE(ctree_web), node, group);

	gtk_entry_set_text(GTK_ENTRY(entry_group_name), "");
	
}

static void remove_item(GtkWidget *widget, gpointer *data)
{
	GtkCTreeRow *row;

	if(current_node == NULL){
		warning(_("Please select group."));
		return;
	}

	row = GTK_CTREE_ROW(current_node);
	g_assert(row != NULL);

	if(row->is_leaf){
		gtk_ctree_remove_node(GTK_CTREE(ctree_web), current_node);
	} else {
		gtk_ctree_remove_node(GTK_CTREE(ctree_web), current_node);
	}

	return;
}

static void up_item(GtkWidget *widget,gpointer *data)
{
	GtkCTreeRow *row;
	GtkCTreeNode *previous;
	GtkCTreeNode *parent;


	if(current_node == NULL){
		warning(_("Please select group."));
		return;
	}

	row = GTK_CTREE_ROW(current_node);
	g_assert(row != NULL);

	if(row->is_leaf){
			parent = row->parent;
		// $B<+J,$HF1$8%l%Y%k$N%N!<%I$rC5$9(B
		previous = GTK_CTREE_NODE_PREV(current_node);
		while(previous){
			if((GTK_CTREE_ROW(previous))->parent == parent)
				break;
			previous = GTK_CTREE_NODE_PREV(previous);
		}

		if(previous != NULL){
			gtk_ctree_move(GTK_CTREE(ctree_web), 
					      current_node,
					      parent,
					      previous);
		}
	} else {
		parent = row->parent;
		// $B<+J,$HF1$8%l%Y%k$N%N!<%I$rC5$9(B
		previous = GTK_CTREE_NODE_PREV(current_node);
		while(previous){
			if((GTK_CTREE_ROW(previous))->parent == parent)
				break;
			previous = GTK_CTREE_NODE_PREV(previous);
		}

		if(previous != NULL){
			gtk_ctree_move(GTK_CTREE(ctree_web), 
					      current_node,
					      parent,
					      previous);
		}
	}

	return;
}

static void down_item(GtkWidget *widget,gpointer *data)
{
	GtkCTreeRow *row;
	GtkCTreeNode *next;
	GtkCTreeNode *parent;

	if(current_node == NULL){
		warning(_("Please select group."));
		return;
	}

	row = GTK_CTREE_ROW(current_node);
	g_assert(row != NULL);

	if(row->is_leaf){
		parent = row->parent;
		// $B<+J,$HF1$8%l%Y%k$N%N!<%I$rC5$9(B
		next = GTK_CTREE_NODE_NEXT(current_node);
		while(next){
			if((GTK_CTREE_ROW(next))->parent == parent)
				break;
			next = GTK_CTREE_NODE_NEXT(next);
		}

		if(next != NULL){
			gtk_ctree_move(GTK_CTREE(ctree_web), 
					      next,
					      parent,
					      current_node);
		}
	} else {
		parent = row->parent;
		// $B<+J,$HF1$8%l%Y%k$N%N!<%I$rC5$9(B
		next = GTK_CTREE_NODE_NEXT(current_node);
		while(next){
			if((GTK_CTREE_ROW(next))->parent == parent)
				break;
			next = GTK_CTREE_NODE_NEXT(next);
		}

		if(next != NULL){
			gtk_ctree_move(GTK_CTREE(ctree_web), 
					      next,
					      parent,
					      current_node);
		}
	}

	return;
}

static void add_engine(GtkWidget *widget,gpointer *data)
{
	char *text[1];

	GtkCTreeRow *row;
	GtkCTreeNode *node;

	WEB_MEMBER *member;
	WEB_GROUP *group;
	GList *member_item;
	gchar *name;
	gchar *home;
	gchar *pre;
	gchar *post;
	gchar *glue;
	gchar *charcode;


	name = gtk_entry_get_text(GTK_ENTRY(entry_engine_name));
	home = gtk_entry_get_text(GTK_ENTRY(entry_engine_home));
	pre = gtk_entry_get_text(GTK_ENTRY(entry_engine_pre));
	post = gtk_entry_get_text(GTK_ENTRY(entry_engine_post));
	glue = gtk_entry_get_text(GTK_ENTRY(entry_engine_glue));
	charcode = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo_charcode)->entry));


	if(current_node == NULL){
		warning(_("Please select group."));
		return;
	}

	node = current_node;
	row = GTK_CTREE_ROW(node);
	g_assert(row != NULL);

	if(row->is_leaf){
		group = gtk_ctree_node_get_row_data(GTK_CTREE(ctree_web), row->parent);		
	} else {
		group = gtk_ctree_node_get_row_data(GTK_CTREE(ctree_web), node); 
	}

	member_item = g_list_first(group->member);
	while(member_item){
		member = (WEB_MEMBER *)(member_item->data);
		if(strcmp(member->name, name) == 0){
			warning(_("Already in member."));
			return;
		}
		member_item = g_list_next(member_item);
	}

	member = (WEB_MEMBER *)calloc(sizeof(WEB_MEMBER), 1);
	member->name = strdup(name);
	member->home = strdup(home);
	member->pre = strdup(pre);
	member->post = strdup(post);
	member->glue = strdup(glue);
	member->charcode = strdup(charcode);

	text[0] = name;
	if(row->is_leaf){
		node = gtk_ctree_insert_node(GTK_CTREE(ctree_web), 
				      row->parent, //parent
				      NULL, //sibling
				      text, //text
				      0,    //spacing
				      NULL, NULL,
				      NULL, NULL,
				      TRUE,//is leaf
				      TRUE);//expanded


	} else {
		node = gtk_ctree_insert_node(GTK_CTREE(ctree_web), 
				      current_node, //parent
				      NULL, //sibling
				      text, //text
				      0,    //spacing
				      NULL, NULL,
				      NULL, NULL,
				      TRUE,//is leaf
				      TRUE);//expanded
	}

	gtk_ctree_node_set_row_data(GTK_CTREE(ctree_web), node, member);

	gtk_ctree_expand(GTK_CTREE(ctree_web), (GTK_CTREE_ROW(node))->parent);

}


static void down_engine(GtkWidget *widget,gpointer *data)
{
	GtkCTreeRow *row;
	GtkCTreeNode *next;
	GtkCTreeNode *parent;

	if(current_node == NULL){
		warning(_("Please select group."));
		return;
	}

	row = GTK_CTREE_ROW(current_node);
	g_assert(row != NULL);

	if(row->is_leaf){
	} else {
		return;
	}

	return;
}


static void ctree_web_select_row(GtkWidget *widget,
			       gint row, 
			       gint column, 
			       GdkEventButton *bevent,
			       gpointer user_data)
{

	GtkCTreeNode *node;
	WEB_MEMBER *member;
	GtkCTreeRow *r;

	node = gtk_ctree_node_nth(GTK_CTREE(ctree_web), row);
	current_node = node;

	r = GTK_CTREE_ROW(node);
	g_assert(r != NULL);

	if(r->is_leaf){
		member = gtk_ctree_node_get_row_data(GTK_CTREE(ctree_web), node);
		gtk_entry_set_text(GTK_ENTRY(entry_engine_name), member->name);
		gtk_entry_set_text(GTK_ENTRY(entry_engine_home), member->home);
		gtk_entry_set_text(GTK_ENTRY(entry_engine_pre), member->pre);
		gtk_entry_set_text(GTK_ENTRY(entry_engine_post), member->post);
		gtk_entry_set_text(GTK_ENTRY(entry_engine_glue), member->glue);
		gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo_charcode)->entry), member->charcode);
	} else {
	}

}

static void change_engine(GtkWidget *widget, gpointer *data)
{

	GtkCTreeNode *node;
	GtkCTreeRow *row;
	WEB_MEMBER *member;
	gchar *name;
	gchar *home;
	gchar *pre;
	gchar *post;
	gchar *glue;
	gchar *charcode;


	if(current_node == NULL){
		warning(_("Please select group."));
		return;
	}

	node = current_node;

	row = GTK_CTREE_ROW(node);
	g_assert(row != NULL);

	if(row->is_leaf){
		member = gtk_ctree_node_get_row_data(GTK_CTREE(ctree_web), node);
		free(member->name);
		free(member->home);
		free(member->pre);
		free(member->post);
		free(member->glue);
		free(member->charcode);

		name = gtk_entry_get_text(GTK_ENTRY(entry_engine_name));
		home = gtk_entry_get_text(GTK_ENTRY(entry_engine_home));
		pre = gtk_entry_get_text(GTK_ENTRY(entry_engine_pre));
		post = gtk_entry_get_text(GTK_ENTRY(entry_engine_post));
		glue = gtk_entry_get_text(GTK_ENTRY(entry_engine_glue));
		charcode = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo_charcode)->entry));

		member->name = strdup(name);
		member->home = strdup(home);
		member->pre = strdup(pre);
		member->post = strdup(post);
		member->glue = strdup(glue);
		member->charcode = strdup(charcode);

		gtk_ctree_node_set_text(GTK_CTREE(ctree_web), node, 0, name);

	}

}


void preference_weblist()
{
	GtkWidget *button;
	GtkWidget *hbox;
	GtkWidget *hbox2;
	GtkWidget *vbox;
	GtkWidget *label;
	GtkWidget *frame;
	GtkWidget *scroll;
	GtkWidget *table;
	GtkAttachOptions xoption, yoption;
	GList *charcode_list=NULL;


	web_dlg = gtk_dialog_new();
	gtk_window_set_position(GTK_WINDOW(web_dlg), GTK_WIN_POS_CENTER_ALWAYS);

	gtk_signal_connect (GTK_OBJECT (web_dlg), "delete_event",
			    GTK_SIGNAL_FUNC (delete_event), NULL);

	
	gtk_grab_add(web_dlg);
	gtk_widget_realize(web_dlg);

	button = gtk_button_new_with_label(_("Ok"));
	GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
	gtk_box_pack_start (GTK_BOX (GTK_DIALOG (web_dlg)->action_area), button,
			    TRUE, TRUE, 0);

	gtk_signal_connect (GTK_OBJECT (button), "clicked",
			    GTK_SIGNAL_FUNC (ok_web), (gpointer)NULL);
	gtk_widget_grab_default (button);


	hbox = gtk_hbox_new(FALSE,0);
	gtk_container_border_width(GTK_CONTAINER(hbox), 5);

	gtk_box_pack_start (GTK_BOX(GTK_DIALOG(web_dlg)->vbox)
			    , hbox,TRUE, TRUE, 0);



	frame = gtk_frame_new(_("Search engines"));
	gtk_box_pack_start (GTK_BOX(hbox), frame,TRUE, TRUE, 5);

	vbox = gtk_vbox_new(FALSE,0);
	gtk_container_border_width(GTK_CONTAINER(vbox), 5);
	gtk_container_add(GTK_CONTAINER(frame), vbox);


	scroll = gtk_scrolled_window_new (NULL, NULL);
	gtk_box_pack_start (GTK_BOX(vbox)
			    , scroll,TRUE, TRUE, 0);
	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
					GTK_POLICY_AUTOMATIC,
					GTK_POLICY_AUTOMATIC);


	ctree_web = gtk_ctree_new(1, 0);
//	gtk_clist_set_reorderable(GTK_CLIST(ctree_web), TRUE);
	gtk_widget_set_usize(ctree_web,300, 300);
	gtk_container_add (GTK_CONTAINER (scroll), ctree_web);
	gtk_signal_connect (GTK_OBJECT (ctree_web), "select_row",
			    (GtkSignalFunc) ctree_web_select_row, NULL);


	show_group_tree();


	hbox2 = gtk_hbox_new(FALSE,5);
	gtk_container_border_width(GTK_CONTAINER(hbox2), 2);
	gtk_box_pack_start (GTK_BOX(vbox)
			    , hbox2,FALSE, FALSE, 0);

	label = gtk_label_new(_("Group name"));
	gtk_box_pack_start (GTK_BOX(hbox2)
			    , label,FALSE, FALSE, 2);

	entry_group_name = gtk_entry_new();
	gtk_box_pack_start (GTK_BOX(hbox2)
			    , entry_group_name,TRUE, TRUE, 0);

	button = gtk_button_new_with_label(_("Add"));
	gtk_box_pack_start (GTK_BOX(hbox2)
			    , button,FALSE,FALSE, 0);
	gtk_signal_connect (GTK_OBJECT (button), "clicked",
			    GTK_SIGNAL_FUNC (add_group), (gpointer)button);

	hbox2 = gtk_hbox_new(FALSE,5);
	gtk_container_border_width(GTK_CONTAINER(hbox2), 2);
	gtk_box_pack_start (GTK_BOX(vbox)
			    , hbox2,FALSE, FALSE, 0);

	button = gtk_button_new_with_label(_("Remove"));
	gtk_box_pack_start (GTK_BOX(hbox2)
			    , button,FALSE,FALSE, 0);
	gtk_signal_connect (GTK_OBJECT (button), "clicked",
			    GTK_SIGNAL_FUNC (remove_item), (gpointer)button);

	button = gtk_button_new_with_label(_("Up"));
	gtk_box_pack_start (GTK_BOX(hbox2)
			    , button,FALSE,FALSE, 0);
	gtk_signal_connect (GTK_OBJECT (button), "clicked",
			    GTK_SIGNAL_FUNC (up_item), (gpointer)button);

	button = gtk_button_new_with_label(_("Down"));
	gtk_box_pack_start (GTK_BOX(hbox2)
			    , button,FALSE,FALSE, 0);
	gtk_signal_connect (GTK_OBJECT (button), "clicked",
			    GTK_SIGNAL_FUNC (down_item), (gpointer)button);

	vbox = gtk_vbox_new(FALSE,0);
	gtk_box_pack_start (GTK_BOX(hbox)
			    , vbox, TRUE, TRUE, 0);



	frame = gtk_frame_new(_("Search engine"));
	gtk_box_pack_start (GTK_BOX(hbox), frame,TRUE, TRUE, 5);

	vbox = gtk_vbox_new(FALSE,0);
	gtk_container_border_width(GTK_CONTAINER(vbox), 5);
	gtk_container_add(GTK_CONTAINER(frame), vbox);


	xoption = GTK_EXPAND | GTK_SHRINK;
	yoption = GTK_EXPAND | GTK_SHRINK;

	table = gtk_table_new(6, 2, FALSE);
	gtk_box_pack_start (GTK_BOX(vbox)
			    , table,FALSE, FALSE, 0);

	label = gtk_label_new(_("Name"));
	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, 
			 xoption, yoption, 5, 5);

	entry_engine_name = gtk_entry_new();
	gtk_widget_set_usize(entry_engine_name,250,20);
	gtk_table_attach(GTK_TABLE(table), entry_engine_name, 1, 2, 0, 1,
			 xoption, yoption, 5, 5);	



	label = gtk_label_new(_("Homepage"));
	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
			 xoption, yoption, 5, 5);

	entry_engine_home = gtk_entry_new();
	gtk_widget_set_usize(entry_engine_home,250,20);
	gtk_table_attach(GTK_TABLE(table), entry_engine_home, 1, 2, 1, 2,
			 xoption, yoption, 5, 5);

	label = gtk_label_new(_("Pre string"));
	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3,
			 xoption, yoption, 5, 5);

	entry_engine_pre = gtk_entry_new();
	gtk_widget_set_usize(entry_engine_pre,250,20);
	gtk_table_attach(GTK_TABLE(table), entry_engine_pre, 1, 2, 2, 3,
			 xoption, yoption, 5, 5);

	label = gtk_label_new(_("Post string"));
	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4,
			 xoption, yoption, 5, 5);

	entry_engine_post = gtk_entry_new();
	gtk_widget_set_usize(entry_engine_post,250,20);
	gtk_table_attach(GTK_TABLE(table), entry_engine_post, 1, 2, 3, 4,
			 xoption, yoption, 5, 5);

	label = gtk_label_new(_("Glue string"));
	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 4, 5,
			 xoption, yoption, 5, 5);

	entry_engine_glue = gtk_entry_new();
	gtk_widget_set_usize(entry_engine_glue,250,20);
	gtk_table_attach(GTK_TABLE(table), entry_engine_glue, 1, 2, 4, 5,
			 xoption, yoption, 5, 5);

	label = gtk_label_new(_("Character Code"));
	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 5, 6,
			 xoption, yoption, 5, 5);

	combo_charcode = gtk_combo_new();
//	gtk_widget_set_usize(GTK_WIDGET(combo_charcode), 250, 20);
	gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(combo_charcode)->entry), FALSE);
	gtk_table_attach(GTK_TABLE(table), combo_charcode, 1, 2, 5, 6,
			 xoption, yoption, 5, 5);

	charcode_list = g_list_append(charcode_list, "euc-jp");
	charcode_list = g_list_append(charcode_list, "shift_jis");
	charcode_list = g_list_append(charcode_list, "iso-2022-jp");
	charcode_list = g_list_append(charcode_list, "utf-8");
	gtk_combo_set_popdown_strings( GTK_COMBO(combo_charcode), 
				       charcode_list) ;


	hbox2 = gtk_hbox_new(FALSE,5);
	gtk_container_border_width(GTK_CONTAINER(hbox2), 5);
	gtk_box_pack_start (GTK_BOX(vbox)
			    , hbox2,FALSE, FALSE, 0);


	button = gtk_button_new_with_label(_("Add"));
	gtk_box_pack_start(GTK_BOX(hbox2)
			    , button,FALSE,FALSE, 0);
	gtk_signal_connect (GTK_OBJECT (button), "clicked",
			    GTK_SIGNAL_FUNC (add_engine), (gpointer)button);

	button = gtk_button_new_with_label(_("Change"));
	gtk_box_pack_start(GTK_BOX(hbox2)
			    , button,FALSE,FALSE, 0);
	gtk_signal_connect (GTK_OBJECT (button), "clicked",
			    GTK_SIGNAL_FUNC (change_engine), (gpointer)button);

	gtk_widget_show_all(web_dlg);

}



syntax highlighted by Code2HTML, v. 0.9.1