#include "menu.h"
#include "stock_pixmap.h"
#include "xml.h"
-#include "prefs.h"
+#include "prefs_gtk.h"
#include "procmime.h"
#include "utils.h"
#include "gtkutils.h"
#include "editgroup.h"
#include "editaddress.h"
#include "editbook.h"
-#include "ldif.h"
#include "importldif.h"
-#include "mutt.h"
#include "importmutt.h"
-#include "pine.h"
#include "importpine.h"
#ifdef USE_JPILOT
#include "addrselect.h"
#include "addrclip.h"
#include "addrgather.h"
+#include "adbookbase.h"
+#include "exphtmldlg.h"
typedef enum
{
GtkCTreeNode *node);
static GtkCTreeNode *addressbook_find_group_node (GtkCTreeNode *parent,
ItemGroup *group);
-static GtkCTreeNode *addressbook_find_folder_node( GtkCTreeNode *parent,
- ItemFolder *folder );
-
-static void addressbook_delete_object (AddressObject *obj);
-
static void key_pressed (GtkWidget *widget,
GdkEventKey *event,
gpointer data);
static void addressbook_import_ldif_cb ( void );
static void addressbook_import_mutt_cb ( void );
static void addressbook_import_pine_cb ( void );
+static void addressbook_export_html_cb ( void );
static void addressbook_clip_cut_cb ( void );
static void addressbook_clip_copy_cb ( void );
static void addressbook_clip_paste_cb ( void );
{N_("/_Address/_Edit"), "<alt>Return", addressbook_edit_address_cb, 0, NULL},
{N_("/_Address/_Delete"), NULL, addressbook_delete_address_cb, 0, NULL},
{N_("/_Tools/---"), NULL, NULL, 0, "<Separator>"},
- {N_("/_Tools/Import _LDIF file"), NULL, addressbook_import_ldif_cb, 0, NULL},
- {N_("/_Tools/Import M_utt file"), NULL, addressbook_import_mutt_cb, 0, NULL},
- {N_("/_Tools/Import _Pine file"), NULL, addressbook_import_pine_cb, 0, NULL},
+ {N_("/_Tools/Import _LDIF file..."), NULL, addressbook_import_ldif_cb, 0, NULL},
+ {N_("/_Tools/Import M_utt file..."), NULL, addressbook_import_mutt_cb, 0, NULL},
+ {N_("/_Tools/Import _Pine file..."), NULL, addressbook_import_pine_cb, 0, NULL},
+ {N_("/_Tools/---"), NULL, NULL, 0, "<Separator>"},
+ {N_("/_Tools/Export _HTML..."), NULL, addressbook_export_html_cb, 0, NULL},
{N_("/_Help"), NULL, NULL, 0, "<LastBranch>"},
{N_("/_Help/_About"), NULL, about_show, 0, NULL}
};
-/* New options to be added. */
-/*
- {N_("/_Tools"), NULL, NULL, 0, "<Branch>"},
- {N_("/_Tools/Import _Mozilla"), NULL, NULL, 0, NULL},
- {N_("/_Tools/Import _vCard"), NULL, NULL, 0, NULL},
- {N_("/_Tools/---"), NULL, NULL, 0, "<Separator>"},
- {N_("/_Tools/Export _LDIF file"), NULL, NULL, 0, NULL},
- {N_("/_Tools/Export v_Card"), NULL, NULL, 0, NULL},
-*/
-
static GtkItemFactoryEntry addressbook_tree_popup_entries[] =
{
{N_("/New _Address"), NULL, addressbook_new_address_cb, 0, NULL},
addressbook_load_tree();
gtk_ctree_select(GTK_CTREE(addrbook.ctree),
GTK_CTREE_NODE(GTK_CLIST(addrbook.ctree)->row_list));
- } else
+ }
+ else {
gtk_widget_hide(addrbook.window);
+ }
gtk_widget_show_all(addrbook.window);
-
addressbook_set_target_compose(target);
}
void addressbook_set_target_compose(Compose *target)
{
addrbook.target_compose = target;
-
addressbook_button_set_sensitive();
}
}
-static gint addressbook_close(void)
-{
+static gint addressbook_close( void ) {
gtk_widget_hide(addrbook.window);
addressbook_export_to_file();
return TRUE;
gchar *name;
name = addrindex_ds_get_name( ds );
- sprintf( addressbook_msgbuf, "%s: %s", name, msg );
+ g_snprintf( addressbook_msgbuf, sizeof(addressbook_msgbuf),
+ "%s: %s", name, msg );
}
else {
- sprintf( addressbook_msgbuf, "%s", msg );
+ g_snprintf( addressbook_msgbuf, sizeof(addressbook_msgbuf),
+ "%s", msg );
}
addressbook_status_show( addressbook_msgbuf );
}
name = addrindex_ds_get_name( ds );
retVal = addrindex_ds_get_status_code( ds );
if( retVal == MGU_SUCCESS ) {
- sprintf( addressbook_msgbuf, "%s", name );
+ g_snprintf( addressbook_msgbuf,
+ sizeof(addressbook_msgbuf), "%s", name );
}
else {
- sprintf( addressbook_msgbuf, "%s: %s", name,
- mgu_error2string( retVal ) );
+ g_snprintf( addressbook_msgbuf,
+ sizeof(addressbook_msgbuf), "%s: %s", name,
+ mgu_error2string( retVal ) );
}
}
addressbook_status_show( addressbook_msgbuf );
/* Test for read only */
iface = ds->interface;
if( iface->readOnly ) {
- aval = alertpanel( _("Delete address(es)"),
+ alertpanel( _("Delete address(es)"),
_("This address data is readonly and cannot be deleted."),
_("Close"), NULL, NULL );
return;
compose = addrbook.target_compose;
if( ! compose ) return;
+ /* Nothing selected, but maybe there is something in text entry */
+ addr = gtk_entry_get_text( GTK_ENTRY( addrbook.entry) );
+ if ( addr ) {
+ compose_entry_append(
+ compose, addr, (ComposeEntryType)data );
+ }
+
+ /* Select from address list */
list = addrselect_get_list( _addressSelect_ );
node = list;
while( node ) {
gboolean canAdd = FALSE;
gboolean canEditTr = TRUE;
gboolean editAddress = FALSE;
+ gboolean canExport = TRUE;
AddressTypeControlItem *atci = NULL;
AddressDataSource *ds = NULL;
AddressInterface *iface = NULL;
menu_set_sensitive( addrbook.menu_factory, atci->menuCommand, TRUE );
}
}
- canEditTr = FALSE;
+ canEditTr = canExport = FALSE;
}
else if( obj->type == ADDR_DATASOURCE ) {
AdapterDSource *ads = ADAPTER_DSOURCE(obj);
canAdd = canEdit = editAddress = TRUE;
}
if( ! iface->haveLibrary ) {
- canAdd = canEdit = editAddress = FALSE;
+ canAdd = canEdit = editAddress = canExport = FALSE;
}
}
else if( obj->type == ADDR_ITEM_FOLDER ) {
menu_set_sensitive( addrbook.menu_factory, "/File/Edit", canEditTr );
menu_set_sensitive( addrbook.menu_factory, "/File/Delete", canEditTr );
+
+ /* Export data */
+ menu_set_sensitive( addrbook.menu_factory, "/Tools/Export HTML...", canExport );
}
static void addressbook_tree_selected(GtkCTree *ctree, GtkCTreeNode *node,
if( name && parentNode ) {
/* Update node in tree view */
addressbook_change_node_name( node, name );
- gtk_ctree_sort_node(ctree, parentNode);
+ gtk_sctree_sort_node(ctree, parentNode);
gtk_ctree_expand( ctree, node );
gtk_ctree_select( ctree, node );
}
return NULL;
}
-/*
-* Search for specified child folder node in address index tree.
-* Enter: parent Parent node.
-* folder Folder to find.
-*/
-static GtkCTreeNode *addressbook_find_folder_node( GtkCTreeNode *parent, ItemFolder *folder ) {
- GtkCTreeNode *node = NULL;
- GtkCTreeRow *currRow;
-
- currRow = GTK_CTREE_ROW( parent );
- if( currRow ) {
- node = currRow->children;
- while( node ) {
- AddressObject *obj;
-
- obj = gtk_ctree_node_get_row_data( GTK_CTREE(addrbook.ctree), node );
- if( obj->type == ADDR_ITEM_FOLDER ) {
- ItemFolder *f = ADAPTER_FOLDER(obj)->itemFolder;
- if( f == folder ) return node;
- }
- currRow = GTK_CTREE_ROW(node);
- node = currRow->sibling;
- }
- }
- return NULL;
-}
-
static AddressBookFile *addressbook_get_book_file() {
AddressBookFile *abf = NULL;
AddressDataSource *ds = NULL;
while( (child = currRow->children) ) {
gtk_ctree_move( ctree, child, parent, node );
}
- gtk_ctree_sort_node( ctree, parent );
+ gtk_sctree_sort_node( ctree, parent );
}
}
/* Update tree node with node name */
if( node == NULL ) return;
addressbook_change_node_name( node, name );
- gtk_ctree_sort_node( ctree, parentNode );
+ gtk_sctree_sort_node( ctree, parentNode );
gtk_ctree_select( ctree, addrbook.opened );
}
FALSE, person->isOpened );
gtk_ctree_node_set_row_data(clist, nodePerson, person );
}
- gtk_ctree_sort_node(GTK_CTREE(clist), NULL);
+ gtk_sctree_sort_node(GTK_CTREE(clist), NULL);
}
/* Free up the list */
mgu_clear_list( items );
atci->iconXpmOpen, atci->maskXpmOpen,
FALSE, FALSE);
gtk_ctree_node_set_row_data(clist, nodeGroup, group );
- gtk_ctree_sort_node(clist, NULL);
+ gtk_sctree_sort_node(clist, NULL);
}
/* Free up the list */
mgu_clear_list( items );
g_list_free( items );
}
-/*
- * Load data sources into list.
- */
-static void addressbook_node_load_datasource( GtkCTree *clist, AddressObject *obj ) {
- AdapterInterface *adapter;
- AddressInterface *iface;
- AddressTypeControlItem *atci = NULL;
- GtkCTreeNode *newNode, *node;
- GtkCTreeRow *row;
- GtkCell *cell = NULL;
- gchar *text[N_COLS];
-
- adapter = ADAPTER_INTERFACE(obj);
- if( adapter == NULL ) return;
- iface = adapter->interface;
- atci = adapter->atci;
- if( atci == NULL ) return;
-
- /* Create nodes in list copying values for data sources in tree */
- row = GTK_CTREE_ROW( adapter->treeNode );
- if( row ) {
- node = row->children;
- while( node ) {
- gpointer data;
-
- data = gtk_ctree_node_get_row_data( clist, node );
- row = GTK_CTREE_ROW( node );
- cell = ( ( GtkCListRow * )row )->cell;
- text[COL_NAME] = cell->u.text;
- text[COL_ADDRESS] = NULL;
- text[COL_REMARKS] = NULL;
- newNode = gtk_ctree_insert_node( clist, NULL, NULL,
- text, FOLDER_SPACING,
- atci->iconXpm, atci->maskXpm,
- atci->iconXpmOpen, atci->maskXpmOpen,
- FALSE, FALSE);
- /*
- gtk_ctree_node_set_row_data( clist, newNode, data );
- gtk_ctree_node_set_row_data_full( clist, newNode, NULL, NULL );
- */
- node = row->sibling;
- }
- }
- gtk_ctree_sort_node( clist, NULL );
-}
-
/*
* Search ctree widget callback function.
* Enter: pA Pointer to node.
}
}
- gtk_ctree_sort_node(ctree, node);
+ gtk_sctree_sort_node(ctree, node);
return added;
}
atci->treeLeaf, atci->treeExpand );
gtk_ctree_node_set_row_data_full( ctree, newNode, adapter,
addressbook_free_treenode );
- gtk_ctree_sort_node( ctree, node );
+ gtk_sctree_sort_node( ctree, node );
return newNode;
}
addressbook_node_add_group( newNode, ds, item );
listItems = g_list_next( listItems );
}
- gtk_ctree_sort_node( ctree, node );
+ gtk_sctree_sort_node( ctree, node );
return newNode;
}
-static void addressbook_delete_object(AddressObject *obj) {
- AdapterDSource *ads = NULL;
- AddressDataSource *ds = NULL;
- if (!obj) return;
-
- /* Remove data source. */
- /* printf( "Delete obj type : %d\n", obj->type ); */
-
- ads = ADAPTER_DSOURCE(obj);
- if( ads == NULL ) return;
- ds = ads->dataSource;
- if( ds == NULL ) return;
-
- /* Remove data source */
- if( addrindex_index_remove_datasource( _addressIndex_, ds ) ) {
- addrindex_free_datasource( ds );
- }
- /* Free up Adapter object */
- g_free( ads );
-}
-
void addressbook_export_to_file( void ) {
if( _addressIndex_ ) {
/* Save all new address book data */
if( svr ) {
name = syldap_get_name( svr );
if( svr->busyFlag ) {
- sprintf( addressbook_msgbuf, "%s: %s", name, ADDRESSBOOK_LDAP_BUSYMSG );
+ g_snprintf( addressbook_msgbuf,
+ sizeof(addressbook_msgbuf), "%s: %s", name,
+ ADDRESSBOOK_LDAP_BUSYMSG );
}
else {
if( svr->retVal == MGU_SUCCESS ) {
- sprintf( addressbook_msgbuf, "%s", name );
+ g_snprintf( addressbook_msgbuf,
+ sizeof(addressbook_msgbuf), "%s",
+ name );
}
else {
- sprintf( addressbook_msgbuf, "%s: %s", name, mgu_error2string( svr->retVal ) );
+ g_snprintf( addressbook_msgbuf,
+ sizeof(addressbook_msgbuf),
+ "%s: %s", name,
+ mgu_error2string( svr->retVal ) );
}
}
}
addressbook_status_show( addressbook_msgbuf );
}
-static void ldapsearch_callback( SyldapServer *sls ) {
+static void addressbook_ldap_show_results( SyldapServer *sls ) {
GtkCTree *ctree = GTK_CTREE(addrbook.ctree);
AddressObject *obj;
AdapterDSource *ads = NULL;
}
}
}
+
+/*
+ * LDAP idle function. This function is called during UI idle time while
+ * an LDAP search is in progress.
+ * Enter: data Reference to LDAP server object.
+ */
+static void addressbook_ldap_idle( gpointer data ) {
+ SyldapServer *server;
+
+ server = ( SyldapServer * ) data;
+ if( ! server->busyFlag ) {
+ /* Server has completed search - remove from idle list */
+ gtk_idle_remove( server->idleId );
+
+ /* Process callback and free up the thread */
+ addressbook_ldap_show_results( server );
+ g_free( server->thread );
+ server->thread = NULL;
+ }
+}
+
+/*
+ * Perform lookup for LDAP search.
+ * Enter: ads Adapter for data source.
+ * sLookup Lookup string.
+ */
+static void addressbook_ldap_lookup( AdapterDSource *ads, gchar *sLookup ) {
+ AddressDataSource *ds = NULL;
+ AddressInterface *iface = NULL;
+ SyldapServer *server;
+
+ ds = ads->dataSource;
+ if( ds == NULL ) return;
+ iface = ds->interface;
+ if( ! iface->haveLibrary ) return;
+ server = ds->rawDataSource;
+ if( server ) {
+ syldap_cancel_read( server );
+ if( *sLookup == '\0' || strlen( sLookup ) < 1 ) return;
+ syldap_set_search_value( server, sLookup );
+ server->idleId = gtk_idle_add(
+ ( GtkFunction ) addressbook_ldap_idle, server );
+ syldap_read_data_th( server );
+ addressbook_ldap_show_message( server );
+ }
+}
#endif
/*
static void addressbook_lup_clicked( GtkButton *button, gpointer data ) {
GtkCTree *ctree = GTK_CTREE(addrbook.ctree);
AddressObject *obj;
-#ifdef USE_LDAP
AdapterDSource *ads = NULL;
- AddressDataSource *ds = NULL;
- AddressInterface *iface = NULL;
-#endif
gchar *sLookup;
- sLookup = gtk_editable_get_chars( GTK_EDITABLE(addrbook.entry), 0, -1 );
- g_strchomp( sLookup );
-
if( ! addrbook.treeSelected ) return;
if( GTK_CTREE_ROW( addrbook.treeSelected )->level == 1 ) return;
obj = gtk_ctree_node_get_row_data( ctree, addrbook.treeSelected );
if( obj == NULL ) return;
-#ifdef USE_LDAP
+ sLookup = gtk_editable_get_chars( GTK_EDITABLE(addrbook.entry), 0, -1 );
+ g_strchomp( sLookup );
+
if( obj->type == ADDR_DATASOURCE ) {
ads = ADAPTER_DSOURCE(obj);
+#ifdef USE_LDAP
if( ads->subType == ADDR_LDAP ) {
- SyldapServer *server;
-
- ds = ads->dataSource;
- if( ds == NULL ) return;
- iface = ds->interface;
- if( ! iface->haveLibrary ) return;
- server = ds->rawDataSource;
- if( server ) {
- syldap_cancel_read( server );
- if( *sLookup == '\0' || strlen( sLookup ) < 1 ) return;
- syldap_set_search_value( server, sLookup );
- syldap_set_callback( server, ldapsearch_callback );
- syldap_read_data_th( server );
- addressbook_ldap_show_message( server );
- }
+ addressbook_ldap_lookup( ads, sLookup );
}
+#endif /* USE_LDAP */
}
-#endif
+ g_free( sLookup );
}
/* **********************************************************************
ItemObjectType addressbook_type2item( AddressObjectType abType ) {
ItemObjectType ioType;
- ioType = ITEMTYPE_NONE;
switch( abType ) {
case ADDR_ITEM_PERSON: ioType = ITEMTYPE_PERSON; break;
case ADDR_ITEM_EMAIL: ioType = ITEMTYPE_EMAIL; break;
case ADDR_ITEM_FOLDER: ioType = ITEMTYPE_FOLDER; break;
case ADDR_ITEM_GROUP: ioType = ITEMTYPE_GROUP; break;
case ADDR_DATASOURCE: ioType = ITEMTYPE_DATASOURCE; break;
+ default: ioType = ITEMTYPE_NONE; break;
}
return ioType;
}
}
/*
- * Gather addresses.
+ * Harvest addresses.
* Enter: folderItem Folder to import.
+ * sourceInd Source indicator: FALSE - Folder, TRUE - Messages.
* msgList List of message numbers, or NULL to process folder.
*/
-void addressbook_gather( FolderItem *folderItem, GList *msgList ) {
+void addressbook_harvest(
+ FolderItem *folderItem, gboolean sourceInd, GList *msgList )
+{
AddressDataSource *ds = NULL;
AdapterDSource *ads = NULL;
AddressBookFile *abf = NULL;
AdapterInterface *adapter;
GtkCTreeNode *newNode;
- abf = addrgather_dlg_execute( folderItem, _addressIndex_, msgList );
+ abf = addrgather_dlg_execute(
+ folderItem, _addressIndex_, sourceInd, msgList );
if( abf ) {
ds = addrindex_index_add_datasource(
_addressIndex_, ADDR_IF_BOOK, abf );
}
}
+/*
+* Export HTML file.
+*/
+static void addressbook_export_html_cb( void ) {
+ GtkCTree *ctree = GTK_CTREE(addrbook.ctree);
+ AddressObject *obj;
+ AddressDataSource *ds = NULL;
+ AddrBookBase *adbase;
+ AddressCache *cache;
+ GtkCTreeNode *node = NULL;
+
+ if( ! addrbook.treeSelected ) return;
+ node = addrbook.treeSelected;
+ if( GTK_CTREE_ROW(node)->level == 1 ) return;
+ obj = gtk_ctree_node_get_row_data( ctree, node );
+ if( obj == NULL ) return;
+
+ ds = addressbook_find_datasource( node );
+ if( ds == NULL ) return;
+ adbase = ( AddrBookBase * ) ds->rawDataSource;
+ cache = adbase->addressCache;
+ addressbook_exp_html( cache );
+}
+
/*
* End of Source.
*/