From 1b92eea9f43d08e724c831ae6807b39b2ba73f4e Mon Sep 17 00:00:00 2001 From: jacob berkman Date: Wed, 22 Aug 2001 22:12:12 +0000 Subject: emit an event from our event source (contact_editor_cb): emit a destroy 2001-08-22 jacob berkman * gui/component/e-address-popup.c (emit_event): emit an event from our event source (contact_editor_cb): emit a destroy event so our control frame can be destroyed. (edit_contact_info_cb): emit a hide event so our control frame can be hidden (e_address_popup_cardify): (add_contacts_cb): emit the destroy event (e_address_popup_factory_new_control): don't unref our object at widget destroy time as that was really really broken (e_address_popup_factory_new_control): create an event source and aggregate ourself with it * gui/contact-editor/e-contact-editor.c (enable_writable_fields): display a nicer warning when we can't find a widget for a given field (e_contact_editor_raise): only raise if there is a window * gui/contact-editor/contact-editor.glade: name some widgets that got unnamed, and set the first entry as defaultable * gui/contact-editor/e-contact-editor.c: envelope printing is disabled in 1.0 2001-08-22 jacob berkman * mail-display.c: rework how the e-card-popup thing has its life managed. we now hide the window on the Hide event and destroy it on the Destroy event emitted from its event source svn path=/trunk/; revision=12402 --- addressbook/ChangeLog | 26 ++++++ addressbook/gui/component/e-address-popup.c | 40 ++++++--- addressbook/gui/component/e-address-popup.h | 3 + .../gui/contact-editor/contact-editor.glade | 5 +- addressbook/gui/contact-editor/e-contact-editor.c | 32 +++++-- mail/ChangeLog | 6 ++ mail/mail-display.c | 98 ++++++++++------------ 7 files changed, 137 insertions(+), 73 deletions(-) diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog index 76a4ca8b11..eaa2782ce0 100644 --- a/addressbook/ChangeLog +++ b/addressbook/ChangeLog @@ -1,3 +1,29 @@ +2001-08-22 jacob berkman + + * gui/component/e-address-popup.c (emit_event): emit an event from + our event source + (contact_editor_cb): emit a destroy event so our control frame can + be destroyed. + (edit_contact_info_cb): emit a hide event so our control frame can + be hidden + (e_address_popup_cardify): + (add_contacts_cb): emit the destroy event + (e_address_popup_factory_new_control): don't unref our object at + widget destroy time as that was really really broken + (e_address_popup_factory_new_control): create an event source and + aggregate ourself with it + + * gui/contact-editor/e-contact-editor.c (enable_writable_fields): + display a nicer warning when we can't find a widget for a given + field + (e_contact_editor_raise): only raise if there is a window + + * gui/contact-editor/contact-editor.glade: name some widgets that + got unnamed, and set the first entry as defaultable + + * gui/contact-editor/e-contact-editor.c: envelope printing is + disabled in 1.0 + 2001-08-22 Chris Toshok * backend/ebook/e-destination.c (e_destination_get_email): make diff --git a/addressbook/gui/component/e-address-popup.c b/addressbook/gui/component/e-address-popup.c index c291e95009..362eee4250 100644 --- a/addressbook/gui/component/e-address-popup.c +++ b/addressbook/gui/component/e-address-popup.c @@ -882,19 +882,37 @@ e_address_popup_new (void) return GTK_WIDGET (pop); } +static void +emit_event (EAddressPopup *pop, const char *event) +{ + if (pop->es) { + BonoboArg *arg; + + arg = bonobo_arg_new (BONOBO_ARG_BOOLEAN); + BONOBO_ARG_SET_BOOLEAN (arg, TRUE); + bonobo_event_source_notify_listeners_full (pop->es, + "GNOME/Evolution/Addressbook/AddressPopup", + "Event", + event, + arg, NULL); + bonobo_arg_release (arg); + } +} + static void contact_editor_cb (EBook *book, gpointer closure) { EAddressPopup *pop = E_ADDRESS_POPUP (closure); EContactEditor *ce = e_addressbook_show_contact_editor (book, pop->card, FALSE, TRUE); - e_contact_editor_raise (ce); + emit_event (pop, "Destroy"); + e_contact_editor_raise (ce); } static void edit_contact_info_cb (EAddressPopup *pop) { + emit_event (pop, "Hide"); e_book_use_local_address_book (contact_editor_cb, pop); - gtk_widget_destroy (GTK_WIDGET (pop)); } static void @@ -932,8 +950,7 @@ add_contacts_cb (EAddressPopup *pop) e_contact_quick_add_free_form (pop->email, NULL, NULL); } - - gtk_widget_destroy (GTK_WIDGET (pop)); + emit_event (pop, "Destroy"); } static void @@ -997,7 +1014,8 @@ e_address_popup_ambiguous_email_add (EAddressPopup *pop, const GList *cards) card_picker_init (wiz, cards, pop->name, pop->email); - gtk_widget_destroy (GTK_WIDGET (pop)); + emit_event (pop, "Destroy"); + gtk_container_add (GTK_CONTAINER (win), wiz->body); gtk_widget_show_all (win); } @@ -1144,17 +1162,15 @@ e_address_popup_factory_new_control (void) { BonoboControl *control; BonoboPropertyBag *bag; + EAddressPopup *addy; GtkWidget *w; w = e_address_popup_new (); + addy = E_ADDRESS_POPUP (w); + control = bonobo_control_new (w); gtk_widget_show (w); - gtk_signal_connect_object (GTK_OBJECT (w), - "destroy", - GTK_SIGNAL_FUNC (bonobo_object_unref), - GTK_OBJECT (control)); - bag = bonobo_property_bag_new (get_prop, set_prop, w); bonobo_property_bag_add (bag, "name", PROPERTY_NAME, BONOBO_ARG_STRING, NULL, NULL, @@ -1171,6 +1187,10 @@ e_address_popup_factory_new_control (void) bonobo_control_set_properties (control, bag); bonobo_object_unref (BONOBO_OBJECT (bag)); + addy->es = bonobo_event_source_new (); + bonobo_object_add_interface (BONOBO_OBJECT (control), + BONOBO_OBJECT (addy->es)); + return control; } diff --git a/addressbook/gui/component/e-address-popup.h b/addressbook/gui/component/e-address-popup.h index 9cfde6cb28..ef51437551 100644 --- a/addressbook/gui/component/e-address-popup.h +++ b/addressbook/gui/component/e-address-popup.h @@ -31,6 +31,7 @@ #include #include #include +#include BEGIN_GNOME_DECLS @@ -63,6 +64,8 @@ struct _EAddressPopup { guint query_tag; gboolean multiple_matches; ECard *card; + + BonoboEventSource *es; }; struct _EAddressPopupClass { diff --git a/addressbook/gui/contact-editor/contact-editor.glade b/addressbook/gui/contact-editor/contact-editor.glade index bb8bf2cd74..88d74a2a77 100644 --- a/addressbook/gui/contact-editor/contact-editor.glade +++ b/addressbook/gui/contact-editor/contact-editor.glade @@ -698,6 +698,7 @@ GtkEntry entry-fullname + True True True True @@ -1603,7 +1604,7 @@ GtkLabel - label21 + accellabel-fileas GTK_JUSTIFY_CENTER False @@ -1630,7 +1631,7 @@ GtkLabel - label22 + accellabel-web GTK_JUSTIFY_CENTER False diff --git a/addressbook/gui/contact-editor/e-contact-editor.c b/addressbook/gui/contact-editor/e-contact-editor.c index 68ef1f6a6d..843f1ab355 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.c +++ b/addressbook/gui/contact-editor/e-contact-editor.c @@ -1055,8 +1055,9 @@ EPixmap pixmaps[] = { E_PIXMAP ("/commands/ContactEditorSaveAs", "save-as-16.png"), E_PIXMAP ("/commands/ContactEditorDelete", "evolution-trash-mini.png"), E_PIXMAP ("/commands/ContactEditorPrint", "print.xpm"), +#if 0 /* Envelope printing is disabled for Evolution 1.0. */ E_PIXMAP ("/commands/ContactEditorPrintEnvelope", "print.xpm"), - +#endif E_PIXMAP ("/Toolbar/ContactEditorSave", "buttons/save-24.png"), E_PIXMAP ("/Toolbar/ContactEditorDelete", "buttons/delete-message.png"), E_PIXMAP ("/Toolbar/ContactEditorPrint", "buttons/print.png"), @@ -1341,6 +1342,9 @@ e_contact_editor_new (EBook *book, { EContactEditor *ce; + g_return_val_if_fail (E_IS_BOOK (book), NULL); + g_return_val_if_fail (E_IS_CARD (card), NULL); + ce = E_CONTACT_EDITOR (gtk_type_new (E_CONTACT_EDITOR_TYPE)); gtk_object_set (GTK_OBJECT (ce), @@ -2185,11 +2189,23 @@ enable_writable_fields(EContactEditor *editor) /* handle the label next to the dropdown widgets */ for (i = 0; i < num_widget_field_mappings; i ++) { - gboolean enabled = g_hash_table_lookup (supported_hash, - e_card_simple_get_ecard_field (simple, - widget_field_mappings[i].field_id)) != NULL; - gtk_widget_set_sensitive (glade_xml_get_widget(editor->gui, - widget_field_mappings[i].widget_name), enabled); + gboolean enabled; + GtkWidget *w; + const char *field; + + w = glade_xml_get_widget(editor->gui, widget_field_mappings[i].widget_name); + if (!w) { + g_warning (_("Could not find widget for a field: `%s'"), + widget_field_mappings[i].widget_name); + continue; + } + + field = e_card_simple_get_ecard_field (simple, + widget_field_mappings[i].field_id); + + enabled = (g_hash_table_lookup (supported_hash, field) != NULL); + + gtk_widget_set_sensitive (w, enabled); } g_hash_table_destroy (dropdown_hash); @@ -2464,7 +2480,9 @@ extract_info(EContactEditor *editor) void e_contact_editor_raise (EContactEditor *editor) { - gdk_window_raise (GTK_WIDGET (editor->app)->window); + /* FIXME: perhaps we should raise at realize time */ + if (GTK_WIDGET (editor->app)->window) + gdk_window_raise (GTK_WIDGET (editor->app)->window); } /** diff --git a/mail/ChangeLog b/mail/ChangeLog index 78cbb77ac6..8948af06b8 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,9 @@ +2001-08-22 jacob berkman + + * mail-display.c: rework how the e-card-popup thing has its life + managed. we now hide the window on the Hide event and destroy it + on the Destroy event emitted from its event source + 2001-08-22 Peter Williams * mail-send-recv.c (set_send_status): We don't need to escape this diff --git a/mail/mail-display.c b/mail/mail-display.c index f352476bb4..912785ea71 100644 --- a/mail/mail-display.c +++ b/mail/mail-display.c @@ -1432,6 +1432,7 @@ struct _PopupInfo { GtkWidget *win; guint destroy_timeout; guint widget_destroy_handle; + gboolean hidden; }; /* Aiieee! Global Data! */ @@ -1448,24 +1449,11 @@ popup_info_free (PopupInfo *pop) } } -static void -popup_widget_destroy_cb (GtkWidget *w, gpointer user_data) -{ - PopupInfo *pop = (PopupInfo *) user_data; - - gtk_widget_destroy (pop->win); -} - static void popup_window_destroy_cb (GtkWidget *w, gpointer user_data) { PopupInfo *pop = (PopupInfo *) user_data; - if (pop->widget_destroy_handle) { - gtk_signal_disconnect (GTK_OBJECT (pop->w), pop->widget_destroy_handle); - pop->widget_destroy_handle = 0; - } - the_popup = NULL; popup_info_free (pop); @@ -1489,6 +1477,7 @@ popup_enter_cb (GtkWidget *w, GdkEventCrossing *ev, gpointer user_data) if (pop->destroy_timeout) gtk_timeout_remove (pop->destroy_timeout); + pop->destroy_timeout = 0; return 0; } @@ -1500,7 +1489,9 @@ popup_leave_cb (GtkWidget *w, GdkEventCrossing *ev, gpointer user_data) if (pop->destroy_timeout) gtk_timeout_remove (pop->destroy_timeout); - pop->destroy_timeout = gtk_timeout_add (500, popup_timeout_cb, pop); + + if (!pop->hidden) + pop->destroy_timeout = gtk_timeout_add (500, popup_timeout_cb, pop); return 0; } @@ -1511,10 +1502,14 @@ popup_realize_cb (GtkWidget *widget, gpointer user_data) PopupInfo *pop = (PopupInfo *) user_data; gtk_widget_add_events (pop->win, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); - gtk_widget_add_events (pop->w, GDK_BUTTON_PRESS_MASK); - if (pop->destroy_timeout == 0) - pop->destroy_timeout = gtk_timeout_add (5000, popup_timeout_cb, pop); + if (pop->destroy_timeout == 0) { + if (!pop->hidden) { + pop->destroy_timeout = gtk_timeout_add (5000, popup_timeout_cb, pop); + } else { + pop->destroy_timeout = 0; + } + } } static void @@ -1534,7 +1529,7 @@ popup_size_allocate_cb (GtkWidget *widget, GtkAllocation *alloc, gpointer user_d } -static GtkWidget * +static PopupInfo * make_popup_window (GtkWidget *w) { PopupInfo *pop = g_new0 (PopupInfo, 1); @@ -1553,11 +1548,6 @@ make_popup_window (GtkWidget *w) gtk_window_set_policy (GTK_WINDOW (pop->win), FALSE, FALSE, FALSE); - - pop->widget_destroy_handle = gtk_signal_connect (GTK_OBJECT (w), - "destroy", - GTK_SIGNAL_FUNC (popup_widget_destroy_cb), - pop); gtk_signal_connect (GTK_OBJECT (pop->win), "destroy", GTK_SIGNAL_FUNC (popup_window_destroy_cb), @@ -1583,29 +1573,35 @@ make_popup_window (GtkWidget *w) gtk_widget_show (fr); gtk_widget_show (pop->win); - return pop->win; + return pop; } -/* Copied from e-shell-view.c */ -static GtkWidget * -find_socket (GtkContainer *container) +static void +listener_cb (BonoboListener *listener, + char *event_name, + CORBA_any *any, + CORBA_Environment *ev, + gpointer user_data) { - GList *children, *tmp; - - children = gtk_container_children (container); - while (children) { - if (BONOBO_IS_SOCKET (children->data)) - return children->data; - else if (GTK_IS_CONTAINER (children->data)) { - GtkWidget *socket = find_socket (children->data); - if (socket) - return socket; - } - tmp = children->next; - g_list_free_1 (children); - children = tmp; - } - return NULL; + PopupInfo *pop; + char *type; + + pop = user_data; + + if (pop->destroy_timeout) + gtk_timeout_remove (pop->destroy_timeout); + pop->destroy_timeout = 0; + + type = bonobo_event_subtype (event_name); + + if (!strcmp (type, "Destroy")) { + gtk_widget_destroy (GTK_WIDGET (pop->win)); + } else if (!strcmp (type, "Hide")) { + pop->hidden = TRUE; + gtk_widget_hide (GTK_WIDGET (pop->win)); + } + + g_free (type); } static int @@ -1618,9 +1614,7 @@ html_button_press_event (GtkWidget *widget, GdkEventButton *event, MailDisplay * if (event->button == 3) { HTMLEngine *e; HTMLPoint *point; - GtkWidget *socket; GtkWidget *popup_thing; - GtkWidget *win; e = GTK_HTML (widget)->engine; point = html_engine_get_point_at (e, event->x + e->x_offset, event->y + e->y_offset, FALSE); @@ -1633,24 +1627,20 @@ html_button_press_event (GtkWidget *widget, GdkEventButton *event, MailDisplay * src = html_object_get_src (point->object); if (url && !g_strncasecmp (url, "mailto:", 7)) { + PopupInfo *pop; popup_thing = bonobo_widget_new_control ("OAFIID:GNOME_Evolution_Addressbook_AddressPopup", CORBA_OBJECT_NIL); - socket = find_socket (GTK_CONTAINER (popup_thing)); - bonobo_widget_set_property (BONOBO_WIDGET (popup_thing), "email", url+7, NULL); - win = make_popup_window (popup_thing); - gtk_signal_connect_object (GTK_OBJECT (socket), - "destroy", - GTK_SIGNAL_FUNC (gtk_widget_destroy), - GTK_OBJECT (win)); - + pop = make_popup_window (popup_thing); - + bonobo_event_source_client_add_listener ( + bonobo_widget_get_objref (BONOBO_WIDGET (popup_thing)), + listener_cb, NULL, NULL, pop); } else if (url || src) { gint hide_mask = 0; -- cgit v1.2.3