[balsa/wip/gtk4: 140/351] Rewrite the class definitions of BalsaMimeWidget*



commit 23e52c0ec9d06becac771084e9726cc234f8e228
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Mon Jan 29 15:11:08 2018 -0500

    Rewrite the class definitions of BalsaMimeWidget*
    
    Use the G_DECLARE* and G_DEFINE* macros to set up the class structure
    of BalsaMimeWidget and its subclasses.

 src/balsa-message.c               |   66 +++++++++-------
 src/balsa-mime-widget-callbacks.c |    7 +-
 src/balsa-mime-widget-crypto.c    |   27 ++++--
 src/balsa-mime-widget-image.c     |    2 +-
 src/balsa-mime-widget-image.h     |   28 +------
 src/balsa-mime-widget-message.c   |   87 +++++++++++++-------
 src/balsa-mime-widget-multipart.c |   15 +++-
 src/balsa-mime-widget-text.c      |   55 +++++++------
 src/balsa-mime-widget-text.h      |    9 +-
 src/balsa-mime-widget-vcalendar.c |    8 +-
 src/balsa-mime-widget.c           |  160 +++++++++++++++++++++++++-----------
 src/balsa-mime-widget.h           |   49 ++++++------
 12 files changed, 308 insertions(+), 205 deletions(-)
---
diff --git a/src/balsa-message.c b/src/balsa-message.c
index 0b5c02c..948bea3 100644
--- a/src/balsa-message.c
+++ b/src/balsa-message.c
@@ -370,7 +370,8 @@ bm_find_scroll_to_rectangle(BalsaMessage * bm,
     gint x, y;
     GtkAdjustment *hadj, *vadj;
 
-    gtk_widget_translate_coordinates(widget, bm->bm_widget->widget,
+    gtk_widget_translate_coordinates(widget,
+                                     balsa_mime_widget_get_widget(bm->bm_widget),
                                      rectangle->x, rectangle->y,
                                      &x, &y);
 
@@ -447,7 +448,7 @@ bm_find_entry_changed_cb(GtkEditable * editable, gpointer data)
 {
     const gchar *text = gtk_entry_get_text(GTK_ENTRY(editable));
     BalsaMessage *bm = data;
-    GtkWidget *widget = bm->current_part->mime_widget->widget;
+    GtkWidget *widget = balsa_mime_widget_get_widget(bm->current_part->mime_widget);
     gboolean found = FALSE;
 
     if (GTK_IS_TEXT_VIEW(widget)) {
@@ -507,7 +508,7 @@ static void
 bm_find_again(BalsaMessage * bm, gboolean find_forward)
 {
     const gchar *text = gtk_entry_get_text(GTK_ENTRY(bm->find_entry));
-    GtkWidget *widget = bm->current_part->mime_widget->widget;
+    GtkWidget *widget = balsa_mime_widget_get_widget(bm->current_part->mime_widget);
     gboolean found;
 
     bm->find_forward = find_forward;
@@ -676,6 +677,7 @@ balsa_message_init(BalsaMessage * bm)
     GtkGesture *gesture;
     GtkCellRenderer *renderer;
     GtkTreeSelection *selection;
+    GtkWidget *widget;
 
     bm->switcher = gtk_stack_switcher_new();
     gtk_box_pack_start(GTK_BOX(bm), bm->switcher);
@@ -710,9 +712,10 @@ balsa_message_init(BalsaMessage * bm)
     g_free(buttons);
 
     /* Widget to hold message */
-    g_signal_connect(bm->bm_widget->widget, "notify::has-focus",
+    widget = balsa_mime_widget_get_widget(bm->bm_widget);
+    g_signal_connect(widget, "notify::has-focus",
                      G_CALLBACK(balsa_mime_widget_check_focus), bm);
-    gtk_container_add(GTK_CONTAINER(bm->scroll), bm->bm_widget->widget);
+    gtk_container_add(GTK_CONTAINER(bm->scroll), widget);
 
     /* structure view */
     model = gtk_tree_store_new (NUM_COLUMNS,
@@ -2158,6 +2161,7 @@ add_part(BalsaMessage * bm, BalsaPartInfo * info, GtkWidget * container)
     GtkTreeSelection *selection;
     GtkWidget *widget;
     LibBalsaMessageBody *body;
+    GtkWidget *bm_container;
 
     if (!info)
        return NULL;
@@ -2171,15 +2175,14 @@ add_part(BalsaMessage * bm, BalsaPartInfo * info, GtkWidget * container)
     if (info->mime_widget == NULL)
        part_info_init(bm, info);
 
-    if ((widget = info->mime_widget->widget)) {
+    if ((widget = balsa_mime_widget_get_widget(info->mime_widget)) != NULL) {
         gtk_widget_set_vexpand(widget, TRUE);
         gtk_box_pack_start(GTK_BOX(container), widget);
     }
 
-    body =
-        add_multipart(bm, info->body,
-                      info->mime_widget->container ?
-                      info->mime_widget->container : container);
+    bm_container = balsa_mime_widget_get_container(info->mime_widget);
+    body = add_multipart(bm, info->body,
+                         bm_container != NULL ?  bm_container : container);
 
     return body;
 }
@@ -2195,9 +2198,11 @@ gtk_tree_hide_func(GtkTreeModel * model, GtkTreePath * path,
     if (info) {
         GtkWidget *widget, *parent;
 
-        if (info->mime_widget && (widget = info->mime_widget->widget)
-            && (parent = gtk_widget_get_parent(widget)))
+        if (info->mime_widget != NULL
+            && (widget = balsa_mime_widget_get_widget(info->mime_widget)) != NULL
+            && (parent = gtk_widget_get_parent(widget)) != NULL) {
             gtk_container_remove(GTK_CONTAINER(parent), widget);
+        }
         g_object_unref(info);
     }
 
@@ -2217,7 +2222,7 @@ hide_all_parts(BalsaMessage * bm)
        bm->current_part = NULL;
     }
 
-    gtk_container_foreach(GTK_CONTAINER(bm->bm_widget->container),
+    gtk_container_foreach(GTK_CONTAINER(balsa_mime_widget_get_container(bm->bm_widget)),
                           (GtkCallback) gtk_widget_destroy, NULL);
 }
 
@@ -2233,7 +2238,7 @@ select_part(BalsaMessage * bm, BalsaPartInfo *info)
     hide_all_parts(bm);
     bm_disable_find_entry(bm);
 
-    body = add_part(bm, info, bm->bm_widget->container);
+    body = add_part(bm, info, balsa_mime_widget_get_container(bm->bm_widget));
     bm->current_part = part_info_from_body(bm, body);
 
     g_signal_emit(G_OBJECT(bm), balsa_message_signals[SELECT_PART], 0);
@@ -2253,7 +2258,7 @@ balsa_message_current_part_widget(BalsaMessage * bmessage)
 {
     if (bmessage && bmessage->current_part &&
        bmessage->current_part->mime_widget)
-       return bmessage->current_part->mime_widget->widget;
+       return balsa_mime_widget_get_widget(bmessage->current_part->mime_widget);
     else
        return NULL;
 }
@@ -2279,17 +2284,22 @@ balsa_get_parent_window(GtkWidget * widget)
 gboolean
 balsa_message_can_select(BalsaMessage * bmessage)
 {
-    GtkWidget *w;
+    GtkWidget *widget;
 
     g_return_val_if_fail(bmessage != NULL, FALSE);
 
-    if (bmessage->current_part == NULL
-        || (w = bmessage->current_part->mime_widget->widget) == NULL)
+    if (bmessage->current_part == NULL) {
+        return FALSE;
+    }
+
+    widget = balsa_mime_widget_get_widget(bmessage->current_part->mime_widget);
+    if (widget == NULL) {
         return FALSE;
+    }
 
-    return GTK_IS_EDITABLE(w) || GTK_IS_TEXT_VIEW(w)
+    return GTK_IS_EDITABLE(widget) || GTK_IS_TEXT_VIEW(widget)
 #ifdef    HAVE_HTML_WIDGET
-        || libbalsa_html_can_select(w)
+        || libbalsa_html_can_select(widget)
 #endif /* HAVE_HTML_WIDGET */
         ;
 }
@@ -2302,7 +2312,7 @@ balsa_message_grab_focus(BalsaMessage * bmessage)
     g_return_val_if_fail(bmessage != NULL, FALSE);
     g_return_val_if_fail(bmessage->current_part != NULL, FALSE);
 
-    widget = bmessage->current_part->mime_widget->widget;
+    widget = balsa_mime_widget_get_widget(bmessage->current_part->mime_widget);
     g_return_val_if_fail(widget != NULL, FALSE);
 
     gtk_widget_set_can_focus(widget, TRUE);
@@ -3224,17 +3234,17 @@ message_recheck_crypto_cb(GtkWidget * button, BalsaMessage * bm)
 void
 balsa_message_find_in_message(BalsaMessage * bm)
 {
-    GtkWidget *w;
+    GtkWidget *widget;
 
-    if (bm->current_part
-        && (w = bm->current_part->mime_widget->widget)
-        && (GTK_IS_TEXT_VIEW(w)
+    if (bm->current_part != NULL
+        && (widget = balsa_mime_widget_get_widget(bm->current_part->mime_widget)) != NULL
+        && (GTK_IS_TEXT_VIEW(widget)
 #ifdef HAVE_HTML_WIDGET
-            || libbalsa_html_can_search(w)
+            || libbalsa_html_can_search(widget)
 #endif                          /* HAVE_HTML_WIDGET */
             )) {
-        if (GTK_IS_TEXT_VIEW(w)) {
-            GtkTextView *text_view = (GtkTextView *) w;
+        if (GTK_IS_TEXT_VIEW(widget)) {
+            GtkTextView *text_view = (GtkTextView *) widget;
             GtkTextBuffer *buffer = gtk_text_view_get_buffer(text_view);
 
             gtk_text_buffer_get_start_iter(buffer, &bm->find_iter);
diff --git a/src/balsa-mime-widget-callbacks.c b/src/balsa-mime-widget-callbacks.c
index 513f29a..39d8ccd 100644
--- a/src/balsa-mime-widget-callbacks.c
+++ b/src/balsa-mime-widget-callbacks.c
@@ -268,19 +268,22 @@ balsa_mime_widget_key_press_event(GtkWidget * widget, GdkEvent * event,
 void
 balsa_mime_widget_check_focus(GtkWidget * widget, GParamSpec * pspec, BalsaMessage * bm)
 {
+    GtkContainer *container =
+        GTK_CONTAINER(balsa_mime_widget_get_container(bm->bm_widget));
+
     if (gtk_widget_has_focus(widget)) {
         /* Disable can_focus on other message parts so that TAB does not
          * attempt to move the focus on them. */
         GList *list;
 
         list = g_list_append(NULL, widget);
-        gtk_container_set_focus_chain(GTK_CONTAINER(bm->bm_widget->container), list);
+        gtk_container_set_focus_chain(container, list);
         g_list_free(list);
 
         if (bm->focus_state == BALSA_MESSAGE_FOCUS_STATE_NO)
             bm->focus_state = BALSA_MESSAGE_FOCUS_STATE_YES;
     } else {
-        gtk_container_unset_focus_chain(GTK_CONTAINER(bm->bm_widget->container));
+        gtk_container_unset_focus_chain(container);
 
         if (bm->message != NULL) {
             if (bm->focus_state == BALSA_MESSAGE_FOCUS_STATE_HOLD) {
diff --git a/src/balsa-mime-widget-crypto.c b/src/balsa-mime-widget-crypto.c
index d0df5e6..4908803 100644
--- a/src/balsa-mime-widget-crypto.c
+++ b/src/balsa-mime-widget-crypto.c
@@ -52,7 +52,9 @@ balsa_mime_widget_new_signature(BalsaMessage * bm,
        return NULL;
 
     mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
-    mw->widget = balsa_mime_widget_signature_widget(mime_body, content_type);
+    balsa_mime_widget_set_widget(mw,
+                                 balsa_mime_widget_signature_widget(mime_body,
+                                                                    content_type));
     
     return mw;
 }
@@ -73,19 +75,26 @@ balsa_mime_widget_new_pgpkey(BalsaMessage        *bm,
 
     body_size = libbalsa_message_body_get_content(mime_body, &body_buf, &err);
     if (body_size < 0) {
-        balsa_information(LIBBALSA_INFORMATION_ERROR, _("Could not save a text part: %s"),
+        balsa_information(LIBBALSA_INFORMATION_ERROR,
+                          _("Could not save a text part: %s"),
                           err ? err->message : "Unknown error");
         g_clear_error(&err);
     } else {
-               mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
-               mw->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_VBOX_SPACE);
-               if (!create_import_keys_widget(GTK_BOX(mw->widget), body_buf, &err)) {
-            balsa_information(LIBBALSA_INFORMATION_ERROR, _("Could not process GnuPG keys: %s"),
-                              err ? err->message : "Unknown error");
+        GtkWidget *box;
+
+        mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
+        box = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_VBOX_SPACE);
+        balsa_mime_widget_set_widget(mw, box);
+        if (!create_import_keys_widget(GTK_BOX(box), body_buf, &err)) {
+            balsa_information(LIBBALSA_INFORMATION_ERROR,
+                              _("Could not process GnuPG keys: %s"),
+                              err != NULL ? err->message : "Unknown error");
             g_clear_error(&err);
-            g_object_unref(G_OBJECT(mw));
+            g_object_ref_sink(box);
+            g_object_unref(box);
+            g_object_unref(mw);
             mw = NULL;
-               }
+        }
        g_free(body_buf);
     }
 
diff --git a/src/balsa-mime-widget-image.c b/src/balsa-mime-widget-image.c
index b0d6e5d..bcbcf16 100644
--- a/src/balsa-mime-widget-image.c
+++ b/src/balsa-mime-widget-image.c
@@ -109,7 +109,7 @@ balsa_mime_widget_new_image(BalsaMessage * bm,
                      G_CALLBACK(balsa_mime_widget_image_gesture_pressed_cb), data);
 
     mw = (BalsaMimeWidget *) g_object_new(BALSA_TYPE_MIME_WIDGET_IMAGE, NULL);
-    mw->widget = image;
+    balsa_mime_widget_set_widget(mw, image);
 
     return mw;
 }
diff --git a/src/balsa-mime-widget-image.h b/src/balsa-mime-widget-image.h
index 7483490..228ce89 100644
--- a/src/balsa-mime-widget-image.h
+++ b/src/balsa-mime-widget-image.h
@@ -29,34 +29,12 @@ G_BEGIN_DECLS
 /*
  * GObject class definitions
  */
-#define BALSA_TYPE_MIME_WIDGET_IMAGE                                    \
-    (balsa_mime_widget_image_get_type())
 
-#define BALSA_MIME_WIDGET_IMAGE(obj)                                    \
-    (G_TYPE_CHECK_INSTANCE_CAST((obj),                                  \
-                                BALSA_TYPE_MIME_WIDGET_IMAGE,           \
-                                BalsaMimeWidgetImage))
+#define BALSA_TYPE_MIME_WIDGET_IMAGE balsa_mime_widget_image_get_type()
 
-#define BALSA_IS_MIME_WIDGET_IMAGE(obj)                                 \
-    (G_TYPE_CHECK_INSTANCE_TYPE((obj), BALSA_TYPE_MIME_WIDGET_IMAGE))
+G_DECLARE_FINAL_TYPE(BalsaMimeWidgetImage, balsa_mime_widget_image,
+                     BALSA, MIME_WIDGET_IMAGE, BalsaMimeWidget)
 
-#define BALSA_MIME_WIDGET_IMAGE_CLASS(klass)                            \
-    (G_TYPE_CHECK_CLASS_CAST((klass),                                   \
-                             BALSA_TYPE_MIME_WIDGET_IMAGE,              \
-                             BalsaMimeWidgetImageClass))
-
-#define BALSA_IS_MIME_WIDGET_IMAGE_CLASS(klass)                         \
-    (G_TYPE_CHECK_CLASS_TYPE((klass), BALSA_TYPE_MIME_WIDGET_IMAGE))
-
-#define BALSA_MIME_WIDGET_IMAGE_GET_CLASS(obj)                          \
-    (G_TYPE_INSTANCE_GET_CLASS((obj),                                   \
-                               BALSA_TYPE_MIME_WIDGET_IMAGE,            \
-                               BalsaMimeWidgetImageClass))
-
-GType balsa_mime_widget_image_get_type(void);
-
-typedef struct _BalsaMimeWidgetImage        BalsaMimeWidgetImage;
-typedef struct _BalsaMimeWidgetImageClass   BalsaMimeWidgetImageClass;
 /*
  * End of GObject class definitions
  */
diff --git a/src/balsa-mime-widget-message.c b/src/balsa-mime-widget-message.c
index b7f1004..ecad880 100644
--- a/src/balsa-mime-widget-message.c
+++ b/src/balsa-mime-widget-message.c
@@ -123,29 +123,42 @@ balsa_mime_widget_new_message(BalsaMessage * bm,
        }
        g_free(access_type);
     } else if (!g_ascii_strcasecmp("message/rfc822", content_type)) {
-       GtkWidget *emb_hdrs;
+       GtkWidget *widget;
+       GtkWidget *container;
+       GtkWidget *header_widget;
 
        mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
 
-       mw->widget = gtk_frame_new(NULL);
+       widget = gtk_frame_new(NULL);
+        balsa_mime_widget_set_widget(mw, widget);
 
-       mw->container = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_MESSAGE_PADDING);
-       g_object_set(G_OBJECT(mw->container), "margin", BMW_MESSAGE_PADDING, NULL);
-       gtk_container_add(GTK_CONTAINER(mw->widget), mw->container);
+       container = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_MESSAGE_PADDING);
+       g_object_set(G_OBJECT(container), "margin", BMW_MESSAGE_PADDING, NULL);
+       gtk_container_add(GTK_CONTAINER(widget), container);
+        balsa_mime_widget_set_container(mw, container);
 
-        mw->header_widget = emb_hdrs = bm_header_widget_new(bm, NULL);
-       gtk_box_pack_start(GTK_BOX(mw->container), emb_hdrs);
+        header_widget = bm_header_widget_new(bm, NULL);
+       gtk_box_pack_start(GTK_BOX(container), header_widget);
+        balsa_mime_widget_set_header_widget(mw, header_widget);
 
         bmw_message_set_headers(bm, mw, mime_body,
                                 bm->shown_headers == HEADERS_ALL);
     } else if (!g_ascii_strcasecmp("text/rfc822-headers", content_type)) {
+       GtkWidget *widget;
+       GtkWidget *header_widget;
+
        mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
-       mw->widget = gtk_frame_new(_("message headers"));
-       mw->header_widget = bm_header_widget_new(bm, NULL);
-        gtk_widget_set_valign(mw->header_widget, GTK_ALIGN_START);
-        gtk_widget_set_vexpand(mw->header_widget, FALSE);
-        g_object_set(G_OBJECT(mw->header_widget), "margin", 5, NULL);
-       gtk_container_add(GTK_CONTAINER(mw->widget), mw->header_widget);
+
+       widget = gtk_frame_new(_("message headers"));
+        balsa_mime_widget_set_widget(mw, widget);
+
+       header_widget = bm_header_widget_new(bm, NULL);
+        gtk_widget_set_valign(header_widget, GTK_ALIGN_START);
+        gtk_widget_set_vexpand(header_widget, FALSE);
+        g_object_set(G_OBJECT(header_widget), "margin", 5, NULL);
+       gtk_container_add(GTK_CONTAINER(widget), header_widget);
+        balsa_mime_widget_set_header_widget(mw, header_widget);
+
        bmw_message_set_headers(bm, mw, mime_body, TRUE);
     }
 
@@ -163,6 +176,7 @@ 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");
@@ -227,20 +241,22 @@ bmw_message_extbody_url(LibBalsaMessageBody * mime_body,
     /* now create & return the widget... */
     mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
 
-    mw->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_VBOX_SPACE);
-    g_object_set(G_OBJECT(mw->widget), "margin", BMW_CONTAINER_BORDER, NULL);
+    widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_VBOX_SPACE);
+    g_object_set(G_OBJECT(widget), "margin", BMW_CONTAINER_BORDER, NULL);
 
-    gtk_box_pack_start(GTK_BOX(mw->widget), gtk_label_new(msg->str));
+    gtk_box_pack_start(GTK_BOX(widget), gtk_label_new(msg->str));
     g_string_free(msg, TRUE);
 
     button = gtk_button_new_with_label(url);
     gtk_widget_set_margin_top(button, BMW_BUTTON_PACK_SPACE);
-    gtk_box_pack_start(GTK_BOX(mw->widget), button);
+    gtk_box_pack_start(GTK_BOX(widget), button);
     g_object_set_data_full(G_OBJECT(button), "call_url", url,
                           (GDestroyNotify) g_free);
     g_signal_connect(G_OBJECT(button), "clicked",
                     G_CALLBACK(extbody_call_url), NULL);
 
+    balsa_mime_widget_set_widget(mw, widget);
+
     return mw;
 }
 
@@ -252,6 +268,7 @@ 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");
 
@@ -272,20 +289,21 @@ bmw_message_extbody_mail(LibBalsaMessageBody * mime_body)
     /* now create & return the widget... */
     mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
     
-    mw->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_VBOX_SPACE);
-    g_object_set(G_OBJECT(mw->widget), "margin", BMW_CONTAINER_BORDER, NULL);
+    widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_VBOX_SPACE);
+    g_object_set(G_OBJECT(widget), "margin", BMW_CONTAINER_BORDER, NULL);
 
-    gtk_box_pack_start(GTK_BOX(mw->widget), gtk_label_new(msg->str));
+    gtk_box_pack_start(GTK_BOX(widget), gtk_label_new(msg->str));
     g_string_free(msg, TRUE);
 
     button =
        gtk_button_new_with_mnemonic(_
                                     ("Se_nd message to obtain this part"));
     gtk_widget_set_margin_top(button, BMW_BUTTON_PACK_SPACE);
-    gtk_box_pack_start(GTK_BOX(mw->widget), button);
+    gtk_box_pack_start(GTK_BOX(widget), button);
     g_signal_connect(G_OBJECT(button), "clicked",
                     G_CALLBACK(extbody_send_mail), (gpointer) mime_body);
 
+    balsa_mime_widget_set_widget(mw, widget);
 
     return mw;
 }
@@ -386,20 +404,25 @@ balsa_mime_widget_new_message_tl(BalsaMessage * bm,
 {
     GtkWidget *headers;
     BalsaMimeWidget *mw;
+    GtkWidget *box;
+    GtkWidget *container;
 
     mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
 
-    mw->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_MESSAGE_PADDING);
-    g_object_set(G_OBJECT(mw->widget), "margin", BMW_MESSAGE_PADDING, NULL);
+    box = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_MESSAGE_PADDING);
+    balsa_mime_widget_set_widget(mw, box);
+    g_object_set(G_OBJECT(box), "margin", BMW_MESSAGE_PADDING, NULL);
 
-    mw->header_widget = headers = bm_header_widget_new(bm, tl_buttons);
-    gtk_box_pack_start(GTK_BOX(mw->widget), headers);
+    headers = bm_header_widget_new(bm, tl_buttons);
+    balsa_mime_widget_set_header_widget(mw, headers);
+    gtk_box_pack_start(GTK_BOX(box), headers);
 
-    mw->container = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_MESSAGE_PADDING);
-    gtk_widget_set_vexpand(mw->container, TRUE);
-    gtk_widget_set_margin_top(mw->container,
+    container = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_MESSAGE_PADDING);
+    balsa_mime_widget_set_container(mw, container);
+    gtk_widget_set_vexpand(container, TRUE);
+    gtk_widget_set_margin_top(container,
                               BMW_CONTAINER_BORDER - BMW_MESSAGE_PADDING);
-    gtk_box_pack_start(GTK_BOX(mw->widget), mw->container);
+    gtk_box_pack_start(GTK_BOX(box), container);
 
     return mw;
 }
@@ -688,7 +711,7 @@ bmw_message_set_headers_d(BalsaMessage           * bm,
     gchar *date;
     GtkWidget * widget;
 
-    if (!(widget = mw->header_widget))
+    if ((widget = balsa_mime_widget_get_header_widget(mw)) == NULL)
        return;
 
     grid = bm_header_widget_get_grid(widget);
@@ -794,8 +817,10 @@ bmw_message_set_headers(BalsaMessage        * bm,
     bmw_message_set_headers_d(bm, mw, part->embhdrs, part->parts,
                               part->embhdrs ? part->embhdrs->subject : NULL,
                               show_all_headers);
-    if (!(widget = mw->header_widget))
+
+    if ((widget = balsa_mime_widget_get_header_widget(mw)) == NULL)
        return;
+
     grid = bm_header_widget_get_grid(widget);
     gtk_container_foreach(GTK_CONTAINER(grid), (GtkCallback) foreach_label,
                           part);
diff --git a/src/balsa-mime-widget-multipart.c b/src/balsa-mime-widget-multipart.c
index 687279e..a5ece75 100644
--- a/src/balsa-mime-widget-multipart.c
+++ b/src/balsa-mime-widget-multipart.c
@@ -34,20 +34,27 @@ balsa_mime_widget_new_multipart(BalsaMessage * bm,
                                const gchar * content_type, gpointer data)
 {
     BalsaMimeWidget *mw;
+    GtkWidget *widget;
 
     g_return_val_if_fail(mime_body != NULL, NULL);
     g_return_val_if_fail(content_type != NULL, NULL);
 
     mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
-    mw->widget = mw->container = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_MESSAGE_PADDING);
+    widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_MESSAGE_PADDING);
+    balsa_mime_widget_set_widget(mw, widget);
+    balsa_mime_widget_set_container(mw, widget);
 
 #ifdef HAVE_GPGME
     if (!g_ascii_strcasecmp("multipart/signed", content_type) &&
        mime_body->parts && mime_body->parts->next &&
-       mime_body->parts->next->sig_info)
-       mw->widget = 
-           balsa_mime_widget_crypto_frame(mime_body->parts->next, mw->widget,
+       mime_body->parts->next->sig_info) {
+        GtkWidget * crypto_frame;
+
+       crypto_frame =
+           balsa_mime_widget_crypto_frame(mime_body->parts->next, widget,
                                           mime_body->was_encrypted, FALSE, NULL);
+        balsa_mime_widget_set_widget(mw, crypto_frame);
+    }
 #endif
 
     return mw;
diff --git a/src/balsa-mime-widget-text.c b/src/balsa-mime-widget-text.c
index 1a92427..027117f 100644
--- a/src/balsa-mime-widget-text.c
+++ b/src/balsa-mime-widget-text.c
@@ -222,6 +222,7 @@ balsa_mime_widget_new_text(BalsaMessage * bm, LibBalsaMessageBody * mime_body,
     GtkTextBuffer *buffer;
     GError *err = NULL;
     gboolean is_text_plain;
+    GtkWidget *widget;
 
 
     g_return_val_if_fail(mime_body != NULL, NULL);
@@ -264,18 +265,17 @@ balsa_mime_widget_new_text(BalsaMessage * bm, LibBalsaMessageBody * mime_body,
 
     /* create the mime object and the text/source view widget */
     mwt = g_object_new(BALSA_TYPE_MIME_WIDGET_TEXT, NULL);
-    mw = (BalsaMimeWidget *) mwt;
-    mw->widget = create_text_widget(content_type);
+    widget = create_text_widget(content_type);
 
     /* configure text or source view */
-    gtk_text_view_set_editable(GTK_TEXT_VIEW(mw->widget), FALSE);
-    gtk_text_view_set_left_margin(GTK_TEXT_VIEW(mw->widget),  BALSA_LEFT_MARGIN);
-    gtk_text_view_set_right_margin(GTK_TEXT_VIEW(mw->widget), BALSA_RIGHT_MARGIN);
-    gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(mw->widget), GTK_WRAP_WORD_CHAR);
+    gtk_text_view_set_editable(GTK_TEXT_VIEW(widget), FALSE);
+    gtk_text_view_set_left_margin(GTK_TEXT_VIEW(widget),  BALSA_LEFT_MARGIN);
+    gtk_text_view_set_right_margin(GTK_TEXT_VIEW(widget), BALSA_RIGHT_MARGIN);
+    gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(widget), GTK_WRAP_WORD_CHAR);
 
     /* set the message font */
     if (!balsa_app.use_system_fonts)
-        bm_modify_font_from_string(mw->widget, balsa_app.message_font);
+        bm_modify_font_from_string(widget, balsa_app.message_font);
 
     if (libbalsa_message_body_is_flowed(mime_body)) {
        /* Parse, but don't wrap. */
@@ -283,41 +283,41 @@ balsa_mime_widget_new_text(BalsaMessage * bm, LibBalsaMessageBody * mime_body,
        ptr = libbalsa_wrap_rfc2646(ptr, G_MAXINT, FALSE, TRUE, delsp);
     } else if (bm->wrap_text
 #if HAVE_GTKSOURCEVIEW
-              && !GTK_SOURCE_IS_VIEW(mw->widget)
+              && !GTK_SOURCE_IS_VIEW(widget)
 #endif
               )
        libbalsa_wrap_string(ptr, balsa_app.browse_wrap_length);
 
-    g_signal_connect(G_OBJECT(mw->widget), "key_press_event",
+    g_signal_connect(G_OBJECT(widget), "key_press_event",
                     G_CALLBACK(balsa_mime_widget_key_press_event),
                     (gpointer) bm);
 
     mwt->mime_body = mime_body;
-    g_signal_connect(G_OBJECT(mw->widget), "populate-popup",
+    g_signal_connect(G_OBJECT(widget), "populate-popup",
                     G_CALLBACK(text_view_populate_popup), mwt);
 
-    buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(mw->widget));
+    buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget));
 
-    mwt->url_list = fill_text_buf_cited(mw->widget, ptr,
+    mwt->url_list = fill_text_buf_cited(widget, ptr,
                                         libbalsa_message_body_is_flowed(mime_body),
                                         is_text_plain);
 
     prepare_url_offsets(buffer, mwt->url_list);
-    g_signal_connect_after(G_OBJECT(mw->widget), "realize",
+    g_signal_connect_after(G_OBJECT(widget), "realize",
                           G_CALLBACK(fix_text_widget), mwt->url_list);
     if (mwt->url_list != NULL) {
         GtkGesture *gesture;
         GtkEventController *controller;
 
-        gesture = gtk_gesture_multi_press_new(mw->widget);
-        g_object_set_data_full(G_OBJECT(mw->widget), "balsa-gesture", gesture, g_object_unref);
+        gesture = gtk_gesture_multi_press_new(widget);
+        g_object_set_data_full(G_OBJECT(widget), "balsa-gesture", gesture, g_object_unref);
         g_signal_connect(gesture, "pressed",
                          G_CALLBACK(store_button_coords), NULL);
        g_signal_connect(gesture, "released",
                         G_CALLBACK(check_call_url), mwt->url_list);
 
-        controller = gtk_event_controller_motion_new(mw->widget);
-        g_object_set_data_full(G_OBJECT(mw->widget),
+        controller = gtk_event_controller_motion_new(widget);
+        g_object_set_data_full(G_OBJECT(widget),
                                "balsa-controller", controller, g_object_unref);
         g_signal_connect(controller, "motion",
                          G_CALLBACK(mwt_controller_motion_cb), mwt);
@@ -327,7 +327,7 @@ balsa_mime_widget_new_text(BalsaMessage * bm, LibBalsaMessageBody * mime_body,
 
     if (is_text_plain) {
        /* plain-text highlighting */
-       g_object_set_data(G_OBJECT(mw->widget), "phrase-highlight",
+       g_object_set_data(G_OBJECT(widget), "phrase-highlight",
                          GINT_TO_POINTER(PHRASE_HIGHLIGHT_ON));
        phrase_highlight(buffer, "hp-bold", '*', "weight", PANGO_WEIGHT_BOLD);
        phrase_highlight(buffer, "hp-underline", '_', "underline", PANGO_UNDERLINE_SINGLE);
@@ -335,10 +335,13 @@ balsa_mime_widget_new_text(BalsaMessage * bm, LibBalsaMessageBody * mime_body,
     }
 
     /* size allocation may not be correct, so we'll check back later */
-    balsa_mime_widget_schedule_resize(mw->widget);
-    
+    balsa_mime_widget_schedule_resize(widget);
+
     g_free(ptr);
 
+    mw = (BalsaMimeWidget *) mwt;
+    balsa_mime_widget_set_widget(mw, widget);
+
     return mw;
 }
 
@@ -1272,8 +1275,9 @@ static BalsaMimeWidget *
 bm_widget_new_vcard(BalsaMessage *bm, LibBalsaMessageBody *mime_body,
                     gchar *ptr, size_t len)
 {
-    BalsaMimeWidget *mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
+    BalsaMimeWidget *mw;
     LibBalsaAddress *addr;
+    GtkWidget *widget;
     GtkGrid *grid;
     GtkWidget *w;
     int row = 1;
@@ -1284,8 +1288,12 @@ bm_widget_new_vcard(BalsaMessage *bm, LibBalsaMessageBody *mime_body,
     if (!addr)
         return NULL;
 
-    mw->widget = gtk_grid_new();
-    grid = (GtkGrid*)mw->widget;
+    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);
+
+    grid = (GtkGrid *) widget;
     gtk_grid_set_row_spacing(grid, 6);
     gtk_grid_set_column_spacing(grid, 12);
 
@@ -1305,7 +1313,6 @@ bm_widget_new_vcard(BalsaMessage *bm, LibBalsaMessageBody *mime_body,
         GRID_ATTACH(grid, addr->address_list->data, _("Email Address:"));
     }
 
-    g_object_set_data(G_OBJECT(mw->widget), "mime-body", mime_body);
     return mw;
 }
 
diff --git a/src/balsa-mime-widget-text.h b/src/balsa-mime-widget-text.h
index 5b4dea5..32f1c49 100644
--- a/src/balsa-mime-widget-text.h
+++ b/src/balsa-mime-widget-text.h
@@ -29,12 +29,11 @@ G_BEGIN_DECLS
 /*
  * Type declaration.
  */
-GType balsa_mime_widget_text_get_type(void);
+
 #define BALSA_TYPE_MIME_WIDGET_TEXT balsa_mime_widget_text_get_type()
-#define BALSA_MIME_WIDGET_TEXT(obj) \
-    G_TYPE_CHECK_INSTANCE_CAST (obj, BALSA_TYPE_MIME_WIDGET_TEXT, BalsaMimeWidgetText)
-typedef struct _BalsaMimeWidgetText BalsaMimeWidgetText;
-typedef struct _BalsaMimeWidgetTextClass BalsaMimeWidgetTextClass;
+
+G_DECLARE_FINAL_TYPE(BalsaMimeWidgetText, balsa_mime_widget_text,
+                     BALSA, MIME_WIDGET_TEXT, BalsaMimeWidget)
 
 /*
  * Method definitions.
diff --git a/src/balsa-mime-widget-vcalendar.c b/src/balsa-mime-widget-vcalendar.c
index 039e83c..d98b52e 100644
--- a/src/balsa-mime-widget-vcalendar.c
+++ b/src/balsa-mime-widget-vcalendar.c
@@ -44,6 +44,7 @@ balsa_mime_widget_new_vcalendar(BalsaMessage * bm,
 {
     LibBalsaVCal *vcal_obj;
     BalsaMimeWidget *mw;
+    GtkWidget *widget;
     GtkWidget *label;
     gchar *text;
     GList *l;
@@ -60,7 +61,8 @@ balsa_mime_widget_new_vcalendar(BalsaMessage * bm,
        return NULL;
 
     mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
-    mw->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
+    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_to_str(vcal_obj->method));
@@ -68,7 +70,7 @@ balsa_mime_widget_new_vcalendar(BalsaMessage * bm,
     g_free(text);
     gtk_widget_set_halign(label, GTK_ALIGN_START);
     gtk_widget_set_valign(label, GTK_ALIGN_START);
-    gtk_container_add(GTK_CONTAINER(mw->widget), label);
+    gtk_container_add(GTK_CONTAINER(widget), label);
 
     /* a reply may be created only for unread requests */
     if ((vcal_obj->method == ITIP_REQUEST) &&
@@ -92,7 +94,7 @@ balsa_mime_widget_new_vcalendar(BalsaMessage * bm,
        GtkWidget *event =
            balsa_vevent_widget((LibBalsaVEvent *) l->data, may_reply,
                                sender);
-       gtk_container_add(GTK_CONTAINER(mw->widget), event);
+       gtk_container_add(GTK_CONTAINER(widget), event);
     }
 
     g_object_unref(vcal_obj);
diff --git a/src/balsa-mime-widget.c b/src/balsa-mime-widget.c
index 4762ac6..947dcc0 100644
--- a/src/balsa-mime-widget.c
+++ b/src/balsa-mime-widget.c
@@ -36,10 +36,6 @@
 #include "balsa-mime-widget.h"
 
 
-/* object related functions */
-static void balsa_mime_widget_init (GTypeInstance *instance, gpointer g_class);
-
-
 /* fall-back widget (unknown/unsupported mime type) */
 static BalsaMimeWidget *balsa_mime_widget_new_unknown(BalsaMessage * bm,
                                                      LibBalsaMessageBody *
@@ -49,41 +45,34 @@ static BalsaMimeWidget *balsa_mime_widget_new_unknown(BalsaMessage * bm,
 
 static void vadj_change_cb(GtkAdjustment *vadj, GtkWidget *widget);
 
+typedef struct {
+    /* display widget */
+    GtkWidget *widget;
 
-GType
-balsa_mime_widget_get_type()
-{
-    static GType balsa_mime_widget_type = 0;
-
-    if (!balsa_mime_widget_type) {
-        static const GTypeInfo balsa_mime_widget_info = {
-            sizeof(BalsaMimeWidgetClass),
-            NULL,               /* base_init */
-            NULL,               /* base_finalize */
-            NULL,               /* class_init */
-            NULL,               /* class_finalize */
-            NULL,               /* class_data */
-            sizeof(BalsaMimeWidget),
-            0,                  /* n_preallocs */
-            (GInstanceInitFunc) balsa_mime_widget_init
-        };
-
-        balsa_mime_widget_type =
-            g_type_register_static(G_TYPE_OBJECT, "BalsaMimeWidget",
-                                   &balsa_mime_widget_info, 0);
-    }
+    /* container widget if more sub-parts can be added */
+    GtkWidget *container;
 
-    return balsa_mime_widget_type;
-}
+    /* headers */
+    GtkWidget *header_widget;
+} BalsaMimeWidgetPrivate;
 
+G_DEFINE_TYPE_WITH_PRIVATE(BalsaMimeWidget, balsa_mime_widget, G_TYPE_OBJECT)
 
 static void
-balsa_mime_widget_init (GTypeInstance *instance, gpointer g_class)
+balsa_mime_widget_class_init(BalsaMimeWidgetClass * klass)
 {
-  BalsaMimeWidget *self = (BalsaMimeWidget *)instance;
+}
 
-  self->widget = NULL;
-  self->container = NULL;
+static void
+balsa_mime_widget_init(BalsaMimeWidget * self)
+{
+    BalsaMimeWidgetPrivate *priv =
+        G_TYPE_INSTANCE_GET_PRIVATE(self, BALSA_TYPE_MIME_WIDGET,
+                                    BalsaMimeWidgetPrivate);
+
+    priv->widget = NULL;
+    priv->container = NULL;
+    priv->header_widget = NULL;
 }
 
 
@@ -142,9 +131,13 @@ balsa_mime_widget_new(BalsaMessage * bm, LibBalsaMessageBody * mime_body, gpoint
     if (!mw)
        mw = balsa_mime_widget_new_unknown(bm, mime_body, content_type);
 
-    if (mw) {
-       if (mw->widget) {
-           g_signal_connect(mw->widget, "notify::has-focus",
+    if (mw != NULL) {
+        BalsaMimeWidgetPrivate *priv =
+            G_TYPE_INSTANCE_GET_PRIVATE(mw, BALSA_TYPE_MIME_WIDGET,
+                                        BalsaMimeWidgetPrivate);
+
+       if (priv->widget != NULL) {
+           g_signal_connect(priv->widget, "notify::has-focus",
                             G_CALLBACK(balsa_mime_widget_check_focus), bm);
 #ifdef HAVE_GPGME
            if (mime_body->sig_info &&
@@ -153,27 +146,25 @@ balsa_mime_widget_new(BalsaMessage * bm, LibBalsaMessageBody * mime_body, gpoint
                g_ascii_strcasecmp("application/x-pkcs7-signature", content_type)) {
                GtkWidget * signature =
                    balsa_mime_widget_signature_widget(mime_body, content_type);
-               mw->widget = balsa_mime_widget_crypto_frame(mime_body, mw->widget,
+               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)) {
-               mw->widget = balsa_mime_widget_crypto_frame(mime_body, mw->widget,
+               priv->widget = balsa_mime_widget_crypto_frame(mime_body, priv->widget,
                                                            TRUE, TRUE, NULL);
            }
 #endif
-            g_object_ref_sink(mw->widget);
+            g_object_ref_sink(priv->widget);
 
-           if (GTK_IS_LAYOUT(mw->widget)) {
+           if (GTK_IS_LAYOUT(priv->widget)) {
                 GtkAdjustment *vadj;
 
-                g_object_get(G_OBJECT(mw->widget), "vadjustment", &vadj,
+                g_object_get(G_OBJECT(priv->widget), "vadjustment", &vadj,
                              NULL);
                g_signal_connect(vadj, "changed",
-                                G_CALLBACK(vadj_change_cb), mw->widget);
+                                 G_CALLBACK(vadj_change_cb), priv->widget);
             }
-
-            gtk_widget_show(mw->widget);
        }
     }
     g_free(content_type);
@@ -187,6 +178,7 @@ balsa_mime_widget_new_unknown(BalsaMessage * bm,
                              LibBalsaMessageBody * mime_body,
                              const gchar * content_type)
 {
+    BalsaMimeWidgetPrivate *priv;
     GtkWidget *hbox;
     GtkWidget *button = NULL;
     gchar *msg;
@@ -197,13 +189,15 @@ balsa_mime_widget_new_unknown(BalsaMessage * bm,
 
     g_return_val_if_fail(mime_body, NULL);
     mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
+    priv = G_TYPE_INSTANCE_GET_PRIVATE(mw, BALSA_TYPE_MIME_WIDGET,
+                                       BalsaMimeWidgetPrivate);
 
-    mw->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_VBOX_SPACE);
-    g_object_set(G_OBJECT(mw->widget), "margin", BMW_CONTAINER_BORDER, NULL);
+    priv->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, BMW_VBOX_SPACE);
+    g_object_set(G_OBJECT(priv->widget), "margin", BMW_CONTAINER_BORDER, NULL);
 
     if (mime_body->filename) {
        msg = g_strdup_printf(_("File name: %s"), mime_body->filename);
-       gtk_box_pack_start(GTK_BOX(mw->widget), gtk_label_new(msg));
+       gtk_box_pack_start(GTK_BOX(priv->widget), gtk_label_new(msg));
        g_free(msg);
     }
 
@@ -257,7 +251,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(mw->widget), msg_label);
+    gtk_box_pack_start(GTK_BOX(priv->widget), msg_label);
 
     hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, BMW_HBOX_SPACE);
     gtk_box_set_homogeneous(GTK_BOX(hbox), TRUE);
@@ -267,7 +261,7 @@ balsa_mime_widget_new_unknown(BalsaMessage * bm,
         gtk_widget_set_hexpand(button, TRUE);
        gtk_box_pack_start(GTK_BOX(hbox), button);
     } else {
-       gtk_box_pack_start(GTK_BOX(mw->widget),
+       gtk_box_pack_start(GTK_BOX(priv->widget),
                           gtk_label_new(_("No open or view action "
                                           "defined for this content type")));
     }
@@ -280,7 +274,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(mw->widget), hbox);
+    gtk_box_pack_start(GTK_BOX(priv->widget), hbox);
 
     return mw;
 }
@@ -330,3 +324,71 @@ vadj_change_cb(GtkAdjustment *vadj, GtkWidget *widget)
     libbalsa_clear_source_id(&resize_idle_id);
     balsa_mime_widget_schedule_resize(widget);
 }
+
+/*
+ * Getters
+ */
+
+GtkWidget *
+balsa_mime_widget_get_widget(BalsaMimeWidget * mw)
+{
+    BalsaMimeWidgetPrivate *priv =
+        G_TYPE_INSTANCE_GET_PRIVATE(mw, BALSA_TYPE_MIME_WIDGET,
+                                    BalsaMimeWidgetPrivate);
+
+    return priv->widget;
+}
+
+GtkWidget *
+balsa_mime_widget_get_container(BalsaMimeWidget * mw)
+{
+    BalsaMimeWidgetPrivate *priv =
+        G_TYPE_INSTANCE_GET_PRIVATE(mw, BALSA_TYPE_MIME_WIDGET,
+                                    BalsaMimeWidgetPrivate);
+
+    return priv->container;
+}
+
+GtkWidget *
+balsa_mime_widget_get_header_widget(BalsaMimeWidget * mw)
+{
+    BalsaMimeWidgetPrivate *priv =
+        G_TYPE_INSTANCE_GET_PRIVATE(mw, BALSA_TYPE_MIME_WIDGET,
+                                    BalsaMimeWidgetPrivate);
+
+    return priv->header_widget;
+}
+
+/*
+ * Setters
+ */
+
+void
+balsa_mime_widget_set_widget(BalsaMimeWidget * mw, GtkWidget * widget)
+{
+    BalsaMimeWidgetPrivate *priv =
+        G_TYPE_INSTANCE_GET_PRIVATE(mw, BALSA_TYPE_MIME_WIDGET,
+                                    BalsaMimeWidgetPrivate);
+
+    priv->widget = widget;
+}
+
+void
+balsa_mime_widget_set_container(BalsaMimeWidget * mw, GtkWidget * widget)
+{
+    BalsaMimeWidgetPrivate *priv =
+        G_TYPE_INSTANCE_GET_PRIVATE(mw, BALSA_TYPE_MIME_WIDGET,
+                                    BalsaMimeWidgetPrivate);
+
+    priv->container = widget;
+}
+
+void
+balsa_mime_widget_set_header_widget(BalsaMimeWidget * mw, GtkWidget * widget)
+{
+    BalsaMimeWidgetPrivate *priv =
+        G_TYPE_INSTANCE_GET_PRIVATE(mw, BALSA_TYPE_MIME_WIDGET,
+                                    BalsaMimeWidgetPrivate);
+
+    priv->header_widget = widget;
+}
diff --git a/src/balsa-mime-widget.h b/src/balsa-mime-widget.h
index e08b151..afc9511 100644
--- a/src/balsa-mime-widget.h
+++ b/src/balsa-mime-widget.h
@@ -35,41 +35,42 @@ G_BEGIN_DECLS
 #define BMW_HEADER_MARGIN_LEFT       2
 #define BMW_HEADER_MARGIN_RIGHT     15
 
-
-#define BALSA_TYPE_MIME_WIDGET          (balsa_mime_widget_get_type ())
-#define BALSA_MIME_WIDGET(obj)          G_TYPE_CHECK_INSTANCE_CAST (obj, BALSA_TYPE_MIME_WIDGET, 
BalsaMimeWidget)
-#define BALSA_MIME_WIDGET_CLASS(klass)  G_TYPE_CHECK_CLASS_CAST (klass, BALSA_TYPE_MIME_WIDGET, 
BalsaMimeWidgetClass)
-#define BALSA_IS_MIME_WIDGET(obj)       G_TYPE_CHECK_INSTANCE_TYPE (obj, BALSA_TYPE_MIME_WIDGET)
-
-
-typedef struct _BalsaMimeWidgetClass BalsaMimeWidgetClass;
-
-
-struct _BalsaMimeWidget {
-    GObject parent;
-
-    /* display widget */
-    GtkWidget *widget;
-
-    /* container widget if more sub-parts can be added */
-    GtkWidget *container;
-
-    /* headers */
-    GtkWidget *header_widget;
-};
-
+/*
+ * GObject class definitions
+ */
 
 struct _BalsaMimeWidgetClass {
     GObjectClass parent;
 };
 
+#define BALSA_TYPE_MIME_WIDGET balsa_mime_widget_get_type()
+
+G_DECLARE_DERIVABLE_TYPE(BalsaMimeWidget, balsa_mime_widget, BALSA, MIME_WIDGET, GObject)
+
+/*
+ * Method definitions.
+ */
 
-GType balsa_mime_widget_get_type (void);
 BalsaMimeWidget *balsa_mime_widget_new(BalsaMessage * bm,
                                       LibBalsaMessageBody * mime_body,
                                       gpointer data);
 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);
+
+/*
+ * 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);
 
 G_END_DECLS
 



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