1 /* ADG - Automatic Drawing Generation
2 * Copyright (C) 2007,2008,2009 Nicola Fontana <ntd at entidi.it>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
22 * SECTION:adg-table-style
23 * @short_description: Customization of table rendering
25 * Contains parameters on how to build tables such as the lines to
26 * use for frames and grids and the font dresses for titles or values.
32 * All fields are private and should not be used directly.
33 * Use its public methods instead.
37 #include "adg-table-style.h"
38 #include "adg-table-style-private.h"
39 #include "adg-dress-builtins.h"
40 #include "adg-font-style.h"
41 #include "adg-line-style.h"
59 static void get_property (GObject
*object
,
63 static void set_property (GObject
*object
,
67 static void apply (AdgStyle
*style
,
72 G_DEFINE_TYPE(AdgTableStyle
, adg_table_style
, ADG_TYPE_STYLE
);
76 adg_table_style_class_init(AdgTableStyleClass
*klass
)
78 GObjectClass
*gobject_class
;
79 AdgStyleClass
*style_class
;
82 gobject_class
= (GObjectClass
*) klass
;
83 style_class
= (AdgStyleClass
*) klass
;
85 g_type_class_add_private(klass
, sizeof(AdgTableStylePrivate
));
87 gobject_class
->get_property
= get_property
;
88 gobject_class
->set_property
= set_property
;
90 style_class
->apply
= apply
;
92 param
= adg_param_spec_dress("color-dress",
94 P_("Color dress for the whole tableension"),
97 g_object_class_install_property(gobject_class
, PROP_COLOR_DRESS
, param
);
99 param
= adg_param_spec_dress("grid-dress",
101 P_("Line dress to use while rendering the grid of the table"),
104 g_object_class_install_property(gobject_class
, PROP_GRID_DRESS
, param
);
106 param
= adg_param_spec_dress("frame-dress",
108 P_("Line dress to use while drawing the table frame"),
109 ADG_DRESS_LINE_FRAME
,
111 g_object_class_install_property(gobject_class
, PROP_FRAME_DRESS
, param
);
113 param
= adg_param_spec_dress("title-dress",
115 P_("Font dress to use for titles"),
116 ADG_DRESS_TEXT_LIMIT
,
118 g_object_class_install_property(gobject_class
, PROP_TITLE_DRESS
, param
);
120 param
= adg_param_spec_dress("value-dress",
122 P_("Font dress to use for values inside the cells"),
123 ADG_DRESS_TEXT_VALUE
,
125 g_object_class_install_property(gobject_class
, PROP_VALUE_DRESS
, param
);
127 param
= g_param_spec_double("row-height",
129 P_("The fallback row height when not explicitely specified while creating a new row"),
132 g_object_class_install_property(gobject_class
, PROP_ROW_HEIGHT
, param
);
134 param
= g_param_spec_boxed("cell-padding",
136 P_("How much space from the bounding box must left inside every cell"),
139 g_object_class_install_property(gobject_class
, PROP_CELL_PADDING
, param
);
141 param
= g_param_spec_boxed("cell-spacing",
143 P_("How much space to left between the cells"),
146 g_object_class_install_property(gobject_class
, PROP_CELL_SPACING
, param
);
150 adg_table_style_init(AdgTableStyle
*table_style
)
152 AdgTableStylePrivate
*data
;
154 data
= G_TYPE_INSTANCE_GET_PRIVATE(table_style
, ADG_TYPE_TABLE_STYLE
,
155 AdgTableStylePrivate
);
157 data
->color_dress
= ADG_DRESS_COLOR
;
158 data
->grid_dress
= ADG_DRESS_LINE_GRID
;
159 data
->frame_dress
= ADG_DRESS_LINE_FRAME
;
160 data
->title_dress
= ADG_DRESS_TEXT_LIMIT
;
161 data
->value_dress
= ADG_DRESS_TEXT_VALUE
;
162 data
->row_height
= 30;
163 data
->cell_padding
.x
= 5;
164 data
->cell_padding
.y
= 5;
165 data
->cell_spacing
.x
= 0;
166 data
->cell_spacing
.y
= 0;
168 table_style
->data
= data
;
172 get_property(GObject
*object
, guint prop_id
, GValue
*value
, GParamSpec
*pspec
)
174 AdgTableStylePrivate
*data
= ((AdgTableStyle
*) object
)->data
;
177 case PROP_COLOR_DRESS
:
178 g_value_set_int(value
, data
->color_dress
);
180 case PROP_GRID_DRESS
:
181 g_value_set_int(value
, data
->grid_dress
);
183 case PROP_FRAME_DRESS
:
184 g_value_set_int(value
, data
->frame_dress
);
186 case PROP_TITLE_DRESS
:
187 g_value_set_int(value
, data
->title_dress
);
189 case PROP_VALUE_DRESS
:
190 g_value_set_int(value
, data
->value_dress
);
192 case PROP_ROW_HEIGHT
:
193 g_value_set_double(value
, data
->row_height
);
195 case PROP_CELL_PADDING
:
196 g_value_set_boxed(value
, &data
->cell_padding
);
198 case PROP_CELL_SPACING
:
199 g_value_set_boxed(value
, &data
->cell_spacing
);
202 G_OBJECT_WARN_INVALID_PROPERTY_ID(object
, prop_id
, pspec
);
208 set_property(GObject
*object
,
209 guint prop_id
, const GValue
*value
, GParamSpec
*pspec
)
211 AdgTableStylePrivate
*data
= ((AdgTableStyle
*) object
)->data
;
214 case PROP_COLOR_DRESS
:
215 adg_dress_set(&data
->color_dress
, g_value_get_int(value
));
217 case PROP_GRID_DRESS
:
218 adg_dress_set(&data
->grid_dress
, g_value_get_int(value
));
220 case PROP_FRAME_DRESS
:
221 adg_dress_set(&data
->frame_dress
, g_value_get_int(value
));
223 case PROP_TITLE_DRESS
:
224 adg_dress_set(&data
->title_dress
, g_value_get_int(value
));
226 case PROP_VALUE_DRESS
:
227 adg_dress_set(&data
->value_dress
, g_value_get_int(value
));
229 case PROP_ROW_HEIGHT
:
230 data
->row_height
= g_value_get_double(value
);
232 case PROP_CELL_PADDING
:
233 cpml_pair_copy(&data
->cell_padding
, g_value_get_boxed(value
));
235 case PROP_CELL_SPACING
:
236 cpml_pair_copy(&data
->cell_spacing
, g_value_get_boxed(value
));
239 G_OBJECT_WARN_INVALID_PROPERTY_ID(object
, prop_id
, pspec
);
246 * adg_table_style_new:
248 * Constructs a new tableension style initialized with default params.
250 * Returns: a new tableension style
253 adg_table_style_new(void)
255 return g_object_new(ADG_TYPE_TABLE_STYLE
, NULL
);
259 * adg_table_style_get_color_dress:
260 * @table_style: an #AdgTableStyle object
262 * Gets the @table_style color dress to be used. This dress should be
263 * intended as a fallback color as it could be overriden by more
264 * specific dresses, such as a color explicitely specified on the
265 * #AdgTableStyle:value-dress.
267 * Returns: the color dress
270 adg_table_style_get_color_dress(AdgTableStyle
*table_style
)
272 AdgTableStylePrivate
*data
;
274 g_return_val_if_fail(ADG_IS_TABLE_STYLE(table_style
), ADG_DRESS_UNDEFINED
);
276 data
= table_style
->data
;
278 return data
->color_dress
;
282 * adg_table_style_set_color_dress:
283 * @table_style: an #AdgTableStyle object
284 * @dress: the new color dress
286 * Sets a new color dress on @table_style.
289 adg_table_style_set_color_dress(AdgTableStyle
*table_style
, AdgDress dress
)
291 AdgTableStylePrivate
*data
;
293 g_return_if_fail(ADG_IS_TABLE_STYLE(table_style
));
295 data
= table_style
->data
;
297 if (adg_dress_set(&data
->color_dress
, dress
))
298 g_object_notify((GObject
*) table_style
, "color-dress");
302 * adg_table_style_get_frame_dress:
303 * @table_style: an #AdgTableStyle object
305 * Gets the line dress to be used for rendering the frames with
308 * Returns: the line dress
311 adg_table_style_get_frame_dress(AdgTableStyle
*table_style
)
313 AdgTableStylePrivate
*data
;
315 g_return_val_if_fail(ADG_IS_TABLE_STYLE(table_style
), ADG_DRESS_UNDEFINED
);
317 data
= table_style
->data
;
319 return data
->frame_dress
;
323 * adg_table_style_set_frame_dress:
324 * @table_style: an #AdgTableStyle object
325 * @dress: the new line dress
327 * Sets a new line dress on @table_style for rendering the frames.
330 adg_table_style_set_frame_dress(AdgTableStyle
*table_style
, AdgDress dress
)
332 AdgTableStylePrivate
*data
;
334 g_return_if_fail(ADG_IS_TABLE_STYLE(table_style
));
336 data
= table_style
->data
;
338 if (adg_dress_set(&data
->frame_dress
, dress
))
339 g_object_notify((GObject
*) table_style
, "frame-dress");
343 * adg_table_style_get_grid_dress:
344 * @table_style: an #AdgTableStyle object
346 * Gets the line dress to be used for rendering the grids with
349 * Returns: the line dress
352 adg_table_style_get_grid_dress(AdgTableStyle
*table_style
)
354 AdgTableStylePrivate
*data
;
356 g_return_val_if_fail(ADG_IS_TABLE_STYLE(table_style
), ADG_DRESS_UNDEFINED
);
358 data
= table_style
->data
;
360 return data
->grid_dress
;
364 * adg_table_style_set_grid_dress:
365 * @table_style: an #AdgTableStyle object
366 * @dress: the new line dress
368 * Sets a new line dress on @table_style for rendering the grids.
371 adg_table_style_set_grid_dress(AdgTableStyle
*table_style
, AdgDress dress
)
373 AdgTableStylePrivate
*data
;
375 g_return_if_fail(ADG_IS_TABLE_STYLE(table_style
));
377 data
= table_style
->data
;
379 if (adg_dress_set(&data
->grid_dress
, dress
))
380 g_object_notify((GObject
*) table_style
, "grid-dress");
384 * adg_table_style_get_title_dress:
385 * @table_style: an #AdgTableStyle object
387 * Gets the font dress to be used for rendering cell titles
390 * Returns: the font dress
393 adg_table_style_get_title_dress(AdgTableStyle
*table_style
)
395 AdgTableStylePrivate
*data
;
397 g_return_val_if_fail(ADG_IS_TABLE_STYLE(table_style
), ADG_DRESS_UNDEFINED
);
399 data
= table_style
->data
;
401 return data
->title_dress
;
405 * adg_table_style_set_title_dress:
406 * @table_style: an #AdgTableStyle object
407 * @dress: the new font dress
409 * Sets a new font dress on @table_style for rendering cell titles.
412 adg_table_style_set_title_dress(AdgTableStyle
*table_style
, AdgDress dress
)
414 AdgTableStylePrivate
*data
;
416 g_return_if_fail(ADG_IS_TABLE_STYLE(table_style
));
418 data
= table_style
->data
;
420 if (adg_dress_set(&data
->title_dress
, dress
))
421 g_object_notify((GObject
*) table_style
, "title-dress");
425 * adg_table_style_get_value_dress:
426 * @table_style: an #AdgTableStyle object
428 * Gets the font dress to be used for rendering cell values
431 * Returns: the font dress
434 adg_table_style_get_value_dress(AdgTableStyle
*table_style
)
436 AdgTableStylePrivate
*data
;
438 g_return_val_if_fail(ADG_IS_TABLE_STYLE(table_style
), ADG_DRESS_UNDEFINED
);
440 data
= table_style
->data
;
442 return data
->value_dress
;
446 * adg_table_style_set_value_dress:
447 * @table_style: an #AdgTableStyle object
448 * @dress: the new font dress
450 * Sets a new font dress on @table_style for rendering cell values.
453 adg_table_style_set_value_dress(AdgTableStyle
*table_style
, AdgDress dress
)
455 AdgTableStylePrivate
*data
;
457 g_return_if_fail(ADG_IS_TABLE_STYLE(table_style
));
459 data
= table_style
->data
;
461 if (adg_dress_set(&data
->value_dress
, dress
))
462 g_object_notify((GObject
*) table_style
, "value-dress");
466 * adg_table_style_get_row_height:
467 * @table_style: an #AdgTableStyle object
469 * Gets the row height fallback value.
471 * Returns: the fallback row height or %0 on errors
474 adg_table_style_get_row_height(AdgTableStyle
*table_style
)
476 AdgTableStylePrivate
*data
;
478 g_return_val_if_fail(ADG_IS_TABLE_STYLE(table_style
), 0);
480 data
= table_style
->data
;
482 return data
->row_height
;
486 * adg_table_style_set_row_height:
487 * @table_style: an #AdgTableStyle object
488 * @row_heigth: the new row heigth fallback
490 * Sets a new #AdgTableStyle:row-height fallback. @row_height must
491 * be a valid row height greather than %0 or a warning will be
492 * raised and this function will fail.
495 adg_table_style_set_row_height(AdgTableStyle
*table_style
, gdouble row_height
)
497 AdgTableStylePrivate
*data
;
499 g_return_if_fail(ADG_IS_TABLE_STYLE(table_style
));
500 g_return_if_fail(row_height
> 0);
502 data
= table_style
->data
;
504 if (row_height
== data
->row_height
)
507 data
->row_height
= row_height
;
509 g_object_notify((GObject
*) table_style
, "row-height");
513 * adg_table_style_get_cell_padding:
514 * @table_style: an #AdgTableStyle object
516 * Gets the padding values in x and y to be left clear inside the cells.
517 * The returned pointer refers to an internal allocated struct and
518 * must not be modified or freed.
520 * The cell padding is a symmetric value, that is the padding on the
521 * left will always be equal to the padding on the right and the top
522 * will always be equal to the bottom.
524 * Returns: the cell padding values or %NULL on errors
527 adg_table_style_get_cell_padding(AdgTableStyle
*table_style
)
529 AdgTableStylePrivate
*data
;
531 g_return_val_if_fail(ADG_IS_TABLE_STYLE(table_style
), NULL
);
533 data
= table_style
->data
;
535 return &data
->cell_padding
;
539 * adg_table_style_set_cell_padding:
540 * @table_style: an #AdgTableStyle object
541 * @cell_padding: the new padding values
543 * Sets new #AdgTableStyle:cell-padding values.
546 adg_table_style_set_cell_padding(AdgTableStyle
*table_style
,
547 const AdgPair
*cell_padding
)
549 AdgTableStylePrivate
*data
;
551 g_return_if_fail(ADG_IS_TABLE_STYLE(table_style
));
552 g_return_if_fail(cell_padding
!= NULL
);
554 data
= table_style
->data
;
555 cpml_pair_copy(&data
->cell_padding
, cell_padding
);
557 g_object_notify((GObject
*) table_style
, "cell-padding");
561 * adg_table_style_get_cell_spacing:
562 * @table_style: an #AdgTableStyle object
564 * Gets the spacing values in x and y to be left between the cell
565 * boundary boxes. The returned pointer refers to an internal
566 * allocated struct and must not be modified or freed.
568 * The cell spacing is a symmetric value, that is the spacing on the
569 * left will always be equal to the spacing on the right and the top
570 * will always be equal to the bottom.
572 * Returns: the cell spacing values or %NULL on errors
575 adg_table_style_get_cell_spacing(AdgTableStyle
*table_style
)
577 AdgTableStylePrivate
*data
;
579 g_return_val_if_fail(ADG_IS_TABLE_STYLE(table_style
), NULL
);
581 data
= table_style
->data
;
583 return &data
->cell_spacing
;
587 * adg_table_style_set_cell_spacing:
588 * @table_style: an #AdgTableStyle object
589 * @cell_spacing: the new spacing values
591 * Sets new #AdgTableStyle:cell-spacing values.
594 adg_table_style_set_cell_spacing(AdgTableStyle
*table_style
,
595 const AdgPair
*cell_spacing
)
597 AdgTableStylePrivate
*data
;
599 g_return_if_fail(ADG_IS_TABLE_STYLE(table_style
));
600 g_return_if_fail(cell_spacing
!= NULL
);
602 data
= table_style
->data
;
603 cpml_pair_copy(&data
->cell_spacing
, cell_spacing
);
605 g_object_notify((GObject
*) table_style
, "cell-spacing");
610 apply(AdgStyle
*style
, AdgEntity
*entity
, cairo_t
*cr
)
612 AdgTableStylePrivate
*data
= ((AdgTableStyle
*) style
)->data
;
614 adg_entity_apply_dress(entity
, data
->color_dress
, cr
);