Added $(GNOME_PRINT_LIBS) to all of the LDADDs.

2000-06-10  Christopher James Lahey  <clahey@helixcode.com>

	* Makefile.am: Added $(GNOME_PRINT_LIBS) to all of the LDADDs.

	* e-cell-text.c: Added printing of text cells.

	* e-cell.c, e-cell.h: Added print and print_height methods.

	* e-table-field-chooser.glade: Added a minimum size.

	* e-table-group-container.c: Fixed a rectangle sizing bug.

	* e-table-group-leaf.c: Implemented get_printable.

	* e-table-group.c, e-table-group.h: Added a get_printable method
	to return an EPrintable.

	* e-table-item.c, e-table-item.h: Added a get_printable function
	to return an EPrintable.

	* e-table.c, e-table.h: Added a get_printable function to return
	an EPrintable.

svn path=/trunk/; revision=3511
This commit is contained in:
Christopher James Lahey
2000-06-10 21:16:45 +00:00
committed by Chris Lahey
parent 5dc1015e96
commit c57de49bb5
26 changed files with 874 additions and 125 deletions
+23
View File
@@ -1,3 +1,26 @@
2000-06-10 Christopher James Lahey <clahey@helixcode.com>
* Makefile.am: Added $(GNOME_PRINT_LIBS) to all of the LDADDs.
* e-cell-text.c: Added printing of text cells.
* e-cell.c, e-cell.h: Added print and print_height methods.
* e-table-field-chooser.glade: Added a minimum size.
* e-table-group-container.c: Fixed a rectangle sizing bug.
* e-table-group-leaf.c: Implemented get_printable.
* e-table-group.c, e-table-group.h: Added a get_printable method
to return an EPrintable.
* e-table-item.c, e-table-item.h: Added a get_printable function
to return an EPrintable.
* e-table.c, e-table.h: Added a get_printable function to return
an EPrintable.
2000-06-08 Chris Toshok <toshok@helixcode.com>
* e-tree-gnode.c, e-tree-gnode.h: New files. A tree model using a
+11 -5
View File
@@ -12,6 +12,7 @@ glade_headers = \
INCLUDES = \
$(EXTRA_GNOME_CFLAGS) \
$(GNOME_PRINT_CFLAGS) \
$(GNOME_INCLUDEDIR) \
-DETABLE_GLADEDIR=\"$(gladedir)\" \
-I$(top_srcdir)/widgets/e-text \
@@ -94,7 +95,8 @@ table_test_LDADD = \
libetable.a \
$(EXTRA_GNOME_LIBS) \
$(top_builddir)/widgets/e-text/libetext.a \
$(top_builddir)/e-util/libeutil.la
$(top_builddir)/e-util/libeutil.la \
$(GNOME_PRINT_LIBS)
table_test_LDFLAGS = `gnome-config --libs gdk_pixbuf`
@@ -105,7 +107,8 @@ table_size_test_LDADD = \
libetable.a \
$(EXTRA_GNOME_LIBS) \
$(top_builddir)/widgets/e-text/libetext.a \
$(top_builddir)/e-util/libeutil.la
$(top_builddir)/e-util/libeutil.la \
$(GNOME_PRINT_LIBS)
table_size_test_LDFLAGS = `gnome-config --libs gdk_pixbuf`
@@ -116,7 +119,8 @@ table_example_1_LDADD = \
libetable.a \
$(EXTRA_GNOME_LIBS) \
$(top_builddir)/widgets/e-text/libetext.a \
$(top_builddir)/e-util/libeutil.la
$(top_builddir)/e-util/libeutil.la \
$(GNOME_PRINT_LIBS)
table_example_1_LDFLAGS = `gnome-config --libs gdk_pixbuf`
@@ -127,7 +131,8 @@ table_example_2_LDADD = \
libetable.a \
$(EXTRA_GNOME_LIBS) \
$(top_builddir)/widgets/e-text/libetext.a \
$(top_builddir)/e-util/libeutil.la
$(top_builddir)/e-util/libeutil.la \
$(GNOME_PRINT_LIBS)
table_example_2_LDFLAGS = `gnome-config --libs gdk_pixbuf`
@@ -140,7 +145,8 @@ tree_example_1_LDADD = \
libetable.a \
$(EXTRA_GNOME_LIBS) \
$(top_builddir)/widgets/e-text/libetext.a \
$(top_builddir)/e-util/libeutil.la
$(top_builddir)/e-util/libeutil.la \
$(GNOME_PRINT_LIBS)
icons = \
arrow-down.xpm \
+31
View File
@@ -1154,6 +1154,35 @@ ect_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, voi
}
}
static void
ect_print (ECellView *ecell_view, GnomePrintContext *context,
int model_col, int view_col, int row,
double width, double height)
{
GnomeFont *font = gnome_font_new("Helvetica", 12);
char *string;
ECellText *ect = E_CELL_TEXT(ecell_view->ecell);
if (ect->filter) {
string = (*ect->filter)(e_table_model_value_at (ecell_view->e_table_model, model_col, row));
} else {
string = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
}
gnome_print_moveto(context, 0, (height - gnome_font_get_ascender(font) + gnome_font_get_descender(font)) / 2);
gnome_print_setfont(context, font);
gnome_print_show(context, string);
if (ect->filter) {
g_free(string);
}
}
static gdouble
ect_print_height (ECellView *ecell_view, GnomePrintContext *context,
int model_col, int view_col, int row,
double width)
{
return 12;
}
/*
* GtkObject::destroy method
*/
@@ -1233,6 +1262,8 @@ e_cell_text_class_init (GtkObjectClass *object_class)
ecc->height = ect_height;
ecc->enter_edit = ect_enter_edit;
ecc->leave_edit = ect_leave_edit;
ecc->print = ect_print;
ecc->print_height = ect_print_height;
object_class->get_arg = ect_get_arg;
object_class->set_arg = ect_set_arg;
+25 -1
View File
@@ -1,3 +1,4 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* e-cell.c: base class for cell renderers in e-table
*
@@ -104,6 +105,8 @@ e_cell_class_init (GtkObjectClass *object_class)
ecc->height = ec_height;
ecc->enter_edit = ec_enter_edit;
ecc->leave_edit = ec_leave_edit;
ecc->print = NULL;
ecc->print_height = NULL;
}
static void
@@ -145,7 +148,7 @@ e_cell_unrealize (ECellView *ecell_view)
{
E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->unrealize (ecell_view);
}
void
e_cell_draw (ECellView *ecell_view, GdkDrawable *drawable,
int model_col, int view_col, int row, gboolean selected, int x1, int y1, int x2, int y2)
@@ -154,6 +157,27 @@ e_cell_draw (ECellView *ecell_view, GdkDrawable *drawable,
ecell_view, drawable, model_col, view_col, row, selected, x1, y1, x2, y2);
}
void
e_cell_print (ECellView *ecell_view, GnomePrintContext *context,
int model_col, int view_col, int row,
double width, double height)
{
E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->print
(ecell_view, context, model_col, view_col, row, width, height);
}
gdouble
e_cell_print_height (ECellView *ecell_view, GnomePrintContext *context,
int model_col, int view_col, int row,
double width)
{
if (E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->print_height)
return E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->print_height
(ecell_view, context, model_col, view_col, row, width);
else
return 0.0;
}
int
e_cell_height (ECellView *ecell_view, int model_col, int view_col, int row)
{
+25 -17
View File
@@ -1,3 +1,4 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
#ifndef _E_CELL_H_
#define _E_CELL_H_
@@ -32,23 +33,28 @@ struct _ECellView {
typedef struct {
GtkObjectClass parent_class;
ECellView *(*new_view) (ECell *ecell, ETableModel *table_model, void *e_table_item_view);
void (*kill_view) (ECellView *ecell_view);
void (*realize) (ECellView *ecell_view);
void (*unrealize) (ECellView *ecell_view);
void (*draw) (ECellView *ecell_view, GdkDrawable *drawable,
int model_col, int view_col, int row,
gboolean selected, int x1, int y1, int x2, int y2);
gint (*event) (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row);
void (*focus) (ECellView *ecell_view, int model_col, int view_col,
int row, int x1, int y1, int x2, int y2);
void (*unfocus) (ECellView *ecell_view);
int (*height) (ECellView *ecell_view, int model_col, int view_col, int row);
void *(*enter_edit)(ECellView *ecell_view, int model_col, int view_col, int row);
void (*leave_edit)(ECellView *ecell_view, int model_col, int view_col, int row, void *context);
ECellView *(*new_view) (ECell *ecell, ETableModel *table_model, void *e_table_item_view);
void (*kill_view) (ECellView *ecell_view);
void (*realize) (ECellView *ecell_view);
void (*unrealize) (ECellView *ecell_view);
void (*draw) (ECellView *ecell_view, GdkDrawable *drawable,
int model_col, int view_col, int row,
gboolean selected, int x1, int y1, int x2, int y2);
gint (*event) (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row);
void (*focus) (ECellView *ecell_view, int model_col, int view_col,
int row, int x1, int y1, int x2, int y2);
void (*unfocus) (ECellView *ecell_view);
int (*height) (ECellView *ecell_view, int model_col, int view_col, int row);
void *(*enter_edit) (ECellView *ecell_view, int model_col, int view_col, int row);
void (*leave_edit) (ECellView *ecell_view, int model_col, int view_col, int row, void *context);
void (*print) (ECellView *ecell_view, GnomePrintContext *context,
int model_col, int view_col, int row,
gdouble width, gdouble height);
gdouble (*print_height) (ECellView *ecell_view, GnomePrintContext *context,
int model_col, int view_col, int row, gdouble width);
} ECellClass;
GtkType e_cell_get_type (void);
@@ -66,6 +72,8 @@ void e_cell_draw (ECellView *ecell_view, GdkDrawable *dr,
void e_cell_print (ECellView *ecell_view, GnomePrintContext *context,
int model_col, int view_col, int row,
double width, double height);
gdouble e_cell_print_height (ECellView *ecell_view, GnomePrintContext *context,
int model_col, int view_col, int row, gdouble width);
void e_cell_focus (ECellView *ecell_view, int model_col, int view_col, int row,
int x1, int y1, int x2, int y2);
void e_cell_unfocus (ECellView *ecell_view);
@@ -85,6 +85,8 @@
<widget>
<class>GtkScrolledWindow</class>
<name>scrolledwindow1</name>
<width>200</width>
<height>200</height>
<hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
<vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
<hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
+1 -1
View File
@@ -754,7 +754,7 @@ etgc_reflow (GnomeCanvasItem *item, gint flags)
gnome_canvas_item_set (GNOME_CANVAS_ITEM(child_node->rect),
"x1", (double) 0,
"x2", (double) running_width,
"x2", (double) running_width + GROUP_INDENT,
"y1", (double) running_height - extra_height,
"y2", (double) running_height + item_height,
NULL);
+8
View File
@@ -245,6 +245,13 @@ etgl_get_focus_column (ETableGroup *etg)
return e_table_item_get_focused_column (etgl->item);
}
static EPrintable *
etgl_get_printable (ETableGroup *etg)
{
ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
return e_table_item_get_printable (etgl->item);
}
static void
etgl_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
{
@@ -356,6 +363,7 @@ etgl_class_init (GtkObjectClass *object_class)
e_group_class->unfocus = etgl_unfocus;
e_group_class->get_selected_view_row = etgl_get_selected_view_row;
e_group_class->get_focus_column = etgl_get_focus_column;
e_group_class->get_printable = etgl_get_printable;
gtk_object_add_arg_type ("ETableGroupLeaf::drawgrid", GTK_TYPE_BOOL,
GTK_ARG_WRITABLE, ARG_TABLE_DRAW_GRID);
+13
View File
@@ -240,6 +240,18 @@ e_table_group_get_ecol (ETableGroup *etg)
return NULL;
}
EPrintable *
e_table_group_get_printable (ETableGroup *etg)
{
g_return_val_if_fail (etg != NULL, NULL);
g_return_val_if_fail (E_IS_TABLE_GROUP (etg), NULL);
if (ETG_CLASS (etg)->get_printable)
return ETG_CLASS (etg)->get_printable (etg);
else
return NULL;
}
void
e_table_group_row_selection (ETableGroup *e_table_group, gint row, gboolean selected)
{
@@ -369,6 +381,7 @@ etg_class_init (GtkObjectClass *object_class)
klass->unfocus = NULL;
klass->get_focus = etg_get_focus;
klass->get_ecol = NULL;
klass->get_printable = NULL;
etg_parent_class = gtk_type_class (PARENT_TYPE);
+24 -20
View File
@@ -7,6 +7,7 @@
#include "e-table-header.h"
#include "e-table-sort-info.h"
#include "e-util/e-util.h"
#include "e-util/e-printable.h"
#define E_TABLE_GROUP_TYPE (e_table_group_get_type ())
#define E_TABLE_GROUP(o) (GTK_CHECK_CAST ((o), E_TABLE_GROUP_TYPE, ETableGroup))
@@ -63,30 +64,33 @@ typedef struct {
gboolean (*get_focus) (ETableGroup *etg);
gint (*get_focus_column) (ETableGroup *etg);
ETableCol *(*get_ecol) (ETableGroup *etg);
EPrintable *(*get_printable) (ETableGroup *etg);
} ETableGroupClass;
void e_table_group_add (ETableGroup *etg,
gint row);
void e_table_group_add_all (ETableGroup *etg);
gboolean e_table_group_remove (ETableGroup *etg,
gint row);
gint e_table_group_get_count (ETableGroup *etg);
void e_table_group_increment (ETableGroup *etg,
gint position,
gint amount);
gint e_table_group_row_count (ETableGroup *etg);
void e_table_group_set_focus (ETableGroup *etg,
EFocus direction,
gint view_col);
void e_table_group_select_row (ETableGroup *etg,
gint row);
/* Virtual functions */
void e_table_group_add (ETableGroup *etg,
gint row);
void e_table_group_add_all (ETableGroup *etg);
gboolean e_table_group_remove (ETableGroup *etg,
gint row);
gint e_table_group_get_count (ETableGroup *etg);
void e_table_group_increment (ETableGroup *etg,
gint position,
gint amount);
gint e_table_group_row_count (ETableGroup *etg);
void e_table_group_set_focus (ETableGroup *etg,
EFocus direction,
gint view_col);
void e_table_group_select_row (ETableGroup *etg,
gint row);
int e_table_group_get_selected_view_row (ETableGroup *etg);
void e_table_group_unfocus (ETableGroup *etg);
gboolean e_table_group_get_focus (ETableGroup *etg);
gint e_table_group_get_focus_column (ETableGroup *etg);
ETableHeader *e_table_group_get_header (ETableGroup *etg);
ETableCol *e_table_group_get_ecol (ETableGroup *etg);
void e_table_group_unfocus (ETableGroup *etg);
gboolean e_table_group_get_focus (ETableGroup *etg);
gint e_table_group_get_focus_column (ETableGroup *etg);
ETableHeader *e_table_group_get_header (ETableGroup *etg);
ETableCol *e_table_group_get_ecol (ETableGroup *etg);
EPrintable *e_table_group_get_printable (ETableGroup *etg);
ETableGroup *e_table_group_new (GnomeCanvasGroup *parent,
ETableHeader *full_header,
+255
View File
@@ -1714,3 +1714,258 @@ e_table_item_leave_edit (ETableItem *eti)
eti->edit_ctx = NULL;
}
typedef struct {
ETableItem *item;
int rows_printed;
} ETableItemPrintContext;
static gdouble *
e_table_item_calculate_print_widths (ETableHeader *eth, gdouble width)
{
int i;
double extra;
double expansion;
int last_resizable = -1;
gdouble scale = 300.0L / 70.0L;
gdouble *widths = g_new(gdouble, e_table_header_count(eth));
/* - 1 to account for the last pixel border. */
extra = width - 1;
expansion = 0;
for (i = 0; i < eth->col_count; i++) {
extra -= eth->columns[i]->min_width * scale;
if (eth->columns[i]->resizeable && eth->columns[i]->expansion > 0)
last_resizable = i;
expansion += eth->columns[i]->resizeable ? eth->columns[i]->expansion : 0;
widths[i] = eth->columns[i]->min_width * scale;
}
for (i = 0; i <= last_resizable; i++) {
widths[i] += extra * (eth->columns[i]->resizeable ? eth->columns[i]->expansion : 0)/expansion;
}
return widths;
}
static gdouble
eti_printed_row_height (ETableItem *item, gdouble *widths, GnomePrintContext *context, gint row)
{
int col;
int cols = item->cols;
gdouble height = 0;
for (col = 0; col < cols; col++) {
ETableCol *ecol = e_table_header_get_column (item->header, col);
ECellView *ecell_view = item->cell_views [col];
gdouble this_height = e_cell_print_height (ecell_view, context, ecol->col_idx, col, row,
widths[col] - 1);
if (this_height > height)
height = this_height;
}
return height;
}
#define CHECK(x) if((x) == -1) return -1;
static gint
gp_draw_rect (GnomePrintContext *context, gdouble x, gdouble y, gdouble width, gdouble height)
{
CHECK(gnome_print_moveto(context, x, y));
CHECK(gnome_print_lineto(context, x + width, y));
CHECK(gnome_print_lineto(context, x + width, y - height));
CHECK(gnome_print_lineto(context, x, y - height));
CHECK(gnome_print_lineto(context, x, y));
return gnome_print_fill(context);
}
static void
e_table_item_print_page (EPrintable *ep,
GnomePrintContext *context,
gdouble width,
gdouble height,
gboolean quantize,
ETableItemPrintContext *itemcontext)
{
ETableItem *item = itemcontext->item;
const int rows = item->rows;
const int cols = item->cols;
int rows_printed = itemcontext->rows_printed;
gdouble *widths;
int row, col;
gdouble yd = height;
widths = e_table_item_calculate_print_widths (itemcontext->item->header, width);
/*
* Draw cells
*/
if (item->draw_grid){
gp_draw_rect(context, 0, yd, width, 1);
}
yd--;
for (row = rows_printed; row < rows; row++){
gdouble xd = 0, row_height;
row_height = eti_printed_row_height(item, widths, context, row);
if (quantize) {
if (yd - row_height - 1 < 0 && row != rows_printed) {
break;
}
} else {
if (yd < 0) {
break;
}
}
for (col = 0; col < cols; col++){
ETableCol *ecol = e_table_header_get_column (item->header, col);
ECellView *ecell_view = item->cell_views [col];
if (gnome_print_gsave(context) == -1)
/* FIXME */;
if (gnome_print_translate(context, xd, yd - row_height) == -1)
/* FIXME */;
if (gnome_print_moveto(context, 0, 0) == -1)
/* FIXME */;
if (gnome_print_lineto(context, widths[col] - 1, 0) == -1)
/* FIXME */;
if (gnome_print_lineto(context, widths[col] - 1, row_height) == -1)
/* FIXME */;
if (gnome_print_lineto(context, 0, row_height) == -1)
/* FIXME */;
if (gnome_print_lineto(context, 0, 0) == -1)
/* FIXME */;
if (gnome_print_clip(context) == -1)
/* FIXME */;
e_cell_print (ecell_view, context, ecol->col_idx, col, row,
widths[col] - 1, row_height);
if (gnome_print_grestore(context) == -1)
/* FIXME */;
xd += widths[col];
}
yd -= row_height;
if (item->draw_grid){
gp_draw_rect(context, 0, yd, width, 1);
}
yd--;
}
itemcontext->rows_printed = row;
if (item->draw_grid){
gdouble xd = 0;
for (col = 0; col < cols; col++){
gp_draw_rect(context, xd, height, 1, height - yd);
xd += widths[col];
}
gp_draw_rect(context, xd, height, 1, height - yd);
}
g_free (widths);
}
static gboolean
e_table_item_data_left (EPrintable *ep,
ETableItemPrintContext *itemcontext)
{
ETableItem *item = itemcontext->item;
int rows_printed = itemcontext->rows_printed;
gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "data_left");
return rows_printed < item->rows;
}
static void
e_table_item_reset (EPrintable *ep,
ETableItemPrintContext *itemcontext)
{
itemcontext->rows_printed = 0;
}
static gdouble
e_table_item_height (EPrintable *ep,
GnomePrintContext *context,
gdouble width,
gdouble max_height,
ETableItemPrintContext *itemcontext)
{
ETableItem *item = itemcontext->item;
const int rows = item->rows;
int rows_printed = itemcontext->rows_printed;
gdouble *widths;
int row;
gdouble yd = 0;
widths = e_table_item_calculate_print_widths (itemcontext->item->header, width);
/*
* Draw cells
*/
yd++;
for (row = rows_printed; row < rows; row++){
gdouble row_height;
row_height = eti_printed_row_height(item, widths, context, row);
if (max_height != -1 && yd + row_height + 1 > max_height && row != rows_printed) {
break;
}
yd += row_height;
yd++;
}
g_free (widths);
gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "height");
return yd;
}
static void
e_table_item_printable_destroy (GtkObject *object,
ETableItemPrintContext *itemcontext)
{
gtk_object_unref(GTK_OBJECT(itemcontext->item));
g_free(itemcontext);
}
EPrintable *
e_table_item_get_printable (ETableItem *item)
{
EPrintable *printable = e_printable_new();
ETableItemPrintContext *itemcontext;
itemcontext = g_new(ETableItemPrintContext, 1);
itemcontext->item = item;
gtk_object_ref(GTK_OBJECT(item));
itemcontext->rows_printed = 0;
gtk_signal_connect (GTK_OBJECT(printable),
"print_page",
GTK_SIGNAL_FUNC(e_table_item_print_page),
itemcontext);
gtk_signal_connect (GTK_OBJECT(printable),
"data_left",
GTK_SIGNAL_FUNC(e_table_item_data_left),
itemcontext);
gtk_signal_connect (GTK_OBJECT(printable),
"reset",
GTK_SIGNAL_FUNC(e_table_item_reset),
itemcontext);
gtk_signal_connect (GTK_OBJECT(printable),
"height",
GTK_SIGNAL_FUNC(e_table_item_height),
itemcontext);
gtk_signal_connect (GTK_OBJECT(printable),
"destroy",
GTK_SIGNAL_FUNC(e_table_item_printable_destroy),
itemcontext);
return printable;
}
+6
View File
@@ -5,6 +5,7 @@
#include <libgnomeui/gnome-canvas.h>
#include "e-table-model.h"
#include "e-table-header.h"
#include <e-util/e-printable.h>
#define E_TABLE_ITEM_TYPE (e_table_item_get_type ())
#define E_TABLE_ITEM(o) (GTK_CHECK_CAST ((o), E_TABLE_ITEM_TYPE, ETableItem))
@@ -134,4 +135,9 @@ void e_table_item_redraw_range (ETableItem *eti,
int start_col, int start_row,
int end_col, int end_row);
EPrintable *e_table_item_get_printable (ETableItem *eti);
void e_table_item_print_height (ETableItem *eti,
GnomePrintContext *context,
gdouble width);
#endif /* _E_TABLE_ITEM_H_ */
+6
View File
@@ -682,6 +682,12 @@ e_table_get_selected_view_row (ETable *e_table)
return e_table_group_get_selected_view_row(e_table->group);
}
EPrintable *
e_table_get_printable (ETable *e_table)
{
return e_table_group_get_printable(e_table->group);
}
static void
et_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
{
+24 -21
View File
@@ -10,6 +10,7 @@
#include "e-table-group.h"
#include "e-table-sort-info.h"
#include "e-table-item.h"
#include "e-util/e-printable.h"
BEGIN_GNOME_DECLS
@@ -66,29 +67,31 @@ typedef struct {
gint (*key_press) (ETable *et, int row, int col, GdkEvent *event);
} ETableClass;
GtkType e_table_get_type (void);
ETable *e_table_construct (ETable *e_table, ETableHeader *full_header, ETableModel *etm,
const char *spec);
GtkWidget *e_table_new (ETableHeader *full_header, ETableModel *etm,
const char *spec);
ETable *e_table_construct_from_spec_file (ETable *e_table,
ETableHeader *full_header,
ETableModel *etm,
const char *filename);
GtkWidget *e_table_new_from_spec_file (ETableHeader *full_header,
ETableModel *etm,
const char *filename);
gchar *e_table_get_specification (ETable *e_table);
void e_table_save_specification (ETable *e_table, gchar *filename);
void e_table_select_row (ETable *e_table,
int row);
GtkType e_table_get_type (void);
ETable *e_table_construct (ETable *e_table, ETableHeader *full_header, ETableModel *etm,
const char *spec);
GtkWidget *e_table_new (ETableHeader *full_header, ETableModel *etm,
const char *spec);
ETable *e_table_construct_from_spec_file (ETable *e_table,
ETableHeader *full_header,
ETableModel *etm,
const char *filename);
GtkWidget *e_table_new_from_spec_file (ETableHeader *full_header,
ETableModel *etm,
const char *filename);
gchar *e_table_get_specification (ETable *e_table);
void e_table_save_specification (ETable *e_table, gchar *filename);
void e_table_select_row (ETable *e_table,
int row);
/* -1 means no selection. */
int e_table_get_selected_view_row (ETable *e_table);
int e_table_get_selected_view_row (ETable *e_table);
EPrintable *e_table_get_printable (ETable *e_table);
END_GNOME_DECLS
#endif /* _E_TABLE_H_ */
+31
View File
@@ -1154,6 +1154,35 @@ ect_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, voi
}
}
static void
ect_print (ECellView *ecell_view, GnomePrintContext *context,
int model_col, int view_col, int row,
double width, double height)
{
GnomeFont *font = gnome_font_new("Helvetica", 12);
char *string;
ECellText *ect = E_CELL_TEXT(ecell_view->ecell);
if (ect->filter) {
string = (*ect->filter)(e_table_model_value_at (ecell_view->e_table_model, model_col, row));
} else {
string = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
}
gnome_print_moveto(context, 0, (height - gnome_font_get_ascender(font) + gnome_font_get_descender(font)) / 2);
gnome_print_setfont(context, font);
gnome_print_show(context, string);
if (ect->filter) {
g_free(string);
}
}
static gdouble
ect_print_height (ECellView *ecell_view, GnomePrintContext *context,
int model_col, int view_col, int row,
double width)
{
return 12;
}
/*
* GtkObject::destroy method
*/
@@ -1233,6 +1262,8 @@ e_cell_text_class_init (GtkObjectClass *object_class)
ecc->height = ect_height;
ecc->enter_edit = ect_enter_edit;
ecc->leave_edit = ect_leave_edit;
ecc->print = ect_print;
ecc->print_height = ect_print_height;
object_class->get_arg = ect_get_arg;
object_class->set_arg = ect_set_arg;
+25 -1
View File
@@ -1,3 +1,4 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* e-cell.c: base class for cell renderers in e-table
*
@@ -104,6 +105,8 @@ e_cell_class_init (GtkObjectClass *object_class)
ecc->height = ec_height;
ecc->enter_edit = ec_enter_edit;
ecc->leave_edit = ec_leave_edit;
ecc->print = NULL;
ecc->print_height = NULL;
}
static void
@@ -145,7 +148,7 @@ e_cell_unrealize (ECellView *ecell_view)
{
E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->unrealize (ecell_view);
}
void
e_cell_draw (ECellView *ecell_view, GdkDrawable *drawable,
int model_col, int view_col, int row, gboolean selected, int x1, int y1, int x2, int y2)
@@ -154,6 +157,27 @@ e_cell_draw (ECellView *ecell_view, GdkDrawable *drawable,
ecell_view, drawable, model_col, view_col, row, selected, x1, y1, x2, y2);
}
void
e_cell_print (ECellView *ecell_view, GnomePrintContext *context,
int model_col, int view_col, int row,
double width, double height)
{
E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->print
(ecell_view, context, model_col, view_col, row, width, height);
}
gdouble
e_cell_print_height (ECellView *ecell_view, GnomePrintContext *context,
int model_col, int view_col, int row,
double width)
{
if (E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->print_height)
return E_CELL_CLASS (GTK_OBJECT (ecell_view->ecell)->klass)->print_height
(ecell_view, context, model_col, view_col, row, width);
else
return 0.0;
}
int
e_cell_height (ECellView *ecell_view, int model_col, int view_col, int row)
{
+25 -17
View File
@@ -1,3 +1,4 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
#ifndef _E_CELL_H_
#define _E_CELL_H_
@@ -32,23 +33,28 @@ struct _ECellView {
typedef struct {
GtkObjectClass parent_class;
ECellView *(*new_view) (ECell *ecell, ETableModel *table_model, void *e_table_item_view);
void (*kill_view) (ECellView *ecell_view);
void (*realize) (ECellView *ecell_view);
void (*unrealize) (ECellView *ecell_view);
void (*draw) (ECellView *ecell_view, GdkDrawable *drawable,
int model_col, int view_col, int row,
gboolean selected, int x1, int y1, int x2, int y2);
gint (*event) (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row);
void (*focus) (ECellView *ecell_view, int model_col, int view_col,
int row, int x1, int y1, int x2, int y2);
void (*unfocus) (ECellView *ecell_view);
int (*height) (ECellView *ecell_view, int model_col, int view_col, int row);
void *(*enter_edit)(ECellView *ecell_view, int model_col, int view_col, int row);
void (*leave_edit)(ECellView *ecell_view, int model_col, int view_col, int row, void *context);
ECellView *(*new_view) (ECell *ecell, ETableModel *table_model, void *e_table_item_view);
void (*kill_view) (ECellView *ecell_view);
void (*realize) (ECellView *ecell_view);
void (*unrealize) (ECellView *ecell_view);
void (*draw) (ECellView *ecell_view, GdkDrawable *drawable,
int model_col, int view_col, int row,
gboolean selected, int x1, int y1, int x2, int y2);
gint (*event) (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row);
void (*focus) (ECellView *ecell_view, int model_col, int view_col,
int row, int x1, int y1, int x2, int y2);
void (*unfocus) (ECellView *ecell_view);
int (*height) (ECellView *ecell_view, int model_col, int view_col, int row);
void *(*enter_edit) (ECellView *ecell_view, int model_col, int view_col, int row);
void (*leave_edit) (ECellView *ecell_view, int model_col, int view_col, int row, void *context);
void (*print) (ECellView *ecell_view, GnomePrintContext *context,
int model_col, int view_col, int row,
gdouble width, gdouble height);
gdouble (*print_height) (ECellView *ecell_view, GnomePrintContext *context,
int model_col, int view_col, int row, gdouble width);
} ECellClass;
GtkType e_cell_get_type (void);
@@ -66,6 +72,8 @@ void e_cell_draw (ECellView *ecell_view, GdkDrawable *dr,
void e_cell_print (ECellView *ecell_view, GnomePrintContext *context,
int model_col, int view_col, int row,
double width, double height);
gdouble e_cell_print_height (ECellView *ecell_view, GnomePrintContext *context,
int model_col, int view_col, int row, gdouble width);
void e_cell_focus (ECellView *ecell_view, int model_col, int view_col, int row,
int x1, int y1, int x2, int y2);
void e_cell_unfocus (ECellView *ecell_view);
@@ -85,6 +85,8 @@
<widget>
<class>GtkScrolledWindow</class>
<name>scrolledwindow1</name>
<width>200</width>
<height>200</height>
<hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
<vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
<hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
+1 -1
View File
@@ -754,7 +754,7 @@ etgc_reflow (GnomeCanvasItem *item, gint flags)
gnome_canvas_item_set (GNOME_CANVAS_ITEM(child_node->rect),
"x1", (double) 0,
"x2", (double) running_width,
"x2", (double) running_width + GROUP_INDENT,
"y1", (double) running_height - extra_height,
"y2", (double) running_height + item_height,
NULL);
+8
View File
@@ -245,6 +245,13 @@ etgl_get_focus_column (ETableGroup *etg)
return e_table_item_get_focused_column (etgl->item);
}
static EPrintable *
etgl_get_printable (ETableGroup *etg)
{
ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
return e_table_item_get_printable (etgl->item);
}
static void
etgl_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
{
@@ -356,6 +363,7 @@ etgl_class_init (GtkObjectClass *object_class)
e_group_class->unfocus = etgl_unfocus;
e_group_class->get_selected_view_row = etgl_get_selected_view_row;
e_group_class->get_focus_column = etgl_get_focus_column;
e_group_class->get_printable = etgl_get_printable;
gtk_object_add_arg_type ("ETableGroupLeaf::drawgrid", GTK_TYPE_BOOL,
GTK_ARG_WRITABLE, ARG_TABLE_DRAW_GRID);
+13
View File
@@ -240,6 +240,18 @@ e_table_group_get_ecol (ETableGroup *etg)
return NULL;
}
EPrintable *
e_table_group_get_printable (ETableGroup *etg)
{
g_return_val_if_fail (etg != NULL, NULL);
g_return_val_if_fail (E_IS_TABLE_GROUP (etg), NULL);
if (ETG_CLASS (etg)->get_printable)
return ETG_CLASS (etg)->get_printable (etg);
else
return NULL;
}
void
e_table_group_row_selection (ETableGroup *e_table_group, gint row, gboolean selected)
{
@@ -369,6 +381,7 @@ etg_class_init (GtkObjectClass *object_class)
klass->unfocus = NULL;
klass->get_focus = etg_get_focus;
klass->get_ecol = NULL;
klass->get_printable = NULL;
etg_parent_class = gtk_type_class (PARENT_TYPE);
+24 -20
View File
@@ -7,6 +7,7 @@
#include "e-table-header.h"
#include "e-table-sort-info.h"
#include "e-util/e-util.h"
#include "e-util/e-printable.h"
#define E_TABLE_GROUP_TYPE (e_table_group_get_type ())
#define E_TABLE_GROUP(o) (GTK_CHECK_CAST ((o), E_TABLE_GROUP_TYPE, ETableGroup))
@@ -63,30 +64,33 @@ typedef struct {
gboolean (*get_focus) (ETableGroup *etg);
gint (*get_focus_column) (ETableGroup *etg);
ETableCol *(*get_ecol) (ETableGroup *etg);
EPrintable *(*get_printable) (ETableGroup *etg);
} ETableGroupClass;
void e_table_group_add (ETableGroup *etg,
gint row);
void e_table_group_add_all (ETableGroup *etg);
gboolean e_table_group_remove (ETableGroup *etg,
gint row);
gint e_table_group_get_count (ETableGroup *etg);
void e_table_group_increment (ETableGroup *etg,
gint position,
gint amount);
gint e_table_group_row_count (ETableGroup *etg);
void e_table_group_set_focus (ETableGroup *etg,
EFocus direction,
gint view_col);
void e_table_group_select_row (ETableGroup *etg,
gint row);
/* Virtual functions */
void e_table_group_add (ETableGroup *etg,
gint row);
void e_table_group_add_all (ETableGroup *etg);
gboolean e_table_group_remove (ETableGroup *etg,
gint row);
gint e_table_group_get_count (ETableGroup *etg);
void e_table_group_increment (ETableGroup *etg,
gint position,
gint amount);
gint e_table_group_row_count (ETableGroup *etg);
void e_table_group_set_focus (ETableGroup *etg,
EFocus direction,
gint view_col);
void e_table_group_select_row (ETableGroup *etg,
gint row);
int e_table_group_get_selected_view_row (ETableGroup *etg);
void e_table_group_unfocus (ETableGroup *etg);
gboolean e_table_group_get_focus (ETableGroup *etg);
gint e_table_group_get_focus_column (ETableGroup *etg);
ETableHeader *e_table_group_get_header (ETableGroup *etg);
ETableCol *e_table_group_get_ecol (ETableGroup *etg);
void e_table_group_unfocus (ETableGroup *etg);
gboolean e_table_group_get_focus (ETableGroup *etg);
gint e_table_group_get_focus_column (ETableGroup *etg);
ETableHeader *e_table_group_get_header (ETableGroup *etg);
ETableCol *e_table_group_get_ecol (ETableGroup *etg);
EPrintable *e_table_group_get_printable (ETableGroup *etg);
ETableGroup *e_table_group_new (GnomeCanvasGroup *parent,
ETableHeader *full_header,
+255
View File
@@ -1714,3 +1714,258 @@ e_table_item_leave_edit (ETableItem *eti)
eti->edit_ctx = NULL;
}
typedef struct {
ETableItem *item;
int rows_printed;
} ETableItemPrintContext;
static gdouble *
e_table_item_calculate_print_widths (ETableHeader *eth, gdouble width)
{
int i;
double extra;
double expansion;
int last_resizable = -1;
gdouble scale = 300.0L / 70.0L;
gdouble *widths = g_new(gdouble, e_table_header_count(eth));
/* - 1 to account for the last pixel border. */
extra = width - 1;
expansion = 0;
for (i = 0; i < eth->col_count; i++) {
extra -= eth->columns[i]->min_width * scale;
if (eth->columns[i]->resizeable && eth->columns[i]->expansion > 0)
last_resizable = i;
expansion += eth->columns[i]->resizeable ? eth->columns[i]->expansion : 0;
widths[i] = eth->columns[i]->min_width * scale;
}
for (i = 0; i <= last_resizable; i++) {
widths[i] += extra * (eth->columns[i]->resizeable ? eth->columns[i]->expansion : 0)/expansion;
}
return widths;
}
static gdouble
eti_printed_row_height (ETableItem *item, gdouble *widths, GnomePrintContext *context, gint row)
{
int col;
int cols = item->cols;
gdouble height = 0;
for (col = 0; col < cols; col++) {
ETableCol *ecol = e_table_header_get_column (item->header, col);
ECellView *ecell_view = item->cell_views [col];
gdouble this_height = e_cell_print_height (ecell_view, context, ecol->col_idx, col, row,
widths[col] - 1);
if (this_height > height)
height = this_height;
}
return height;
}
#define CHECK(x) if((x) == -1) return -1;
static gint
gp_draw_rect (GnomePrintContext *context, gdouble x, gdouble y, gdouble width, gdouble height)
{
CHECK(gnome_print_moveto(context, x, y));
CHECK(gnome_print_lineto(context, x + width, y));
CHECK(gnome_print_lineto(context, x + width, y - height));
CHECK(gnome_print_lineto(context, x, y - height));
CHECK(gnome_print_lineto(context, x, y));
return gnome_print_fill(context);
}
static void
e_table_item_print_page (EPrintable *ep,
GnomePrintContext *context,
gdouble width,
gdouble height,
gboolean quantize,
ETableItemPrintContext *itemcontext)
{
ETableItem *item = itemcontext->item;
const int rows = item->rows;
const int cols = item->cols;
int rows_printed = itemcontext->rows_printed;
gdouble *widths;
int row, col;
gdouble yd = height;
widths = e_table_item_calculate_print_widths (itemcontext->item->header, width);
/*
* Draw cells
*/
if (item->draw_grid){
gp_draw_rect(context, 0, yd, width, 1);
}
yd--;
for (row = rows_printed; row < rows; row++){
gdouble xd = 0, row_height;
row_height = eti_printed_row_height(item, widths, context, row);
if (quantize) {
if (yd - row_height - 1 < 0 && row != rows_printed) {
break;
}
} else {
if (yd < 0) {
break;
}
}
for (col = 0; col < cols; col++){
ETableCol *ecol = e_table_header_get_column (item->header, col);
ECellView *ecell_view = item->cell_views [col];
if (gnome_print_gsave(context) == -1)
/* FIXME */;
if (gnome_print_translate(context, xd, yd - row_height) == -1)
/* FIXME */;
if (gnome_print_moveto(context, 0, 0) == -1)
/* FIXME */;
if (gnome_print_lineto(context, widths[col] - 1, 0) == -1)
/* FIXME */;
if (gnome_print_lineto(context, widths[col] - 1, row_height) == -1)
/* FIXME */;
if (gnome_print_lineto(context, 0, row_height) == -1)
/* FIXME */;
if (gnome_print_lineto(context, 0, 0) == -1)
/* FIXME */;
if (gnome_print_clip(context) == -1)
/* FIXME */;
e_cell_print (ecell_view, context, ecol->col_idx, col, row,
widths[col] - 1, row_height);
if (gnome_print_grestore(context) == -1)
/* FIXME */;
xd += widths[col];
}
yd -= row_height;
if (item->draw_grid){
gp_draw_rect(context, 0, yd, width, 1);
}
yd--;
}
itemcontext->rows_printed = row;
if (item->draw_grid){
gdouble xd = 0;
for (col = 0; col < cols; col++){
gp_draw_rect(context, xd, height, 1, height - yd);
xd += widths[col];
}
gp_draw_rect(context, xd, height, 1, height - yd);
}
g_free (widths);
}
static gboolean
e_table_item_data_left (EPrintable *ep,
ETableItemPrintContext *itemcontext)
{
ETableItem *item = itemcontext->item;
int rows_printed = itemcontext->rows_printed;
gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "data_left");
return rows_printed < item->rows;
}
static void
e_table_item_reset (EPrintable *ep,
ETableItemPrintContext *itemcontext)
{
itemcontext->rows_printed = 0;
}
static gdouble
e_table_item_height (EPrintable *ep,
GnomePrintContext *context,
gdouble width,
gdouble max_height,
ETableItemPrintContext *itemcontext)
{
ETableItem *item = itemcontext->item;
const int rows = item->rows;
int rows_printed = itemcontext->rows_printed;
gdouble *widths;
int row;
gdouble yd = 0;
widths = e_table_item_calculate_print_widths (itemcontext->item->header, width);
/*
* Draw cells
*/
yd++;
for (row = rows_printed; row < rows; row++){
gdouble row_height;
row_height = eti_printed_row_height(item, widths, context, row);
if (max_height != -1 && yd + row_height + 1 > max_height && row != rows_printed) {
break;
}
yd += row_height;
yd++;
}
g_free (widths);
gtk_signal_emit_stop_by_name(GTK_OBJECT(ep), "height");
return yd;
}
static void
e_table_item_printable_destroy (GtkObject *object,
ETableItemPrintContext *itemcontext)
{
gtk_object_unref(GTK_OBJECT(itemcontext->item));
g_free(itemcontext);
}
EPrintable *
e_table_item_get_printable (ETableItem *item)
{
EPrintable *printable = e_printable_new();
ETableItemPrintContext *itemcontext;
itemcontext = g_new(ETableItemPrintContext, 1);
itemcontext->item = item;
gtk_object_ref(GTK_OBJECT(item));
itemcontext->rows_printed = 0;
gtk_signal_connect (GTK_OBJECT(printable),
"print_page",
GTK_SIGNAL_FUNC(e_table_item_print_page),
itemcontext);
gtk_signal_connect (GTK_OBJECT(printable),
"data_left",
GTK_SIGNAL_FUNC(e_table_item_data_left),
itemcontext);
gtk_signal_connect (GTK_OBJECT(printable),
"reset",
GTK_SIGNAL_FUNC(e_table_item_reset),
itemcontext);
gtk_signal_connect (GTK_OBJECT(printable),
"height",
GTK_SIGNAL_FUNC(e_table_item_height),
itemcontext);
gtk_signal_connect (GTK_OBJECT(printable),
"destroy",
GTK_SIGNAL_FUNC(e_table_item_printable_destroy),
itemcontext);
return printable;
}
+6
View File
@@ -5,6 +5,7 @@
#include <libgnomeui/gnome-canvas.h>
#include "e-table-model.h"
#include "e-table-header.h"
#include <e-util/e-printable.h>
#define E_TABLE_ITEM_TYPE (e_table_item_get_type ())
#define E_TABLE_ITEM(o) (GTK_CHECK_CAST ((o), E_TABLE_ITEM_TYPE, ETableItem))
@@ -134,4 +135,9 @@ void e_table_item_redraw_range (ETableItem *eti,
int start_col, int start_row,
int end_col, int end_row);
EPrintable *e_table_item_get_printable (ETableItem *eti);
void e_table_item_print_height (ETableItem *eti,
GnomePrintContext *context,
gdouble width);
#endif /* _E_TABLE_ITEM_H_ */
+6
View File
@@ -682,6 +682,12 @@ e_table_get_selected_view_row (ETable *e_table)
return e_table_group_get_selected_view_row(e_table->group);
}
EPrintable *
e_table_get_printable (ETable *e_table)
{
return e_table_group_get_printable(e_table->group);
}
static void
et_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
{
+24 -21
View File
@@ -10,6 +10,7 @@
#include "e-table-group.h"
#include "e-table-sort-info.h"
#include "e-table-item.h"
#include "e-util/e-printable.h"
BEGIN_GNOME_DECLS
@@ -66,29 +67,31 @@ typedef struct {
gint (*key_press) (ETable *et, int row, int col, GdkEvent *event);
} ETableClass;
GtkType e_table_get_type (void);
ETable *e_table_construct (ETable *e_table, ETableHeader *full_header, ETableModel *etm,
const char *spec);
GtkWidget *e_table_new (ETableHeader *full_header, ETableModel *etm,
const char *spec);
ETable *e_table_construct_from_spec_file (ETable *e_table,
ETableHeader *full_header,
ETableModel *etm,
const char *filename);
GtkWidget *e_table_new_from_spec_file (ETableHeader *full_header,
ETableModel *etm,
const char *filename);
gchar *e_table_get_specification (ETable *e_table);
void e_table_save_specification (ETable *e_table, gchar *filename);
void e_table_select_row (ETable *e_table,
int row);
GtkType e_table_get_type (void);
ETable *e_table_construct (ETable *e_table, ETableHeader *full_header, ETableModel *etm,
const char *spec);
GtkWidget *e_table_new (ETableHeader *full_header, ETableModel *etm,
const char *spec);
ETable *e_table_construct_from_spec_file (ETable *e_table,
ETableHeader *full_header,
ETableModel *etm,
const char *filename);
GtkWidget *e_table_new_from_spec_file (ETableHeader *full_header,
ETableModel *etm,
const char *filename);
gchar *e_table_get_specification (ETable *e_table);
void e_table_save_specification (ETable *e_table, gchar *filename);
void e_table_select_row (ETable *e_table,
int row);
/* -1 means no selection. */
int e_table_get_selected_view_row (ETable *e_table);
int e_table_get_selected_view_row (ETable *e_table);
EPrintable *e_table_get_printable (ETable *e_table);
END_GNOME_DECLS
#endif /* _E_TABLE_H_ */