[gq-commit] gq/src browse.c,1.80,1.81 browse.h,1.30,1.31
Status: Beta
Brought to you by:
sur5r
From: <sta...@us...> - 2003-10-13 07:38:45
|
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv17456 Modified Files: browse.c browse.h Log Message: * Implement persistency for browse tabs even through ref-nodes along the way by keeping the entire path to the currently opened node in the .gq-state file Index: browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/browse.c,v retrieving revision 1.80 retrieving revision 1.81 diff -C2 -d -r1.80 -r1.81 *** browse.c 12 Oct 2003 11:10:40 -0000 1.80 --- browse.c 13 Oct 2003 07:38:40 -0000 1.81 *************** *** 69,72 **** --- 69,106 ---- GtkCTreeNode *node); + static void record_path(struct tab *tab, browse_entry *entry, + GtkCTree *ctreeroot, GtkCTreeNode *node) + { + GtkCTreeRow *row; + browse_entry *e; + int type = -1; + + if (BROWSETAB(tab)->cur_path) { + g_list_foreach(BROWSETAB(tab)->cur_path, (GFunc) g_free, NULL); + g_list_free(BROWSETAB(tab)->cur_path); + } + + BROWSETAB(tab)->cur_path = NULL; + + for ( ; node ; node = row->parent ) { + row = GTK_CTREE_ROW(node); + e = (browse_entry *) gtk_ctree_node_get_row_data(ctreeroot, node); + + /* currently it is sufficient to keep changes in entry types only */ + if (e && e->type != type) { + GString *str = g_string_sized_new(128); + g_string_sprintf(str, "%d:%s", + e->type, e->base_methods->get_name(e, TRUE)); + + BROWSETAB(tab)->cur_path = + g_list_insert(BROWSETAB(tab)->cur_path, str->str, 0); + + g_string_free(str, FALSE); + + type = e->type; + } + } + } + /* A GtkDestroyNotify callback to be used as a destroy function for browse_entry objects attached to gtk objects */ *************** *** 409,416 **** dn = entry->dn; ! g_string_assign(BROWSETAB(tab)->cur_dn, dn); ctreeroot = BROWSETAB(tab)->ctreeroot; - BROWSETAB(tab)->cur_server = server; /* delete old struct inputform (if any) */ --- 443,449 ---- dn = entry->dn; ! record_path(tab, (browse_entry *) entry, ctreeroot, ctreenode); ctreeroot = BROWSETAB(tab)->ctreeroot; /* delete old struct inputform (if any) */ *************** *** 496,515 **** assert(IS_DN_ENTRY(entry)); ! exploded_dn = gq_ldap_explode_dn(entry->dn, FALSE); ! #if GTK_MAJOR >= 2 ! g = g_strdup(exploded_dn[0]); #else ! l = decoded_string(exploded_dn[0]); ! /* impedance match -> malloc to g_malloc */ ! g = g_strdup(l); ! free(l); #endif ! gq_exploded_free(exploded_dn); ! return g; } static struct browse_entry_vtab dn_vtab = { (browse_entry_destructor) destroy_dn_browse_entry, /* destroy */ --- 529,553 ---- assert(IS_DN_ENTRY(entry)); ! if (long_form) { ! return g_strdup(entry->dn); ! } else { ! exploded_dn = gq_ldap_explode_dn(entry->dn, FALSE); ! #if GTK_MAJOR >= 2 ! g = g_strdup(exploded_dn[0]); #else ! l = decoded_string(exploded_dn[0]); ! /* impedance match -> malloc to g_malloc */ ! g = g_strdup(l); ! free(l); #endif ! gq_exploded_free(exploded_dn); ! return g; ! } } + static struct browse_entry_vtab dn_vtab = { (browse_entry_destructor) destroy_dn_browse_entry, /* destroy */ *************** *** 632,637 **** server_name = entry->server->name; /* dn_by_node(node); */ ! g_string_assign(BROWSETAB(tab)->cur_dn, server_name); ! BROWSETAB(tab)->cur_server = NULL; pane2_scrwin = BROWSETAB(tab)->pane2_scrwin; --- 670,674 ---- server_name = entry->server->name; /* dn_by_node(node); */ ! record_path(tab, (browse_entry *) entry, ctree, node); pane2_scrwin = BROWSETAB(tab)->pane2_scrwin; *************** *** 1077,1082 **** assert(IS_REF_ENTRY(entry)); ! g_string_assign(BROWSETAB(tab)->cur_dn, entry->uri); ! BROWSETAB(tab)->cur_server = NULL; pane2_scrwin = BROWSETAB(tab)->pane2_scrwin; --- 1114,1118 ---- assert(IS_REF_ENTRY(entry)); ! record_path(tab, (browse_entry *) entry, ctree, node); pane2_scrwin = BROWSETAB(tab)->pane2_scrwin; *************** *** 1491,1501 **** static void browse_save_snapshot(char *state_name, struct tab *tab) { ! if (BROWSETAB(tab)->cur_dn) ! state_value_set_string(state_name, "dn", ! BROWSETAB(tab)->cur_dn->str); ! ! if (BROWSETAB(tab)->cur_server) ! state_value_set_string(state_name, "server", ! BROWSETAB(tab)->cur_server->name); #if GTK_MAJOR >= 2 --- 1527,1531 ---- static void browse_save_snapshot(char *state_name, struct tab *tab) { ! state_value_set_list(state_name, "open-path", BROWSETAB(tab)->cur_path); #if GTK_MAJOR >= 2 *************** *** 1506,1523 **** } static void browse_restore_snapshot(char *state_name, struct tab *tab) { GtkCTree *ctree = BROWSETAB(tab)->ctreeroot; - const char *dn = state_value_get_string(state_name, "dn", NULL); - const char *s = state_value_get_string(state_name, "server", NULL); int gutter = state_value_get_int(state_name, "gutter-pos", -1); ! if (dn && s) { ! struct ldapserver *server = server_by_name(s); ! if (server && !server->ask_pw) { ! show_server_dn(ctree, server, dn, TRUE); } } --- 1536,1592 ---- } + static int cmp_name(browse_entry *entry, const char *name) + { + gchar *c; + int rc; + + if (entry == NULL) return -1; + c = entry->base_methods->get_name(entry, TRUE); + rc = strcasecmp(name, c); + g_free(c); + return rc; + } static void browse_restore_snapshot(char *state_name, struct tab *tab) { GtkCTree *ctree = BROWSETAB(tab)->ctreeroot; int gutter = state_value_get_int(state_name, "gutter-pos", -1); + const GList *path = state_value_get_list(state_name, "open-path"); ! struct ldapserver *server = NULL; ! GtkCTreeNode *node = gtk_ctree_node_nth(GTK_CTREE(ctree), 0); ! ! if (path) { ! const GList *I; ! for (I = path ; I ; I = g_list_next(I)) { ! const char *s = I->data; ! const char *c = g_utf8_strchr(s, -1, ':'); ! char *ep; ! long type = strtol(s, &ep, 10); ! ! if (c == ep) { ! switch(type) { ! case DN_BROWSE_ENTRY: ! node = show_dn(ctree, node, c + 1, TRUE); ! break; ! case REF_BROWSE_ENTRY: ! gtk_ctree_expand(ctree, node); ! node = ! gtk_ctree_find_by_row_data_custom(ctree, ! node, ! (gpointer) (c + 1), ! (GCompareFunc) cmp_name); ! break; ! case SERVER_BROWSE_ENTRY: ! server = server_by_name(c + 1); ! node = tree_node_from_server_dn(ctree, server, ""); ! break; ! default: ! break; ! } ! } } + if (node) gtk_ctree_select(ctree, node); } *************** *** 1608,1614 **** gtk_widget_show(browsemode_vbox); - modeinfo->cur_dn = g_string_sized_new(128); - g_string_assign(modeinfo->cur_dn, ""); - /* prepare for proper cleanup */ gtk_signal_connect(GTK_OBJECT(browsemode_vbox), "destroy", --- 1677,1680 ---- *************** *** 1661,1664 **** --- 1727,1740 ---- } + GtkCTreeNode *node_from_entry(GtkCTree *ctreeroot, + GtkCTreeNode *top, + browse_entry *e) + { + return gtk_ctree_find_by_row_data(GTK_CTREE(ctreeroot), + top, e); + } + + + struct server_dn { const struct ldapserver *server; *************** *** 1748,1754 **** assert(tab); ! if(BROWSETAB(tab)->cur_dn) { ! g_string_free(BROWSETAB(tab)->cur_dn, TRUE); ! BROWSETAB(tab)->cur_dn = NULL; } --- 1824,1830 ---- assert(tab); ! if(BROWSETAB(tab)->cur_path) { ! g_list_foreach(BROWSETAB(tab)->cur_path, (GFunc) g_free, NULL); ! g_list_free(BROWSETAB(tab)->cur_path); } *************** *** 1898,1914 **** } ! void show_server_dn(GtkCTree *tree, ! struct ldapserver *server, const char *dn, ! gboolean select_node) { GtkCTreeNode *node = tree_node_from_server_dn(tree, server, ""); if (node) { gtk_ctree_expand(tree, node); ! show_dn(tree, node, dn, select_node); } } ! void show_dn(GtkCTree *tree, GtkCTreeNode *node, const char *dn, ! gboolean select_node) { char **dnparts; --- 1974,1991 ---- } ! GtkCTreeNode *show_server_dn(GtkCTree *tree, ! struct ldapserver *server, const char *dn, ! gboolean select_node) { GtkCTreeNode *node = tree_node_from_server_dn(tree, server, ""); if (node) { gtk_ctree_expand(tree, node); ! return show_dn(tree, node, dn, select_node); } + return NULL; } ! GtkCTreeNode *show_dn(GtkCTree *tree, GtkCTreeNode *node, const char *dn, ! gboolean select_node) { char **dnparts; *************** *** 1918,1923 **** char *attrs[] = { LDAP_NO_ATTRS, NULL }; ! if (!dn) return; ! if (!tree) return; s = g_string_new(""); --- 1995,2000 ---- char *attrs[] = { LDAP_NO_ATTRS, NULL }; ! if (!dn) return NULL; ! if (!tree) return NULL; s = g_string_new(""); *************** *** 1981,1984 **** --- 2058,2064 ---- 0.5, 0); } + + if (found) return found; + return NULL; } Index: browse.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/browse.h,v retrieving revision 1.30 retrieving revision 1.31 diff -C2 -d -r1.30 -r1.31 *** browse.h 12 Oct 2003 11:10:41 -0000 1.30 --- browse.h 13 Oct 2003 07:38:41 -0000 1.31 *************** *** 32,37 **** #define BROWSETAB(tab) (assert(tab->type == BROWSE_MODE), ((struct tab_browse *)tab->modeinfo)) struct tab_browse { ! GString *cur_dn; ! struct ldapserver *cur_server; GtkCTree *ctreeroot; --- 32,36 ---- #define BROWSETAB(tab) (assert(tab->type == BROWSE_MODE), ((struct tab_browse *)tab->modeinfo)) struct tab_browse { ! GList *cur_path; GtkCTree *ctreeroot; *************** *** 83,87 **** gboolean long_form); - #define IS_ENTRY(o,t) ((o) && (((browse_entry *)(o))->type == t)) --- 82,85 ---- *************** *** 89,105 **** struct browse_entry_vtab { /* destructor */ ! browse_entry_destructor destroy; /* expansion callback of corresponding GtkCtreeNode */ ! browse_entry_expand expand; /* select callback of corresponding GtkCtreeNode */ ! browse_entry_select select; /* refresh callback of corresponding GtkCtreeNode */ ! browse_entry_refresh refresh; /* Gets the user visible name of the node, must be freed using g_free */ ! browse_entry_get_name get_name; }; --- 87,103 ---- struct browse_entry_vtab { /* destructor */ ! browse_entry_destructor destroy; /* expansion callback of corresponding GtkCtreeNode */ ! browse_entry_expand expand; /* select callback of corresponding GtkCtreeNode */ ! browse_entry_select select; /* refresh callback of corresponding GtkCtreeNode */ ! browse_entry_refresh refresh; /* Gets the user visible name of the node, must be freed using g_free */ ! browse_entry_get_name get_name; }; *************** *** 189,197 **** GtkCTreeNode *node); ! void show_server_dn(GtkCTree *tree, ! struct ldapserver *server, const char *dn, ! gboolean select_node); ! void show_dn(GtkCTree *tree, GtkCTreeNode *node, const char *dn, ! gboolean select_node); GtkCTreeNode *node_from_dn(GtkCTree *ctreeroot, --- 187,195 ---- GtkCTreeNode *node); ! GtkCTreeNode *show_server_dn(GtkCTree *tree, ! struct ldapserver *server, const char *dn, ! gboolean select_node); ! GtkCTreeNode *show_dn(GtkCTree *tree, GtkCTreeNode *node, const char *dn, ! gboolean select_node); GtkCTreeNode *node_from_dn(GtkCTree *ctreeroot, |