1 /* ADG - Automatic Drawing Generation
2 * Copyright (C) 2007-2015 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-title-block
23 * @short_description: A title block entity
25 * Title blocks are commonly used in technical drawings to include
26 * additional information not strictly related to physical dimensions,
27 * such as title, material of the represented part, special treatments,
30 * Actually this entity is only a place-holder: it will be implemented
31 * properly in a 0.6.x release, after having AdgToyTable in place.
39 * All fields are privates and should not be used directly.
40 * Use its public methods instead.
46 #include "adg-internal.h"
48 #include "adg-table.h"
49 #include "adg-table-row.h"
50 #include "adg-table-cell.h"
52 #include "adg-title-block.h"
53 #include "adg-title-block-private.h"
56 #define _ADG_OLD_OBJECT_CLASS ((GObjectClass *) adg_title_block_parent_class)
59 G_DEFINE_TYPE(AdgTitleBlock
, adg_title_block
, ADG_TYPE_TABLE
);
74 static void _adg_finalize (GObject
*object
);
75 static void _adg_get_property (GObject
*object
,
79 static void _adg_set_property (GObject
*object
,
86 adg_title_block_class_init(AdgTitleBlockClass
*klass
)
88 GObjectClass
*gobject_class
;
91 gobject_class
= (GObjectClass
*) klass
;
93 g_type_class_add_private(klass
, sizeof(AdgTitleBlockPrivate
));
95 gobject_class
->finalize
= _adg_finalize
;
96 gobject_class
->set_property
= _adg_set_property
;
97 gobject_class
->get_property
= _adg_get_property
;
99 param
= g_param_spec_string("title",
101 P_("A descriptive title of the drawing"),
104 g_object_class_install_property(gobject_class
, PROP_TITLE
, param
);
106 param
= g_param_spec_string("drawing",
108 P_("The name of the drawing: the ADG canvas does not make any assumtpion on this text string"),
111 g_object_class_install_property(gobject_class
, PROP_DRAWING
, param
);
113 param
= g_param_spec_string("size",
115 P_("The media size to be used to print the drawing, usually something like \"A3\" or \"Letter\""),
118 g_object_class_install_property(gobject_class
, PROP_SIZE
, param
);
120 param
= g_param_spec_string("scale",
122 P_("The scale of the drawing, if it makes sense"),
125 g_object_class_install_property(gobject_class
, PROP_SCALE
, param
);
127 param
= g_param_spec_string("author",
129 P_("Name and last name of the author of the drawing"),
132 g_object_class_install_property(gobject_class
, PROP_AUTHOR
, param
);
134 param
= g_param_spec_string("date",
136 P_("The date this drawing has been generated: setting it to an empty string will fallback to today in the preferred representation for the current locale"),
139 g_object_class_install_property(gobject_class
, PROP_DATE
, param
);
141 param
= g_param_spec_object("logo",
143 P_("An entity to be displayed in the title block as the logo of the owner: the containing cell has a 1:1 ratio"),
146 g_object_class_install_property(gobject_class
, PROP_LOGO
, param
);
148 param
= g_param_spec_object("projection",
149 P_("Projection Scheme"),
150 P_("The entity usually reserved to identify the projection scheme adopted by this drawing"),
153 g_object_class_install_property(gobject_class
, PROP_PROJECTION
, param
);
157 adg_title_block_init(AdgTitleBlock
*title_block
)
159 AdgTable
*table
= (AdgTable
*) title_block
;
161 AdgTitleBlockPrivate
*data
= G_TYPE_INSTANCE_GET_PRIVATE(title_block
,
162 ADG_TYPE_TITLE_BLOCK
,
163 AdgTitleBlockPrivate
);
167 data
->drawing
= NULL
;
172 data
->projection
= NULL
;
174 title_block
->data
= data
;
176 /* Create the title block template*/
179 row
= adg_table_row_new(table
);
180 adg_table_cell_new_with_width(row
, 62);
181 adg_table_cell_new_full(row
, 200, "title", _("TITLE"), TRUE
);
184 row
= adg_table_row_new(table
);
185 adg_table_cell_new_full(row
, 62, "logo", NULL
, FALSE
);
186 adg_table_cell_new_full(row
, 40, "size", _("SIZE"), TRUE
);
187 adg_table_cell_new_full(row
, 60, "scale", _("SCALE"), TRUE
);
188 adg_table_cell_new_full(row
, 100, "drawing", _("DRAWING"), TRUE
);
191 row
= adg_table_row_new(table
);
192 adg_table_cell_new_full(row
, 62, "projection", NULL
, TRUE
);
193 adg_table_cell_new_full(row
, 100, "author", _("AUTHOR"), TRUE
);
194 adg_table_cell_new_full(row
, 100, "date", _("DATE"), TRUE
);
198 _adg_finalize(GObject
*object
)
200 AdgTitleBlockPrivate
*data
= ((AdgTitleBlock
*) object
)->data
;
203 g_free(data
->drawing
);
206 g_free(data
->author
);
209 if (_ADG_OLD_OBJECT_CLASS
->finalize
)
210 _ADG_OLD_OBJECT_CLASS
->finalize(object
);
214 _adg_get_property(GObject
*object
, guint prop_id
,
215 GValue
*value
, GParamSpec
*pspec
)
217 AdgTitleBlockPrivate
*data
= ((AdgTitleBlock
*) object
)->data
;
221 g_value_set_string(value
, data
->title
);
224 g_value_set_string(value
, data
->drawing
);
227 g_value_set_string(value
, data
->size
);
230 g_value_set_string(value
, data
->scale
);
233 g_value_set_string(value
, data
->author
);
236 g_value_set_string(value
, data
->date
);
239 g_value_set_object(value
, data
->logo
);
241 case PROP_PROJECTION
:
242 g_value_set_object(value
, data
->projection
);
245 G_OBJECT_WARN_INVALID_PROPERTY_ID(object
, prop_id
, pspec
);
251 _adg_set_property(GObject
*object
, guint prop_id
,
252 const GValue
*value
, GParamSpec
*pspec
)
254 AdgTitleBlock
*title_block
;
255 AdgTitleBlockPrivate
*data
;
259 title_block
= (AdgTitleBlock
*) object
;
260 data
= title_block
->data
;
261 table
= (AdgTable
*) object
;
266 data
->title
= g_value_dup_string(value
);
267 cell
= adg_table_get_cell(table
, "title");
268 adg_table_cell_set_text_value(cell
, data
->title
);
271 g_free(data
->drawing
);
272 data
->drawing
= g_value_dup_string(value
);
273 cell
= adg_table_get_cell(table
, "drawing");
274 adg_table_cell_set_text_value(cell
, data
->drawing
);
278 data
->size
= g_value_dup_string(value
);
279 cell
= adg_table_get_cell(table
, "size");
280 adg_table_cell_set_text_value(cell
, data
->size
);
284 data
->scale
= g_value_dup_string(value
);
285 cell
= adg_table_get_cell(table
, "scale");
286 adg_table_cell_set_text_value(cell
, data
->scale
);
289 g_free(data
->author
);
290 data
->author
= g_value_dup_string(value
);
291 cell
= adg_table_get_cell(table
, "author");
292 adg_table_cell_set_text_value(cell
, data
->author
);
296 if (g_value_get_string(value
) == NULL
) {
297 /* NULL means the date must be automatically updated */
299 char buffer
[100] = { 0 };
301 gdate
= g_date_new();
302 g_date_set_time_t(gdate
, time (NULL
));
303 g_date_strftime(buffer
, sizeof(buffer
), "%x", gdate
);
306 data
->date
= g_strdup(buffer
);
308 data
->date
= g_value_dup_string(value
);
310 cell
= adg_table_get_cell(table
, "date");
311 adg_table_cell_set_text_value(cell
, data
->date
);
314 data
->logo
= g_value_get_object(value
);
315 cell
= adg_table_get_cell(table
, "logo");
316 adg_table_cell_set_value(cell
, data
->logo
);
317 adg_table_cell_set_value_pos_explicit(cell
, 0.5, 1, 0.5, 0.5);
319 case PROP_PROJECTION
:
320 data
->projection
= g_value_get_object(value
);
321 cell
= adg_table_get_cell(table
, "projection");
322 adg_table_cell_set_value(cell
, data
->projection
);
323 adg_table_cell_set_value_pos_explicit(cell
, 0.5, 0.5, 0.5, 0.5);
326 G_OBJECT_WARN_INVALID_PROPERTY_ID(object
, prop_id
, pspec
);
333 * adg_title_block_new:
335 * Creates a new empty title block entity.
337 * Returns: (transfer full): the newly created title block entity.
342 adg_title_block_new(void)
344 return g_object_new(ADG_TYPE_TITLE_BLOCK
, NULL
);
348 * adg_title_block_set_title:
349 * @title_block: an #AdgTitleBlock entity
350 * @title: the new title
352 * Sets a new title on the title block.
357 adg_title_block_set_title(AdgTitleBlock
*title_block
, const gchar
*title
)
359 g_return_if_fail(ADG_IS_TITLE_BLOCK(title_block
));
360 g_object_set(title_block
, "title", title
, NULL
);
364 * adg_title_block_get_title:
365 * @title_block: an #AdgTitleBlock entity
367 * Gets the descriptive title associated to this title block.
368 * The returned string is owned by @title_block and should not
369 * be modifed or freed.
371 * Returns: (transfer none): the title or <constant>NULL</constant> on no title or errors.
376 adg_title_block_get_title(AdgTitleBlock
*title_block
)
378 AdgTitleBlockPrivate
*data
;
380 g_return_val_if_fail(ADG_IS_TITLE_BLOCK(title_block
), NULL
);
382 data
= title_block
->data
;
388 * adg_title_block_set_drawing:
389 * @title_block: an #AdgTitleBlock entity
390 * @drawing: the new drawing name
392 * Sets a new drawing name on the title block.
397 adg_title_block_set_drawing(AdgTitleBlock
*title_block
, const gchar
*drawing
)
399 g_return_if_fail(ADG_IS_TITLE_BLOCK(title_block
));
400 g_object_set(title_block
, "drawing", drawing
, NULL
);
404 * adg_title_block_get_drawing:
405 * @title_block: an #AdgTitleBlock entity
407 * Gets the drawing name, commonly used to specify the file name.
408 * The returned string is owned by @title_block and should not
409 * be modifed or freed.
411 * Returns: (transfer none): the drawing name or <constant>NULL</constant> on no name or errors.
416 adg_title_block_get_drawing(AdgTitleBlock
*title_block
)
418 AdgTitleBlockPrivate
*data
;
420 g_return_val_if_fail(ADG_IS_TITLE_BLOCK(title_block
), NULL
);
422 data
= title_block
->data
;
424 return data
->drawing
;
428 * adg_title_block_set_size:
429 * @title_block: an #AdgTitleBlock entity
430 * @size: the new size
432 * Sets a new size on the title block.
437 adg_title_block_set_size(AdgTitleBlock
*title_block
, const gchar
*size
)
439 g_return_if_fail(ADG_IS_TITLE_BLOCK(title_block
));
440 g_object_set(title_block
, "size", size
, NULL
);
444 * adg_title_block_get_size:
445 * @title_block: an #AdgTitleBlock entity
447 * Gets the media size (a descriptive name) where this drawing will
448 * be printed. Usually contains something like <constant>"A4"</constant>
449 * or <constant>"Letter"</constant>.
450 * The returned string is owned by @title_block and should not
451 * be modifed or freed.
453 * Returns: (transfer none): the size or <constant>NULL</constant> on no size or errors.
458 adg_title_block_get_size(AdgTitleBlock
*title_block
)
460 AdgTitleBlockPrivate
*data
;
462 g_return_val_if_fail(ADG_IS_TITLE_BLOCK(title_block
), NULL
);
464 data
= title_block
->data
;
470 * adg_title_block_set_scale:
471 * @title_block: an #AdgTitleBlock entity
472 * @scale: the new scale
474 * Sets a new scale on the title block.
479 adg_title_block_set_scale(AdgTitleBlock
*title_block
, const gchar
*scale
)
481 g_return_if_fail(ADG_IS_TITLE_BLOCK(title_block
));
482 g_object_set(title_block
, "scale", scale
, NULL
);
486 * adg_title_block_get_scale:
487 * @title_block: an #AdgTitleBlock entity
489 * Gets the scale descriptive name of the drawing.
491 * Returns: (transfer none): the scale text or <constant>NULL</constant> on no scale or errors.
496 adg_title_block_get_scale(AdgTitleBlock
*title_block
)
498 AdgTitleBlockPrivate
*data
;
500 g_return_val_if_fail(ADG_IS_TITLE_BLOCK(title_block
), NULL
);
502 data
= title_block
->data
;
508 * adg_title_block_set_author:
509 * @title_block: an #AdgTitleBlock entity
510 * @author: the new author
512 * Sets a new author on the title block.
517 adg_title_block_set_author(AdgTitleBlock
*title_block
, const gchar
*author
)
519 g_return_if_fail(ADG_IS_TITLE_BLOCK(title_block
));
520 g_object_set(title_block
, "author", author
, NULL
);
524 * adg_title_block_get_author:
525 * @title_block: an #AdgTitleBlock entity
527 * Gets the author's name of the drawing.
529 * Returns: (transfer none): the author or <constant>NULL</constant> on no author or errors.
534 adg_title_block_get_author(AdgTitleBlock
*title_block
)
536 AdgTitleBlockPrivate
*data
;
538 g_return_val_if_fail(ADG_IS_TITLE_BLOCK(title_block
), NULL
);
540 data
= title_block
->data
;
546 * adg_title_block_set_date:
547 * @title_block: an #AdgTitleBlock entity
548 * @date: the new date
550 * Sets a new date on the title block. By default the date is
551 * set to <constant>NULL</constant> and it will be implicitely
552 * rendered using the*preferred representation for the current
553 * local of the actual date. This is roughly equivalent to:
555 * <informalexample><programlisting language="C">
556 * strftime(buffer, sizeof(buffer), "%x", now);
557 * adg_title_block_set_date(title_block, buffer);
558 * </programlisting></informalexample>
560 * To not render any value, use an empty string as @date.
565 adg_title_block_set_date(AdgTitleBlock
*title_block
, const gchar
*date
)
567 g_return_if_fail(ADG_IS_TITLE_BLOCK(title_block
));
568 g_object_set(title_block
, "date", date
, NULL
);
572 * adg_title_block_get_date:
573 * @title_block: an #AdgTitleBlock entity
575 * Gets the date of the rendering set on @title_block.
577 * Returns: (transfer none): the date or <constant>NULL</constant> on no date or errors.
582 adg_title_block_get_date(AdgTitleBlock
*title_block
)
584 AdgTitleBlockPrivate
*data
;
586 g_return_val_if_fail(ADG_IS_TITLE_BLOCK(title_block
), NULL
);
588 data
= title_block
->data
;
594 * adg_title_block_set_logo:
595 * @title_block: an #AdgTitleBlock entity
596 * @logo: the new logo
598 * Sets a new logo on the title block. This function will add
599 * a reference to @logo, removing the eventual reference held
600 * to the old logo, hence possibly destroying the old endity.
602 * The space reserved for the logo is 56x56, so try to keep the
603 * new logo near this size or scale it accordingly.
608 adg_title_block_set_logo(AdgTitleBlock
*title_block
, AdgEntity
*logo
)
610 g_return_if_fail(ADG_IS_TITLE_BLOCK(title_block
));
611 g_object_set(title_block
, "logo", logo
, NULL
);
615 * adg_title_block_logo:
616 * @title_block: an #AdgTitleBlock entity
618 * Gets the logo bound to this title block.
619 * The returned object is owned by @title_block and should not
620 * be unreferenced although can be freely modified.
622 * Returns: (transfer none): the logo or <constant>NULL</constant> on no logo or errors.
627 adg_title_block_logo(AdgTitleBlock
*title_block
)
629 AdgTitleBlockPrivate
*data
;
631 g_return_val_if_fail(ADG_IS_TITLE_BLOCK(title_block
), NULL
);
633 data
= title_block
->data
;
639 * adg_title_block_set_projection:
640 * @title_block: an #AdgTitleBlock entity
641 * @projection: the new projection
643 * Sets a new projection symbol on the title block. This function
644 * will add a reference to @projection, removing the eventual
645 * reference held to the old symbol, hence possibly destroying
648 * The space reserved for the projection is 56x56, so try to keep the
649 * new projection near this size or scale it accordingly.
654 adg_title_block_set_projection(AdgTitleBlock
*title_block
,
655 AdgEntity
*projection
)
657 g_return_if_fail(ADG_IS_TITLE_BLOCK(title_block
));
658 g_object_set(title_block
, "projection", projection
, NULL
);
662 * adg_title_block_projection:
663 * @title_block: an #AdgTitleBlock entity
665 * Gets the projection bound to this title block.
666 * The returned object is owned by @title_block and should not
667 * be unreferenced although can be freely modified.
669 * Returns: (transfer none): the projection or <constant>NULL</constant> on no projection or errors.
674 adg_title_block_projection(AdgTitleBlock
*title_block
)
676 AdgTitleBlockPrivate
*data
;
678 g_return_val_if_fail(ADG_IS_TITLE_BLOCK(title_block
), NULL
);
680 data
= title_block
->data
;
682 return data
->projection
;