Thread: [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 ----
 |