new newsgroups dialog box
This commit is contained in:
parent
278b0f58a7
commit
cfc0223165
3 changed files with 221 additions and 74 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2001-11-18 [hoa] 0.6.4claws21
|
||||||
|
|
||||||
|
* src/grouplistdialog.c
|
||||||
|
a new newsgroups list selection dialog box
|
||||||
|
with a CTree instead of a CList
|
||||||
|
|
||||||
2001-11-18 [hoa] 0.6.4claws20
|
2001-11-18 [hoa] 0.6.4claws20
|
||||||
|
|
||||||
* src/folderview.c
|
* src/folderview.c
|
||||||
|
|
|
@ -8,7 +8,7 @@ MINOR_VERSION=6
|
||||||
MICRO_VERSION=4
|
MICRO_VERSION=4
|
||||||
INTERFACE_AGE=0
|
INTERFACE_AGE=0
|
||||||
BINARY_AGE=0
|
BINARY_AGE=0
|
||||||
EXTRA_VERSION=claws20
|
EXTRA_VERSION=claws21
|
||||||
VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION
|
VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION
|
||||||
|
|
||||||
dnl
|
dnl
|
||||||
|
|
|
@ -34,7 +34,8 @@
|
||||||
#include <gtk/gtkhbox.h>
|
#include <gtk/gtkhbox.h>
|
||||||
#include <gtk/gtklabel.h>
|
#include <gtk/gtklabel.h>
|
||||||
#include <gtk/gtkentry.h>
|
#include <gtk/gtkentry.h>
|
||||||
#include <gtk/gtkclist.h>
|
// #include <gtk/gtkclist.h>
|
||||||
|
#include <gtk/gtkctree.h>
|
||||||
#include <gtk/gtkscrolledwindow.h>
|
#include <gtk/gtkscrolledwindow.h>
|
||||||
#include <gtk/gtkbutton.h>
|
#include <gtk/gtkbutton.h>
|
||||||
#include <gtk/gtkhbbox.h>
|
#include <gtk/gtkhbbox.h>
|
||||||
|
@ -64,10 +65,10 @@ static gboolean locked;
|
||||||
|
|
||||||
static GtkWidget *dialog;
|
static GtkWidget *dialog;
|
||||||
static GtkWidget *entry;
|
static GtkWidget *entry;
|
||||||
static GtkWidget *clist;
|
// static GtkWidget *clist;
|
||||||
|
static GtkWidget *groups_tree;
|
||||||
static GtkWidget *status_label;
|
static GtkWidget *status_label;
|
||||||
static GtkWidget *ok_button;
|
static GtkWidget *ok_button;
|
||||||
static GSList *group_list = NULL;
|
|
||||||
static Folder *news_folder;
|
static Folder *news_folder;
|
||||||
|
|
||||||
static void grouplist_dialog_create (void);
|
static void grouplist_dialog_create (void);
|
||||||
|
@ -87,16 +88,16 @@ static void refresh_clicked (GtkWidget *widget,
|
||||||
static void key_pressed (GtkWidget *widget,
|
static void key_pressed (GtkWidget *widget,
|
||||||
GdkEventKey *event,
|
GdkEventKey *event,
|
||||||
gpointer data);
|
gpointer data);
|
||||||
static void clist_selected (GtkCList *clist,
|
static void groups_tree_selected (GtkCTree *groups_tree,
|
||||||
gint row,
|
GtkCTreeNode * node,
|
||||||
gint column,
|
gint column,
|
||||||
GdkEventButton *event,
|
GdkEventButton *event,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
static void clist_unselected (GtkCList *clist,
|
static void groups_tree_unselected (GtkCTree *groups_tree,
|
||||||
gint row,
|
GtkCTreeNode * node,
|
||||||
gint column,
|
gint column,
|
||||||
GdkEventButton *event,
|
GdkEventButton *event,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
static void entry_activated (GtkEditable *editable);
|
static void entry_activated (GtkEditable *editable);
|
||||||
|
|
||||||
GList *grouplist_dialog(Folder *folder, GList * cur_subscriptions)
|
GList *grouplist_dialog(Folder *folder, GList * cur_subscriptions)
|
||||||
|
@ -128,16 +129,6 @@ GList *grouplist_dialog(Folder *folder, GList * cur_subscriptions)
|
||||||
manage_window_focus_out(dialog, NULL, NULL);
|
manage_window_focus_out(dialog, NULL, NULL);
|
||||||
gtk_widget_hide(dialog);
|
gtk_widget_hide(dialog);
|
||||||
|
|
||||||
/*
|
|
||||||
if (ack) {
|
|
||||||
str = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
|
|
||||||
if (str && *str == '\0') {
|
|
||||||
g_free(str);
|
|
||||||
str = NULL;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
str = NULL;
|
|
||||||
*/
|
|
||||||
if (!ack) {
|
if (!ack) {
|
||||||
list_free_strings(subscribed);
|
list_free_strings(subscribed);
|
||||||
g_list_free(subscribed);
|
g_list_free(subscribed);
|
||||||
|
@ -157,7 +148,7 @@ GList *grouplist_dialog(Folder *folder, GList * cur_subscriptions)
|
||||||
static void grouplist_clear(void)
|
static void grouplist_clear(void)
|
||||||
{
|
{
|
||||||
dont_unsubscribed = TRUE;
|
dont_unsubscribed = TRUE;
|
||||||
gtk_clist_clear(GTK_CLIST(clist));
|
gtk_clist_clear(GTK_CLIST(groups_tree));
|
||||||
gtk_entry_set_text(GTK_ENTRY(entry), "");
|
gtk_entry_set_text(GTK_ENTRY(entry), "");
|
||||||
dont_unsubscribed = FALSE;
|
dont_unsubscribed = FALSE;
|
||||||
}
|
}
|
||||||
|
@ -215,15 +206,18 @@ static void grouplist_dialog_create(void)
|
||||||
GTK_POLICY_AUTOMATIC,
|
GTK_POLICY_AUTOMATIC,
|
||||||
GTK_POLICY_AUTOMATIC);
|
GTK_POLICY_AUTOMATIC);
|
||||||
|
|
||||||
clist = gtk_clist_new_with_titles(3, col_names);
|
groups_tree = gtk_ctree_new_with_titles(3, 0, col_names);
|
||||||
gtk_container_add(GTK_CONTAINER(scrolledwin), clist);
|
gtk_container_add(GTK_CONTAINER(scrolledwin), groups_tree);
|
||||||
gtk_clist_set_selection_mode(GTK_CLIST(clist), GTK_SELECTION_MULTIPLE);
|
gtk_clist_set_selection_mode(GTK_CLIST(groups_tree),
|
||||||
|
GTK_SELECTION_MULTIPLE);
|
||||||
|
/*
|
||||||
GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(clist)->column[0].button,
|
GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(clist)->column[0].button,
|
||||||
GTK_CAN_FOCUS);
|
GTK_CAN_FOCUS);
|
||||||
gtk_signal_connect(GTK_OBJECT(clist), "select_row",
|
*/
|
||||||
GTK_SIGNAL_FUNC(clist_selected), NULL);
|
gtk_signal_connect(GTK_OBJECT(groups_tree), "tree_select_row",
|
||||||
gtk_signal_connect(GTK_OBJECT(clist), "unselect_row",
|
GTK_SIGNAL_FUNC(groups_tree_selected), NULL);
|
||||||
GTK_SIGNAL_FUNC(clist_unselected), NULL);
|
gtk_signal_connect(GTK_OBJECT(groups_tree), "tree_unselect_row",
|
||||||
|
GTK_SIGNAL_FUNC(groups_tree_unselected), NULL);
|
||||||
|
|
||||||
hbox = gtk_hbox_new(FALSE, 0);
|
hbox = gtk_hbox_new(FALSE, 0);
|
||||||
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
|
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
|
||||||
|
@ -249,10 +243,161 @@ static void grouplist_dialog_create(void)
|
||||||
gtk_widget_show_all(GTK_DIALOG(dialog)->vbox);
|
gtk_widget_show_all(GTK_DIALOG(dialog)->vbox);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GHashTable * hash_last_node;
|
||||||
|
static GHashTable * hash_branch_node;
|
||||||
|
|
||||||
|
static void hash_news_init()
|
||||||
|
{
|
||||||
|
hash_last_node = g_hash_table_new(g_str_hash, g_str_equal);
|
||||||
|
hash_branch_node = g_hash_table_new(g_str_hash, g_str_equal);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void free_key(gchar * key, void * value, void * user_data)
|
||||||
|
{
|
||||||
|
g_free(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void hash_news_done()
|
||||||
|
{
|
||||||
|
g_hash_table_foreach(hash_branch_node, free_key, NULL);
|
||||||
|
g_hash_table_foreach(hash_last_node, free_key, NULL);
|
||||||
|
|
||||||
|
g_hash_table_destroy(hash_branch_node);
|
||||||
|
g_hash_table_destroy(hash_last_node);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkCTreeNode * hash_news_get_branch_node(gchar * name)
|
||||||
|
{
|
||||||
|
return g_hash_table_lookup(hash_branch_node, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void hash_news_set_branch_node(gchar * name, GtkCTreeNode * node)
|
||||||
|
{
|
||||||
|
g_hash_table_insert(hash_branch_node, g_strdup(name), node);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkCTreeNode * hash_news_get_last_node(gchar * name)
|
||||||
|
{
|
||||||
|
return g_hash_table_lookup(hash_last_node, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void hash_news_set_last_node(gchar * name, GtkCTreeNode * node)
|
||||||
|
{
|
||||||
|
gchar * key;
|
||||||
|
void * value;
|
||||||
|
|
||||||
|
if (g_hash_table_lookup_extended(hash_last_node, name,
|
||||||
|
(void *) &key, &value)) {
|
||||||
|
g_hash_table_remove(hash_last_node, name);
|
||||||
|
g_free(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_hash_table_insert(hash_last_node, g_strdup(name), node);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gchar * get_parent_name(gchar * name)
|
||||||
|
{
|
||||||
|
gchar * p;
|
||||||
|
|
||||||
|
p = (gchar *) strrchr(name, '.');
|
||||||
|
if (p == NULL)
|
||||||
|
return g_strdup("");
|
||||||
|
|
||||||
|
return g_strndup(name, p - name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkCTreeNode * create_parent(GtkCTree * groups_tree, gchar * name)
|
||||||
|
{
|
||||||
|
gchar * cols[3];
|
||||||
|
GtkCTreeNode * parent;
|
||||||
|
GtkCTreeNode * node;
|
||||||
|
gchar * parent_name;
|
||||||
|
|
||||||
|
if (* name == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (hash_news_get_branch_node(name) != NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cols[0] = name;
|
||||||
|
cols[1] = "";
|
||||||
|
cols[2] = "";
|
||||||
|
|
||||||
|
parent_name = get_parent_name(name);
|
||||||
|
create_parent(groups_tree, parent_name);
|
||||||
|
|
||||||
|
parent = hash_news_get_branch_node(parent_name);
|
||||||
|
node = hash_news_get_last_node(parent_name);
|
||||||
|
node = gtk_ctree_insert_node(groups_tree,
|
||||||
|
parent, node,
|
||||||
|
cols, 0, NULL, NULL,
|
||||||
|
NULL, NULL,
|
||||||
|
FALSE, FALSE);
|
||||||
|
gtk_ctree_node_set_selectable(groups_tree, node, FALSE);
|
||||||
|
hash_news_set_last_node(parent_name, node);
|
||||||
|
hash_news_set_branch_node(name, node);
|
||||||
|
|
||||||
|
g_free(parent_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkCTreeNode * create_branch(GtkCTree * groups_tree, gchar * name,
|
||||||
|
struct NNTPGroupInfo * info)
|
||||||
|
{
|
||||||
|
gchar * parent_name;
|
||||||
|
|
||||||
|
GtkCTreeNode * node;
|
||||||
|
GtkCTreeNode * parent;
|
||||||
|
|
||||||
|
gchar count_str[10];
|
||||||
|
gchar * cols[3];
|
||||||
|
gint count;
|
||||||
|
|
||||||
|
count = info->last - info->first;
|
||||||
|
if (count < 0)
|
||||||
|
count = 0;
|
||||||
|
snprintf(count_str, 10, "%i", count);
|
||||||
|
|
||||||
|
cols[0] = info->name;
|
||||||
|
cols[1] = count_str;
|
||||||
|
if (info->type == 'y')
|
||||||
|
cols[2] = "";
|
||||||
|
else if (info->type == 'm')
|
||||||
|
cols[2] = "moderated";
|
||||||
|
else if (info->type == 'n')
|
||||||
|
cols[2] = "readonly";
|
||||||
|
else
|
||||||
|
cols[2] = "unkown";
|
||||||
|
|
||||||
|
parent_name = get_parent_name(name);
|
||||||
|
|
||||||
|
create_parent(groups_tree, parent_name);
|
||||||
|
|
||||||
|
parent = hash_news_get_branch_node(parent_name);
|
||||||
|
node = hash_news_get_last_node(parent_name);
|
||||||
|
node = gtk_ctree_insert_node(groups_tree,
|
||||||
|
parent, node,
|
||||||
|
cols, 0, NULL, NULL,
|
||||||
|
NULL, NULL,
|
||||||
|
TRUE, FALSE);
|
||||||
|
gtk_ctree_node_set_selectable(groups_tree, node, TRUE);
|
||||||
|
hash_news_set_last_node(parent_name, node);
|
||||||
|
|
||||||
|
g_free(parent_name);
|
||||||
|
|
||||||
|
if (node == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
gtk_ctree_node_set_row_data(GTK_CTREE(groups_tree), node, info);
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
static void grouplist_dialog_set_list(gchar * pattern)
|
static void grouplist_dialog_set_list(gchar * pattern)
|
||||||
{
|
{
|
||||||
GSList *cur;
|
GSList *cur;
|
||||||
gint row;
|
GtkCTreeNode * node;
|
||||||
|
GSList * group_list = NULL;
|
||||||
|
GSList * r_list;
|
||||||
|
|
||||||
if (pattern == NULL)
|
if (pattern == NULL)
|
||||||
pattern = "*";
|
pattern = "*";
|
||||||
|
@ -273,59 +418,51 @@ static void grouplist_dialog_set_list(gchar * pattern)
|
||||||
|
|
||||||
dont_unsubscribed = TRUE;
|
dont_unsubscribed = TRUE;
|
||||||
|
|
||||||
gtk_clist_freeze(GTK_CLIST(clist));
|
hash_news_init();
|
||||||
for (cur = group_list; cur != NULL ; cur = cur->next) {
|
|
||||||
|
gtk_clist_freeze(GTK_CLIST(groups_tree));
|
||||||
|
|
||||||
|
r_list = g_slist_copy(group_list);
|
||||||
|
r_list = g_slist_reverse(r_list);
|
||||||
|
|
||||||
|
for (cur = r_list; cur != NULL ; cur = cur->next) {
|
||||||
struct NNTPGroupInfo * info;
|
struct NNTPGroupInfo * info;
|
||||||
|
|
||||||
info = (struct NNTPGroupInfo *) cur->data;
|
info = (struct NNTPGroupInfo *) cur->data;
|
||||||
|
|
||||||
if (fnmatch(pattern, info->name, 0) == 0) {
|
if (fnmatch(pattern, info->name, 0) == 0) {
|
||||||
gchar count_str[10];
|
|
||||||
gchar * cols[3];
|
|
||||||
gint count;
|
|
||||||
GList * l;
|
GList * l;
|
||||||
|
|
||||||
count = info->last - info->first;
|
node = create_branch(GTK_CTREE(groups_tree),
|
||||||
if (count < 0)
|
info->name, info);
|
||||||
count = 0;
|
|
||||||
snprintf(count_str, 10, "%i", count);
|
|
||||||
|
|
||||||
cols[0] = info->name;
|
|
||||||
cols[1] = count_str;
|
|
||||||
if (info->type == 'y')
|
|
||||||
cols[2] = "";
|
|
||||||
else if (info->type == 'm')
|
|
||||||
cols[2] = "moderated";
|
|
||||||
else if (info->type == 'n')
|
|
||||||
cols[2] = "readonly";
|
|
||||||
else
|
|
||||||
cols[2] = "unkown";
|
|
||||||
|
|
||||||
row = gtk_clist_append(GTK_CLIST(clist), cols);
|
|
||||||
gtk_clist_set_row_data(GTK_CLIST(clist), row, info);
|
|
||||||
|
|
||||||
l = g_list_find_custom(subscribed, info->name,
|
l = g_list_find_custom(subscribed, info->name,
|
||||||
(GCompareFunc) g_strcasecmp);
|
(GCompareFunc) g_strcasecmp);
|
||||||
|
|
||||||
if (l != NULL)
|
if (l != NULL)
|
||||||
gtk_clist_select_row(GTK_CLIST(clist), row, 0);
|
gtk_ctree_select(GTK_CTREE(groups_tree), node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_clist_moveto(GTK_CLIST(clist), 0, 0, 0, 0);
|
g_slist_free(r_list);
|
||||||
|
|
||||||
|
hash_news_done();
|
||||||
|
|
||||||
|
node = gtk_ctree_node_nth(GTK_CTREE(groups_tree), 0);
|
||||||
|
gtk_ctree_node_moveto(GTK_CTREE(groups_tree), node, 0, 0, 0);
|
||||||
|
|
||||||
dont_unsubscribed = FALSE;
|
dont_unsubscribed = FALSE;
|
||||||
|
|
||||||
gtk_clist_set_column_width(GTK_CLIST(clist), 0, GROUPLIST_NAMES);
|
gtk_clist_set_column_width(GTK_CLIST(groups_tree), 0, GROUPLIST_NAMES);
|
||||||
gtk_clist_set_column_justification (GTK_CLIST(clist), 1,
|
gtk_clist_set_column_justification (GTK_CLIST(groups_tree), 1,
|
||||||
GTK_JUSTIFY_RIGHT);
|
GTK_JUSTIFY_RIGHT);
|
||||||
gtk_clist_set_column_auto_resize(GTK_CLIST(clist), 1, TRUE);
|
gtk_clist_set_column_auto_resize(GTK_CLIST(groups_tree), 1, TRUE);
|
||||||
gtk_clist_set_column_auto_resize(GTK_CLIST(clist), 2, TRUE);
|
gtk_clist_set_column_auto_resize(GTK_CLIST(groups_tree), 2, TRUE);
|
||||||
|
|
||||||
gtk_clist_thaw(GTK_CLIST(clist));
|
gtk_clist_thaw(GTK_CLIST(groups_tree));
|
||||||
|
|
||||||
gtk_widget_grab_focus(ok_button);
|
gtk_widget_grab_focus(ok_button);
|
||||||
gtk_widget_grab_focus(clist);
|
gtk_widget_grab_focus(groups_tree);
|
||||||
|
|
||||||
gtk_label_set_text(GTK_LABEL(status_label), _("Done."));
|
gtk_label_set_text(GTK_LABEL(status_label), _("Done."));
|
||||||
|
|
||||||
|
@ -394,28 +531,36 @@ static void key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
||||||
cancel_clicked(NULL, NULL);
|
cancel_clicked(NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clist_selected(GtkCList *clist, gint row, gint column,
|
static void groups_tree_selected(GtkCTree *groups_tree, GtkCTreeNode * node,
|
||||||
GdkEventButton *event, gpointer user_data)
|
gint column,
|
||||||
|
GdkEventButton *event, gpointer user_data)
|
||||||
{
|
{
|
||||||
struct NNTPGroupInfo * group;
|
struct NNTPGroupInfo * group;
|
||||||
GList * l;
|
GList * l;
|
||||||
|
|
||||||
group = (struct NNTPGroupInfo *)
|
group = (struct NNTPGroupInfo *)
|
||||||
gtk_clist_get_row_data(GTK_CLIST(clist), row);
|
gtk_ctree_node_get_row_data(GTK_CTREE(groups_tree), node);
|
||||||
|
|
||||||
|
if (group == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!dont_unsubscribed) {
|
if (!dont_unsubscribed) {
|
||||||
subscribed = g_list_append(subscribed, g_strdup(group->name));
|
subscribed = g_list_append(subscribed, g_strdup(group->name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clist_unselected(GtkCList *clist, gint row, gint column,
|
static void groups_tree_unselected(GtkCTree *groups_tree, GtkCTreeNode * node,
|
||||||
GdkEventButton *event, gpointer user_data)
|
gint column,
|
||||||
|
GdkEventButton *event, gpointer user_data)
|
||||||
{
|
{
|
||||||
struct NNTPGroupInfo * group;
|
struct NNTPGroupInfo * group;
|
||||||
GList * l;
|
GList * l;
|
||||||
|
|
||||||
group = (struct NNTPGroupInfo *)
|
group = (struct NNTPGroupInfo *)
|
||||||
gtk_clist_get_row_data(GTK_CLIST(clist), row);
|
gtk_ctree_node_get_row_data(GTK_CTREE(groups_tree), node);
|
||||||
|
|
||||||
|
if (group == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!dont_unsubscribed) {
|
if (!dont_unsubscribed) {
|
||||||
l = g_list_find_custom(subscribed, group->name,
|
l = g_list_find_custom(subscribed, group->name,
|
||||||
|
@ -427,10 +572,6 @@ static void clist_unselected(GtkCList *clist, gint row, gint column,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean match_string(gchar * str, gchar * expr)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static void entry_activated(GtkEditable *editable)
|
static void entry_activated(GtkEditable *editable)
|
||||||
{
|
{
|
||||||
gchar * str;
|
gchar * str;
|
||||||
|
|
Loading…
Reference in a new issue