/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2006 Hiroyuki Yamamoto and the Sylpheed-Claws team
+ * Copyright (C) 1999-2006 Hiroyuki Yamamoto and the Claws Mail team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
static gint addressbook_close (void);
static void addressbook_button_set_sensitive (void);
+static gboolean address_index_has_focus = FALSE;
+static gboolean address_list_has_focus = FALSE;
+
/* callback functions */
static void addressbook_del_clicked (GtkButton *button,
gpointer data);
static GtkTargetEntry addressbook_drag_types[] =
{
- {"sylpheed-claws/internal", GTK_TARGET_SAME_APP, TARGET_DUMMY}
+ {"claws-mail/internal", GTK_TARGET_SAME_APP, TARGET_DUMMY}
};
static GtkTargetList *addressbook_target_list = NULL;
{
{N_("/_Edit"), NULL, addressbook_treenode_edit_cb, 0, NULL},
{N_("/_Delete"), NULL, addressbook_treenode_delete_cb, 0, NULL},
- {N_("/---"), NULL, NULL, 0, "<Separator>"},
+ {"/---", NULL, NULL, 0, "<Separator>"},
{N_("/New _Book"), NULL, addressbook_new_book_cb, 0, NULL},
{N_("/New _Folder"), NULL, addressbook_new_folder_cb, 0, NULL},
{N_("/New _Group"), NULL, addressbook_new_group_cb, 0, NULL},
- {N_("/---"), NULL, NULL, 0, "<Separator>"},
+ {"/---", NULL, NULL, 0, "<Separator>"},
{N_("/C_ut"), NULL, addressbook_treenode_cut_cb, 0, NULL},
{N_("/_Copy"), NULL, addressbook_treenode_copy_cb, 0, NULL},
{N_("/_Paste"), NULL, addressbook_treenode_paste_cb, 0, NULL}
static GtkItemFactoryEntry addressbook_list_popup_entries[] =
{
{N_("/_Select all"), NULL, addressbook_select_all_cb, 0, NULL},
- {N_("/---"), NULL, NULL, 0, "<Separator>"},
+ {"/---", NULL, NULL, 0, "<Separator>"},
{N_("/_Edit"), NULL, addressbook_edit_address_cb, 0, NULL},
{N_("/_Delete"), NULL, addressbook_delete_address_cb, 0, NULL},
- {N_("/---"), NULL, NULL, 0, "<Separator>"},
+ {"/---", NULL, NULL, 0, "<Separator>"},
{N_("/New _Address"), NULL, addressbook_new_address_cb, 0, NULL},
{N_("/New _Group"), NULL, addressbook_new_group_cb, 0, NULL},
- {N_("/---"), NULL, NULL, 0, "<Separator>"},
+ {"/---", NULL, NULL, 0, "<Separator>"},
{N_("/C_ut"), NULL, addressbook_clip_cut_cb, 0, NULL},
{N_("/_Copy"), NULL, addressbook_clip_copy_cb, 0, NULL},
{N_("/_Paste"), NULL, addressbook_clip_paste_cb, 0, NULL},
- {N_("/---"), NULL, NULL, 0, "<Separator>"},
+ {"/---", NULL, NULL, 0, "<Separator>"},
/* {N_("/Pa_ste Address"), NULL, addressbook_clip_paste_address_cb, 0, NULL},*/
{N_("/_Mail To"), NULL, addressbook_mail_to_cb, 0, NULL},
#ifdef USE_LDAP
void addressbook_open(Compose *target)
{
+fprintf(stderr, "addressbook_open: %p\n", target);
/* Initialize all static members */
if( _clipBoard_ == NULL ) {
_clipBoard_ = addrclip_create();
}
gtk_widget_show_all(addrbook.window);
+ if (!prefs_common.addressbook_use_editaddress_dialog)
+ addressbook_edit_person_widgetset_hide();
+
address_completion_start(addrbook.window);
addressbook_show_buttons(target == NULL, lastCanLookup, target != NULL);
static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
+fprintf(stderr, "key_pressed\n");
if (event && event->keyval == GDK_Escape)
addressbook_close();
- else if (event && event->keyval == GDK_Delete)
- addressbook_del_clicked(NULL, NULL);
+ else if (event && event->keyval == GDK_Delete) {
+ /* TODO: enable deletion when focus is in ctree (needs implementation in _del_clicked() */
+ if ( /* address_index_has_focus || */ address_list_has_focus )
+ addressbook_del_clicked(NULL, NULL);
+ }
return FALSE;
}
addressbook_sort_list(clist, COL_REMARKS, sort_type);
}
+static void addressbook_address_index_focus_evt_in(GtkWidget *widget, GdkEventFocus *event,
+ gpointer data)
+{
+ address_index_has_focus = TRUE;
+}
+
+static void addressbook_address_index_focus_evt_out(GtkWidget *widget, GdkEventFocus *event,
+ gpointer data)
+{
+ address_index_has_focus = FALSE;
+}
+
+static void addressbook_address_list_focus_evt_in(GtkWidget *widget, GdkEventFocus *event,
+ gpointer data)
+{
+ address_list_has_focus = TRUE;
+}
+
+static void addressbook_address_list_focus_evt_out(GtkWidget *widget, GdkEventFocus *event,
+ gpointer data)
+{
+ address_list_has_focus = FALSE;
+}
+
/*
* Create the address book widgets. The address book contains two CTree widgets: the
* address index tree on the left and the address list on the right.
GtkWidget *vbox2;
GtkWidget *ctree_swin;
GtkWidget *ctree;
+ GtkWidget *editaddress_vbox;
GtkWidget *clist_vbox;
GtkWidget *clist_swin;
GtkWidget *clist;
- GtkWidget *paned;
+ GtkWidget *hpaned;
+ GtkWidget *vpaned;
GtkWidget *hbox;
GtkWidget *label;
GtkWidget *entry;
static GdkGeometry geometry;
+fprintf(stderr, "addressbook_create\n");
debug_print("Creating addressbook window...\n");
index_titles[COL_SOURCES] = _("Sources");
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ctree_swin),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
- gtk_widget_set_size_request(ctree_swin, COL_FOLDER_WIDTH + 40, -1);
+ gtk_widget_set_size_request(ctree_swin, COL_FOLDER_WIDTH + 20, -1);
/* Address index */
ctree = gtk_sctree_new_with_titles(N_INDEX_COLS, 0, index_titles);
g_signal_connect(G_OBJECT(ctree), "drag_data_received",
G_CALLBACK(addressbook_drag_received_cb),
ctree);
+ g_signal_connect(G_OBJECT(ctree), "focus_in_event",
+ G_CALLBACK(addressbook_address_index_focus_evt_in), NULL);
+ g_signal_connect(G_OBJECT(ctree), "focus_out_event",
+ G_CALLBACK(addressbook_address_index_focus_evt_out), NULL);
clist_vbox = gtk_vbox_new(FALSE, 4);
COL_NAME_WIDTH);
gtk_clist_set_column_width(GTK_CLIST(clist), COL_ADDRESS,
COL_ADDRESS_WIDTH);
+ gtk_widget_set_size_request(clist, -1, 80);
addressbook_sort_list(GTK_CLIST(clist), COL_NAME, GTK_SORT_ASCENDING);
g_signal_connect(G_OBJECT(GTK_CLIST(clist)->column[COL_NAME].button),
"clicked", G_CALLBACK(addressbook_address_clicked), clist);
g_signal_connect(G_OBJECT(GTK_CLIST(clist)->column[COL_REMARKS].button),
"clicked", G_CALLBACK(addressbook_remarks_clicked), clist);
-
+ g_signal_connect(G_OBJECT(clist), "focus_in_event",
+ G_CALLBACK(addressbook_address_list_focus_evt_in), NULL);
+ g_signal_connect(G_OBJECT(clist), "focus_out_event",
+ G_CALLBACK(addressbook_address_list_focus_evt_out), NULL);
+
for (i = 0; i < N_LIST_COLS; i++)
GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(clist)->column[i].button,
GTK_CAN_FOCUS);
g_signal_connect(G_OBJECT(entry), "key_press_event",
G_CALLBACK(addressbook_entry_key_pressed),
NULL);
- paned = gtk_hpaned_new();
- gtk_box_pack_start(GTK_BOX(vbox2), paned, TRUE, TRUE, 0);
- gtk_paned_add1(GTK_PANED(paned), ctree_swin);
- gtk_paned_add2(GTK_PANED(paned), clist_vbox);
+
+ if (!prefs_common.addressbook_use_editaddress_dialog) {
+ editaddress_vbox = gtk_vbox_new(FALSE, 4);
+ vpaned = gtk_vpaned_new();
+ gtk_paned_pack1(GTK_PANED(vpaned), clist_vbox, FALSE, FALSE);
+ gtk_paned_pack2(GTK_PANED(vpaned), editaddress_vbox, TRUE, FALSE);
+ } else {
+ vpaned = NULL;
+ editaddress_vbox = NULL;
+ }
+ hpaned = gtk_hpaned_new();
+ gtk_box_pack_start(GTK_BOX(vbox2), hpaned, TRUE, TRUE, 0);
+ gtk_paned_pack1(GTK_PANED(hpaned), ctree_swin, FALSE, FALSE);
+ if (prefs_common.addressbook_use_editaddress_dialog)
+ gtk_paned_pack2(GTK_PANED(hpaned), clist_vbox, TRUE, FALSE);
+ else
+ gtk_paned_pack2(GTK_PANED(hpaned), vpaned, TRUE, FALSE);
/* Status bar */
hsbox = gtk_hbox_new(FALSE, 0);
addrbook.ctree = ctree;
addrbook.ctree_swin
= ctree_swin;
+ addrbook.editaddress_vbox = editaddress_vbox;
addrbook.clist = clist;
addrbook.label = label;
addrbook.entry = entry;
* Close address book window and save to file(s).
*/
static gint addressbook_close( void ) {
+fprintf(stderr, "addressbook_close\n");
address_completion_end(addrbook.window);
+ if (!prefs_common.addressbook_use_editaddress_dialog)
+ addressbook_edit_person_invalidate(NULL, NULL, NULL);
gtk_widget_hide(addrbook.window);
addressbook_export_to_file();
return TRUE;
GList *list, *node;
gboolean refreshList = FALSE;
+fprintf(stderr, "addressbook_del_clicked: %p %p\n", button, data);
pobj = gtk_ctree_node_get_row_data(ctree, addrbook.opened );
g_return_if_fail(pobj != NULL);
/* Select from address list */
list = addrselect_get_list( _addressSelect_ );
node = list;
- while( node ) {
- item = node->data;
- node = g_list_next( node );
- aio = item->addressItem;
- if( aio->type == ADDR_ITEM_PERSON ||
- aio->type == ADDR_ITEM_EMAIL ) {
- addr = addressbook_format_address( aio );
- compose_entry_append(
- compose, addr, (ComposeEntryType) data );
- g_free( addr );
+ if (node) {
+ while( node ) {
+ item = node->data;
+ node = g_list_next( node );
+ aio = item->addressItem;
+ if( aio->type == ADDR_ITEM_PERSON ||
+ aio->type == ADDR_ITEM_EMAIL ) {
+ addr = addressbook_format_address( aio );
+ compose_entry_append(
+ compose, addr, (ComposeEntryType) data );
+ g_free( addr );
+ }
+ else if( aio->type == ADDR_ITEM_GROUP ) {
+ ItemGroup *group = ( ItemGroup * ) aio;
+ GList *nodeMail = group->listEMail;
+ while( nodeMail ) {
+ ItemEMail *email = nodeMail->data;
+
+ addr = addressbook_format_address(
+ ( AddrItemObject * ) email );
+ compose_entry_append(
+ compose, addr, (ComposeEntryType) data );
+ g_free( addr );
+ nodeMail = g_list_next( nodeMail );
+ }
+ }
}
- else if( aio->type == ADDR_ITEM_GROUP ) {
- ItemGroup *group = ( ItemGroup * ) aio;
- GList *nodeMail = group->listEMail;
+ } else {
+ AddressObject *obj = NULL;
+
+ obj = gtk_ctree_node_get_row_data( GTK_CTREE(addrbook.ctree), addrbook.treeSelected );
+
+ if( obj && obj->type == ADDR_ITEM_GROUP ) {
+ ItemGroup *itemGroup = ADAPTER_GROUP(obj)->itemGroup;
+ GList *nodeMail = itemGroup->listEMail;
while( nodeMail ) {
ItemEMail *email = nodeMail->data;
ItemFolder *rootFolder = NULL;
AddressObjectType aot;
+fprintf(stderr, "addressbook_tree_selected\n");
addrbook.treeSelected = node;
addrbook.listSelected = NULL;
addressbook_status_show( "" );
g_signal_handlers_unblock_by_func
(G_OBJECT(ctree),
G_CALLBACK(addressbook_tree_selected), NULL);
+ if (!prefs_common.addressbook_use_editaddress_dialog)
+ addressbook_edit_person_invalidate(NULL, NULL, NULL);
/* Setup main menu selections */
addressbook_menubar_set_sensitive( FALSE );
}
static void addressbook_select_all_cb( void ) {
+fprintf(stderr, "addressbook_select_all_cb\n");
gtk_clist_select_all(GTK_CLIST(addrbook.clist));
}
AdapterDSource *ads = NULL;
AddressDataSource *ds = NULL;
+fprintf(stderr, "addressbook_list_row_selected\n");
gtk_entry_set_text( entry, "" );
addrbook.listSelected = node;
}
addressbook_list_menu_setup();
+
+ if (!addrbook.target_compose && !prefs_common.addressbook_use_editaddress_dialog)
+ addressbook_edit_address_cb(NULL, 0, NULL);
}
static void addressbook_list_row_unselected( GtkCTree *ctree,
{
AddrItemObject *aio;
+fprintf(stderr, "addressbook_list_row_unselected\n");
aio = gtk_ctree_node_get_row_data( ctree, node );
if( aio != NULL ) {
/* printf( "list unselect: %d : '%s'\n", aio->type, aio->name ); */
addressbook_list_select_remove( aio );
}
+
+ if (!prefs_common.addressbook_use_editaddress_dialog)
+ addressbook_edit_person_invalidate(NULL, NULL, NULL);
}
/* from gdkevents.c */
addrbook.target_compose)
addressbook_to_clicked(NULL, GINT_TO_POINTER(COMPOSE_TO));
else
+ if (prefs_common.addressbook_use_editaddress_dialog)
addressbook_edit_address_cb(NULL, 0, NULL);
lasttime = 0;
else if (obj->type == ADDR_ITEM_FOLDER) {
ds = addressbook_find_datasource( node );
if (!ds) {
- printf("no ds\n");
goto just_set_sens;
}
iface = ds->interface;
}
}
+void addressbook_new_address_from_book_post_cb( ItemPerson *person )
+{
+fprintf(stderr, "addressbook_new_address_from_book_post_cb\n");
+ if( person && addrbook.treeSelected == addrbook.opened ) {
+ gtk_clist_unselect_all( GTK_CLIST(addrbook.clist) );
+ addressbook_folder_refresh_one_person(
+ GTK_CTREE(addrbook.clist), person );
+ }
+ addressbook_address_list_set_focus();
+}
+
+void addressbook_new_address_from_folder_post_cb( ItemPerson *person )
+{
+fprintf(stderr, "addressbook_new_address_from_folder_post_cb\n");
+ if( person && addrbook.treeSelected == addrbook.opened) {
+ gtk_sctree_select( GTK_SCTREE(addrbook.ctree), addrbook.opened );
+ addressbook_set_clist(
+ gtk_ctree_node_get_row_data(GTK_CTREE(addrbook.ctree),
+ addrbook.opened),
+ TRUE);
+ }
+ addressbook_address_list_set_focus();
+}
+
static void addressbook_new_address_cb( gpointer data, guint action, GtkWidget *widget ) {
AddressObject *pobj = NULL;
AddressDataSource *ds = NULL;
if( pobj->type == ADDR_DATASOURCE ) {
if( ADAPTER_DSOURCE(pobj)->subType == ADDR_BOOK ) {
/* New address */
- ItemPerson *person = addressbook_edit_person( abf, NULL, NULL, FALSE );
- if( person && addrbook.treeSelected == addrbook.opened ) {
- gtk_clist_unselect_all( GTK_CLIST(addrbook.clist) );
- addressbook_folder_refresh_one_person(
- GTK_CTREE(addrbook.clist), person );
- }
+ ItemPerson *person = addressbook_edit_person( abf, NULL, NULL, FALSE,
+ addrbook.editaddress_vbox,
+ addressbook_new_address_from_book_post_cb,
+ TRUE );
+ if (prefs_common.addressbook_use_editaddress_dialog)
+ addressbook_new_address_from_book_post_cb( person );
}
}
else if( pobj->type == ADDR_ITEM_FOLDER ) {
/* New address */
ItemFolder *folder = ADAPTER_FOLDER(pobj)->itemFolder;
- ItemPerson *person = addressbook_edit_person( abf, folder, NULL, FALSE );
- if( person ) {
- if (addrbook.treeSelected == addrbook.opened) {
- gtk_sctree_select( GTK_SCTREE(addrbook.ctree), addrbook.opened );
- addressbook_set_clist(
- gtk_ctree_node_get_row_data(GTK_CTREE(addrbook.ctree),
- addrbook.opened),
- TRUE);
- }
- }
+ ItemPerson *person = addressbook_edit_person( abf, folder, NULL, FALSE,
+ addrbook.editaddress_vbox,
+ addressbook_new_address_from_folder_post_cb,
+ TRUE );
+ if (prefs_common.addressbook_use_editaddress_dialog)
+ addressbook_new_address_from_folder_post_cb( person );
}
else if( pobj->type == ADDR_ITEM_GROUP ) {
/* New address in group */
}
}
+void addressbook_edit_address_post_cb( ItemPerson *person )
+{
+fprintf(stderr, "addressbook_edit_address_post_cb\n");
+ if( person ) {
+ addressbook_folder_refresh_one_person( GTK_CTREE(addrbook.clist), person );
+ invalidate_address_completion();
+ }
+ addressbook_address_list_set_focus();
+}
+
+void addressbook_address_list_set_focus( void )
+{
+ if (!prefs_common.addressbook_use_editaddress_dialog)
+ gtk_window_set_focus(GTK_WINDOW(addrbook.window), addrbook.clist);
+}
+
static void addressbook_edit_address_cb( gpointer data, guint action, GtkWidget *widget ) {
GtkCTree *clist = GTK_CTREE(addrbook.clist);
GtkCTree *ctree;
/* Edit person - email page */
ItemPerson *person;
person = ( ItemPerson * ) ADDRITEM_PARENT(email);
- if( addressbook_edit_person( abf, NULL, person, TRUE ) == NULL ) return;
- addressbook_folder_refresh_one_person( clist, person );
- invalidate_address_completion();
+ if ( addressbook_edit_person( abf, NULL, person, TRUE, addrbook.editaddress_vbox,
+ addressbook_edit_address_post_cb,
+ prefs_common.addressbook_use_editaddress_dialog?TRUE:FALSE )
+ != NULL ) {
+ if (prefs_common.addressbook_use_editaddress_dialog)
+ addressbook_edit_address_post_cb( person );
+ }
return;
}
}
else if( obj->type == ADDR_ITEM_PERSON ) {
/* Edit person - basic page */
ItemPerson *person = ( ItemPerson * ) obj;
- if( addressbook_edit_person( abf, NULL, person, FALSE ) == NULL ) return;
- addressbook_folder_refresh_one_person( clist, person );
- invalidate_address_completion();
+ if( addressbook_edit_person( abf, NULL, person, FALSE, addrbook.editaddress_vbox,
+ addressbook_edit_address_post_cb,
+ prefs_common.addressbook_use_editaddress_dialog?TRUE:FALSE )
+ != NULL ) {
+ if (prefs_common.addressbook_use_editaddress_dialog)
+ addressbook_edit_address_post_cb( person );
+ }
return;
}
else if( obj->type == ADDR_ITEM_GROUP ) {
static gboolean addressbook_entry_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
+fprintf(stderr, "addressbook_entry_key_pressed\n");
if (event && event->keyval == GDK_Return)
addressbook_lup_clicked(NULL, NULL);
return FALSE;
/* printf( "addressbook_clear_idler::%d::\n", queryID ); */
ptrQID = GINT_TO_POINTER( queryID );
if( ptrQID ) {
- gtk_idle_remove_by_data( ptrQID );
+ g_idle_remove_by_data( ptrQID );
}
}
/* Remove idler function */
ptrQID = GINT_TO_POINTER( queryID );
if( ptrQID ) {
- gtk_idle_remove_by_data( ptrQID );
+ g_idle_remove_by_data( ptrQID );
}
/* Refresh addressbook contents */
if( queryID == 0 ) return;
/* Set up idler function */
- idleID = gtk_idle_add(
+ idleID = g_idle_add(
( GtkFunction ) addressbook_search_idle,
GINT_TO_POINTER( queryID ) );