/* 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