[gq-commit] gq/src search.c,1.58,1.59 search.h,1.15,1.16
Status: Beta
Brought to you by:
sur5r
|
From: <sta...@us...> - 2003-10-28 19:28:35
|
Update of /cvsroot/gqclient/gq/src
In directory sc8-pr-cvs1:/tmp/cvs-serv11345
Modified Files:
search.c search.h
Log Message:
* dropped search-specific struct resultset - replaced by general purpose
dn_on_server structure to bundle dn and server information
* Added possibility for selecting multiple search results and to apply several
operations to the selection (delete, export) via a submenu of the popup menu
for search result entries
Index: search.c
===================================================================
RCS file: /cvsroot/gqclient/gq/src/search.c,v
retrieving revision 1.58
retrieving revision 1.59
diff -C2 -d -r1.58 -r1.59
*** search.c 23 Oct 2003 05:31:34 -0000 1.58
--- search.c 28 Oct 2003 19:26:57 -0000 1.59
***************
*** 50,56 ****
#include "syntax.h"
#include "utf8-compat.h"
! void find_in_browser(struct tab *tab);
! void add_all_to_browser(struct tab *tab);
static int column_by_attr(struct attrs **attrlist, char *attribute);
--- 50,60 ----
#include "syntax.h"
#include "utf8-compat.h"
+ #include "browse-export.h"
! static void find_in_browser(struct tab *tab);
! static void add_all_to_browser(struct tab *tab);
! static void add_selected_to_browser(struct tab *tab);
! static void export_search_selected_entry(struct tab *tab);
! static void delete_search_selected(struct tab *tab);
static int column_by_attr(struct attrs **attrlist, char *attribute);
***************
*** 847,850 ****
--- 851,856 ----
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
main_clist = gtk_clist_new(1);
+ gtk_clist_set_selection_mode(GTK_CLIST(main_clist),
+ GTK_SELECTION_EXTENDED);
gtk_clist_set_column_title(GTK_CLIST(main_clist), 0, "");
gtk_clist_column_titles_show(GTK_CLIST(main_clist));
***************
*** 960,988 ****
}
-
- static struct resultset *new_resultset(struct ldapserver *server)
- {
- struct resultset *newset;
-
- newset = g_malloc0(sizeof(struct resultset));
- newset->dn = g_strdup("");
- newset->server = server;
-
- if (server) ldapserver_ref(server);
-
- return(newset);
- }
-
-
- static void free_resultset(struct resultset *set)
- {
- if (set) {
- if (set->server) ldapserver_unref(set->server);
- g_free_if(set->dn);
- g_free(set);
- }
- }
-
-
static int column_by_attr(struct attrs **attrlist, char *attribute)
{
--- 966,969 ----
***************
*** 1137,1141 ****
int row;
char *dn, *attr, **vals;
! struct resultset *set;
#if GTK_MAJOR < 2
--- 1118,1122 ----
int row;
char *dn, *attr, **vals;
! struct dn_on_server *set;
#if GTK_MAJOR < 2
***************
*** 1152,1157 ****
dn = ldap_get_dn(ld, e);
/* store for later reference */
! set = new_resultset(server);
! g_free_and_dup(set->dn, dn);
if(config->showdn) {
--- 1133,1137 ----
dn = ldap_get_dn(ld, e);
/* store for later reference */
! set = new_dn_on_server(dn, server);
if(config->showdn) {
***************
*** 1251,1255 ****
row = gtk_clist_append(GTK_CLIST(clist), cl);
gtk_clist_set_row_data_full(GTK_CLIST(clist), row, set,
! (GtkDestroyNotify) free_resultset);
gtk_clist_column_titles_show(GTK_CLIST(clist));
--- 1231,1235 ----
row = gtk_clist_append(GTK_CLIST(clist), cl);
gtk_clist_set_row_data_full(GTK_CLIST(clist), row, set,
! (GtkDestroyNotify) free_dn_on_server);
gtk_clist_column_titles_show(GTK_CLIST(clist));
***************
*** 1443,1446 ****
--- 1423,1428 ----
/* setup GUI - build new clist */
new_main_clist = gtk_clist_new(MAX_NUM_ATTRIBUTES);
+ gtk_clist_set_selection_mode(GTK_CLIST(new_main_clist),
+ GTK_SELECTION_EXTENDED);
GTK_CLIST(new_main_clist)->button_actions[2] = GTK_BUTTON_SELECTS;
***************
*** 1716,1724 ****
static void results_popup_menu(struct tab *tab, GdkEventButton *event,
! struct resultset *set)
{
GtkWidget *root_menu, *menu, *menu_item, *label;
int transient = is_transient_server(set->server);
char **exploded_dn = NULL, *name;
/* this is a hack to pass the selected set under the menu to the callbacks.
--- 1698,1709 ----
static void results_popup_menu(struct tab *tab, GdkEventButton *event,
! struct dn_on_server *set)
{
GtkWidget *root_menu, *menu, *menu_item, *label;
+ GtkWidget *submenu;
int transient = is_transient_server(set->server);
char **exploded_dn = NULL, *name;
+ GList *selection;
+ int have_sel;
/* this is a hack to pass the selected set under the menu to the callbacks.
***************
*** 1758,1761 ****
--- 1743,1813 ----
gtk_widget_show(menu_item);
+ /* Selection submenu */
+ menu_item = gtk_menu_item_new_with_label(_("Selection"));
+ gtk_menu_append(GTK_MENU(menu), menu_item);
+ submenu = gtk_menu_new();
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu);
+ gtk_widget_show(menu_item);
+
+ /* Check if several entries it should be sensitive */
+ selection = GTK_CLIST(SEARCHTAB(tab)->main_clist)->selection;
+ have_sel = (selection && g_list_length(selection) > 0);
+
+ /* Select All */
+ menu_item = gtk_menu_item_new_with_label(_("Select All"));
+ gtk_menu_append(GTK_MENU(submenu), menu_item);
+ gtk_signal_connect_object(GTK_OBJECT(menu_item), "activate",
+ GTK_SIGNAL_FUNC(gtk_clist_select_all),
+ (gpointer) SEARCHTAB(tab)->main_clist);
+ gtk_widget_show(menu_item);
+
+ /* Unselect All */
+ menu_item = gtk_menu_item_new_with_label(_("Unselect All"));
+ gtk_menu_append(GTK_MENU(submenu), menu_item);
+ gtk_signal_connect_object(GTK_OBJECT(menu_item), "activate",
+ GTK_SIGNAL_FUNC(gtk_clist_unselect_all),
+ (gpointer) SEARCHTAB(tab)->main_clist);
+ gtk_widget_show(menu_item);
+ gtk_widget_set_sensitive(menu_item, have_sel);
+
+ /* separator */
+ menu_item = gtk_menu_item_new();
+ gtk_menu_append(GTK_MENU(submenu), menu_item);
+ gtk_widget_show(menu_item);
+
+ /* Export to LDIF*/
+ menu_item = gtk_menu_item_new_with_label(_("Export to LDIF"));
+ gtk_menu_append(GTK_MENU(submenu), menu_item);
+ gtk_signal_connect_object(GTK_OBJECT(menu_item), "activate",
+ GTK_SIGNAL_FUNC(export_search_selected_entry),
+ (gpointer) tab);
+ gtk_widget_show(menu_item);
+ gtk_widget_set_sensitive(menu_item, have_sel);
+
+ /* Add to Browser*/
+ menu_item = gtk_menu_item_new_with_label(_("Add to Browser"));
+ gtk_menu_append(GTK_MENU(submenu), menu_item);
+ gtk_signal_connect_object(GTK_OBJECT(menu_item), "activate",
+ GTK_SIGNAL_FUNC(add_selected_to_browser),
+ (gpointer) tab);
+ gtk_widget_show(menu_item);
+ gtk_widget_set_sensitive(menu_item, have_sel);
+
+ /* separator */
+ menu_item = gtk_menu_item_new();
+ gtk_menu_append(GTK_MENU(submenu), menu_item);
+ gtk_widget_show(menu_item);
+
+ /* Delete */
+ menu_item = gtk_menu_item_new_with_label(_("Delete"));
+ gtk_menu_append(GTK_MENU(submenu), menu_item);
+ gtk_signal_connect_object(GTK_OBJECT(menu_item), "activate",
+ GTK_SIGNAL_FUNC(delete_search_selected),
+ (gpointer) tab);
+ gtk_widget_show(menu_item);
+ gtk_widget_set_sensitive(menu_item, have_sel);
+
+ /*** End of Selected submenu ***/
+
/* Edit */
menu_item = gtk_menu_item_new_with_label(_("Edit"));
***************
*** 1806,1809 ****
--- 1858,1862 ----
+
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
event->button, event->time);
***************
*** 1815,1824 ****
{
GtkCTree *ctree;
! struct resultset *set;
struct tab *browsetab;
set = SEARCHTAB(tab)->set;
SEARCHTAB(tab)->set = NULL;
! if(set == NULL || set->dn == NULL)
return;
--- 1868,1877 ----
{
GtkCTree *ctree;
! struct dn_on_server *set;
struct tab *browsetab;
set = SEARCHTAB(tab)->set;
SEARCHTAB(tab)->set = NULL;
! if(set == NULL || set->dn == NULL || strlen(set->dn) == 0)
return;
***************
*** 1839,1843 ****
{
GtkCTree *ctree;
! struct resultset *cur_resultset;
struct tab *browsetab;
int i;
--- 1892,1896 ----
{
GtkCTree *ctree;
! struct dn_on_server *cur_resultset;
struct tab *browsetab;
int i;
***************
*** 1863,1870 ****
}
void search_new_from_entry_callback(struct tab *tab)
{
! struct resultset *set;
set = SEARCHTAB(tab)->set;
--- 1916,2019 ----
}
+ static void add_selected_to_browser(struct tab *tab)
+ {
+ GtkCTree *ctree;
+ struct dn_on_server *cur_resultset;
+ struct tab *browsetab;
+ GtkWidget *clist = SEARCHTAB(tab)->main_clist;
+ GList *sel, *I;
+
+ /* find last used browser... */
+
+ browsetab = get_last_of_mode(BROWSE_MODE);
+ if(browsetab) {
+ ctree = BROWSETAB(browsetab)->ctreeroot;
+ gtk_clist_freeze(GTK_CLIST(ctree));
+
+ sel = GTK_CLIST(clist)->selection;
+
+ for (I = sel ; I ; I = g_list_next(I)) {
+ cur_resultset = gtk_clist_get_row_data(GTK_CLIST(clist), GPOINTER_TO_INT(I->data));
+ show_server_dn(ctree,
+ cur_resultset->server, cur_resultset->dn, FALSE);
+ }
+ gtk_clist_thaw(GTK_CLIST(ctree));
+ go_to_page(browsetab);
+ } else {
+ single_warning_popup(_("No browser available"));
+ }
+ }
+
+
+
+ static void export_search_selected_entry(struct tab *tab)
+ {
+ struct dn_on_server *cur_resultset;
+ struct tab *browsetab;
+ GtkWidget *clist = SEARCHTAB(tab)->main_clist;
+ GList *sel, *I;
+
+ /* find last used browser... */
+
+ browsetab = get_last_of_mode(BROWSE_MODE);
+ if(browsetab) {
+ GList *to_export = NULL;
+ struct dn_on_server *dos;
+
+ sel = GTK_CLIST(clist)->selection;
+
+ for (I = sel ; I ; I = g_list_next(I)) {
+ cur_resultset = gtk_clist_get_row_data(GTK_CLIST(clist), GPOINTER_TO_INT(I->data));
+
+ dos = new_dn_on_server(cur_resultset->dn,
+ cur_resultset->server);
+ to_export = g_list_append(to_export, dos);
+ }
+
+ export_many(tab->win->mainwin, to_export);
+ } else {
+ single_warning_popup(_("No browser available"));
+ }
+ }
+
+ static void delete_search_selected(struct tab *tab)
+ {
+ struct dn_on_server *set;
+ GtkWidget *clist = SEARCHTAB(tab)->main_clist;
+ GList *sel, *I;
+
+ sel = GTK_CLIST(clist)->selection;
+ if (g_list_length(sel) > 0) {
+ int answer =
+ question_popup(_("Do you really want to delete the selected entries?"),
+ _("Do you really want to delete the selected entries?")
+ );
+
+ /* FIXME: sort by ldapserver and keep connection open across
+ deletions */
+ if (answer) {
+ GList *deld = NULL;
+
+ for (I = g_list_last(sel) ; I ; I = g_list_previous(I)) {
+ set = gtk_clist_get_row_data(GTK_CLIST(clist),
+ GPOINTER_TO_INT(I->data));
+ if (delete_entry(set->server, set->dn)) {
+ deld = g_list_append(deld, I->data);
+ }
+ }
+ gtk_clist_freeze(GTK_CLIST(clist));
+ for (I = g_list_first(deld) ; I ; I = g_list_next(I)) {
+ gtk_clist_remove(GTK_CLIST(clist),
+ GPOINTER_TO_INT(I->data));
+ }
+ g_list_free(deld);
+ gtk_clist_thaw(GTK_CLIST(clist));
+ }
+ }
+ }
void search_new_from_entry_callback(struct tab *tab)
{
! struct dn_on_server *set;
set = SEARCHTAB(tab)->set;
***************
*** 1876,1883 ****
}
-
void search_edit_entry_callback(struct tab *tab)
{
! struct resultset *set;
set = SEARCHTAB(tab)->set;
--- 2025,2031 ----
}
void search_edit_entry_callback(struct tab *tab)
{
! struct dn_on_server *set;
set = SEARCHTAB(tab)->set;
***************
*** 1889,1896 ****
}
-
void delete_search_entry(struct tab *tab)
{
! struct resultset *set;
set = SEARCHTAB(tab)->set;
--- 2037,2043 ----
}
void delete_search_entry(struct tab *tab)
{
! struct dn_on_server *set;
set = SEARCHTAB(tab)->set;
***************
*** 1902,1910 ****
}
-
int select_entry_callback(GtkWidget *clist, gint row, gint column,
GdkEventButton *event, struct tab *tab)
{
! struct resultset *set;
if(event) {
--- 2049,2056 ----
}
int select_entry_callback(GtkWidget *clist, gint row, gint column,
GdkEventButton *event, struct tab *tab)
{
! struct dn_on_server *set;
if(event) {
***************
*** 1927,1931 ****
GtkCListRow *clistrow;
GList *list;
! struct resultset *set;
if(event && event->button == 3) {
--- 2073,2077 ----
GtkCListRow *clistrow;
GList *list;
! struct dn_on_server *set;
if(event && event->button == 3) {
***************
*** 1952,1956 ****
struct tab *tab)
{
! struct resultset *set;
int rc, row, column;
--- 2098,2102 ----
struct tab *tab)
{
! struct dn_on_server *set;
int rc, row, column;
Index: search.h
===================================================================
RCS file: /cvsroot/gqclient/gq/src/search.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -C2 -d -r1.15 -r1.16
*** search.h 19 Oct 2003 12:06:42 -0000 1.15
--- search.h 28 Oct 2003 19:26:57 -0000 1.16
***************
*** 39,43 ****
int populated_searchbase;
int search_lock;
! struct resultset *set;
GList *history;
--- 39,46 ----
int populated_searchbase;
int search_lock;
!
! /* set gets used to pass the current result for some
! callbacks. There was no simple other way except to hack */
! struct dn_on_server *set;
GList *history;
***************
*** 48,59 ****
int max_depth;
GList *attrs;
- };
-
- struct resultset {
- char *dn;
- struct ldapserver *server;
- /* struct oc *objectclass; */
- /* struct attrs *attributes; */
- /* int num_attributes; */
};
--- 51,54 ----
|