[balsa/mime-widgets] mime-widget: subclass GtkBox instead of GObject



commit 83bcd1988af3e2ebb7338d036c32f5fe358c0c97
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Sat Sep 14 21:21:06 2019 -0400

    mime-widget: subclass GtkBox instead of GObject
    
    This makes BalsaMimeWidget inherit from GtkBox, so it is
    actually a widget. A subclass that used to create a vertical
    GtkBox can use the BalsaMimeWidget itself. Other subclasses can
    add their custom widget to the BalsaMimeWidget.
    
    * src/balsa-message.c (bm_find_scroll_to_rectangle),
      (bm_find_entry_changed_cb), (bm_find_again), (balsa_message_init),
      (balsa_message_destroy), (part_info_init), (add_part),
      (gtk_tree_hide_func), (balsa_message_current_part_widget),
      (balsa_message_can_select), (balsa_message_grab_focus),
      (balsa_message_can_zoom), (balsa_message_zoom),
      (balsa_message_find_in_message):
    * src/balsa-mime-widget-crypto.c (balsa_mime_widget_new_signature),
      (balsa_mime_widget_new_pgpkey):
    * src/balsa-mime-widget-image.c (img_check_size),
      (balsa_mime_widget_new_image):
    * src/balsa-mime-widget-message.c (balsa_mime_widget_new_message),
      (bmw_message_extbody_url), (bmw_message_extbody_mail),
      (balsa_mime_widget_new_message_tl):
    * src/balsa-mime-widget-multipart.c
      (balsa_mime_widget_new_multipart):
    * src/balsa-mime-widget-text.c (balsa_mime_widget_new_text),
      (bm_widget_new_html), (bm_widget_new_vcard):
    * src/balsa-mime-widget-vcalendar.c
      (balsa_mime_widget_new_vcalendar):
    * src/balsa-mime-widget.c (balsa_mime_widget_init),
      (balsa_mime_widget_new), (balsa_mime_widget_new_unknown):
    * src/balsa-mime-widget.h:

 ChangeLog                         |  33 ++++++++++
 src/balsa-message.c               |  69 ++++++++++----------
 src/balsa-mime-widget-crypto.c    |   9 +--
 src/balsa-mime-widget-image.c     |  11 ++--
 src/balsa-mime-widget-message.c   |  34 ++++------
 src/balsa-mime-widget-multipart.c |  11 ++--
 src/balsa-mime-widget-text.c      |   6 +-
 src/balsa-mime-widget-vcalendar.c |   8 +--
 src/balsa-mime-widget.c           | 128 ++++++++++++++++----------------------
 src/balsa-mime-widget.h           |   6 +-
 10 files changed, 159 insertions(+), 156 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 7bc2e8b7c..bbacb26d4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,36 @@
+2019-09-14  Peter Bloomfield  <pbloomfield bellsouth net>
+
+       mime-widget: subclass GtkBox instead of GObject
+
+       This makes BalsaMimeWidget inherit from GtkBox, so it is
+       actually a widget. A subclass that used to create a vertical
+       GtkBox can use the BalsaMimeWidget itself. Other subclasses can
+       add their custom widget to the BalsaMimeWidget.
+
+       * src/balsa-message.c (bm_find_scroll_to_rectangle),
+       (bm_find_entry_changed_cb), (bm_find_again), (balsa_message_init),
+       (balsa_message_destroy), (part_info_init), (add_part),
+       (gtk_tree_hide_func), (balsa_message_current_part_widget),
+       (balsa_message_can_select), (balsa_message_grab_focus),
+       (balsa_message_can_zoom), (balsa_message_zoom),
+       (balsa_message_find_in_message):
+       * src/balsa-mime-widget-crypto.c (balsa_mime_widget_new_signature),
+       (balsa_mime_widget_new_pgpkey):
+       * src/balsa-mime-widget-image.c (img_check_size),
+       (balsa_mime_widget_new_image):
+       * src/balsa-mime-widget-message.c (balsa_mime_widget_new_message),
+       (bmw_message_extbody_url), (bmw_message_extbody_mail),
+       (balsa_mime_widget_new_message_tl):
+       * src/balsa-mime-widget-multipart.c
+       (balsa_mime_widget_new_multipart):
+       * src/balsa-mime-widget-text.c (balsa_mime_widget_new_text),
+       (bm_widget_new_html), (bm_widget_new_vcard):
+       * src/balsa-mime-widget-vcalendar.c
+       (balsa_mime_widget_new_vcalendar):
+       * src/balsa-mime-widget.c (balsa_mime_widget_init),
+       (balsa_mime_widget_new), (balsa_mime_widget_new_unknown):
+       * src/balsa-mime-widget.h:
+
 2019-09-13  Peter Bloomfield  <pbloomfield bellsouth net>
 
        mime-widget-text: Actually show the context menu
diff --git a/src/balsa-message.c b/src/balsa-message.c
index a7a9643f8..295b07e2e 100644
--- a/src/balsa-message.c
+++ b/src/balsa-message.c
@@ -370,7 +370,7 @@ bm_find_scroll_to_rectangle(BalsaMessage * balsa_message,
     GtkScrolledWindow *scroll = GTK_SCROLLED_WINDOW(balsa_message->scroll);
 
     gtk_widget_translate_coordinates(widget,
-                                     balsa_mime_widget_get_widget(balsa_message->bm_widget),
+                                     GTK_WIDGET(balsa_message->bm_widget),
                                      rectangle->x, rectangle->y,
                                      &x, &y);
 
@@ -447,7 +447,7 @@ bm_find_entry_changed_cb(GtkEditable * editable, gpointer data)
 {
     const gchar *text = gtk_entry_get_text(GTK_ENTRY(editable));
     BalsaMessage *balsa_message = data;
-    GtkWidget *widget = balsa_mime_widget_get_widget(balsa_message->current_part->mime_widget);
+    GtkWidget *widget = GTK_WIDGET(balsa_message->current_part->mime_widget);
     gboolean found = FALSE;
 
     if (GTK_IS_TEXT_VIEW(widget)) {
@@ -507,7 +507,7 @@ static void
 bm_find_again(BalsaMessage * balsa_message, gboolean find_forward)
 {
     const gchar *text = gtk_entry_get_text(GTK_ENTRY(balsa_message->find_entry));
-    GtkWidget *widget = balsa_mime_widget_get_widget(balsa_message->current_part->mime_widget);
+    GtkWidget *widget = GTK_WIDGET(balsa_message->current_part->mime_widget);
     gboolean found;
 
     balsa_message->find_forward = find_forward;
@@ -709,10 +709,10 @@ balsa_message_init(BalsaMessage * balsa_message)
     g_free(buttons);
 
     /* Widget to hold message */
-    g_signal_connect(balsa_mime_widget_get_widget(balsa_message->bm_widget), "focus_in_event",
+    g_signal_connect(GTK_WIDGET(balsa_message->bm_widget), "focus_in_event",
                      G_CALLBACK(balsa_mime_widget_limit_focus),
                      (gpointer) balsa_message);
-    g_signal_connect(balsa_mime_widget_get_widget(balsa_message->bm_widget), "focus_out_event",
+    g_signal_connect(GTK_WIDGET(balsa_message->bm_widget), "focus_out_event",
                      G_CALLBACK(balsa_mime_widget_unlimit_focus),
                     (gpointer) balsa_message);
 
@@ -720,7 +720,7 @@ balsa_message_init(BalsaMessage * balsa_message)
      * provide one, but it would also set it up to scroll on grab-focus,
      * which has been really annoying for a long time :-( */
     viewport = gtk_viewport_new(NULL, NULL);
-    gtk_container_add(GTK_CONTAINER(viewport), balsa_mime_widget_get_widget(balsa_message->bm_widget));
+    gtk_container_add(GTK_CONTAINER(viewport), GTK_WIDGET(balsa_message->bm_widget));
     gtk_container_add(GTK_CONTAINER(balsa_message->scroll), viewport);
 
     /* structure view */
@@ -813,7 +813,6 @@ balsa_message_destroy(GObject * object)
 
     g_clear_object(&balsa_message->save_all_popup);
     g_clear_object(&balsa_message->parts_popup);
-    g_clear_object(&balsa_message->bm_widget);
     g_clear_object(&balsa_message->face_box);
 
 #ifdef HAVE_HTML_WIDGET
@@ -1326,7 +1325,8 @@ part_info_init(BalsaMessage * balsa_message, BalsaPartInfo * info)
     g_return_if_fail(info != NULL);
     g_return_if_fail(info->body != NULL);
 
-    info->mime_widget = balsa_mime_widget_new(balsa_message, info->body, info->popup_menu);
+    info->mime_widget =
+        g_object_ref_sink(balsa_mime_widget_new(balsa_message, info->body, info->popup_menu));
 }
 
 
@@ -2196,30 +2196,27 @@ static LibBalsaMessageBody *
 add_part(BalsaMessage * balsa_message, BalsaPartInfo * info, GtkWidget * container)
 {
     GtkTreeSelection *selection;
-    GtkWidget *widget;
     LibBalsaMessageBody *body;
     GtkWidget *info_container;
 
-    if (!info)
+    if (info == NULL)
        return NULL;
 
     selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(balsa_message->treeview));
 
-    if (info->path &&
+    if (info->path != NULL &&
        !gtk_tree_selection_path_is_selected(selection, info->path))
        gtk_tree_selection_select_path(selection, info->path);
 
     if (info->mime_widget == NULL)
        part_info_init(balsa_message, info);
 
-    if ((widget = balsa_mime_widget_get_widget(info->mime_widget)))
-        gtk_box_pack_start(GTK_BOX(container), widget, TRUE, TRUE, 0);
+    gtk_box_pack_start(GTK_BOX(container), GTK_WIDGET(info->mime_widget), TRUE, TRUE, 0);
 
     info_container = balsa_mime_widget_get_container(info->mime_widget);
-    body =
-        add_multipart(balsa_message, info->body,
-                      info_container != NULL ?
-                      info_container : container);
+    body = add_multipart(balsa_message, info->body,
+                         info_container != NULL ?
+                         info_container : container);
 
     return body;
 }
@@ -2232,12 +2229,16 @@ gtk_tree_hide_func(GtkTreeModel * model, GtkTreePath * path,
     BalsaPartInfo *info;
 
     gtk_tree_model_get(model, iter, PART_INFO_COLUMN, &info, -1);
-    if (info) {
-        GtkWidget *widget, *parent;
 
-        if (info->mime_widget && (widget = balsa_mime_widget_get_widget(info->mime_widget))
-            && (parent = gtk_widget_get_parent(widget)))
-            gtk_container_remove(GTK_CONTAINER(parent), widget);
+    if (info != NULL) {
+        if (info->mime_widget != NULL) {
+            GtkWidget *widget, *parent;
+
+            widget = GTK_WIDGET(info->mime_widget);
+            if ((parent = gtk_widget_get_parent(widget)) != NULL)
+                gtk_container_remove(GTK_CONTAINER(parent), widget);
+        }
+
         g_object_unref(info);
     }
 
@@ -2295,7 +2296,7 @@ balsa_message_current_part_widget(BalsaMessage * balsa_message)
 {
     if (balsa_message && balsa_message->current_part &&
        balsa_message->current_part->mime_widget)
-       return balsa_mime_widget_get_widget(balsa_message->current_part->mime_widget);
+       return GTK_WIDGET(balsa_message->current_part->mime_widget);
     else
        return NULL;
 }
@@ -2326,9 +2327,10 @@ balsa_message_can_select(BalsaMessage * balsa_message)
     g_return_val_if_fail(balsa_message != NULL, FALSE);
 
     if (balsa_message->current_part == NULL
-        || (w = balsa_mime_widget_get_widget(balsa_message->current_part->mime_widget)) == NULL)
+        || balsa_message->current_part->mime_widget == NULL)
         return FALSE;
 
+    w = GTK_WIDGET(balsa_message->current_part->mime_widget);
     return GTK_IS_EDITABLE(w) || GTK_IS_TEXT_VIEW(w)
 #ifdef    HAVE_HTML_WIDGET
         || libbalsa_html_can_select(w)
@@ -2344,7 +2346,7 @@ balsa_message_grab_focus(BalsaMessage * balsa_message)
     g_return_val_if_fail(balsa_message != NULL, FALSE);
     g_return_val_if_fail(balsa_message->current_part != NULL, FALSE);
 
-    widget = balsa_mime_widget_get_widget(balsa_message->current_part->mime_widget);
+    widget = GTK_WIDGET(balsa_message->current_part->mime_widget);
     g_return_val_if_fail(widget != NULL, FALSE);
 
     gtk_widget_set_can_focus(widget, TRUE);
@@ -2644,7 +2646,7 @@ gboolean
 balsa_message_can_zoom(BalsaMessage * balsa_message)
 {
     return balsa_message->current_part
-        && libbalsa_html_can_zoom(balsa_mime_widget_get_widget(balsa_message->current_part->mime_widget));
+        && libbalsa_html_can_zoom(GTK_WIDGET(balsa_message->current_part->mime_widget));
 }
 
 /* Zoom an html item. */
@@ -2666,7 +2668,7 @@ balsa_message_zoom(BalsaMessage * balsa_message, gint in_out)
      g_object_set_data(G_OBJECT(balsa_message->message), BALSA_MESSAGE_ZOOM_KEY,
                      GINT_TO_POINTER(zoom));
 
-     libbalsa_html_zoom(balsa_mime_widget_get_widget(balsa_message->current_part->mime_widget), in_out);
+     libbalsa_html_zoom(GTK_WIDGET(balsa_message->current_part->mime_widget), in_out);
 
 }
 #endif /* HAVE_HTML_WIDGET */
@@ -3293,13 +3295,16 @@ balsa_message_find_in_message(BalsaMessage * balsa_message)
 {
     GtkWidget *w;
 
-    if (balsa_message->current_part
-        && (w = balsa_mime_widget_get_widget(balsa_message->current_part->mime_widget))
-        && (GTK_IS_TEXT_VIEW(w)
+    if (balsa_message->current_part == NULL ||
+        balsa_message->current_part->mime_widget == NULL)
+        return;
+
+    w = GTK_WIDGET(balsa_message->current_part->mime_widget);
+    if (GTK_IS_TEXT_VIEW(w)
 #ifdef HAVE_HTML_WIDGET
-            || libbalsa_html_can_search(w)
+        || libbalsa_html_can_search(w)
 #endif                          /* HAVE_HTML_WIDGET */
-            )) {
+            ) {
         if (GTK_IS_TEXT_VIEW(w)) {
             GtkTextView *text_view = (GtkTextView *) w;
             GtkTextBuffer *buffer = gtk_text_view_get_buffer(text_view);
diff --git a/src/balsa-mime-widget-crypto.c b/src/balsa-mime-widget-crypto.c
index 02ff5f8d0..8e32d05f1 100644
--- a/src/balsa-mime-widget-crypto.c
+++ b/src/balsa-mime-widget-crypto.c
@@ -51,7 +51,8 @@ balsa_mime_widget_new_signature(BalsaMessage * bm,
        return NULL;
 
     mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
-    balsa_mime_widget_set_widget(mw, balsa_mime_widget_signature_widget(mime_body, content_type));
+    gtk_container_add(GTK_CONTAINER(mw),
+                      balsa_mime_widget_signature_widget(mime_body, content_type));
 
     return mw;
 }
@@ -76,12 +77,8 @@ balsa_mime_widget_new_pgpkey(BalsaMessage        *bm,
                           err ? err->message : "Unknown error");
         g_clear_error(&err);
     } else {
-        GtkWidget *widget;
-
         mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
-        widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_VBOX_SPACE);
-        balsa_mime_widget_set_widget(mw, widget);
-        if (!create_import_keys_widget(GTK_BOX(widget), body_buf, &err)) {
+        if (!create_import_keys_widget(GTK_BOX(mw), body_buf, &err)) {
             balsa_information(LIBBALSA_INFORMATION_ERROR, _("Could not process GnuPG keys: %s"),
                               err ? err->message : "Unknown error");
             g_clear_error(&err);
diff --git a/src/balsa-mime-widget-image.c b/src/balsa-mime-widget-image.c
index 864aceac7..70808486b 100644
--- a/src/balsa-mime-widget-image.c
+++ b/src/balsa-mime-widget-image.c
@@ -36,6 +36,7 @@ struct _BalsaMimeWidgetImage {
 
     guint img_check_size_id;
     GdkPixbuf *pixbuf;
+    GtkWidget *image;
 };
 
 G_DEFINE_TYPE(BalsaMimeWidgetImage,
@@ -90,7 +91,7 @@ img_check_size(BalsaMimeWidgetImage * mwi)
 
     mwi->img_check_size_id = 0;
 
-    widget = balsa_mime_widget_get_widget((BalsaMimeWidget *) mwi);
+    widget = GTK_WIDGET(mwi);
     viewport = gtk_widget_get_ancestor(widget, GTK_TYPE_VIEWPORT);
     if (viewport == NULL) {
         return G_SOURCE_REMOVE;
@@ -106,7 +107,7 @@ img_check_size(BalsaMimeWidgetImage * mwi)
         return G_SOURCE_REMOVE;
     }
 
-    image = GTK_IMAGE(gtk_bin_get_child(GTK_BIN(widget)));
+    image = GTK_IMAGE(mwi->image);
     if (gtk_image_get_storage_type(image) == GTK_IMAGE_PIXBUF)
         curr_w = gdk_pixbuf_get_width(gtk_image_get_pixbuf(image));
     else
@@ -198,13 +199,13 @@ balsa_mime_widget_new_image(BalsaMessage * bm,
     mw = (BalsaMimeWidget *) mwi;
 
     widget = gtk_event_box_new();
-    balsa_mime_widget_set_widget(mw, widget);
+    gtk_container_add(GTK_CONTAINER(mw), widget);
 
     g_signal_connect(widget, "button-press-event",
                      G_CALLBACK(balsa_image_button_press_cb), data);
 
-    image = gtk_image_new_from_icon_name("image-missing",
-                                         GTK_ICON_SIZE_BUTTON);
+    mwi->image = image = gtk_image_new_from_icon_name("image-missing",
+                                                      GTK_ICON_SIZE_BUTTON);
     g_signal_connect_swapped(image, "size-allocate",
                              G_CALLBACK(img_size_allocate_cb), mwi);
     gtk_container_add(GTK_CONTAINER(widget), image);
diff --git a/src/balsa-mime-widget-message.c b/src/balsa-mime-widget-message.c
index bf78a6a82..6d1e7e0e7 100644
--- a/src/balsa-mime-widget-message.c
+++ b/src/balsa-mime-widget-message.c
@@ -128,7 +128,7 @@ balsa_mime_widget_new_message(BalsaMessage * bm,
        mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
 
        widget = gtk_frame_new(NULL);
-        balsa_mime_widget_set_widget(mw, widget);
+        gtk_container_add(GTK_CONTAINER(mw), widget);
 
        container = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_MESSAGE_PADDING);
         balsa_mime_widget_set_container(mw, container);
@@ -151,7 +151,7 @@ balsa_mime_widget_new_message(BalsaMessage * bm,
        mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
 
        widget = gtk_frame_new(_("message headers"));
-        balsa_mime_widget_set_widget(mw, widget);
+        gtk_container_add(GTK_CONTAINER(mw), widget);
 
        header_widget = bm_header_widget_new(bm, NULL);
         balsa_mime_widget_set_header_widget(mw, header_widget);
@@ -177,7 +177,6 @@ bmw_message_extbody_url(LibBalsaMessageBody * mime_body,
     GString *msg = NULL;
     gchar *url;
     BalsaMimeWidget *mw;
-    GtkWidget *widget;
 
     if (url_type == RFC2046_EXTBODY_LOCALFILE) {
        url = libbalsa_message_body_get_parameter(mime_body, "name");
@@ -242,18 +241,15 @@ bmw_message_extbody_url(LibBalsaMessageBody * mime_body,
     /* now create & return the widget... */
     mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
 
-    widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_VBOX_SPACE);
-    balsa_mime_widget_set_widget(mw, widget);
-
-    gtk_container_set_border_width(GTK_CONTAINER(widget),
+    gtk_container_set_border_width(GTK_CONTAINER(mw),
                                   BMW_CONTAINER_BORDER);
 
-    gtk_box_pack_start(GTK_BOX(widget), gtk_label_new(msg->str), FALSE,
+    gtk_box_pack_start(GTK_BOX(mw), gtk_label_new(msg->str), FALSE,
                       FALSE, 0);
     g_string_free(msg, TRUE);
 
     button = gtk_button_new_with_label(url);
-    gtk_box_pack_start(GTK_BOX(widget), button, FALSE, FALSE,
+    gtk_box_pack_start(GTK_BOX(mw), button, FALSE, FALSE,
                       BMW_BUTTON_PACK_SPACE);
     g_object_set_data_full(G_OBJECT(button), "call_url", url,
                           (GDestroyNotify) g_free);
@@ -271,7 +267,6 @@ bmw_message_extbody_mail(LibBalsaMessageBody * mime_body)
     GString *msg = NULL;
     gchar *mail_subject, *mail_site;
     BalsaMimeWidget *mw;
-    GtkWidget *widget;
 
     mail_site = libbalsa_message_body_get_parameter(mime_body, "server");
 
@@ -292,20 +287,17 @@ bmw_message_extbody_mail(LibBalsaMessageBody * mime_body)
     /* now create & return the widget... */
     mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
 
-    widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_VBOX_SPACE);
-    balsa_mime_widget_set_widget(mw, widget);
-
-    gtk_container_set_border_width(GTK_CONTAINER(widget),
+    gtk_container_set_border_width(GTK_CONTAINER(mw),
                                   BMW_CONTAINER_BORDER);
 
-    gtk_box_pack_start(GTK_BOX(widget), gtk_label_new(msg->str), FALSE,
+    gtk_box_pack_start(GTK_BOX(mw), gtk_label_new(msg->str), FALSE,
                       FALSE, 0);
     g_string_free(msg, TRUE);
 
     button =
        gtk_button_new_with_mnemonic(_
                                     ("Se_nd message to obtain this part"));
-    gtk_box_pack_start(GTK_BOX(widget), button, FALSE, FALSE,
+    gtk_box_pack_start(GTK_BOX(mw), button, FALSE, FALSE,
                       BMW_BUTTON_PACK_SPACE);
     g_signal_connect(button, "clicked",
                     G_CALLBACK(extbody_send_mail), (gpointer) mime_body);
@@ -420,26 +412,22 @@ balsa_mime_widget_new_message_tl(BalsaMessage * bm,
                                  GtkWidget * const * tl_buttons)
 {
     BalsaMimeWidget *mw;
-    GtkWidget *widget;
     GtkWidget *headers;
     GtkWidget *container;
 
     mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
 
-    widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_MESSAGE_PADDING);
-    balsa_mime_widget_set_widget(mw, widget);
-
-    gtk_container_set_border_width(GTK_CONTAINER(widget), BMW_MESSAGE_PADDING);
+    gtk_container_set_border_width(GTK_CONTAINER(mw), BMW_MESSAGE_PADDING);
 
     headers = bm_header_widget_new(bm, tl_buttons);
     balsa_mime_widget_set_header_widget(mw, headers);
 
-    gtk_box_pack_start(GTK_BOX(widget), headers, FALSE, FALSE, 0);
+    gtk_box_pack_start(GTK_BOX(mw), headers, FALSE, FALSE, 0);
 
     container = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_MESSAGE_PADDING);
     balsa_mime_widget_set_container(mw, container);
 
-    gtk_box_pack_start(GTK_BOX(widget), container, TRUE, TRUE,
+    gtk_box_pack_start(GTK_BOX(mw), container, TRUE, TRUE,
                       BMW_CONTAINER_BORDER - BMW_MESSAGE_PADDING);
 
     return mw;
diff --git a/src/balsa-mime-widget-multipart.c b/src/balsa-mime-widget-multipart.c
index 514f82a2d..61d28454b 100644
--- a/src/balsa-mime-widget-multipart.c
+++ b/src/balsa-mime-widget-multipart.c
@@ -40,9 +40,9 @@ balsa_mime_widget_new_multipart(BalsaMessage * bm,
     g_return_val_if_fail(content_type != NULL, NULL);
 
     mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
-    widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_MESSAGE_PADDING);
-    balsa_mime_widget_set_widget(mw, widget);
-    balsa_mime_widget_set_container(mw, widget);
+    gtk_box_set_spacing(GTK_BOX(mw), BMW_MESSAGE_PADDING);
+
+    widget = GTK_WIDGET(mw);
 
     if (g_ascii_strcasecmp("multipart/signed", content_type) == 0 &&
        mime_body->parts != NULL &&
@@ -52,8 +52,11 @@ balsa_mime_widget_new_multipart(BalsaMessage * bm,
            balsa_mime_widget_crypto_frame(mime_body->parts->next, widget,
                                           mime_body->was_encrypted, FALSE, NULL);
 
-        balsa_mime_widget_set_widget(mw, crypto_frame);
+        mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
+        gtk_container_add(GTK_CONTAINER(mw), crypto_frame);
     }
 
+    balsa_mime_widget_set_container(mw, widget);
+
     return mw;
 }
diff --git a/src/balsa-mime-widget-text.c b/src/balsa-mime-widget-text.c
index bc8f51ce9..262020dc4 100644
--- a/src/balsa-mime-widget-text.c
+++ b/src/balsa-mime-widget-text.c
@@ -296,7 +296,7 @@ balsa_mime_widget_new_text(BalsaMessage * bm, LibBalsaMessageBody * mime_body,
     }
 
     mw = (BalsaMimeWidget *) mwt;
-    balsa_mime_widget_set_widget(mw, widget);
+    gtk_container_add(GTK_CONTAINER(mw), widget);
 
     return mw;
 }
@@ -1176,7 +1176,7 @@ bm_widget_new_html(BalsaMessage * bm, LibBalsaMessageBody * mime_body)
         libbalsa_html_new(mime_body,
                          (LibBalsaHtmlCallback) bm_widget_on_url,
                          (LibBalsaHtmlCallback) handle_url);
-    balsa_mime_widget_set_widget(mw, widget);
+    gtk_container_add(GTK_CONTAINER(mw), widget);
 
     g_object_set_data(G_OBJECT(widget), "mime-body", mime_body);
 
@@ -1231,7 +1231,7 @@ bm_widget_new_vcard(BalsaMessage *bm, LibBalsaMessageBody *mime_body,
     mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
     widget = gtk_grid_new();
     g_object_set_data(G_OBJECT(widget), "mime-body", mime_body);
-    balsa_mime_widget_set_widget(mw, widget);
+    gtk_container_add(GTK_CONTAINER(mw), widget);
 
     grid = (GtkGrid *) widget;
     gtk_grid_set_row_spacing(grid, 6);
diff --git a/src/balsa-mime-widget-vcalendar.c b/src/balsa-mime-widget-vcalendar.c
index d5a2b1371..d2e3ff347 100644
--- a/src/balsa-mime-widget-vcalendar.c
+++ b/src/balsa-mime-widget-vcalendar.c
@@ -44,7 +44,6 @@ balsa_mime_widget_new_vcalendar(BalsaMessage * bm,
 {
     LibBalsaVCal *vcal_obj;
     BalsaMimeWidget *mw;
-    GtkWidget *widget;
     GtkWidget *label;
     gchar *text;
     guint event_no;
@@ -62,16 +61,13 @@ balsa_mime_widget_new_vcalendar(BalsaMessage * bm,
 
     mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
 
-    widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
-    balsa_mime_widget_set_widget(mw, widget);
-
     text = g_strdup_printf(_("This is an iTIP calendar ā€œ%sā€ message."),
                           libbalsa_vcal_method_str(vcal_obj));
     label = gtk_label_new(text);
     g_free(text);
     gtk_widget_set_halign(label, GTK_ALIGN_START);
     gtk_widget_set_valign(label, GTK_ALIGN_START);
-    gtk_container_add(GTK_CONTAINER(widget), label);
+    gtk_container_add(GTK_CONTAINER(mw), label);
 
     /* a reply may be created only for unread requests */
     if ((libbalsa_vcal_method(vcal_obj) == ITIP_REQUEST) &&
@@ -101,7 +97,7 @@ balsa_mime_widget_new_vcalendar(BalsaMessage * bm,
        GtkWidget *event;
 
        event = balsa_vevent_widget(libbalsa_vcal_vevent(vcal_obj, event_no), may_reply, sender);
-       gtk_container_add(GTK_CONTAINER(widget), event);
+       gtk_container_add(GTK_CONTAINER(mw), event);
     }
 
     g_object_unref(vcal_obj);
diff --git a/src/balsa-mime-widget.c b/src/balsa-mime-widget.c
index 5fc245c40..e907ae6cf 100644
--- a/src/balsa-mime-widget.c
+++ b/src/balsa-mime-widget.c
@@ -46,9 +46,6 @@ static BalsaMimeWidget *balsa_mime_widget_new_unknown(BalsaMessage * bm,
 static void vadj_change_cb(GtkAdjustment *vadj, GtkWidget *widget);
 
 typedef struct {
-    /* display widget */
-    GtkWidget *widget;
-
     /* container widget if more sub-parts can be added */
     GtkWidget *container;
 
@@ -56,7 +53,7 @@ typedef struct {
     GtkWidget *header_widget;
 } BalsaMimeWidgetPrivate;
 
-G_DEFINE_TYPE_WITH_PRIVATE(BalsaMimeWidget, balsa_mime_widget, G_TYPE_OBJECT)
+G_DEFINE_TYPE_WITH_PRIVATE(BalsaMimeWidget, balsa_mime_widget, GTK_TYPE_BOX)
 
 static void
 balsa_mime_widget_init(BalsaMimeWidget *self)
@@ -64,10 +61,13 @@ balsa_mime_widget_init(BalsaMimeWidget *self)
 #ifdef G_OBJECT_NEEDS_TO_BE_INITIALIZED
     BalsaMimeWidgetPrivate *priv = balsa_mime_widget_get_instance_private(self);
 
-    priv->widget = NULL;
     priv->container = NULL;
     priv->header_widget = NULL;
 #endif /* G_OBJECT_NEEDS_TO_BE_INITIALIZED */
+    g_object_set(self,
+                 "orientation", GTK_ORIENTATION_VERTICAL,
+                 "spacing", BMW_VBOX_SPACE,
+                 NULL);
 }
 
 static void
@@ -129,47 +129,54 @@ balsa_mime_widget_new(BalsaMessage * bm, LibBalsaMessageBody * mime_body, gpoint
     if (mw == NULL)
        mw = balsa_mime_widget_new_unknown(bm, mime_body, content_type);
 
-    if (mw != NULL) {
-        BalsaMimeWidgetPrivate *priv = balsa_mime_widget_get_instance_private(mw);
-
-       if (priv->widget) {
-           g_signal_connect(priv->widget, "focus_in_event",
-                            G_CALLBACK(balsa_mime_widget_limit_focus),
-                            (gpointer) bm);
-           g_signal_connect(priv->widget, "focus_out_event",
-                            G_CALLBACK(balsa_mime_widget_unlimit_focus),
-                            (gpointer) bm);
-           if (mime_body->sig_info &&
-               g_ascii_strcasecmp("application/pgp-signature", content_type) &&
-               g_ascii_strcasecmp("application/pkcs7-signature", content_type) &&
-               g_ascii_strcasecmp("application/x-pkcs7-signature", content_type)) {
-               GtkWidget * signature =
-                   balsa_mime_widget_signature_widget(mime_body, content_type);
-               priv->widget = balsa_mime_widget_crypto_frame(mime_body, priv->widget,
-                                                           mime_body->was_encrypted,
-                                                           FALSE, signature);
-           } else if (mime_body->was_encrypted &&
-                      g_ascii_strcasecmp("multipart/signed", content_type)) {
-               priv->widget = balsa_mime_widget_crypto_frame(mime_body, priv->widget,
-                                                           TRUE, TRUE, NULL);
-           }
-            g_object_ref_sink(priv->widget);
-
-           if (GTK_IS_LAYOUT(priv->widget)) {
-                GtkAdjustment *vadj;
-
-                g_object_get(priv->widget, "vadjustment", &vadj,
-                             NULL);
-               g_signal_connect(vadj, "changed",
-                                G_CALLBACK(vadj_change_cb), priv->widget);
-                g_object_unref(vadj);
-            }
-
-            gtk_widget_show_all(priv->widget);
-       }
+    g_signal_connect(mw, "focus_in_event",
+                     G_CALLBACK(balsa_mime_widget_limit_focus), bm);
+    g_signal_connect(mw, "focus_out_event",
+                     G_CALLBACK(balsa_mime_widget_unlimit_focus), bm);
+    if (mime_body->sig_info != NULL &&
+        g_ascii_strcasecmp("application/pgp-signature", content_type) != 0 &&
+        g_ascii_strcasecmp("application/pkcs7-signature", content_type) != 0 &&
+        g_ascii_strcasecmp("application/x-pkcs7-signature", content_type) != 0) {
+        GtkWidget *signature = balsa_mime_widget_signature_widget(mime_body, content_type);
+        GtkWidget *crypto_frame =
+            balsa_mime_widget_crypto_frame(mime_body, GTK_WIDGET(mw),
+                                           mime_body->was_encrypted,
+                                           FALSE, signature);
+        BalsaMimeWidgetPrivate *priv;
+        GtkWidget *container;
+
+        priv = balsa_mime_widget_get_instance_private(mw);
+        container = priv->container;
+        mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
+        gtk_container_add(GTK_CONTAINER(mw), crypto_frame);
+        priv = balsa_mime_widget_get_instance_private(mw);
+        priv->container = container;
+    } else if (mime_body->was_encrypted &&
+               g_ascii_strcasecmp("multipart/signed", content_type) != 0) {
+        GtkWidget *crypto_frame =
+            balsa_mime_widget_crypto_frame(mime_body, GTK_WIDGET(mw), TRUE, TRUE, NULL);
+        BalsaMimeWidgetPrivate *priv;
+        GtkWidget *container;
+
+        priv = balsa_mime_widget_get_instance_private(mw);
+        container = priv->container;
+        mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
+        gtk_container_add(GTK_CONTAINER(mw), crypto_frame);
+        priv = balsa_mime_widget_get_instance_private(mw);
+        priv->container = container;
     }
     g_free(content_type);
 
+    if (GTK_IS_LAYOUT(mw)) {
+        GtkAdjustment *vadj;
+
+        g_object_get(mw, "vadjustment", &vadj, NULL);
+        g_signal_connect(vadj, "changed", G_CALLBACK(vadj_change_cb), mw);
+        g_object_unref(vadj);
+    }
+
+    gtk_widget_show_all(GTK_WIDGET(mw));
+
     return mw;
 }
 
@@ -186,20 +193,17 @@ balsa_mime_widget_new_unknown(BalsaMessage * bm,
     gchar *content_desc;
     BalsaMimeWidget *mw;
     gchar *use_content_type;
-    BalsaMimeWidgetPrivate *priv;
 
     g_return_val_if_fail(mime_body != NULL, NULL);
 
     mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
-    priv = balsa_mime_widget_get_instance_private(mw);
 
-    priv->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_VBOX_SPACE);
-    gtk_container_set_border_width(GTK_CONTAINER(priv->widget),
+    gtk_container_set_border_width(GTK_CONTAINER(mw),
                                   BMW_CONTAINER_BORDER);
 
     if (mime_body->filename) {
        msg = g_strdup_printf(_("File name: %s"), mime_body->filename);
-       gtk_box_pack_start(GTK_BOX(priv->widget), gtk_label_new(msg), FALSE,
+       gtk_box_pack_start(GTK_BOX(mw), gtk_label_new(msg), FALSE,
                           FALSE, 0);
        g_free(msg);
     }
@@ -254,7 +258,7 @@ balsa_mime_widget_new_unknown(BalsaMessage * bm,
     msg_label = gtk_label_new(msg);
     g_free(msg);
     gtk_label_set_ellipsize(GTK_LABEL(msg_label), PANGO_ELLIPSIZE_END);
-    gtk_box_pack_start(GTK_BOX(priv->widget), msg_label, FALSE, FALSE, 0);
+    gtk_box_pack_start(GTK_BOX(mw), msg_label, FALSE, FALSE, 0);
 
     hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, BMW_HBOX_SPACE);
     gtk_box_set_homogeneous(GTK_BOX(hbox), TRUE);
@@ -263,7 +267,7 @@ balsa_mime_widget_new_unknown(BalsaMessage * bm,
                                            (gpointer) mime_body)))
        gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
     else
-       gtk_box_pack_start(GTK_BOX(priv->widget),
+       gtk_box_pack_start(GTK_BOX(mw),
                           gtk_label_new(_("No open or view action "
                                           "defined for this content type")),
                           FALSE, FALSE, 0);
@@ -275,7 +279,7 @@ balsa_mime_widget_new_unknown(BalsaMessage * bm,
                     G_CALLBACK(balsa_mime_widget_ctx_menu_save),
                     (gpointer) mime_body);
 
-    gtk_box_pack_start(GTK_BOX(priv->widget), hbox, FALSE, FALSE, 0);
+    gtk_box_pack_start(GTK_BOX(mw), hbox, FALSE, FALSE, 0);
 
     return mw;
 }
@@ -331,17 +335,6 @@ vadj_change_cb(GtkAdjustment *vadj, GtkWidget *widget)
  * Getters
  */
 
-GtkWidget *
-balsa_mime_widget_get_widget(BalsaMimeWidget * mw)
-{
-    BalsaMimeWidgetPrivate *priv =
-        balsa_mime_widget_get_instance_private(mw);
-
-    g_return_val_if_fail(BALSA_IS_MIME_WIDGET(mw), NULL);
-
-    return priv->widget;
-}
-
 GtkWidget *
 balsa_mime_widget_get_container(BalsaMimeWidget * mw)
 {
@@ -368,17 +361,6 @@ balsa_mime_widget_get_header_widget(BalsaMimeWidget * mw)
  * Setters
  */
 
-void
-balsa_mime_widget_set_widget(BalsaMimeWidget * mw, GtkWidget * widget)
-{
-    BalsaMimeWidgetPrivate *priv =
-        balsa_mime_widget_get_instance_private(mw);
-
-    g_return_if_fail(BALSA_IS_MIME_WIDGET(mw));
-
-    priv->widget = widget;
-}
-
 void
 balsa_mime_widget_set_container(BalsaMimeWidget * mw, GtkWidget * widget)
 {
diff --git a/src/balsa-mime-widget.h b/src/balsa-mime-widget.h
index afc951159..ea1ccbb09 100644
--- a/src/balsa-mime-widget.h
+++ b/src/balsa-mime-widget.h
@@ -40,12 +40,12 @@ G_BEGIN_DECLS
  */
 
 struct _BalsaMimeWidgetClass {
-    GObjectClass parent;
+    GtkBoxClass parent_class;
 };
 
 #define BALSA_TYPE_MIME_WIDGET balsa_mime_widget_get_type()
 
-G_DECLARE_DERIVABLE_TYPE(BalsaMimeWidget, balsa_mime_widget, BALSA, MIME_WIDGET, GObject)
+G_DECLARE_DERIVABLE_TYPE(BalsaMimeWidget, balsa_mime_widget, BALSA, MIME_WIDGET, GtkBox)
 
 /*
  * Method definitions.
@@ -60,7 +60,6 @@ void balsa_mime_widget_schedule_resize(GtkWidget * widget);
  * Getters
  */
 
-GtkWidget *balsa_mime_widget_get_widget       (BalsaMimeWidget * mw);
 GtkWidget *balsa_mime_widget_get_container    (BalsaMimeWidget * mw);
 GtkWidget *balsa_mime_widget_get_header_widget(BalsaMimeWidget * mw);
 
@@ -68,7 +67,6 @@ GtkWidget *balsa_mime_widget_get_header_widget(BalsaMimeWidget * mw);
  * Setters
  */
 
-void balsa_mime_widget_set_widget       (BalsaMimeWidget * mw, GtkWidget * widget);
 void balsa_mime_widget_set_container    (BalsaMimeWidget * mw, GtkWidget * widget);
 void balsa_mime_widget_set_header_widget(BalsaMimeWidget * mw, GtkWidget * widget);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]