/* 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){ // グループでない場合 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 { // グループの場合 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)); // まずは全部クリアする 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; // 自分と同じレベルのノードを探す 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; // 自分と同じレベルのノードを探す 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; // 自分と同じレベルのノードを探す 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; // 自分と同じレベルのノードを探す 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); }