aboutsummaryrefslogtreecommitdiffstats
path: root/e-util/e-cell-pixbuf.c
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2012-12-10 21:09:59 +0800
committerMatthew Barnes <mbarnes@redhat.com>2012-12-13 03:33:43 +0800
commitd09d8de870b6697c8a8b262e7e077b871a69b315 (patch)
tree3b718882e7a0bb0a996daf2967a033d91714c9b5 /e-util/e-cell-pixbuf.c
parentb61331ed03ac1c7a9b8614e25510040b9c60ae02 (diff)
downloadgsoc2013-evolution-d09d8de870b6697c8a8b262e7e077b871a69b315.tar.gz
gsoc2013-evolution-d09d8de870b6697c8a8b262e7e077b871a69b315.tar.zst
gsoc2013-evolution-d09d8de870b6697c8a8b262e7e077b871a69b315.zip
Consolidate base utility libraries into libeutil.
Evolution consists of entirely too many small utility libraries, which increases linking and loading time, places a burden on higher layers of the application (e.g. modules) which has to remember to link to all the small in-tree utility libraries, and makes it difficult to generate API documentation for these utility libraries in one Gtk-Doc module. Merge the following utility libraries under the umbrella of libeutil, and enforce a single-include policy on libeutil so we can reorganize the files as desired without disrupting its pseudo-public API. libemail-utils/libemail-utils.la libevolution-utils/libevolution-utils.la filter/libfilter.la widgets/e-timezone-dialog/libetimezonedialog.la widgets/menus/libmenus.la widgets/misc/libemiscwidgets.la widgets/table/libetable.la widgets/text/libetext.la This also merges libedataserverui from the Evolution-Data-Server module, since Evolution is its only consumer nowadays, and I'd like to make some improvements to those APIs without concern for backward-compatibility. And finally, start a Gtk-Doc module for libeutil. It's going to be a project just getting all the symbols _listed_ much less _documented_. But the skeletal structure is in place and I'm off to a good start.
Diffstat (limited to 'e-util/e-cell-pixbuf.c')
-rw-r--r--e-util/e-cell-pixbuf.c389
1 files changed, 389 insertions, 0 deletions
diff --git a/e-util/e-cell-pixbuf.c b/e-util/e-cell-pixbuf.c
new file mode 100644
index 0000000000..41b030ec5a
--- /dev/null
+++ b/e-util/e-cell-pixbuf.c
@@ -0,0 +1,389 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ *
+ * Authors:
+ * Vladimir Vukicevic <vladimir@ximian.com>
+ *
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+
+#include <libgnomecanvas/libgnomecanvas.h>
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include "e-cell-pixbuf.h"
+
+G_DEFINE_TYPE (ECellPixbuf, e_cell_pixbuf, E_TYPE_CELL)
+
+typedef struct _ECellPixbufView ECellPixbufView;
+
+struct _ECellPixbufView {
+ ECellView cell_view;
+ GnomeCanvas *canvas;
+};
+
+/* Object argument IDs */
+enum {
+ PROP_0,
+
+ PROP_SELECTED_COLUMN,
+ PROP_FOCUSED_COLUMN,
+ PROP_UNSELECTED_COLUMN
+};
+
+/*
+ * ECellPixbuf functions
+ */
+
+ECell *
+e_cell_pixbuf_new (void)
+{
+ return g_object_new (E_TYPE_CELL_PIXBUF, NULL);
+}
+
+/*
+ * ECell methods
+ */
+
+static ECellView *
+pixbuf_new_view (ECell *ecell,
+ ETableModel *table_model,
+ gpointer e_table_item_view)
+{
+ ECellPixbufView *pixbuf_view = g_new0 (ECellPixbufView, 1);
+ ETableItem *eti = E_TABLE_ITEM (e_table_item_view);
+ GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas;
+
+ pixbuf_view->cell_view.ecell = ecell;
+ pixbuf_view->cell_view.e_table_model = table_model;
+ pixbuf_view->cell_view.e_table_item_view = e_table_item_view;
+ pixbuf_view->cell_view.kill_view_cb = NULL;
+ pixbuf_view->cell_view.kill_view_cb_data = NULL;
+
+ pixbuf_view->canvas = canvas;
+
+ return (ECellView *) pixbuf_view;
+}
+
+static void
+pixbuf_kill_view (ECellView *ecell_view)
+{
+ ECellPixbufView *pixbuf_view = (ECellPixbufView *) ecell_view;
+
+ if (pixbuf_view->cell_view.kill_view_cb)
+ pixbuf_view->cell_view.kill_view_cb (
+ ecell_view, pixbuf_view->cell_view.kill_view_cb_data);
+
+ if (pixbuf_view->cell_view.kill_view_cb_data)
+ g_list_free (pixbuf_view->cell_view.kill_view_cb_data);
+
+ g_free (pixbuf_view);
+}
+
+static void
+pixbuf_draw (ECellView *ecell_view,
+ cairo_t *cr,
+ gint model_col,
+ gint view_col,
+ gint row,
+ ECellFlags flags,
+ gint x1,
+ gint y1,
+ gint x2,
+ gint y2)
+{
+ GdkPixbuf *cell_pixbuf;
+ gint real_x, real_y;
+ gint pix_w, pix_h;
+
+ cell_pixbuf = e_table_model_value_at (ecell_view->e_table_model,
+ 1, row);
+
+ /* we can't make sure we really got a pixbuf since, well, it's a Gdk thing */
+
+ if (x2 - x1 == 0)
+ return;
+
+ if (!cell_pixbuf)
+ return;
+
+ pix_w = gdk_pixbuf_get_width (cell_pixbuf);
+ pix_h = gdk_pixbuf_get_height (cell_pixbuf);
+
+ /* We center the pixbuf within our allocated space */
+ if (x2 - x1 > pix_w) {
+ gint diff = (x2 - x1) - pix_w;
+ real_x = x1 + diff / 2;
+ } else {
+ real_x = x1;
+ }
+
+ if (y2 - y1 > pix_h) {
+ gint diff = (y2 - y1) - pix_h;
+ real_y = y1 + diff / 2;
+ } else {
+ real_y = y1;
+ }
+
+ cairo_save (cr);
+ gdk_cairo_set_source_pixbuf (cr, cell_pixbuf, real_x, real_y);
+ cairo_paint_with_alpha (cr, 1);
+ cairo_restore (cr);
+}
+
+static gint
+pixbuf_event (ECellView *ecell_view,
+ GdkEvent *event,
+ gint model_col,
+ gint view_col,
+ gint row,
+ ECellFlags flags,
+ ECellActions *actions)
+{
+ /* noop */
+
+ return FALSE;
+}
+
+static gint
+pixbuf_height (ECellView *ecell_view,
+ gint model_col,
+ gint view_col,
+ gint row)
+{
+ GdkPixbuf *pixbuf;
+ if (row == -1) {
+ if (e_table_model_row_count (ecell_view->e_table_model) > 0) {
+ row = 0;
+ } else {
+ return 6;
+ }
+ }
+
+ pixbuf = (GdkPixbuf *) e_table_model_value_at (ecell_view->e_table_model, 1, row);
+ if (!pixbuf)
+ return 0;
+
+ /* We give ourselves 3 pixels of padding on either side */
+ return gdk_pixbuf_get_height (pixbuf) + 6;
+}
+
+/*
+ * ECell::print method
+ */
+static void
+pixbuf_print (ECellView *ecell_view,
+ GtkPrintContext *context,
+ gint model_col,
+ gint view_col,
+ gint row,
+ gdouble width,
+ gdouble height)
+{
+ GdkPixbuf *pixbuf;
+ gint scale;
+ cairo_t *cr = gtk_print_context_get_cairo_context (context);
+
+ pixbuf = (GdkPixbuf *) e_table_model_value_at (ecell_view->e_table_model, 1, row);
+ if (pixbuf == NULL)
+ return;
+
+ scale = gdk_pixbuf_get_height (pixbuf);
+ cairo_save (cr);
+ cairo_translate (cr, 0, (gdouble)(height - scale) / (gdouble) 2);
+ gdk_cairo_set_source_pixbuf (cr, pixbuf, (gdouble) scale, (gdouble) scale);
+ cairo_paint (cr);
+ cairo_restore (cr);
+}
+
+static gdouble
+pixbuf_print_height (ECellView *ecell_view,
+ GtkPrintContext *context,
+ gint model_col,
+ gint view_col,
+ gint row,
+ gdouble width)
+{
+ GdkPixbuf *pixbuf;
+
+ if (row == -1) {
+ if (e_table_model_row_count (ecell_view->e_table_model) > 0) {
+ row = 0;
+ } else {
+ return 6;
+ }
+ }
+
+ pixbuf = (GdkPixbuf *) e_table_model_value_at (ecell_view->e_table_model, 1, row);
+ if (!pixbuf)
+ return 0;
+
+ /* We give ourselves 3 pixels of padding on either side */
+ return gdk_pixbuf_get_height (pixbuf);
+}
+
+static gint
+pixbuf_max_width (ECellView *ecell_view,
+ gint model_col,
+ gint view_col)
+{
+ gint pw;
+ gint num_rows, i;
+ gint max_width = -1;
+
+ if (model_col == 0) {
+ num_rows = e_table_model_row_count (ecell_view->e_table_model);
+
+ for (i = 0; i <= num_rows; i++) {
+ GdkPixbuf *pixbuf = (GdkPixbuf *) e_table_model_value_at
+ (ecell_view->e_table_model,
+ 1,
+ i);
+ if (!pixbuf)
+ continue;
+ pw = gdk_pixbuf_get_width (pixbuf);
+ if (max_width < pw)
+ max_width = pw;
+ }
+ } else {
+ return -1;
+ }
+
+ return max_width;
+}
+
+static void
+pixbuf_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ ECellPixbuf *pixbuf;
+
+ pixbuf = E_CELL_PIXBUF (object);
+
+ switch (property_id) {
+ case PROP_SELECTED_COLUMN:
+ pixbuf->selected_column = g_value_get_int (value);
+ break;
+
+ case PROP_FOCUSED_COLUMN:
+ pixbuf->focused_column = g_value_get_int (value);
+ break;
+
+ case PROP_UNSELECTED_COLUMN:
+ pixbuf->unselected_column = g_value_get_int (value);
+ break;
+
+ default:
+ return;
+ }
+}
+
+/* Get_arg handler for the pixbuf item */
+static void
+pixbuf_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ ECellPixbuf *pixbuf;
+
+ pixbuf = E_CELL_PIXBUF (object);
+
+ switch (property_id) {
+ case PROP_SELECTED_COLUMN:
+ g_value_set_int (value, pixbuf->selected_column);
+ break;
+
+ case PROP_FOCUSED_COLUMN:
+ g_value_set_int (value, pixbuf->focused_column);
+ break;
+
+ case PROP_UNSELECTED_COLUMN:
+ g_value_set_int (value, pixbuf->unselected_column);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+e_cell_pixbuf_init (ECellPixbuf *ecp)
+{
+ ecp->selected_column = -1;
+ ecp->focused_column = -1;
+ ecp->unselected_column = -1;
+}
+
+static void
+e_cell_pixbuf_class_init (ECellPixbufClass *class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
+ ECellClass *ecc = E_CELL_CLASS (class);
+
+ object_class->set_property = pixbuf_set_property;
+ object_class->get_property = pixbuf_get_property;
+
+ ecc->new_view = pixbuf_new_view;
+ ecc->kill_view = pixbuf_kill_view;
+ ecc->draw = pixbuf_draw;
+ ecc->event = pixbuf_event;
+ ecc->height = pixbuf_height;
+ ecc->print = pixbuf_print;
+ ecc->print_height = pixbuf_print_height;
+ ecc->max_width = pixbuf_max_width;
+
+ g_object_class_install_property (
+ object_class,
+ PROP_SELECTED_COLUMN,
+ g_param_spec_int (
+ "selected_column",
+ "Selected Column",
+ NULL,
+ 0, G_MAXINT, 0,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_FOCUSED_COLUMN,
+ g_param_spec_int (
+ "focused_column",
+ "Focused Column",
+ NULL,
+ 0, G_MAXINT, 0,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_UNSELECTED_COLUMN,
+ g_param_spec_int (
+ "unselected_column",
+ "Unselected Column",
+ NULL,
+ 0, G_MAXINT, 0,
+ G_PARAM_READWRITE));
+}
+