]> git.sur5r.net Git - glabels/blob - src/object-editor.c
Imported Upstream version 3.2.0
[glabels] / src / object-editor.c
1 /*
2  *  object-editor.c
3  *  Copyright (C) 2003-2009  Jim Evins <evins@snaught.com>.
4  *
5  *  This file is part of gLabels.
6  *
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.
11  *
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.
16  *
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/>.
19  */
20
21 #include <config.h>
22
23 #include "object-editor.h"
24
25 #include <glib/gi18n.h>
26 #include <gtk/gtk.h>
27 #include <math.h>
28
29 #include "prefs.h"
30 #include "color-combo.h"
31 #include "color.h"
32 #include "wdgt-chain-button.h"
33 #include "field-button.h"
34 #include "marshal.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"
43
44 #include "object-editor-private.h"
45
46 #include "debug.h"
47
48
49 /*===========================================*/
50 /* Private macros                            */
51 /*===========================================*/
52
53
54 /*===========================================*/
55 /* Private data types                        */
56 /*===========================================*/
57
58
59 /*===========================================*/
60 /* Private globals                           */
61 /*===========================================*/
62
63
64 /*===========================================*/
65 /* Local function prototypes                 */
66 /*===========================================*/
67
68 static void gl_object_editor_finalize           (GObject              *object);
69
70 static void set_object                          (glObjectEditor       *editor,
71                                                  glLabelObject        *object);
72
73 static void prefs_changed_cb                    (glObjectEditor       *editor);
74
75 static void label_changed_cb                    (glLabel              *label,
76                                                  glObjectEditor       *editor);
77
78 static void selection_changed_cb                (glLabel              *label,
79                                                  glObjectEditor       *editor);
80
81 static void merge_changed_cb                    (glLabel              *label,
82                                                  glObjectEditor       *editor);
83
84 static void set_key_names                       (glObjectEditor       *editor,
85                                                  glMerge              *merge);
86
87 static void object_changed_cb                   (glLabelObject        *object,
88                                                  glObjectEditor       *editor);
89
90 static void object_moved_cb                     (glLabelObject        *object,
91                                                  glObjectEditor       *editor);
92
93
94
95 /*****************************************************************************/
96 /* Boilerplate object stuff.                                                 */
97 /*****************************************************************************/
98 G_DEFINE_TYPE (glObjectEditor, gl_object_editor, GTK_TYPE_VBOX)
99
100
101 static void
102 gl_object_editor_class_init (glObjectEditorClass *class)
103 {
104         GObjectClass *object_class = G_OBJECT_CLASS (class);
105
106         gl_debug (DEBUG_EDITOR, "START");
107         
108         gl_object_editor_parent_class = g_type_class_peek_parent (class);
109
110         object_class->finalize = gl_object_editor_finalize;     
111 }
112
113
114 static void
115 gl_object_editor_init (glObjectEditor *editor)
116 {
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",
124                                        NULL };
125         GError       *error = NULL;
126         gchar        *s;
127
128         gl_debug (DEBUG_EDITOR, "START");
129         
130         editor->priv = g_new0 (glObjectEditorPrivate, 1);
131
132         editor->priv->builder = gtk_builder_new ();
133
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);
137         if (error) {
138                 g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
139                 g_error_free (error);
140                 return;
141         }
142
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,
148                                      NULL);
149
150         gtk_box_pack_start (GTK_BOX(editor),
151                             editor->priv->editor_vbox,
152                             FALSE, FALSE, 0);
153
154         gtk_widget_show_all (GTK_WIDGET(editor));
155
156         gtk_image_set_from_icon_name (GTK_IMAGE(editor->priv->title_image),
157                                       "glabels-object-properties",
158                                       GTK_ICON_SIZE_LARGE_TOOLBAR);
159
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);
164         g_free (s);
165
166         gtk_widget_set_sensitive (editor->priv->title_image, FALSE);
167         gtk_widget_set_sensitive (editor->priv->title_label, FALSE);
168
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);
172
173         gl_debug (DEBUG_EDITOR, "END");
174 }
175
176
177 static void 
178 gl_object_editor_finalize (GObject *object)
179 {
180         glObjectEditor* editor = GL_OBJECT_EDITOR (object);;
181         
182         gl_debug (DEBUG_EDITOR, "START");
183         
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);
187
188         g_signal_handlers_disconnect_by_func (G_OBJECT(gl_prefs),
189                                               prefs_changed_cb, editor);
190
191         if (editor->priv->label)
192         {
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);
198         }
199
200         if (editor->priv->object)
201         {
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);
207         }
208
209         g_object_unref (editor->priv->builder);
210
211         g_free (editor->priv->current_backend_id);
212         g_free (editor->priv);
213
214         G_OBJECT_CLASS (gl_object_editor_parent_class)->finalize (object);
215
216         gl_debug (DEBUG_EDITOR, "END");
217 }
218
219
220 /*****************************************************************************/
221 /* NEW object editor.                                                        */
222 /*****************************************************************************/
223 GtkWidget*
224 gl_object_editor_new (void)
225 {
226         glObjectEditor *editor;
227
228         gl_debug (DEBUG_EDITOR, "START");
229
230         editor = GL_OBJECT_EDITOR (g_object_new (GL_TYPE_OBJECT_EDITOR, NULL));
231
232         gtk_widget_set_sensitive (editor->priv->title_image, FALSE);
233         gtk_widget_set_sensitive (editor->priv->title_label, FALSE);
234
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);
246
247         g_signal_connect_swapped (G_OBJECT (gl_prefs), "changed",
248                                   G_CALLBACK (prefs_changed_cb), editor);
249
250         gl_debug (DEBUG_EDITOR, "END");
251
252         return GTK_WIDGET(editor);
253 }
254
255
256 /*****************************************************************************/
257 /* Set label.                                                                */
258 /*****************************************************************************/
259 void
260 gl_object_editor_set_label (glObjectEditor  *editor,
261                             glLabel         *label)
262 {
263         gl_debug (DEBUG_EDITOR, "START");
264
265         editor->priv->label = g_object_ref (label);
266
267         label_changed_cb (label, editor);
268         merge_changed_cb (label, editor);
269
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);
276
277         gl_debug (DEBUG_EDITOR, "END");
278 }
279
280
281 /*--------------------------------------------------------------------------*/
282 /* Private. Set object.                                                     */
283 /*--------------------------------------------------------------------------*/
284 static void
285 set_object (glObjectEditor  *editor,
286             glLabelObject   *object)
287 {
288         gchar               *image;
289         gchar               *title;
290         gchar               *s;
291         GtkTextBuffer       *buffer;
292         gint                 old_page, new_page;
293
294         gl_debug (DEBUG_EDITOR, "START");
295
296         if ( editor->priv->object != NULL )
297         {
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);
303         }
304
305         if (object)
306         {
307                 editor->priv->object = g_object_ref (object);
308
309                 old_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (editor->priv->notebook));
310
311                 if (GL_IS_LABEL_BOX (object))
312                 {
313                         image = "glabels-box";
314                         title = _("Box object properties");
315
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);
327
328                         gtk_widget_hide     (editor->priv->size_reset_image_button);
329                 }
330                 else if (GL_IS_LABEL_ELLIPSE (object))
331                 {
332                         image = "glabels-ellipse";
333                         title = _("Ellipse object properties");
334
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);
346
347                         gtk_widget_hide     (editor->priv->size_reset_image_button);
348                 }
349                 else if (GL_IS_LABEL_LINE (object))
350                 {
351                         image = "glabels-line";
352                         title = _("Line object properties");
353
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);
365                 }
366                 else if (GL_IS_LABEL_IMAGE (object))
367                 {
368                         image = "glabels-image";
369                         title = _("Image object properties");
370
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);
382                 }
383                 else if (GL_IS_LABEL_TEXT (object))
384                 {
385                         image = "glabels-text";
386                         title = _("Text object properties");
387
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);
399
400                         gtk_widget_hide     (editor->priv->size_reset_image_button);
401
402                         buffer = gl_label_text_get_buffer (GL_LABEL_TEXT(object));
403                         gl_object_editor_set_text_buffer (editor, buffer);
404                 }
405                 else if (GL_IS_LABEL_BARCODE (object))
406                 {
407                         image = "glabels-barcode";
408                         title = _("Barcode object properties");
409
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);
421
422                         gtk_widget_hide     (editor->priv->size_reset_image_button);
423                 }
424
425                 gtk_image_set_from_icon_name (GTK_IMAGE(editor->priv->title_image),
426                                               image,
427                                               GTK_ICON_SIZE_LARGE_TOOLBAR);
428
429                 s = g_strdup_printf ("<span weight=\"bold\">%s</span>",
430                                      title);
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);
433                 g_free (s);
434
435                 gtk_widget_set_sensitive (editor->priv->title_image, TRUE);
436                 gtk_widget_set_sensitive (editor->priv->title_label, TRUE);
437
438                 gtk_widget_show (editor->priv->notebook);
439
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 )
443                 {
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);
451                 }
452
453                 object_moved_cb (object, editor);
454                 object_changed_cb (object, editor);
455
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);
460         }
461         else
462         {
463                 editor->priv->object = NULL;
464
465                 gtk_image_set_from_icon_name (GTK_IMAGE(editor->priv->title_image),
466                                               "glabels-object-properties",
467                                               GTK_ICON_SIZE_LARGE_TOOLBAR);
468
469                 s = g_strdup_printf ("<span weight=\"bold\">%s</span>",
470                                      _("Object properties"));
471                 gtk_label_set_text (GTK_LABEL(editor->priv->title_label), s);
472                 gtk_label_set_use_markup (GTK_LABEL(editor->priv->title_label), TRUE);
473                 g_free (s);
474
475                 gtk_widget_set_sensitive (editor->priv->title_image, FALSE);
476                 gtk_widget_set_sensitive (editor->priv->title_label, FALSE);
477
478                 gtk_widget_hide (editor->priv->notebook);
479         }
480
481         gl_debug (DEBUG_EDITOR, "END");
482 }
483
484
485 /*--------------------------------------------------------------------------*/
486 /* PRIVATE. Prefs changed callback.  Update units related items.            */
487 /*--------------------------------------------------------------------------*/
488 static void
489 prefs_changed_cb (glObjectEditor *editor)
490 {
491
492         gl_debug (DEBUG_EDITOR, "START");
493
494         if (editor->priv->lsize_r_spin) {
495                 lsize_prefs_changed_cb (editor);
496         }
497                 
498         if (editor->priv->size_w_spin) {
499                 size_prefs_changed_cb (editor);
500         }
501                 
502         if (editor->priv->pos_x_spin) {
503                 position_prefs_changed_cb (editor);
504         }
505
506         if (editor->priv->shadow_x_spin) {
507                 shadow_prefs_changed_cb (editor);
508         }
509
510         gl_debug (DEBUG_EDITOR, "END");
511 }
512
513
514 /*---------------------------------------------------------------------------*/
515 /* PRIVATE.  Label "selection state changed" callback.                       */
516 /*---------------------------------------------------------------------------*/
517 static void 
518 selection_changed_cb (glLabel        *label,
519                       glObjectEditor *editor)
520 {
521         glLabelObject *object;
522
523         gl_debug (DEBUG_EDITOR, "START");
524
525         g_return_if_fail (label && GL_IS_LABEL (label));
526         g_return_if_fail (editor && GL_IS_OBJECT_EDITOR (editor));
527
528         if (!gl_label_is_selection_atomic (label))
529         {
530                 set_object (editor, NULL);
531         }
532         else
533         {
534                 object = gl_label_get_1st_selected_object (label);
535                 set_object (editor, object);
536         }
537
538         gl_debug (DEBUG_EDITOR, "END");
539 }
540
541
542 /*---------------------------------------------------------------------------*/
543 /* PRIVATE. label "size_changed" callback.                                   */
544 /*---------------------------------------------------------------------------*/
545 static void
546 label_changed_cb (glLabel        *label,
547                   glObjectEditor *editor)
548 {
549         gdouble   label_width, label_height;
550
551         gl_debug (DEBUG_EDITOR, "START");
552
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);
562
563         gl_debug (DEBUG_EDITOR, "END");
564 }
565
566
567 /*---------------------------------------------------------------------------*/
568 /* PRIVATE. label "merge_changed" callback.                                  */
569 /*---------------------------------------------------------------------------*/
570 static void
571 merge_changed_cb (glLabel        *label,
572                   glObjectEditor *editor)
573 {
574         glMerge  *merge;
575
576         gl_debug (DEBUG_EDITOR, "START");
577
578         merge = gl_label_get_merge (label);
579         set_key_names (editor, merge);
580
581         gl_debug (DEBUG_EDITOR, "END");
582 }
583
584
585 /*---------------------------------------------------------------------------*/
586 /* PRIVATE. Load up possible key names from merge into various widgets.      */
587 /*---------------------------------------------------------------------------*/
588 static void
589 set_key_names (glObjectEditor      *editor,
590                glMerge             *merge)
591 {
592         GList     *keys;
593         GtkWidget *button;
594         gboolean   fixed_flag;
595         gboolean   state;
596  
597         gl_debug (DEBUG_EDITOR, "START");
598
599         gtk_widget_set_sensitive (editor->priv->text_auto_shrink_check,
600                                   merge != NULL);
601  
602         gtk_widget_set_sensitive (editor->priv->text_color_key_radio, merge != NULL);
603         if (merge == NULL)
604         {
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);
609         }
610         else
611         {
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);
615         }
616
617         gtk_widget_set_sensitive (editor->priv->edit_insert_field_button,
618                                   merge != NULL);
619
620         gtk_widget_set_sensitive (editor->priv->img_key_combo, merge != NULL);
621  
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),
624                                       merge == NULL);
625
626         gtk_widget_set_sensitive (editor->priv->data_key_combo, merge != NULL);
627  
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),
630                                       merge == NULL);
631         
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);
639
640         gtk_widget_set_sensitive (editor->priv->fill_key_radio, merge != NULL);
641         if (merge == NULL)
642         {
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);
647         }
648         else
649         {
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);
653         }
654
655         gtk_widget_set_sensitive (editor->priv->line_key_radio, merge != NULL);
656         if (merge == NULL)
657         {
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);
662         }
663         else
664         {
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);
668         }
669
670         gtk_widget_set_sensitive (editor->priv->bc_key_radio, merge != NULL);
671         if (merge == NULL)
672         {
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);
677         }
678         else
679         {
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);
683         }
684
685         gtk_widget_set_sensitive (editor->priv->shadow_key_radio, merge != NULL);
686         if (merge == NULL)
687         {
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);
692         }
693         else
694         {
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);
698         }
699
700         keys = gl_merge_get_key_list (merge);
701         if ( keys == NULL ) {
702                 keys = g_list_append (keys, g_strdup (""));
703         }
704
705         button = editor->priv->img_key_combo;
706         gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
707
708         button = editor->priv->edit_insert_field_button;
709         gl_field_button_set_keys (GL_FIELD_BUTTON(button), keys);
710
711         button = editor->priv->data_key_combo;
712         gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
713                 
714         button = editor->priv->fill_key_combo;
715         gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
716
717         button = editor->priv->text_color_key_combo;
718         gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
719
720         button = editor->priv->line_key_combo;
721         gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
722                 
723         button = editor->priv->bc_key_combo;
724         gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
725                 
726         button = editor->priv->shadow_key_combo;
727         gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys);
728
729         gl_merge_free_key_list (&keys);
730  
731         gl_debug (DEBUG_EDITOR, "END");
732 }
733
734
735 /*---------------------------------------------------------------------------*/
736 /* PRIVATE. object "changed" callback.                                       */
737 /*---------------------------------------------------------------------------*/
738 static void
739 object_changed_cb (glLabelObject  *object,
740                    glObjectEditor *editor)
741 {
742         gdouble              w, h;
743         glColorNode         *line_color_node;
744         gdouble              line_width;
745         glColorNode         *fill_color_node;
746         gchar               *font_family;
747         gdouble              font_size;
748         PangoWeight          font_weight;
749         gboolean             font_italic_flag;
750         glColorNode         *text_color_node;
751         PangoAlignment       align;
752         glValignment          valign;
753         gdouble              text_line_spacing;
754         gboolean             auto_shrink;
755         gdouble              image_w, image_h;
756         glTextNode          *filename;
757         glTextNode          *bc_data;
758         glLabelBarcodeStyle *bc_style;
759         gboolean             shadow_state;
760         gdouble              shadow_x, shadow_y;
761         glColorNode         *shadow_color_node;
762         gdouble              shadow_opacity;
763         glLabel             *label;
764         glMerge             *merge;
765
766         gl_debug (DEBUG_EDITOR, "BEGIN");
767
768
769         label = gl_label_object_get_parent (object);
770         merge = gl_label_get_merge (label);
771
772
773         if ( GL_IS_LABEL_BOX (object) || GL_IS_LABEL_ELLIPSE (object) )
774         {
775
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));
780
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);
785
786                 gl_color_node_free (&fill_color_node);
787                 gl_color_node_free (&line_color_node);
788
789         }
790         else if ( GL_IS_LABEL_LINE (object) )
791         {
792
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));
796
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);
800
801                 gl_color_node_free (&line_color_node);
802
803         }
804         else if ( GL_IS_LABEL_IMAGE (object) )
805         {
806
807                 gl_label_object_get_size (object, &w, &h);
808                 filename = gl_label_image_get_filename (GL_LABEL_IMAGE(object));
809
810                 gl_label_image_get_base_size (GL_LABEL_IMAGE(object), &image_w, &image_h);
811
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);
815
816                 gl_text_node_free (&filename);
817
818         }
819         else if ( GL_IS_LABEL_TEXT (object) )
820         {
821
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));
832
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);
843
844                 gl_color_node_free (&text_color_node);
845                 g_free (font_family);
846
847         }
848         else if ( GL_IS_LABEL_BARCODE (object) )
849         {
850
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));
855
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);
860
861                 gl_text_node_free (&bc_data);
862                 gl_label_barcode_style_free (bc_style);
863
864         }
865
866
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);
871
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);
876
877         gl_color_node_free (&shadow_color_node);
878
879
880         gl_debug (DEBUG_EDITOR, "END");
881 }
882
883
884 /*---------------------------------------------------------------------------*/
885 /* PRIVATE. object "moved" callback.                                         */
886 /*---------------------------------------------------------------------------*/
887 static void
888 object_moved_cb (glLabelObject  *object,
889                  glObjectEditor *editor)
890 {
891         gdouble              x, y;
892
893         gl_debug (DEBUG_EDITOR, "BEGIN");
894
895         gl_label_object_get_position (object, &x, &y);
896         gl_object_editor_set_position (editor, x, y);
897
898         gl_debug (DEBUG_EDITOR, "END");
899 }
900
901
902 /*****************************************************************************/
903 /* Object editor "changed" callback.                                         */
904 /*****************************************************************************/
905 void
906 gl_object_editor_changed_cb (glObjectEditor *editor)
907 {
908         glLabelObject       *object = editor->priv->object;
909         gdouble              x, y;
910         glColorNode         *line_color_node;
911         gdouble              line_width;
912         glColorNode         *fill_color_node;
913         gchar               *font_family;
914         gdouble              font_size;
915         PangoWeight          font_weight;
916         gboolean             font_italic_flag;
917         glColorNode         *text_color_node;
918         PangoAlignment       align;
919         glValignment          valign;
920         gdouble              text_line_spacing;
921         gboolean             auto_shrink;
922         glTextNode          *filename;
923         gdouble              w, h;
924         gdouble              image_w, image_h;
925         gdouble              new_w, new_h;
926         glTextNode          *bc_data;
927         glLabelBarcodeStyle *bc_style;
928         gboolean             shadow_state;
929         gdouble              shadow_x, shadow_y;
930         glColorNode         *shadow_color_node;
931         gdouble              shadow_opacity;
932
933         gl_debug (DEBUG_EDITOR, "BEGIN");
934
935
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);
938
939
940         gl_object_editor_get_position (editor, &x, &y);
941         gl_label_object_set_position (object, x, y, TRUE);
942
943
944         if ( GL_IS_LABEL_BOX (object) || GL_IS_LABEL_ELLIPSE (object) )
945         {
946
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);
950
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);
954
955                 gl_color_node_free (&fill_color_node);
956                 gl_color_node_free (&line_color_node);
957
958         }
959         else if (GL_IS_LABEL_LINE (object))
960         {
961
962                 line_color_node   = gl_object_editor_get_line_color (editor);
963                 line_width        = gl_object_editor_get_line_width (editor);
964
965                 gl_label_object_set_line_color (object, line_color_node, TRUE);
966                 gl_label_object_set_line_width (object, line_width, TRUE);
967
968                 gl_color_node_free (&line_color_node);
969
970         }
971         else if ( GL_IS_LABEL_IMAGE (object) )
972         {
973
974                 filename = gl_object_editor_get_image (editor);
975
976                 gl_label_image_set_filename (GL_LABEL_IMAGE(object), filename, TRUE);
977
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) )
982                 {
983                         gl_object_editor_set_size (editor, new_w, new_h);
984                 }
985
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);
989
990                 gl_text_node_free (&filename);
991
992         }
993         else if (GL_IS_LABEL_TEXT (object))
994         {
995
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);
1005
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);
1015
1016                 gl_color_node_free (&text_color_node);
1017                 g_free (font_family);
1018
1019         }
1020         else if (GL_IS_LABEL_BARCODE (object))
1021         {
1022
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);
1026
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);
1030
1031                 gl_color_node_free (&line_color_node);
1032                 gl_text_node_free (&bc_data);
1033                 gl_label_barcode_style_free (bc_style);
1034
1035         }
1036
1037
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);
1042
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);
1047
1048         gl_color_node_free (&shadow_color_node);
1049
1050
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);
1053
1054         gl_debug (DEBUG_EDITOR, "END");
1055 }
1056
1057
1058 /*****************************************************************************/
1059 /* Object editor "size_changed" callback.                                    */
1060 /*****************************************************************************/
1061 void
1062 gl_object_editor_size_changed_cb (glObjectEditor *editor)
1063 {
1064         glLabelObject     *object = editor->priv->object;
1065         gdouble            w, h;
1066
1067         gl_debug (DEBUG_EDITOR, "BEGIN");
1068
1069         g_signal_handlers_block_by_func (G_OBJECT (object), object_changed_cb, editor);
1070
1071
1072         if ( GL_IS_LABEL_LINE (object) )
1073         {
1074                 gl_object_editor_get_lsize (editor, &w, &h);
1075         }
1076         else
1077         {
1078                 gl_object_editor_get_size (editor, &w, &h);
1079         }
1080
1081         gl_label_object_set_size (object, w, h, TRUE);
1082
1083
1084         g_signal_handlers_unblock_by_func (G_OBJECT (object), object_changed_cb, editor);
1085
1086         gl_debug (DEBUG_EDITOR, "END");
1087 }
1088
1089
1090
1091 /*
1092  * Local Variables:       -- emacs
1093  * mode: C                -- emacs
1094  * c-basic-offset: 8      -- emacs
1095  * tab-width: 8           -- emacs
1096  * indent-tabs-mode: nil  -- emacs
1097  * End:                   -- emacs
1098  */