3 * Copyright (C) 2003-2009 Jim Evins <evins@snaught.com>.
5 * This file is part of gLabels.
7 * gLabels is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * gLabels is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with gLabels. If not, see <http://www.gnu.org/licenses/>.
23 #include "object-editor.h"
25 #include <glib/gi18n.h>
30 #include "color-combo.h"
32 #include "wdgt-chain-button.h"
33 #include "field-button.h"
35 #include "combo-util.h"
36 #include "builder-util.h"
37 #include "label-box.h"
38 #include "label-ellipse.h"
39 #include "label-line.h"
40 #include "label-image.h"
41 #include "label-text.h"
42 #include "label-barcode.h"
44 #include "object-editor-private.h"
49 /*===========================================*/
51 /*===========================================*/
54 /*===========================================*/
55 /* Private data types */
56 /*===========================================*/
59 /*===========================================*/
61 /*===========================================*/
64 /*===========================================*/
65 /* Local function prototypes */
66 /*===========================================*/
68 static void gl_object_editor_finalize (GObject *object);
70 static void set_object (glObjectEditor *editor,
71 glLabelObject *object);
73 static void prefs_changed_cb (glObjectEditor *editor);
75 static void label_changed_cb (glLabel *label,
76 glObjectEditor *editor);
78 static void selection_changed_cb (glLabel *label,
79 glObjectEditor *editor);
81 static void merge_changed_cb (glLabel *label,
82 glObjectEditor *editor);
84 static void set_key_names (glObjectEditor *editor,
87 static void object_changed_cb (glLabelObject *object,
88 glObjectEditor *editor);
90 static void object_moved_cb (glLabelObject *object,
91 glObjectEditor *editor);
95 /*****************************************************************************/
96 /* Boilerplate object stuff. */
97 /*****************************************************************************/
98 G_DEFINE_TYPE (glObjectEditor, gl_object_editor, GTK_TYPE_VBOX)
102 gl_object_editor_class_init (glObjectEditorClass *class)
104 GObjectClass *object_class = G_OBJECT_CLASS (class);
106 gl_debug (DEBUG_EDITOR, "START");
108 gl_object_editor_parent_class = g_type_class_peek_parent (class);
110 object_class->finalize = gl_object_editor_finalize;
115 gl_object_editor_init (glObjectEditor *editor)
117 gchar *builder_filename;
118 static gchar *object_ids[] = { "editor_vbox",
119 "adjustment1", "adjustment2", "adjustment3",
120 "adjustment4", "adjustment5", "adjustment6",
121 "adjustment7", "adjustment8", "adjustment9",
122 "adjustment10", "adjustment11", "adjustment12",
123 "adjustment13", "page_sizegroup", "width_sizegroup",
125 GError *error = NULL;
128 gl_debug (DEBUG_EDITOR, "START");
130 editor->priv = g_new0 (glObjectEditorPrivate, 1);
132 editor->priv->builder = gtk_builder_new ();
134 builder_filename = g_build_filename (GLABELS_DATA_DIR, "ui", "object-editor.ui", NULL);
135 gtk_builder_add_objects_from_file (editor->priv->builder, builder_filename, object_ids, &error);
136 g_free (builder_filename);
138 g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
139 g_error_free (error);
143 gl_builder_util_get_widgets (editor->priv->builder,
144 "editor_vbox", &editor->priv->editor_vbox,
145 "title_image", &editor->priv->title_image,
146 "title_label", &editor->priv->title_label,
147 "notebook", &editor->priv->notebook,
150 gtk_box_pack_start (GTK_BOX(editor),
151 editor->priv->editor_vbox,
154 gtk_widget_show_all (GTK_WIDGET(editor));
156 gtk_image_set_from_icon_name (GTK_IMAGE(editor->priv->title_image),
157 "glabels-object-properties",
158 GTK_ICON_SIZE_LARGE_TOOLBAR);
160 s = g_strdup_printf ("<span weight=\"bold\">%s</span>",
161 _("Object properties"));
162 gtk_label_set_text (GTK_LABEL(editor->priv->title_label), s);
163 gtk_label_set_use_markup (GTK_LABEL(editor->priv->title_label), TRUE);
166 gtk_widget_set_sensitive (editor->priv->title_image, FALSE);
167 gtk_widget_set_sensitive (editor->priv->title_label, FALSE);
169 /* Hide all notebook pages to start with. */
170 gtk_widget_hide (editor->priv->notebook);
171 gtk_widget_set_no_show_all (editor->priv->notebook, TRUE);
173 gl_debug (DEBUG_EDITOR, "END");
178 gl_object_editor_finalize (GObject *object)
180 glObjectEditor* editor = GL_OBJECT_EDITOR (object);;
182 gl_debug (DEBUG_EDITOR, "START");
184 g_return_if_fail (object != NULL);
185 g_return_if_fail (GL_IS_OBJECT_EDITOR (editor));
186 g_return_if_fail (editor->priv != NULL);
188 g_signal_handlers_disconnect_by_func (G_OBJECT(gl_prefs),
189 prefs_changed_cb, editor);
191 if (editor->priv->label)
193 g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->label),
194 label_changed_cb, editor);
195 g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->label),
196 merge_changed_cb, editor);
197 g_object_unref (editor->priv->label);
200 if (editor->priv->object)
202 g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->object),
203 object_changed_cb, editor);
204 g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->object),
205 object_moved_cb, editor);
206 g_object_unref (editor->priv->object);
209 g_object_unref (editor->priv->builder);
211 g_free (editor->priv->current_backend_id);
212 g_free (editor->priv);
214 G_OBJECT_CLASS (gl_object_editor_parent_class)->finalize (object);
216 gl_debug (DEBUG_EDITOR, "END");
220 /*****************************************************************************/
221 /* NEW object editor. */
222 /*****************************************************************************/
224 gl_object_editor_new (void)
226 glObjectEditor *editor;
228 gl_debug (DEBUG_EDITOR, "START");
230 editor = GL_OBJECT_EDITOR (g_object_new (GL_TYPE_OBJECT_EDITOR, NULL));
232 gtk_widget_set_sensitive (editor->priv->title_image, FALSE);
233 gtk_widget_set_sensitive (editor->priv->title_label, FALSE);
235 gl_object_editor_prepare_position_page (editor);
236 gl_object_editor_prepare_size_page (editor);
237 gl_object_editor_prepare_lsize_page (editor);
238 gl_object_editor_prepare_fill_page (editor);
239 gl_object_editor_prepare_line_page (editor);
240 gl_object_editor_prepare_image_page (editor);
241 gl_object_editor_prepare_text_page (editor);
242 gl_object_editor_prepare_edit_page (editor);
243 gl_object_editor_prepare_bc_page (editor);
244 gl_object_editor_prepare_data_page (editor);
245 gl_object_editor_prepare_shadow_page (editor);
247 g_signal_connect_swapped (G_OBJECT (gl_prefs), "changed",
248 G_CALLBACK (prefs_changed_cb), editor);
250 gl_debug (DEBUG_EDITOR, "END");
252 return GTK_WIDGET(editor);
256 /*****************************************************************************/
258 /*****************************************************************************/
260 gl_object_editor_set_label (glObjectEditor *editor,
263 gl_debug (DEBUG_EDITOR, "START");
265 editor->priv->label = g_object_ref (label);
267 label_changed_cb (label, editor);
268 merge_changed_cb (label, editor);
270 g_signal_connect (G_OBJECT(label), "selection_changed",
271 G_CALLBACK(selection_changed_cb), editor);
272 g_signal_connect (G_OBJECT (label), "size_changed",
273 G_CALLBACK (label_changed_cb), editor);
274 g_signal_connect (G_OBJECT (label), "merge_changed",
275 G_CALLBACK (merge_changed_cb), editor);
277 gl_debug (DEBUG_EDITOR, "END");
281 /*--------------------------------------------------------------------------*/
282 /* Private. Set object. */
283 /*--------------------------------------------------------------------------*/
285 set_object (glObjectEditor *editor,
286 glLabelObject *object)
291 GtkTextBuffer *buffer;
292 gint old_page, new_page;
294 gl_debug (DEBUG_EDITOR, "START");
296 if ( editor->priv->object != NULL )
298 g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->object),
299 object_changed_cb, editor);
300 g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->object),
301 object_moved_cb, editor);
302 g_object_unref (editor->priv->object);
307 editor->priv->object = g_object_ref (object);
309 old_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (editor->priv->notebook));
311 if (GL_IS_LABEL_BOX (object))
313 image = "glabels-box";
314 title = _("Box object properties");
316 gtk_widget_show_all (editor->priv->pos_page_vbox);
317 gtk_widget_show_all (editor->priv->size_page_vbox);
318 gtk_widget_hide (editor->priv->lsize_page_vbox);
319 gtk_widget_show_all (editor->priv->fill_page_vbox);
320 gtk_widget_show_all (editor->priv->line_page_vbox);
321 gtk_widget_hide (editor->priv->img_page_vbox);
322 gtk_widget_hide (editor->priv->text_page_vbox);
323 gtk_widget_hide (editor->priv->edit_page_vbox);
324 gtk_widget_hide (editor->priv->bc_page_vbox);
325 gtk_widget_hide (editor->priv->data_page_vbox);
326 gtk_widget_show_all (editor->priv->shadow_page_vbox);
328 gtk_widget_hide (editor->priv->size_reset_image_button);
330 else if (GL_IS_LABEL_ELLIPSE (object))
332 image = "glabels-ellipse";
333 title = _("Ellipse object properties");
335 gtk_widget_show_all (editor->priv->pos_page_vbox);
336 gtk_widget_show_all (editor->priv->size_page_vbox);
337 gtk_widget_hide (editor->priv->lsize_page_vbox);
338 gtk_widget_show_all (editor->priv->fill_page_vbox);
339 gtk_widget_show_all (editor->priv->line_page_vbox);
340 gtk_widget_hide (editor->priv->img_page_vbox);
341 gtk_widget_hide (editor->priv->text_page_vbox);
342 gtk_widget_hide (editor->priv->edit_page_vbox);
343 gtk_widget_hide (editor->priv->bc_page_vbox);
344 gtk_widget_hide (editor->priv->data_page_vbox);
345 gtk_widget_show_all (editor->priv->shadow_page_vbox);
347 gtk_widget_hide (editor->priv->size_reset_image_button);
349 else if (GL_IS_LABEL_LINE (object))
351 image = "glabels-line";
352 title = _("Line object properties");
354 gtk_widget_show_all (editor->priv->pos_page_vbox);
355 gtk_widget_hide (editor->priv->size_page_vbox);
356 gtk_widget_show_all (editor->priv->lsize_page_vbox);
357 gtk_widget_hide (editor->priv->fill_page_vbox);
358 gtk_widget_show_all (editor->priv->line_page_vbox);
359 gtk_widget_hide (editor->priv->img_page_vbox);
360 gtk_widget_hide (editor->priv->text_page_vbox);
361 gtk_widget_hide (editor->priv->edit_page_vbox);
362 gtk_widget_hide (editor->priv->bc_page_vbox);
363 gtk_widget_hide (editor->priv->data_page_vbox);
364 gtk_widget_show_all (editor->priv->shadow_page_vbox);
366 else if (GL_IS_LABEL_IMAGE (object))
368 image = "glabels-image";
369 title = _("Image object properties");
371 gtk_widget_show_all (editor->priv->pos_page_vbox);
372 gtk_widget_show_all (editor->priv->size_page_vbox);
373 gtk_widget_hide (editor->priv->lsize_page_vbox);
374 gtk_widget_hide (editor->priv->fill_page_vbox);
375 gtk_widget_hide (editor->priv->line_page_vbox);
376 gtk_widget_show_all (editor->priv->img_page_vbox);
377 gtk_widget_hide (editor->priv->text_page_vbox);
378 gtk_widget_hide (editor->priv->edit_page_vbox);
379 gtk_widget_hide (editor->priv->bc_page_vbox);
380 gtk_widget_hide (editor->priv->data_page_vbox);
381 gtk_widget_show_all (editor->priv->shadow_page_vbox);
383 else if (GL_IS_LABEL_TEXT (object))
385 image = "glabels-text";
386 title = _("Text object properties");
388 gtk_widget_show_all (editor->priv->pos_page_vbox);
389 gtk_widget_show_all (editor->priv->size_page_vbox);
390 gtk_widget_hide (editor->priv->lsize_page_vbox);
391 gtk_widget_hide (editor->priv->fill_page_vbox);
392 gtk_widget_hide (editor->priv->line_page_vbox);
393 gtk_widget_hide (editor->priv->img_page_vbox);
394 gtk_widget_show_all (editor->priv->text_page_vbox);
395 gtk_widget_show_all (editor->priv->edit_page_vbox);
396 gtk_widget_hide (editor->priv->bc_page_vbox);
397 gtk_widget_hide (editor->priv->data_page_vbox);
398 gtk_widget_show_all (editor->priv->shadow_page_vbox);
400 gtk_widget_hide (editor->priv->size_reset_image_button);
402 buffer = gl_label_text_get_buffer (GL_LABEL_TEXT(object));
403 gl_object_editor_set_text_buffer (editor, buffer);
405 else if (GL_IS_LABEL_BARCODE (object))
407 image = "glabels-barcode";
408 title = _("Barcode object properties");
410 gtk_widget_show_all (editor->priv->pos_page_vbox);
411 gtk_widget_show_all (editor->priv->size_page_vbox);
412 gtk_widget_hide (editor->priv->lsize_page_vbox);
413 gtk_widget_hide (editor->priv->fill_page_vbox);
414 gtk_widget_hide (editor->priv->line_page_vbox);
415 gtk_widget_hide (editor->priv->img_page_vbox);
416 gtk_widget_hide (editor->priv->text_page_vbox);
417 gtk_widget_hide (editor->priv->edit_page_vbox);
418 gtk_widget_show_all (editor->priv->bc_page_vbox);
419 gtk_widget_show_all (editor->priv->data_page_vbox);
420 gtk_widget_hide (editor->priv->shadow_page_vbox);
422 gtk_widget_hide (editor->priv->size_reset_image_button);
425 gtk_image_set_from_icon_name (GTK_IMAGE(editor->priv->title_image),
427 GTK_ICON_SIZE_LARGE_TOOLBAR);
429 s = g_strdup_printf ("<span weight=\"bold\">%s</span>",
431 gtk_label_set_text (GTK_LABEL(editor->priv->title_label), s);
432 gtk_label_set_use_markup (GTK_LABEL(editor->priv->title_label), TRUE);
435 gtk_widget_set_sensitive (editor->priv->title_image, TRUE);
436 gtk_widget_set_sensitive (editor->priv->title_label, TRUE);
438 gtk_widget_show (editor->priv->notebook);
440 /* if the old active page is no longer visible, set to 1st visible page. */
441 new_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (editor->priv->notebook));
442 if ( old_page != new_page )
444 /* Trick: try in reverse order, only the last visible attempt will stick. */
445 gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 5);
446 gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 4);
447 gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 3);
448 gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 2);
449 gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 1);
450 gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 0);
453 object_moved_cb (object, editor);
454 object_changed_cb (object, editor);
456 g_signal_connect (G_OBJECT (object), "changed",
457 G_CALLBACK (object_changed_cb), editor);
458 g_signal_connect (G_OBJECT (object), "moved",
459 G_CALLBACK (object_moved_cb), editor);
463 gtk_widget_hide (editor->priv->notebook);
465 editor->priv->object = NULL;
467 gtk_image_set_from_icon_name (GTK_IMAGE(editor->priv->title_image),
468 "glabels-object-properties",
469 GTK_ICON_SIZE_LARGE_TOOLBAR);
471 s = g_strdup_printf ("<span weight=\"bold\">%s</span>",
472 _("Object properties"));
473 gtk_label_set_text (GTK_LABEL(editor->priv->title_label), s);
474 gtk_label_set_use_markup (GTK_LABEL(editor->priv->title_label), TRUE);
477 gtk_widget_set_sensitive (editor->priv->title_image, FALSE);
478 gtk_widget_set_sensitive (editor->priv->title_label, FALSE);
481 gl_debug (DEBUG_EDITOR, "END");
485 /*--------------------------------------------------------------------------*/
486 /* PRIVATE. Prefs changed callback. Update units related items. */
487 /*--------------------------------------------------------------------------*/
489 prefs_changed_cb (glObjectEditor *editor)
492 gl_debug (DEBUG_EDITOR, "START");
494 if (editor->priv->lsize_r_spin) {
495 lsize_prefs_changed_cb (editor);
498 if (editor->priv->size_w_spin) {
499 size_prefs_changed_cb (editor);
502 if (editor->priv->pos_x_spin) {
503 position_prefs_changed_cb (editor);
506 if (editor->priv->shadow_x_spin) {
507 shadow_prefs_changed_cb (editor);
510 gl_debug (DEBUG_EDITOR, "END");
514 /*---------------------------------------------------------------------------*/
515 /* PRIVATE. Label "selection state changed" callback. */
516 /*---------------------------------------------------------------------------*/
518 selection_changed_cb (glLabel *label,
519 glObjectEditor *editor)
521 glLabelObject *object;
523 gl_debug (DEBUG_EDITOR, "START");
525 g_return_if_fail (label && GL_IS_LABEL (label));
526 g_return_if_fail (editor && GL_IS_OBJECT_EDITOR (editor));
528 if (!gl_label_is_selection_atomic (label))
530 set_object (editor, NULL);
534 object = gl_label_get_1st_selected_object (label);
535 set_object (editor, object);
538 gl_debug (DEBUG_EDITOR, "END");
542 /*---------------------------------------------------------------------------*/
543 /* PRIVATE. label "size_changed" callback. */
544 /*---------------------------------------------------------------------------*/
546 label_changed_cb (glLabel *label,
547 glObjectEditor *editor)
549 gdouble label_width, label_height;
551 gl_debug (DEBUG_EDITOR, "START");
553 gl_label_get_size (label, &label_width, &label_height);
554 gl_object_editor_set_max_position (GL_OBJECT_EDITOR (editor),
555 label_width, label_height);
556 gl_object_editor_set_max_size (GL_OBJECT_EDITOR (editor),
557 label_width, label_height);
558 gl_object_editor_set_max_lsize (GL_OBJECT_EDITOR (editor),
559 label_width, label_height);
560 gl_object_editor_set_max_shadow_offset (GL_OBJECT_EDITOR (editor),
561 label_width, label_height);
563 gl_debug (DEBUG_EDITOR, "END");
567 /*---------------------------------------------------------------------------*/
568 /* PRIVATE. label "merge_changed" callback. */
569 /*---------------------------------------------------------------------------*/
571 merge_changed_cb (glLabel *label,
572 glObjectEditor *editor)
576 gl_debug (DEBUG_EDITOR, "START");
578 merge = gl_label_get_merge (label);
579 set_key_names (editor, merge);
581 gl_debug (DEBUG_EDITOR, "END");
585 /*---------------------------------------------------------------------------*/
586 /* PRIVATE. Load up possible key names from merge into various widgets. */
587 /*---------------------------------------------------------------------------*/
589 set_key_names (glObjectEditor *editor,
597 gl_debug (DEBUG_EDITOR, "START");
599 gtk_widget_set_sensitive (editor->priv->text_auto_shrink_check,
602 gtk_widget_set_sensitive (editor->priv->text_color_key_radio, merge != NULL);
605 gtk_toggle_button_set_active (
606 GTK_TOGGLE_BUTTON(editor->priv->text_color_radio), TRUE);
607 gtk_widget_set_sensitive (editor->priv->text_color_combo, TRUE);
608 gtk_widget_set_sensitive (editor->priv->text_color_key_combo, FALSE);
612 state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->text_color_key_radio));
613 gtk_widget_set_sensitive (editor->priv->text_color_combo, !state);
614 gtk_widget_set_sensitive (editor->priv->text_color_key_combo, state);
617 gtk_widget_set_sensitive (editor->priv->edit_insert_field_button,
620 gtk_widget_set_sensitive (editor->priv->img_key_combo, merge != NULL);
622 gtk_widget_set_sensitive (editor->priv->img_key_radio, merge != NULL);
623 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(editor->priv->img_file_radio),
626 gtk_widget_set_sensitive (editor->priv->data_key_combo, merge != NULL);
628 gtk_widget_set_sensitive (editor->priv->data_key_radio, merge != NULL);
629 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(editor->priv->data_literal_radio),
632 fixed_flag = editor->priv->data_format_fixed_flag;
633 gtk_widget_set_sensitive (editor->priv->data_format_label, merge != NULL);
634 gtk_widget_set_sensitive (editor->priv->data_ex_label, merge != NULL);
635 gtk_widget_set_sensitive (editor->priv->data_digits_label,
636 (merge != NULL) && !fixed_flag);
637 gtk_widget_set_sensitive (editor->priv->data_digits_spin,
638 (merge != NULL) && !fixed_flag);
640 gtk_widget_set_sensitive (editor->priv->fill_key_radio, merge != NULL);
643 gtk_toggle_button_set_active (
644 GTK_TOGGLE_BUTTON(editor->priv->fill_color_radio), TRUE);
645 gtk_widget_set_sensitive (editor->priv->fill_color_combo, TRUE);
646 gtk_widget_set_sensitive (editor->priv->fill_key_combo, FALSE);
650 state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->fill_key_radio));
651 gtk_widget_set_sensitive (editor->priv->fill_color_combo, !state);
652 gtk_widget_set_sensitive (editor->priv->fill_key_combo, state);
655 gtk_widget_set_sensitive (editor->priv->line_key_radio, merge != NULL);
658 gtk_toggle_button_set_active (
659 GTK_TOGGLE_BUTTON(editor->priv->line_color_radio), TRUE);
660 gtk_widget_set_sensitive (editor->priv->line_color_combo, TRUE);
661 gtk_widget_set_sensitive (editor->priv->line_key_combo, FALSE);
665 state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->line_key_radio));
666 gtk_widget_set_sensitive (editor->priv->line_color_combo, !state);
667 gtk_widget_set_sensitive (editor->priv->line_key_combo, state);
670 gtk_widget_set_sensitive (editor->priv->bc_key_radio, merge != NULL);
673 gtk_toggle_button_set_active (
674 GTK_TOGGLE_BUTTON(editor->priv->bc_color_radio), TRUE);
675 gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE);
676 gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE);
680 state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->bc_key_radio));
681 gtk_widget_set_sensitive (editor->priv->bc_color_combo, !state);
682 gtk_widget_set_sensitive (editor->priv->bc_key_combo, state);
685 gtk_widget_set_sensitive (editor->priv->shadow_key_radio, merge != NULL);
688 gtk_toggle_button_set_active (
689 GTK_TOGGLE_BUTTON(editor->priv->shadow_color_radio), TRUE);
690 gtk_widget_set_sensitive (editor->priv->shadow_color_combo, TRUE);
691 gtk_widget_set_sensitive (editor->priv->shadow_key_combo, FALSE);
695 state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->shadow_key_radio));
696 gtk_widget_set_sensitive (editor->priv->shadow_color_combo, !state);
697 gtk_widget_set_sensitive (editor->priv->shadow_key_combo, state);
700 keys = gl_merge_get_key_list (merge);
701 if ( keys == NULL ) {
702 keys = g_list_append (keys, g_strdup (""));
705 button = editor->priv->img_key_combo;
706 gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
708 button = editor->priv->edit_insert_field_button;
709 gl_field_button_set_keys (GL_FIELD_BUTTON(button), keys);
711 button = editor->priv->data_key_combo;
712 gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
714 button = editor->priv->fill_key_combo;
715 gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
717 button = editor->priv->text_color_key_combo;
718 gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
720 button = editor->priv->line_key_combo;
721 gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
723 button = editor->priv->bc_key_combo;
724 gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
726 button = editor->priv->shadow_key_combo;
727 gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
729 gl_merge_free_key_list (&keys);
731 gl_debug (DEBUG_EDITOR, "END");
735 /*---------------------------------------------------------------------------*/
736 /* PRIVATE. object "changed" callback. */
737 /*---------------------------------------------------------------------------*/
739 object_changed_cb (glLabelObject *object,
740 glObjectEditor *editor)
743 glColorNode *line_color_node;
745 glColorNode *fill_color_node;
748 PangoWeight font_weight;
749 gboolean font_italic_flag;
750 glColorNode *text_color_node;
751 PangoAlignment align;
753 gdouble text_line_spacing;
754 gboolean auto_shrink;
755 gdouble image_w, image_h;
756 glTextNode *filename;
758 glLabelBarcodeStyle *bc_style;
759 gboolean shadow_state;
760 gdouble shadow_x, shadow_y;
761 glColorNode *shadow_color_node;
762 gdouble shadow_opacity;
766 gl_debug (DEBUG_EDITOR, "BEGIN");
769 label = gl_label_object_get_parent (object);
770 merge = gl_label_get_merge (label);
773 if ( GL_IS_LABEL_BOX (object) || GL_IS_LABEL_ELLIPSE (object) )
776 gl_label_object_get_size (object, &w, &h);
777 fill_color_node = gl_label_object_get_fill_color (GL_LABEL_OBJECT(object));
778 line_color_node = gl_label_object_get_line_color (GL_LABEL_OBJECT(object));
779 line_width = gl_label_object_get_line_width (GL_LABEL_OBJECT(object));
781 gl_object_editor_set_size (editor, w, h);
782 gl_object_editor_set_fill_color (editor, (merge != NULL), fill_color_node);
783 gl_object_editor_set_line_color (editor, (merge != NULL), line_color_node);
784 gl_object_editor_set_line_width (editor, line_width);
786 gl_color_node_free (&fill_color_node);
787 gl_color_node_free (&line_color_node);
790 else if ( GL_IS_LABEL_LINE (object) )
793 gl_label_object_get_size (object, &w, &h);
794 line_color_node = gl_label_object_get_line_color (GL_LABEL_OBJECT(object));
795 line_width = gl_label_object_get_line_width (GL_LABEL_OBJECT(object));
797 gl_object_editor_set_lsize (editor, w, h);
798 gl_object_editor_set_line_color (editor, (merge != NULL), line_color_node);
799 gl_object_editor_set_line_width (editor, line_width);
801 gl_color_node_free (&line_color_node);
804 else if ( GL_IS_LABEL_IMAGE (object) )
807 gl_label_object_get_size (object, &w, &h);
808 filename = gl_label_image_get_filename (GL_LABEL_IMAGE(object));
810 gl_label_image_get_base_size (GL_LABEL_IMAGE(object), &image_w, &image_h);
812 gl_object_editor_set_size (editor, w, h);
813 gl_object_editor_set_base_size (editor, image_w, image_h);
814 gl_object_editor_set_image (editor, (merge != NULL), filename);
816 gl_text_node_free (&filename);
819 else if ( GL_IS_LABEL_TEXT (object) )
822 gl_label_object_get_size (object, &w, &h);
823 font_family = gl_label_object_get_font_family (object);
824 font_size = gl_label_object_get_font_size (object);
825 font_weight = gl_label_object_get_font_weight (object);
826 font_italic_flag = gl_label_object_get_font_italic_flag (object);
827 text_color_node = gl_label_object_get_text_color (object);
828 align = gl_label_object_get_text_alignment (object);
829 valign = gl_label_object_get_text_valignment (object);
830 text_line_spacing = gl_label_object_get_text_line_spacing (object);
831 auto_shrink = gl_label_text_get_auto_shrink (GL_LABEL_TEXT (object));
833 gl_object_editor_set_size (editor, w, h);
834 gl_object_editor_set_font_family (editor, font_family);
835 gl_object_editor_set_font_size (editor, font_size);
836 gl_object_editor_set_font_weight (editor, font_weight);
837 gl_object_editor_set_font_italic_flag (editor, font_italic_flag);
838 gl_object_editor_set_text_color (editor, (merge != NULL), text_color_node);
839 gl_object_editor_set_text_alignment (editor, align);
840 gl_object_editor_set_text_valignment (editor, valign);
841 gl_object_editor_set_text_line_spacing (editor, text_line_spacing);
842 gl_object_editor_set_text_auto_shrink (editor, auto_shrink);
844 gl_color_node_free (&text_color_node);
845 g_free (font_family);
848 else if ( GL_IS_LABEL_BARCODE (object) )
851 gl_label_object_get_size (object, &w, &h);
852 bc_data = gl_label_barcode_get_data (GL_LABEL_BARCODE(object));
853 bc_style = gl_label_barcode_get_style (GL_LABEL_BARCODE(object));
854 line_color_node = gl_label_object_get_line_color (GL_LABEL_OBJECT(object));
856 gl_object_editor_set_size (editor, w, h);
857 gl_object_editor_set_data (editor, (merge != NULL), bc_data);
858 gl_object_editor_set_bc_style (editor, bc_style);
859 gl_object_editor_set_bc_color (editor, (merge != NULL), line_color_node);
861 gl_text_node_free (&bc_data);
862 gl_label_barcode_style_free (bc_style);
867 shadow_state = gl_label_object_get_shadow_state (object);
868 gl_label_object_get_shadow_offset (object, &shadow_x, &shadow_y);
869 shadow_color_node = gl_label_object_get_shadow_color (object);
870 shadow_opacity = gl_label_object_get_shadow_opacity (object);
872 gl_object_editor_set_shadow_state (editor, shadow_state);
873 gl_object_editor_set_shadow_offset (editor, shadow_x, shadow_y);
874 gl_object_editor_set_shadow_color (editor, (merge != NULL), shadow_color_node);
875 gl_object_editor_set_shadow_opacity (editor, shadow_opacity);
877 gl_color_node_free (&shadow_color_node);
880 gl_debug (DEBUG_EDITOR, "END");
884 /*---------------------------------------------------------------------------*/
885 /* PRIVATE. object "moved" callback. */
886 /*---------------------------------------------------------------------------*/
888 object_moved_cb (glLabelObject *object,
889 glObjectEditor *editor)
893 gl_debug (DEBUG_EDITOR, "BEGIN");
895 gl_label_object_get_position (object, &x, &y);
896 gl_object_editor_set_position (editor, x, y);
898 gl_debug (DEBUG_EDITOR, "END");
902 /*****************************************************************************/
903 /* Object editor "changed" callback. */
904 /*****************************************************************************/
906 gl_object_editor_changed_cb (glObjectEditor *editor)
908 glLabelObject *object = editor->priv->object;
910 glColorNode *line_color_node;
912 glColorNode *fill_color_node;
915 PangoWeight font_weight;
916 gboolean font_italic_flag;
917 glColorNode *text_color_node;
918 PangoAlignment align;
920 gdouble text_line_spacing;
921 gboolean auto_shrink;
922 glTextNode *filename;
924 gdouble image_w, image_h;
925 gdouble new_w, new_h;
927 glLabelBarcodeStyle *bc_style;
928 gboolean shadow_state;
929 gdouble shadow_x, shadow_y;
930 glColorNode *shadow_color_node;
931 gdouble shadow_opacity;
933 gl_debug (DEBUG_EDITOR, "BEGIN");
936 g_signal_handlers_block_by_func (G_OBJECT (object), object_changed_cb, editor);
937 g_signal_handlers_block_by_func (G_OBJECT (object), object_moved_cb, editor);
940 gl_object_editor_get_position (editor, &x, &y);
941 gl_label_object_set_position (object, x, y, TRUE);
944 if ( GL_IS_LABEL_BOX (object) || GL_IS_LABEL_ELLIPSE (object) )
947 fill_color_node = gl_object_editor_get_fill_color (editor);
948 line_color_node = gl_object_editor_get_line_color (editor);
949 line_width = gl_object_editor_get_line_width (editor);
951 gl_label_object_set_fill_color (object, fill_color_node, TRUE);
952 gl_label_object_set_line_color (object, line_color_node, TRUE);
953 gl_label_object_set_line_width (object, line_width, TRUE);
955 gl_color_node_free (&fill_color_node);
956 gl_color_node_free (&line_color_node);
959 else if (GL_IS_LABEL_LINE (object))
962 line_color_node = gl_object_editor_get_line_color (editor);
963 line_width = gl_object_editor_get_line_width (editor);
965 gl_label_object_set_line_color (object, line_color_node, TRUE);
966 gl_label_object_set_line_width (object, line_width, TRUE);
968 gl_color_node_free (&line_color_node);
971 else if ( GL_IS_LABEL_IMAGE (object) )
974 filename = gl_object_editor_get_image (editor);
976 gl_label_image_set_filename (GL_LABEL_IMAGE(object), filename, TRUE);
978 /* Setting filename may have modified the size. */
979 gl_object_editor_get_size (editor, &w, &h);
980 gl_label_object_get_size (object, &new_w, &new_h);
981 if ( (new_w != w) || (new_h != h) )
983 gl_object_editor_set_size (editor, new_w, new_h);
986 /* It may also have a new base size. */
987 gl_label_image_get_base_size (GL_LABEL_IMAGE(object), &image_w, &image_h);
988 gl_object_editor_set_base_size (editor, image_w, image_h);
990 gl_text_node_free (&filename);
993 else if (GL_IS_LABEL_TEXT (object))
996 font_family = gl_object_editor_get_font_family (editor);
997 font_size = gl_object_editor_get_font_size (editor);
998 font_weight = gl_object_editor_get_font_weight (editor);
999 font_italic_flag = gl_object_editor_get_font_italic_flag (editor);
1000 text_color_node = gl_object_editor_get_text_color (editor);
1001 align = gl_object_editor_get_text_alignment (editor);
1002 valign = gl_object_editor_get_text_valignment (editor);
1003 text_line_spacing = gl_object_editor_get_text_line_spacing (editor);
1004 auto_shrink = gl_object_editor_get_text_auto_shrink (editor);
1006 gl_label_object_set_font_family (object, font_family, TRUE);
1007 gl_label_object_set_font_size (object, font_size, TRUE);
1008 gl_label_object_set_font_weight (object, font_weight, TRUE);
1009 gl_label_object_set_font_italic_flag (object, font_italic_flag, TRUE);
1010 gl_label_object_set_text_color (object, text_color_node, TRUE);
1011 gl_label_object_set_text_alignment (object, align, TRUE);
1012 gl_label_object_set_text_valignment (object, valign, TRUE);
1013 gl_label_object_set_text_line_spacing (object, text_line_spacing, TRUE);
1014 gl_label_text_set_auto_shrink (GL_LABEL_TEXT (object), auto_shrink, TRUE);
1016 gl_color_node_free (&text_color_node);
1017 g_free (font_family);
1020 else if (GL_IS_LABEL_BARCODE (object))
1023 line_color_node = gl_object_editor_get_bc_color (editor);
1024 bc_data = gl_object_editor_get_data (editor);
1025 bc_style = gl_object_editor_get_bc_style (editor);
1027 gl_label_object_set_line_color (object, line_color_node, TRUE);
1028 gl_label_barcode_set_data (GL_LABEL_BARCODE(object), bc_data, TRUE);
1029 gl_label_barcode_set_style (GL_LABEL_BARCODE(object), bc_style, TRUE);
1031 gl_color_node_free (&line_color_node);
1032 gl_text_node_free (&bc_data);
1033 gl_label_barcode_style_free (bc_style);
1038 shadow_state = gl_object_editor_get_shadow_state (editor);
1039 gl_object_editor_get_shadow_offset (editor, &shadow_x, &shadow_y);
1040 shadow_color_node = gl_object_editor_get_shadow_color (editor);
1041 shadow_opacity = gl_object_editor_get_shadow_opacity (editor);
1043 gl_label_object_set_shadow_state (object, shadow_state, TRUE);
1044 gl_label_object_set_shadow_offset (object, shadow_x, shadow_y, TRUE);
1045 gl_label_object_set_shadow_color (object, shadow_color_node, TRUE);
1046 gl_label_object_set_shadow_opacity (object, shadow_opacity, TRUE);
1048 gl_color_node_free (&shadow_color_node);
1051 g_signal_handlers_unblock_by_func (G_OBJECT (object), object_changed_cb, editor);
1052 g_signal_handlers_unblock_by_func (G_OBJECT (object), object_moved_cb, editor);
1054 gl_debug (DEBUG_EDITOR, "END");
1058 /*****************************************************************************/
1059 /* Object editor "size_changed" callback. */
1060 /*****************************************************************************/
1062 gl_object_editor_size_changed_cb (glObjectEditor *editor)
1064 glLabelObject *object = editor->priv->object;
1067 gl_debug (DEBUG_EDITOR, "BEGIN");
1069 g_signal_handlers_block_by_func (G_OBJECT (object), object_changed_cb, editor);
1072 if ( GL_IS_LABEL_LINE (object) )
1074 gl_object_editor_get_lsize (editor, &w, &h);
1078 gl_object_editor_get_size (editor, &w, &h);
1081 gl_label_object_set_size (object, w, h, TRUE);
1084 g_signal_handlers_unblock_by_func (G_OBJECT (object), object_changed_cb, editor);
1086 gl_debug (DEBUG_EDITOR, "END");
1092 * Local Variables: -- emacs
1094 * c-basic-offset: 8 -- emacs
1095 * tab-width: 8 -- emacs
1096 * indent-tabs-mode: nil -- emacs