aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/e-table/e-cell-text.c
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/e-table/e-cell-text.c')
-rw-r--r--widgets/e-table/e-cell-text.c139
1 files changed, 127 insertions, 12 deletions
diff --git a/widgets/e-table/e-cell-text.c b/widgets/e-table/e-cell-text.c
index c30e42cfd3..1b3f524a2e 100644
--- a/widgets/e-table/e-cell-text.c
+++ b/widgets/e-table/e-cell-text.c
@@ -7,42 +7,157 @@
* (C) 1999 Helix Code, Inc
*/
#include <config.h>
+#include <gtk/gtkenums.h>
#include "e-cell-text.h"
#include "e-util.h"
-#define PARENT_TYPE gtk_object_get_type()
+#define PARENT_TYPE e_cell_get_type()
+
+typedef struct {
+ ECellView cell_view;
+ GdkGC *gc;
+ GdkFont *font;
+ GnomeCanvas *canvas;
+} ECellTextView;
+
+static ECellClass *parent_class;
+
+static ECellView *
+ect_realize (ECell *ecell, GnomeCanvas *canvas)
+{
+ ECellText *ect = E_CELL_TEXT (ecell);
+ ECellTextView *ectv = g_new (ECellTextView, 1);
+
+ ectv->cell_view.ecell = ecell;
+ ectv->gc = gdk_gc_new (GTK_WIDGET (canvas)->window);
+ ectv->font = gdk_fontset_load (ect->font_name ? ect->font_name : "fixed");
+ ectv->canvas = canvas;
+
+ return (ECellView *)ectv;
+}
static void
-ec_realize (ECell *e_cell, GnomeCanvas *canvas)
+ect_unrealize (ECellView *ecv)
{
+ ECellTextView *ectv = (ECellTextView *) ecv;
+
+ gdk_gc_unref (ectv->gc);
+ ectv->gc = NULL;
+
+ gdk_font_unref (ectv->font);
+ ectv->font = NULL;
+
+ g_free (ectv);
}
static void
-ec_unrealize (ECell *e_cell)
+ect_draw (ECellView *ecell_view, GdkDrawable *drawable, int col, int row, int x1, int y1, int x2, int y2)
{
+ ECellText *ect = E_CELL_TEXT (ecell_view->ecell);
+ GdkRectangle rect;
+ const char *str = e_table_model_value_at (ecell_view->ecell->table_model, col, row);
+ int selected = e_table_model_get_selected_row (ecell_view->ecell->table_model) == row;
+ int xoff, w;
+
+ rect.x = x1;
+ rect.y = y1;
+ rect.width = x2 - x1;
+ rect.height = y2 - y1;
+
+ gdk_gc_set_clip_rectangle (ect->gc, &rect);
+
+ switch (ect->justify){
+ case GTK_JUSTIFY_LEFT:
+ xoff = 1;
+ break;
+
+ case GTK_JUSTIFY_RIGHT:
+ w = 1 + gdk_text_width (ect->font, str, strlen (str));
+ xoff = (x2 - x1) - w;
+ break;
+
+ case GTK_JUSTIFY_CENTER:
+ xoff = ((x2 - x1) - gdk_text_width (ect->font, str, strlen (str))) / 2;
+ break;
+ default:
+ g_warning ("Can not handle GTK_JUSTIFY_FILL");
+ break;
+ }
+
+ /* Draw now */
+ {
+ GtkWidget *w = GTK_WIDGET (ect->canvas);
+ GdkColor *background;
+ int idx;
+
+ if (selected)
+ idx = GTK_STATE_SELECTED;
+ else
+ idx = GTK_STATE_NORMAL;
+
+ gdk_gc_set_foreground (ect->gc, &w->style->bg [idx]);
+ gdk_draw_rectangle (drawable, ect->gc, TRUE, rect.x, rect.y, rect.width, rect.height);
+ gdk_gc_set_foreground (ect->gc, &w->style->fg [idx]);
+ gdk_draw_string (drawable, ect->font, ect->gc, x1 + xoff, y2 + ect->font->descent, str);
+ }
}
static void
-ec_draw (ECell *ecell, int x1, int y1, int x2, int y2)
+e_cell_text_start_editing (ECellText *ect, int col, int row)
{
+ printf ("Starting to edit %d %d\n", col, row);
}
static gint
-ec_event (ECell *ecell, GdkEvent *event)
+ect_event (ECellView *ecell_view, GdkEvent *event, int col, int row)
{
+ ECell *ecell = ecell_view->ecell;
+ ECellText *ect = E_CELL_TEXT (ecell);
+
+ switch (event->type){
+ case GDK_BUTTON_PRESS:
+ if (e_table_model_get_selected_row (ecell->table_model) == row)
+ e_cell_text_start_editing (ect, col, row);
+ else
+ e_table_model_select_row (ecell->table_model, row);
+ return TRUE;
+ }
}
static void
-e_cell_class_init (GtkObjectClass *object_class)
+ect_destroy (GtkObject *object)
{
- ECellClass *ecc = (ECellClass *) object_class;
+ ECellText *ect = E_CELL_TEXT (object);
+
+ g_free (ect->font_name);
- ecc->realize = ec_realize;
- ecc->unrealize = ec_unrealize;
- ecc->draw = ec_draw;
- ecc->event = ec_event;
+ GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
-E_MAKE_TYPE(e_cell, "ECell", ECell, e_cell_class_init, NULL, PARENT_TYPE);
+static void
+e_cell_text_class_init (GtkObjectClass *object_class)
+{
+ ECellClass *ecc = (ECellClass *) object_class;
+ object_class->destroy = ect_destroy;
+ ecc->realize = ect_realize;
+ ecc->unrealize = ect_unrealize;
+ ecc->draw = ect_draw;
+ ecc->event = ect_event;
+
+ parent_class = gtk_type_class (PARENT_TYPE);
+}
+
+E_MAKE_TYPE(e_cell_text, "ECellText", ECellText, e_cell_text_class_init, NULL, PARENT_TYPE);
+
+ECell *
+e_cell_text_new (const char *fontname, GtkJustification justify)
+{
+ ECellText *ect = gtk_type_new (e_cell_text_get_type ());
+
+ ect->font_name = g_strdup (fontname);
+ ect->justify = justify;
+
+ return (ECell *) ect;
+}