static GObject* 
gcr_certificate_details_widget_constructor (GType type, guint n_props, GObjectConstructParam *props) 
{
	GObject *obj = G_OBJECT_CLASS (gcr_certificate_details_widget_parent_class)->constructor (type, n_props, props);
	GcrCertificateDetailsWidget *self = NULL;
	GtkTextTagTable *tags;
	GtkWidget *widget; 
	GtkWidget *scroll;
	
	g_return_val_if_fail (obj, NULL);
	
	self = GCR_CERTIFICATE_DETAILS_WIDGET (obj);
	
	tags = create_tag_table (self);
	self->pv->buffer = gtk_text_buffer_new (tags);
	g_object_unref (tags);
	
	widget = gtk_text_view_new_with_buffer (self->pv->buffer);
	self->pv->view = GTK_TEXT_VIEW (widget);
	gtk_text_view_set_editable (self->pv->view, FALSE);
	
	scroll = gtk_scrolled_window_new (NULL, NULL);
	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
	gtk_container_add (GTK_CONTAINER (scroll), widget);
	
	gtk_container_add (GTK_CONTAINER (self), scroll);
	gtk_widget_show_all (scroll);
	
	return obj;
}
static GObject*
_gcr_display_view_constructor (GType type, guint n_props, GObjectConstructParam *props)
{
	GObject *obj = G_OBJECT_CLASS (_gcr_display_view_parent_class)->constructor (type, n_props, props);
	GcrDisplayView *self = NULL;
	GtkTextView *view = NULL;
	GtkTextTagTable *tags;

	g_return_val_if_fail (obj, NULL);

	self = GCR_DISPLAY_VIEW (obj);
	view = GTK_TEXT_VIEW (obj);

	tags = create_tag_table (self);
	self->pv->buffer = gtk_text_buffer_new (tags);
	g_object_unref (tags);

	gtk_text_view_set_buffer (view, self->pv->buffer);
	gtk_text_view_set_editable (view, FALSE);
	gtk_text_view_set_left_margin (view, NORMAL_MARGIN);
	gtk_text_view_set_right_margin (view, NORMAL_MARGIN);
	gtk_text_view_set_cursor_visible (view, FALSE);

	return obj;
}
void
create_indirect_tag_table()
{
	FILE *id = 0;
	int initial;
	for (unsigned i = 1; i <= IndirectEntries; i++)
	{
		id = openinfo(indirect[i].filename, 1);
		initial = TagTableEntries + 1;
		if (!id)
		{
			/* display error message to make the user aware of
			 * the broken info page
			 */
			char msg[1024];
			snprintf(msg, 1024, "%s '%s' (%s)",
				_("Can't open file"), indirect[i].filename,
				_("press a key to continue") );
			attrset(bottomline);
			mvhline(maxy - 1, 0, ' ', maxx);
			mvaddstr(maxy - 1, 0, msg);
			move(0, 0);
			attrset(normal);
			getch();

			continue;
		}
		create_tag_table(id);
		FirstNodeOffset = tag_table[1].offset;
		strcpy(FirstNodeName, tag_table[1].nodename);
		fclose(id);
		for (unsigned j = initial; j <= TagTableEntries; j++)
		{
			tag_table[j].offset +=(indirect[i].offset - FirstNodeOffset);
		}
	}
	FirstNodeOffset = tag_table[1].offset;
	strcpy(FirstNodeName, tag_table[1].nodename);
	qsort(&tag_table[1], TagTableEntries, sizeof(TagTable), qsort_cmp);
}