From 073927075b22b5a2988e299e91d2ccb7ec58c1c8 Mon Sep 17 00:00:00 2001 From: Ettore Perazzoli Date: Thu, 16 May 2002 18:48:59 +0000 Subject: New, quit handler for the EvolutionShellComponent. (add_creatable_item): * gui/component/addressbook-component.c (request_quit): New, quit handler for the EvolutionShellComponent. (add_creatable_item): Set it up. * gui/contact-editor/e-contact-list-editor.c (e_contact_list_editor_request_close_all): New. (e_contact_list_editor_new): Put the contact editor in a static list and gtk_object_weakref() it. (contact_list_editor_destroy_notify): New, GtkDestroyNotify function for the contact editors. * gui/contact-editor/e-contact-editor.c (e_contact_editor_request_close_all): New. (e_contact_editor_new): Put the contact editor in a static list and gtk_object_weakref() it. (contact_editor_destroy_notify): New, GtkDestroyNotify function for the contact editors. svn path=/trunk/; revision=16934 --- addressbook/ChangeLog | 20 ++++++++++++ addressbook/gui/component/addressbook-component.c | 17 +++++++++- addressbook/gui/component/addressbook-storage.c | 2 +- addressbook/gui/contact-editor/e-contact-editor.c | 37 ++++++++++++++++++++++ addressbook/gui/contact-editor/e-contact-editor.h | 20 ++++++------ .../contact-list-editor/e-contact-list-editor.c | 37 ++++++++++++++++++++++ .../contact-list-editor/e-contact-list-editor.h | 20 ++++++------ 7 files changed, 133 insertions(+), 20 deletions(-) diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog index 2a04e24eb3..abcc8b687a 100644 --- a/addressbook/ChangeLog +++ b/addressbook/ChangeLog @@ -1,3 +1,23 @@ +2002-05-16 Ettore Perazzoli + + * gui/component/addressbook-component.c (request_quit): New, quit + handler for the EvolutionShellComponent. + (add_creatable_item): Set it up. + + * gui/contact-editor/e-contact-list-editor.c + (e_contact_list_editor_request_close_all): New. + (e_contact_list_editor_new): Put the contact editor in a static + list and gtk_object_weakref() it. + (contact_list_editor_destroy_notify): New, GtkDestroyNotify + function for the contact editors. + + * gui/contact-editor/e-contact-editor.c + (e_contact_editor_request_close_all): New. + (e_contact_editor_new): Put the contact editor in a static list + and gtk_object_weakref() it. + (contact_editor_destroy_notify): New, GtkDestroyNotify function + for the contact editors. + 2002-05-15 Ettore Perazzoli * gui/component/addressbook-component.c (create_component): Pass diff --git a/addressbook/gui/component/addressbook-component.c b/addressbook/gui/component/addressbook-component.c index 2979d211eb..54940faeab 100644 --- a/addressbook/gui/component/addressbook-component.c +++ b/addressbook/gui/component/addressbook-component.c @@ -504,6 +504,20 @@ destination_folder_handle_drop (EvolutionShellComponentDndDestinationFolder *fol return TRUE; } + +/* Quitting. */ + +static gboolean +request_quit (EvolutionShellComponent *shell_component, + void *data) +{ + if (! e_contact_editor_request_close_all () + || ! e_contact_list_editor_request_close_all ()) + return FALSE; + else + return TRUE; +} + /* The factory function. */ @@ -549,7 +563,8 @@ create_component (void) remove_folder, xfer_folder, NULL, get_dnd_selection, - NULL, NULL); + request_quit, + NULL); destination_interface = evolution_shell_component_dnd_destination_folder_new (destination_folder_handle_motion, destination_folder_handle_drop, diff --git a/addressbook/gui/component/addressbook-storage.c b/addressbook/gui/component/addressbook-storage.c index d3430dd476..358c3e8245 100644 --- a/addressbook/gui/component/addressbook-storage.c +++ b/addressbook/gui/component/addressbook-storage.c @@ -165,7 +165,7 @@ addressbook_get_other_contact_storage (void) EvolutionStorageResult result; if (storage == NULL) { - storage = evolution_storage_new (U_("Other Contacts"), FALSE); + storage = evolution_storage_new (U_("Other Contacts"), TRUE); gtk_signal_connect (GTK_OBJECT (storage), "remove_folder", GTK_SIGNAL_FUNC(remove_ldap_folder), NULL); diff --git a/addressbook/gui/contact-editor/e-contact-editor.c b/addressbook/gui/contact-editor/e-contact-editor.c index fd0f14ddb5..a3dd431d2e 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.c +++ b/addressbook/gui/contact-editor/e-contact-editor.c @@ -112,6 +112,8 @@ enum { DYNAMIC_LIST_ADDRESS }; +static GSList *all_contact_editors = NULL; + GtkType e_contact_editor_get_type (void) { @@ -1489,6 +1491,14 @@ supported_fields_cb (EBook *book, EBookStatus status, command_state_changed (ce); } +static void +contact_editor_destroy_notify (void *data) +{ + EContactEditor *ce = E_CONTACT_EDITOR (data); + + all_contact_editors = g_slist_remove (all_contact_editors, ce); +} + EContactEditor * e_contact_editor_new (EBook *book, ECard *card, @@ -1502,6 +1512,9 @@ e_contact_editor_new (EBook *book, ce = E_CONTACT_EDITOR (gtk_type_new (E_CONTACT_EDITOR_TYPE)); + all_contact_editors = g_slist_prepend (all_contact_editors, ce); + gtk_object_weakref (GTK_OBJECT (ce), contact_editor_destroy_notify, ce); + gtk_object_set (GTK_OBJECT (ce), "book", book, "card", card, @@ -2746,3 +2759,27 @@ enable_widget (GtkWidget *widget, gboolean enabled) else gtk_widget_set_sensitive (widget, enabled); } + + +gboolean +e_contact_editor_request_close_all (void) +{ + GSList *p; + GSList *pnext; + gboolean retval; + + retval = TRUE; + for (p = all_contact_editors; p != NULL; p = pnext) { + pnext = p->next; + + e_contact_editor_raise (E_CONTACT_EDITOR (p->data)); + if (! prompt_to_save_changes (E_CONTACT_EDITOR (p->data))) { + retval = FALSE; + break; + } + + close_dialog (E_CONTACT_EDITOR (p->data)); + } + + return retval; +} diff --git a/addressbook/gui/contact-editor/e-contact-editor.h b/addressbook/gui/contact-editor/e-contact-editor.h index 249640379b..0010182b99 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.h +++ b/addressbook/gui/contact-editor/e-contact-editor.h @@ -117,17 +117,19 @@ struct _EContactEditorClass void (* editor_closed) (EContactEditor *ce); }; -EContactEditor *e_contact_editor_new (EBook *book, - ECard *card, - gboolean is_new_card, - gboolean editable); -GtkType e_contact_editor_get_type (void); -void e_contact_editor_show (EContactEditor *editor); -void e_contact_editor_close (EContactEditor *editor); -void e_contact_editor_raise (EContactEditor *editor); +EContactEditor *e_contact_editor_new (EBook *book, + ECard *card, + gboolean is_new_card, + gboolean editable); +GtkType e_contact_editor_get_type (void); +void e_contact_editor_show (EContactEditor *editor); +void e_contact_editor_close (EContactEditor *editor); +void e_contact_editor_raise (EContactEditor *editor); -gboolean e_contact_editor_confirm_delete (GtkWindow *parent); +gboolean e_contact_editor_confirm_delete (GtkWindow *parent); + +gboolean e_contact_editor_request_close_all (void); #ifdef __cplusplus } diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor.c b/addressbook/gui/contact-list-editor/e-contact-list-editor.c index c88af3005e..abb08d30f8 100644 --- a/addressbook/gui/contact-list-editor/e-contact-list-editor.c +++ b/addressbook/gui/contact-list-editor/e-contact-list-editor.c @@ -97,6 +97,8 @@ enum { ARG_EDITABLE }; +static GSList *all_contact_list_editors = NULL; + GtkType e_contact_list_editor_get_type (void) { @@ -538,6 +540,14 @@ create_ui (EContactListEditor *ce) e_pixmaps_update (ce->uic, pixmaps); } +static void +contact_list_editor_destroy_notify (void *data) +{ + EContactListEditor *ce = E_CONTACT_LIST_EDITOR (data); + + all_contact_list_editors = g_slist_remove (all_contact_list_editors, ce); +} + EContactListEditor * e_contact_list_editor_new (EBook *book, ECard *list_card, @@ -548,6 +558,9 @@ e_contact_list_editor_new (EBook *book, ce = E_CONTACT_LIST_EDITOR (gtk_type_new (E_CONTACT_LIST_EDITOR_TYPE)); + all_contact_list_editors = g_slist_prepend (all_contact_list_editors, ce); + gtk_object_weakref (GTK_OBJECT (ce), contact_list_editor_destroy_notify, ce); + gtk_object_set (GTK_OBJECT (ce), "book", book, "card", list_card, @@ -978,3 +991,27 @@ fill_in_info(EContactListEditor *editor) } } } + + +gboolean +e_contact_list_editor_request_close_all (void) +{ + GSList *p; + GSList *pnext; + gboolean retval; + + retval = TRUE; + for (p = all_contact_list_editors; p != NULL; p = pnext) { + pnext = p->next; + + e_contact_list_editor_raise (E_CONTACT_LIST_EDITOR (p->data)); + if (! prompt_to_save_changes (E_CONTACT_LIST_EDITOR (p->data))) { + retval = FALSE; + break; + } + + close_dialog (E_CONTACT_LIST_EDITOR (p->data)); + } + + return retval; +} diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor.h b/addressbook/gui/contact-list-editor/e-contact-list-editor.h index 37f54df170..a091c6c680 100644 --- a/addressbook/gui/contact-list-editor/e-contact-list-editor.h +++ b/addressbook/gui/contact-list-editor/e-contact-list-editor.h @@ -92,15 +92,17 @@ struct _EContactListEditorClass void (* editor_closed) (EContactListEditor *cle); }; -EContactListEditor *e_contact_list_editor_new (EBook *book, - ECard *list_card, - gboolean is_new_list, - gboolean editable); -GtkType e_contact_list_editor_get_type (void); -void e_contact_list_editor_show (EContactListEditor *editor); -void e_contact_list_editor_raise (EContactListEditor *editor); - -gboolean e_contact_list_editor_confirm_delete (GtkWindow *parent); +EContactListEditor *e_contact_list_editor_new (EBook *book, + ECard *list_card, + gboolean is_new_list, + gboolean editable); +GtkType e_contact_list_editor_get_type (void); +void e_contact_list_editor_show (EContactListEditor *editor); +void e_contact_list_editor_raise (EContactListEditor *editor); + +gboolean e_contact_list_editor_confirm_delete (GtkWindow *parent); + +gboolean e_contact_list_editor_request_close_all (void); #ifdef __cplusplus } -- cgit v1.2.3