Blame ui/gcr-display-scrolled.c

Packit b00eeb
/*
Packit b00eeb
 * Copyright (C) 2011 Collabora Ltd.
Packit b00eeb
 *
Packit b00eeb
 * This program is free software; you can redistribute it and/or modify
Packit b00eeb
 * it under the terms of the GNU Lesser General Public License as
Packit b00eeb
 * published by the Free Software Foundation; either version 2.1 of
Packit b00eeb
 * the License, or (at your option) any later version.
Packit b00eeb
 *
Packit b00eeb
 * This program is distributed in the hope that it will be useful, but
Packit b00eeb
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit b00eeb
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit b00eeb
 * Lesser General Public License for more details.
Packit b00eeb
 *
Packit b00eeb
 * You should have received a copy of the GNU Lesser General Public
Packit b00eeb
 * License along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit b00eeb
 *
Packit b00eeb
 * Author: Stef Walter <stefw@collabora.co.uk>
Packit b00eeb
 */
Packit b00eeb
Packit b00eeb
Packit b00eeb
#include "config.h"
Packit b00eeb
Packit b00eeb
#include "gcr-display-scrolled.h"
Packit b00eeb
#include "gcr-viewer.h"
Packit b00eeb
Packit b00eeb
static void _gcr_display_scrolled_viewer_iface (GcrViewerIface *iface);
Packit b00eeb
Packit b00eeb
G_DEFINE_TYPE_WITH_CODE (GcrDisplayScrolled, _gcr_display_scrolled, GTK_TYPE_SCROLLED_WINDOW,
Packit b00eeb
                         G_IMPLEMENT_INTERFACE (GCR_TYPE_VIEWER, _gcr_display_scrolled_viewer_iface));
Packit b00eeb
Packit b00eeb
struct _GcrDisplayScrolledPrivate {
Packit b00eeb
	GcrViewer *internal;
Packit b00eeb
};
Packit b00eeb
Packit b00eeb
/* -----------------------------------------------------------------------------
Packit b00eeb
 * INTERNAL
Packit b00eeb
 */
Packit b00eeb
Packit b00eeb
/* -----------------------------------------------------------------------------
Packit b00eeb
 * OBJECT
Packit b00eeb
 */
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
_gcr_display_scrolled_init (GcrDisplayScrolled *self)
Packit b00eeb
{
Packit b00eeb
	self->pv = (G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_DISPLAY_SCROLLED, GcrDisplayScrolledPrivate));
Packit b00eeb
	self->pv->internal = gcr_viewer_new ();
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
_gcr_display_scrolled_constructed (GObject *object)
Packit b00eeb
{
Packit b00eeb
	GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (object);
Packit b00eeb
Packit b00eeb
	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (self), GTK_SHADOW_ETCHED_IN);
Packit b00eeb
	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (self), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
Packit b00eeb
	gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->pv->internal));
Packit b00eeb
	gtk_widget_show (GTK_WIDGET (self->pv->internal));
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
_gcr_display_scrolled_get_preferred_height (GtkWidget *widget, gint *minimal_height,
Packit b00eeb
                                            gint *natural_height)
Packit b00eeb
{
Packit b00eeb
	GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (widget);
Packit b00eeb
	gint minimal, natural;
Packit b00eeb
Packit b00eeb
	GTK_WIDGET_CLASS (_gcr_display_scrolled_parent_class)->get_preferred_height (widget,
Packit b00eeb
	                                                                             minimal_height,
Packit b00eeb
	                                                                             natural_height);
Packit b00eeb
Packit b00eeb
	minimal = 0;
Packit b00eeb
	natural = 0;
Packit b00eeb
Packit b00eeb
	gtk_widget_get_preferred_height (GTK_WIDGET (self->pv->internal),
Packit b00eeb
	                                 &minimal, &natural);
Packit b00eeb
Packit b00eeb
	/* This is messy, we add a extra for the etching height */
Packit b00eeb
	*minimal_height = MAX (minimal + 3, *minimal_height);
Packit b00eeb
	*natural_height = MAX (natural + 3, *natural_height);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
_gcr_display_scrolled_get_preferred_width (GtkWidget *widget, gint *minimal_width,
Packit b00eeb
                                           gint *natural_width)
Packit b00eeb
{
Packit b00eeb
	GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (widget);
Packit b00eeb
	gint minimal, natural;
Packit b00eeb
Packit b00eeb
	GTK_WIDGET_CLASS (_gcr_display_scrolled_parent_class)->get_preferred_width (widget,
Packit b00eeb
	                                                                            minimal_width,
Packit b00eeb
	                                                                            natural_width);
Packit b00eeb
Packit b00eeb
	minimal = 0;
Packit b00eeb
	natural = 0;
Packit b00eeb
Packit b00eeb
	gtk_widget_get_preferred_width (GTK_WIDGET (self->pv->internal),
Packit b00eeb
	                                &minimal, &natural);
Packit b00eeb
Packit b00eeb
	/* This is messy, we add a extra for the scrollbar width, etching */
Packit b00eeb
	*minimal_width = MAX (minimal + 32, *minimal_width);
Packit b00eeb
	*natural_width = MAX (natural + 32, *natural_width);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
_gcr_display_scrolled_class_init (GcrDisplayScrolledClass *klass)
Packit b00eeb
{
Packit b00eeb
	GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit b00eeb
	GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
Packit b00eeb
Packit b00eeb
	widget_class->get_preferred_height = _gcr_display_scrolled_get_preferred_height;
Packit b00eeb
	widget_class->get_preferred_width = _gcr_display_scrolled_get_preferred_width;
Packit b00eeb
Packit b00eeb
	object_class->constructed = _gcr_display_scrolled_constructed;
Packit b00eeb
Packit b00eeb
	g_type_class_add_private (klass, sizeof (GcrDisplayScrolledPrivate));
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
_gcr_display_scrolled_real_add_renderer (GcrViewer *viewer, GcrRenderer *renderer)
Packit b00eeb
{
Packit b00eeb
	GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer);
Packit b00eeb
	gcr_viewer_add_renderer (self->pv->internal, renderer);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
_gcr_display_scrolled_real_insert_renderer (GcrViewer *viewer,
Packit b00eeb
                                            GcrRenderer *renderer,
Packit b00eeb
                                            GcrRenderer *before)
Packit b00eeb
{
Packit b00eeb
	GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer);
Packit b00eeb
	gcr_viewer_insert_renderer (self->pv->internal, renderer, before);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
_gcr_display_scrolled_real_remove_renderer (GcrViewer *viewer, GcrRenderer *renderer)
Packit b00eeb
{
Packit b00eeb
	GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer);
Packit b00eeb
	gcr_viewer_remove_renderer (self->pv->internal, renderer);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static guint
Packit b00eeb
_gcr_display_scrolled_real_count_renderers (GcrViewer *viewer)
Packit b00eeb
{
Packit b00eeb
	GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer);
Packit b00eeb
	return gcr_viewer_count_renderers (self->pv->internal);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static GcrRenderer*
Packit b00eeb
_gcr_display_scrolled_real_get_renderer (GcrViewer *viewer, guint index_)
Packit b00eeb
{
Packit b00eeb
	GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer);
Packit b00eeb
	return gcr_viewer_get_renderer (self->pv->internal, index_);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
_gcr_display_scrolled_viewer_iface (GcrViewerIface *iface)
Packit b00eeb
{
Packit b00eeb
	iface->add_renderer = _gcr_display_scrolled_real_add_renderer;
Packit b00eeb
	iface->insert_renderer = _gcr_display_scrolled_real_insert_renderer;
Packit b00eeb
	iface->remove_renderer = _gcr_display_scrolled_real_remove_renderer;
Packit b00eeb
	iface->count_renderers = _gcr_display_scrolled_real_count_renderers;
Packit b00eeb
	iface->get_renderer = _gcr_display_scrolled_real_get_renderer;
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
/* -----------------------------------------------------------------------------
Packit b00eeb
 * PUBLIC
Packit b00eeb
 */
Packit b00eeb
Packit b00eeb
GcrDisplayScrolled*
Packit b00eeb
_gcr_display_scrolled_new (void)
Packit b00eeb
{
Packit b00eeb
	return g_object_new (GCR_TYPE_DISPLAY_SCROLLED, NULL);
Packit b00eeb
}