static void
anjuta_cell_renderer_captioned_image_get_preferred_height (GtkCellRenderer *gtk_cell,
                                                           GtkWidget *widget,
                                                           gint *minimum,
                                                           gint *natural)
{
	gint text_min;
	gint text_nat;
	gint image_min;
	gint image_nat;
    
	AnjutaCellRendererCaptionedImage *cell = ANJUTA_CELL_RENDERER_CAPTIONED_IMAGE (gtk_cell);
	
	gtk_cell_renderer_get_preferred_height (cell->image, widget, &image_min, &image_nat);
	
	gtk_cell_renderer_get_preferred_height (cell->caption, widget,
	                                        &text_min, &text_nat);


	if (minimum) {
		*minimum = image_min + text_min + PAD;
	}
	
	if (natural) {
		*natural = image_nat + text_nat + PAD;
	}
}
static void
anjuta_cell_renderer_captioned_image_render (GtkCellRenderer *gtk_cell,
					     cairo_t *cr,
					     GtkWidget *widget,
					     const GdkRectangle *background_area,
					     const GdkRectangle *cell_area,
					     GtkCellRendererState flags)

{
	AnjutaCellRendererCaptionedImage *cell = ANJUTA_CELL_RENDERER_CAPTIONED_IMAGE (gtk_cell);
	GdkRectangle text_area;
	GdkRectangle pixbuf_area;
	gint width, height;
	
	gtk_cell_renderer_get_preferred_width (cell->image, widget, NULL, &width);
	gtk_cell_renderer_get_preferred_height (cell->image, widget, NULL, &height);
	
	pixbuf_area.y = cell_area->y;
	pixbuf_area.x = cell_area->x;
	pixbuf_area.height = height;
	pixbuf_area.width = cell_area->width;
    
	gtk_cell_renderer_get_preferred_width (cell->caption, widget, NULL, &width);
	gtk_cell_renderer_get_preferred_height (cell->caption, widget, NULL, &height);

	text_area.x = cell_area->x + (cell_area->width - width) / 2;
	text_area.y = cell_area->y + (pixbuf_area.height + PAD);
	text_area.height = height;
	text_area.width = width;

	gtk_cell_renderer_render (cell->image, cr, widget, 
				  background_area, &pixbuf_area, flags);

	gtk_cell_renderer_render (cell->caption, cr, widget,
				  background_area, &text_area, flags);
}
static void
acwin_calculate_window_size(Tacwin * acw, GList * items, GList * items2, const gchar *closetag, gint *numitems)
{
	GList *tmplist;
	gboolean runtwo = FALSE;
	gchar *longest = NULL, *tmp;
	guint longestlen = 1;
	*numitems = 0;
	DBG_AUTOCOMP("acwin_calculate_window_size, items=%p, items2=%p, closetag=%s\n", items, items2, closetag);
	if (closetag) {
		longest = g_markup_escape_text(closetag, -1);
		longestlen = strlen(longest);
	}
	tmplist = g_list_first(items);
	while (!runtwo || tmplist) {
		guint len;
		if (!tmplist) {
			tmplist = g_list_first(items2);
			runtwo = TRUE;
			if (!tmplist)
				break;
		}
		g_assert(tmplist != NULL);
		g_assert(tmplist->data != NULL);
/*		DBG_AUTOCOMP("acwin_calculate_window_size, tmplist=%p", tmplist);
		DBG_AUTOCOMP(", tmplist->data=%p",tmplist->data);
		DBG_AUTOCOMP("=%s\n", (gchar *)tmplist->data);*/
		tmp = g_markup_escape_text(tmplist->data, -1);
		len = strlen(tmp);
		if (len > longestlen) {
			longest = tmp;
			longestlen = len;
		} else {
			g_free(tmp);
		}
		(*numitems)++;
		tmplist = g_list_next(tmplist);
	}
	if (longest) {
		gint len, rowh,min_h,nat_h;
		PangoLayout *panlay = gtk_widget_create_pango_layout(GTK_WIDGET(acw->tree), NULL);
		pango_layout_set_markup(panlay, longest, -1);
		pango_layout_get_pixel_size(panlay, &len, &rowh);
		DBG_AUTOCOMP("longest=%s which has len=%d and rowheight=%d\n", longest, len, rowh);
		/*  rowh+9 has been found by trial and error on a particular gtk theme and resolution, so
		there is quite a chance that this will not be optimal for other themes or for example
		on a high resolution display. I've tried to request this size but I cannot find it.
		I've now changed it to nat_h+5, hopefully nat_h is already a more dynamic value */
		/*gint spacing,height;
		GtkRequisition min_size, nat_size;
		gtk_cell_renderer_get_preferred_height(acw->cell,GTK_WIDGET(acw->tree),&min_h,&nat_h);
		spacing= gtk_tree_view_column_get_spacing(acw->column);
		gtk_tree_view_column_cell_get_size(acw->column,NULL,NULL,NULL,NULL,&height);
		gtk_widget_get_preferred_size(GTK_WIDGET(acw->tree),&min_size,&nat_size);
		g_print("row=%d,rowh+9=%d,min_h=%d,nat_h=%d,spacing=%d,height=%d,nat_size.h=%d\n",rowh,rowh+9,min_h,nat_h,spacing,height,min_size.height);*/
#if GTK_CHECK_VERSION(3,0,0)
		gtk_cell_renderer_get_preferred_height(acw->cell,GTK_WIDGET(acw->tree),&min_h,&nat_h);
#else
		nat_h=rowh+2;
#endif
		acw->h = MIN((*numitems) * (nat_h+5), 350); /*MIN(MAX((*numitems + 1) * rowh + 8, 150), 350);*/
		acw->w = acw->listwidth = MIN(len + 20, 350);
		DBG_AUTOCOMP("acwin_calculate_window_size, numitems=%d, rowh=%d, new height=%d, new width=%d\n", *numitems, rowh, acw->h,
				acw->listwidth);
		gtk_widget_set_size_request(GTK_WIDGET(acw->scroll), acw->listwidth, acw->h);	/* ac_window */
		g_free(longest);
		g_object_unref(G_OBJECT(panlay));
	}
}