[Commits] [SCM] claws branch, master, updated. 3.13.0-96-gade3676

charles at claws-mail.org charles at claws-mail.org
Sat Dec 5 00:39:53 CET 2015


The branch, master has been updated
       via  ade36765043da35dfac36ba905ff1b40efd88ead (commit)
      from  e2746b5c0864a8cb8c291ce76997b6e69fe45525 (commit)

Summary of changes:
 src/addressbook.c |   84 +++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 79 insertions(+), 5 deletions(-)


- Log -----------------------------------------------------------------
commit ade36765043da35dfac36ba905ff1b40efd88ead
Author: Charles Lehner <charles at claws-mail.org>
Date:   Fri Dec 4 17:51:16 2015 -0500

    Fix bug #1918: allow searching of local address books
    
    Based on code in Sylpheed by Hiroyuki from 2009-11-26

diff --git a/src/addressbook.c b/src/addressbook.c
index 9aa8d30..60c5f02 100644
--- a/src/addressbook.c
+++ b/src/addressbook.c
@@ -210,6 +210,9 @@ static void addressbook_person_collapse_node	(GtkCMCTree	*ctree,
 						 GList		*node,
 						 gpointer	*data );
 
+static void addressbook_entry_activated		(GtkWidget	*widget,
+						 gpointer	 data);
+
 static gboolean addressbook_list_button_pressed	(GtkWidget	*widget,
 						 GdkEventButton	*event,
 						 gpointer	 data);
@@ -1117,6 +1120,8 @@ static void addressbook_create(void)
 	g_signal_connect(G_OBJECT(entry), "key_press_event",
 			 G_CALLBACK(addressbook_entry_key_pressed),
 			 NULL);
+	g_signal_connect(G_OBJECT(entry), "activate",
+			 G_CALLBACK(addressbook_entry_activated), NULL);
 
 	if (!prefs_common.addressbook_use_editaddress_dialog) {
 		editaddress_vbox = gtk_vbox_new(FALSE, 4);
@@ -2372,13 +2377,11 @@ static void addressbook_list_row_selected( GtkCMCTree *clist,
 					   gint column,
 					   gpointer data )
 {
-	GtkEntry *entry = GTK_ENTRY(addrbook.entry);
 	AddrItemObject *aio = NULL;
 	AddressObject *pobj = NULL;
 	AdapterDSource *ads = NULL;
 	AddressDataSource *ds = NULL;
 
-	gtk_entry_set_text( entry, "" );
 	addrbook.listSelected = node;
 
 	pobj = gtk_cmctree_node_get_row_data( GTK_CMCTREE(addrbook.ctree), addrbook.treeSelected );
@@ -2425,6 +2428,11 @@ static void addressbook_list_row_unselected( GtkCMCTree *ctree,
 		addressbook_edit_person_invalidate(NULL, NULL, NULL);
 }
 
+static void addressbook_entry_activated(GtkWidget *widget, gpointer data)
+{
+	addressbook_lup_clicked(NULL, NULL);
+}
+
 static gboolean addressbook_list_button_pressed(GtkWidget *widget,
 						GdkEventButton *event,
 						gpointer data)
@@ -2537,6 +2545,7 @@ static gboolean addressbook_tree_button_pressed(GtkWidget *ctree,
 			canLookup = TRUE;
 	}
 	if (obj->type == ADDR_DATASOURCE) {
+		canLookup = TRUE;
 		ads = ADAPTER_DSOURCE(obj);
 		ds = ads->dataSource;
 		if( !ds )
@@ -2552,10 +2561,9 @@ static gboolean addressbook_tree_button_pressed(GtkWidget *ctree,
 		}
 		canEdit = TRUE;
 		canTreeCopy = TRUE;
-		if( iface->externalQuery )
-			canLookup = TRUE;
 	}
 	else if (obj->type == ADDR_ITEM_FOLDER) {
+		canLookup = TRUE;
 		ds = addressbook_find_datasource( node );
 		if( !ds )
 			goto just_set_sens;
@@ -2574,11 +2582,11 @@ static gboolean addressbook_tree_button_pressed(GtkWidget *ctree,
 
 		if( iface->externalQuery ) {
 			/* Enable deletion of LDAP folder */
-			canLookup = TRUE;
 			canDelete = TRUE;
 		}
 	}
 	else if (obj->type == ADDR_ITEM_GROUP) {
+		canLookup = TRUE;
 		ds = addressbook_find_datasource( node );
 		if( !ds )
 			goto just_set_sens;
@@ -3521,9 +3529,32 @@ static gchar *addressbook_format_item_clist( ItemPerson *person, ItemEMail *emai
 	return str;
 }
 
+static gboolean addressbook_match_item(const gchar *name,
+				       const gchar *email_alias,
+				       const gchar *addr,
+				       const gchar *remarks,
+				       const gchar *str)
+{
+	if (!name)
+		return FALSE;
+	if (!str || str[0] == '\0')
+		return TRUE;
+	if (strcasestr(name, str))
+		return TRUE;
+	else if (email_alias && strcasestr(email_alias, str))
+		return TRUE;
+	else if (addr && strcasestr(addr, str))
+		return TRUE;
+	else if (remarks && strcasestr(remarks, str))
+		return TRUE;
+
+	return FALSE;
+}
+
 static void addressbook_load_group( GtkCMCTree *clist, ItemGroup *itemGroup ) {
 	GList *items = itemGroup->listEMail;
 	AddressTypeControlItem *atci = addrbookctl_lookup( ADDR_ITEM_EMAIL );
+	const gchar *search_str = gtk_entry_get_text(GTK_ENTRY(addrbook.entry));
 	for( ; items != NULL; items = g_list_next( items ) ) {
 		GtkCMCTreeNode *nodeEMail = NULL;
 		gchar *text[N_LIST_COLS];
@@ -3534,6 +3565,13 @@ static void addressbook_load_group( GtkCMCTree *clist, ItemGroup *itemGroup ) {
 		if( ! email ) continue;
 
 		person = ( ItemPerson * ) ADDRITEM_PARENT(email);
+
+		if( !addressbook_match_item(ADDRITEM_NAME(person),
+					    ADDRITEM_NAME(email),
+					    email->address, email->remarks,
+					    search_str))
+			continue;
+
 		str = addressbook_format_item_clist( person, email );
 		if( str ) {
 			text[COL_NAME] = addressbook_set_col_name_guard(str);
@@ -3659,13 +3697,33 @@ static void addressbook_folder_load_person( GtkCMCTree *clist, ItemFolder *itemF
 	GList *items;
 	AddressTypeControlItem *atci = addrbookctl_lookup( ADDR_ITEM_PERSON );
 	AddressTypeControlItem *atciMail = addrbookctl_lookup( ADDR_ITEM_EMAIL );
+	const gchar *search_str;
 
 	if( atci == NULL ) return;
 	if( atciMail == NULL ) return;
 
+	search_str = gtk_entry_get_text(GTK_ENTRY(addrbook.entry));
+
 	/* Load email addresses */
 	items = addritem_folder_get_person_list( itemFolder );
 	for( ; items != NULL; items = g_list_next( items ) ) {
+		ItemPerson *person;
+		GList *node;
+		ItemEMail *email;
+
+		person = (ItemPerson *)items->data;
+		if (!person)
+			continue;
+		node = person->listEMail;
+		if (node && node->data) {
+			email = node->data;
+			if (!addressbook_match_item(ADDRITEM_NAME(person), ADDRITEM_NAME(email), email->address, email->remarks, search_str))
+				continue;
+		} else {
+			if (!addressbook_match_item(ADDRITEM_NAME(person), NULL, NULL, NULL, search_str))
+				continue;
+		}
+
 		addressbook_folder_load_one_person( clist, items->data, atci, atciMail );
 	}
 	/* Free up the list */
@@ -3718,15 +3776,23 @@ static void addressbook_folder_remove_one_person( GtkCMCTree *clist, ItemPerson
 static void addressbook_folder_load_group( GtkCMCTree *clist, ItemFolder *itemFolder ) {
 	GList *items;
 	AddressTypeControlItem *atci =  addrbookctl_lookup( ADDR_ITEM_GROUP );
+	const gchar *search_str;
 
 	/* Load any groups */
 	if( ! atci ) return;
+
+	search_str = gtk_entry_get_text(GTK_ENTRY(addrbook.entry));
+
 	items = addritem_folder_get_group_list( itemFolder );
 	for( ; items != NULL; items = g_list_next( items ) ) {
 		GtkCMCTreeNode *nodeGroup = NULL;
 		gchar *text[N_LIST_COLS];
 		ItemGroup *group = items->data;
 		if( group == NULL ) continue;
+		if( !addressbook_match_item(ADDRITEM_NAME(group),
+					    NULL, NULL, NULL, search_str) )
+			continue;
+
 		text[COL_NAME] = ADDRITEM_NAME(group);
 		text[COL_ADDRESS] = "";
 		text[COL_REMARKS] = "";
@@ -4640,6 +4706,14 @@ static void addressbook_lup_clicked( GtkButton *button, gpointer data ) {
 	obj = gtk_cmctree_node_get_row_data( ctree, node );
 	if( obj == NULL ) return;
 
+	if (obj->type != ADDR_DATASOURCE ||
+			ADAPTER_DSOURCE(obj)->subType != ADDR_LDAP) {
+		addressbook_set_clist(
+				gtk_cmctree_node_get_row_data(GTK_CMCTREE(addrbook.ctree),
+					addrbook.treeSelected),
+				TRUE);
+	}
+
 	ds = addressbook_find_datasource( node );
 	if( ds == NULL ) return;
 

-----------------------------------------------------------------------


hooks/post-receive
-- 
Claws Mail


More information about the Commits mailing list