+/* THIS IS A HACK: we modify the size requisition and allocation system to negociate the
+ * size of the GtkHtml so that it gets the correct height, and reports it to this widget
+ * to propagate the new allocation. It should make it work when it's included in a scrolled
+ * window with a viewport */
+
+static void
+size_request (GtkWidget *widget,
+ GtkRequisition *req,
+ gpointer userdata)
+{
+ ModestMsgViewPrivate *priv = MODEST_MSG_VIEW_GET_PRIVATE (widget);
+ GtkRequisition req_headers;
+
+ g_message ("SIZE REQUEST START w %d h %d", req->width, req->height);
+
+ /* tries to allocate as much as possible of the current allocation for headers box */
+
+ req_headers.height = priv->full_height;
+ req_headers.width = req->width;
+ req->height = priv->full_height;
+
+ g_message ("SIZE REQUEST HEADER START w %d h %d", req_headers.width, req_headers.height);
+ gtk_widget_size_request (priv->headers_box, &req_headers);
+ g_message ("SIZE REQUEST HEADER END w %d h %d", req_headers.width, req_headers.height);
+ g_message ("SIZE REQUEST END w %d h %d", req->width, req->height);
+}
+
+static void
+size_allocate (GtkWidget *widget,
+ GtkAllocation *alloc,
+ gpointer userdata)
+{
+ ModestMsgViewPrivate *priv = MODEST_MSG_VIEW_GET_PRIVATE (widget);
+ GtkAllocation headers_alloc;
+ GtkAllocation html_alloc;
+ GtkAdjustment *hadj, *vadj;
+
+ g_message ("SIZE_ALLOCATE START w %d h %d", alloc->width, alloc->height);
+
+ priv->full_width = alloc->width;
+ priv->full_height = alloc->height;
+
+ hadj = gtk_viewport_get_hadjustment (GTK_VIEWPORT (widget));
+ vadj = gtk_viewport_get_vadjustment (GTK_VIEWPORT (widget));
+
+ /* allocates all the visible with for the header. The height is
+ taken from the last requisition of the widget, supposing it's
+ been calculated depending on this width */
+ headers_alloc.x = alloc->x;
+ headers_alloc.y = alloc->y;
+ headers_alloc.width = alloc->width;
+ headers_alloc.height = priv->headers_box->requisition.height;
+ if (priv->html_height != priv->gtkhtml->requisition.height)
+ gtk_widget_size_allocate (priv->headers_box, &headers_alloc);
+
+ /* allocates the gtk html space trying to negociate that it takes
+ * the available space, and as much height as it needs. To do this,
+ * it takes the internal adjustment upper value (see html_adjustment_changed)
+ */
+ html_alloc.x = alloc->x;
+ html_alloc.y = alloc->y + headers_alloc.height;
+ html_alloc.width = alloc->width;
+ html_alloc.height = MAX(alloc->height, priv->html_height);
+ gtk_widget_size_allocate (priv->gtkhtml, &html_alloc);
+
+ /* Corrects the allocation of the full widget to include the final
+ * gtkhtml height */
+ priv->full_height = headers_alloc.height + priv->html_height;
+ alloc->height = priv->full_height;
+
+ g_message ("SIZE_ALLOCATE END w %d h %d", alloc->width, alloc->height);
+
+}
+
+
+static void
+html_adjustment_changed (GtkAdjustment *adj,
+ ModestMsgView * view)
+{
+ ModestMsgViewPrivate *priv = MODEST_MSG_VIEW_GET_PRIVATE (view);
+
+ g_message ("ADJUSTMENT CHANGED START upper %f html_height %d", adj->upper, priv->html_height);
+
+ /* correct the html height calculation depending on the range exposed
+ * by the html vertical adjustment
+ */
+ if (((gint) adj->upper) != priv->gtkhtml->allocation.height) {
+ priv->html_height = (gint) adj->upper;
+ }
+ gtk_widget_queue_resize (GTK_WIDGET(view));
+}
+
+