]> git.sur5r.net Git - glabels/blob - src/object-editor.c
Imported Upstream version 2.2.8
[glabels] / src / object-editor.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
2
3 /**
4  *  (GLABELS) Label and Business Card Creation program for GNOME
5  *
6  *  object-editor.c:  object properties editor module
7  *
8  *  Copyright (C) 2003  Jim Evins <evins@snaught.com>.
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23  */
24 #include <config.h>
25
26 #include "object-editor.h"
27
28 #include <glib/gi18n.h>
29 #include <glade/glade-xml.h>
30 #include <gtk/gtklabel.h>
31 #include <gtk/gtknotebook.h>
32 #include <gtk/gtkcombobox.h>
33 #include <gtk/gtktogglebutton.h>
34
35 #include <math.h>
36
37 #include "prefs.h"
38 #include "mygal/widget-color-combo.h"
39 #include "color.h"
40 #include "wdgt-chain-button.h"
41 #include "marshal.h"
42 #include "util.h"
43
44 #include "object-editor-private.h"
45
46 #include "debug.h"
47
48 /*===========================================*/
49 /* Private macros                            */
50 /*===========================================*/
51
52 /*===========================================*/
53 /* Private data types                        */
54 /*===========================================*/
55
56 typedef void (*ChangedSignal) (GObject * object, gpointer data);
57
58 /*===========================================*/
59 /* Private globals                           */
60 /*===========================================*/
61
62 gint gl_object_editor_signals[LAST_SIGNAL] = { 0 };
63
64 /*===========================================*/
65 /* Local function prototypes                 */
66 /*===========================================*/
67
68 static void gl_object_editor_finalize           (GObject              *object);
69
70 static void gl_object_notebook_construct_valist (glObjectEditor       *editor,
71                                                  glLabel              *label,
72                                                  glObjectEditorOption  first_option,
73                                                  va_list               args);
74
75 static void prefs_changed_cb                    (glObjectEditor       *editor);
76
77 static void label_changed_cb                    (glLabel              *label,
78                                                  glObjectEditor       *editor);
79
80 \f
81 /*****************************************************************************/
82 /* Boilerplate object stuff.                                                 */
83 /*****************************************************************************/
84 G_DEFINE_TYPE (glObjectEditor, gl_object_editor, GTK_TYPE_VBOX);
85
86 static void
87 gl_object_editor_class_init (glObjectEditorClass *class)
88 {
89         GObjectClass *object_class = G_OBJECT_CLASS (class);
90
91         gl_debug (DEBUG_EDITOR, "START");
92         
93         gl_object_editor_parent_class = g_type_class_peek_parent (class);
94
95         object_class->finalize = gl_object_editor_finalize;     
96
97         gl_object_editor_signals[CHANGED] =
98             g_signal_new ("changed",
99                           G_OBJECT_CLASS_TYPE(object_class),
100                           G_SIGNAL_RUN_LAST,
101                           G_STRUCT_OFFSET (glObjectEditorClass, changed),
102                           NULL, NULL,
103                           gl_marshal_VOID__VOID,
104                           G_TYPE_NONE, 0);
105
106         gl_object_editor_signals[SIZE_CHANGED] =
107             g_signal_new ("size_changed",
108                           G_OBJECT_CLASS_TYPE(object_class),
109                           G_SIGNAL_RUN_LAST,
110                           G_STRUCT_OFFSET (glObjectEditorClass, size_changed),
111                           NULL, NULL,
112                           gl_marshal_VOID__VOID,
113                           G_TYPE_NONE, 0);
114
115         gl_debug (DEBUG_EDITOR, "END");
116 }
117
118 static void
119 gl_object_editor_init (glObjectEditor *editor)
120 {
121         gl_debug (DEBUG_EDITOR, "START");
122         
123         editor->priv = g_new0 (glObjectEditorPrivate, 1);
124
125         editor->priv->gui = glade_xml_new (GLABELS_GLADE_DIR "object-editor.glade",
126                                            "editor_vbox",
127                                            NULL);
128
129         if (!editor->priv->gui) {
130                 g_critical ("Could not open object-editor.glade. gLabels may not be installed correctly!");
131                 return;
132         }
133
134         editor->priv->editor_vbox = glade_xml_get_widget (editor->priv->gui,
135                                                           "editor_vbox");
136         gtk_box_pack_start (GTK_BOX(editor),
137                             editor->priv->editor_vbox,
138                             FALSE, FALSE, 0);
139
140         editor->priv->title_image = glade_xml_get_widget (editor->priv->gui,
141                                                           "title_image");
142         editor->priv->title_label = glade_xml_get_widget (editor->priv->gui,
143                                                           "title_label");
144         editor->priv->notebook    = glade_xml_get_widget (editor->priv->gui,
145                                                           "notebook");
146
147         gtk_widget_show_all (GTK_WIDGET(editor));
148
149         /* Hide all notebook pages to start with. */
150         gtk_widget_hide_all (editor->priv->notebook);
151         gtk_widget_set_no_show_all (editor->priv->notebook, TRUE);
152
153         gl_debug (DEBUG_EDITOR, "END");
154 }
155
156 static void 
157 gl_object_editor_finalize (GObject *object)
158 {
159         glObjectEditor* editor = GL_OBJECT_EDITOR (object);;
160         
161         gl_debug (DEBUG_EDITOR, "START");
162         
163         g_return_if_fail (object != NULL);
164         g_return_if_fail (GL_IS_OBJECT_EDITOR (editor));
165         g_return_if_fail (editor->priv != NULL);
166
167         g_signal_handlers_disconnect_by_func (G_OBJECT(gl_prefs),
168                                               prefs_changed_cb, editor);
169         g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->label),
170                                               label_changed_cb, editor);
171
172         g_object_unref (editor->priv->gui);
173         g_free (editor->priv);
174
175         G_OBJECT_CLASS (gl_object_editor_parent_class)->finalize (object);
176
177         gl_debug (DEBUG_EDITOR, "END");
178 }
179
180 /*****************************************************************************/
181 /* NEW object editor.                                                      */
182 /*****************************************************************************/
183 GtkWidget*
184 gl_object_editor_new (gchar                *image,
185                       gchar                *title,
186                       glLabel              *label,
187                       glObjectEditorOption  first_option, ...)
188 {
189         glObjectEditor *editor;
190         va_list         args;
191
192         gl_debug (DEBUG_EDITOR, "START");
193
194         editor = GL_OBJECT_EDITOR (g_object_new (GL_TYPE_OBJECT_EDITOR, NULL));
195
196         if (image) {
197                 gtk_image_set_from_stock (GTK_IMAGE(editor->priv->title_image),
198                                           image,
199                                           GTK_ICON_SIZE_LARGE_TOOLBAR);
200         }
201
202         if (title) {
203                 gchar *s;
204
205                 s = g_strdup_printf ("<span weight=\"bold\">%s</span>",
206                                      title);
207                 gtk_label_set_text (GTK_LABEL(editor->priv->title_label), s);
208                 g_free (s);
209
210                 gtk_label_set_use_markup (GTK_LABEL(editor->priv->title_label), TRUE);
211                                           
212         }
213
214         gtk_notebook_set_homogeneous_tabs (GTK_NOTEBOOK(editor->priv->notebook), TRUE);
215
216         va_start (args, first_option);
217         gl_object_notebook_construct_valist (editor, label, first_option, args);
218         va_end (args);
219
220         gl_debug (DEBUG_EDITOR, "END");
221
222         return GTK_WIDGET(editor);
223 }
224
225 /*--------------------------------------------------------------------------*/
226 /* PRIVATE.  Construct notebook.                                            */
227 /*--------------------------------------------------------------------------*/
228 static void
229 gl_object_notebook_construct_valist (glObjectEditor       *editor,
230                                      glLabel              *label,
231                                      glObjectEditorOption  first_option,
232                                      va_list               args)
233 {
234         glObjectEditorOption option;
235         gint pages = 0;
236
237         gl_debug (DEBUG_EDITOR, "START");
238
239         editor->priv->label = label;
240
241         option = first_option;
242
243         for ( option=first_option; option; option=va_arg (args, glObjectEditorOption) ) {
244
245                 switch (option) {
246
247                 case GL_OBJECT_EDITOR_EMPTY:
248                         gtk_widget_set_sensitive (editor->priv->title_image, FALSE);
249                         gtk_widget_set_sensitive (editor->priv->title_label, FALSE);
250                         break;
251
252                 case GL_OBJECT_EDITOR_POSITION_PAGE:
253                         gl_object_editor_prepare_position_page (editor);
254                         pages++;
255                         break;
256
257                 case GL_OBJECT_EDITOR_SIZE_PAGE:
258                 case GL_OBJECT_EDITOR_SIZE_IMAGE_PAGE:
259                         gl_object_editor_prepare_size_page (editor, option);
260                         pages++;
261                         break;
262
263                 case GL_OBJECT_EDITOR_SIZE_LINE_PAGE:
264                         gl_object_editor_prepare_lsize_page (editor);
265                         pages++;
266                         break;
267
268                 case GL_OBJECT_EDITOR_FILL_PAGE:
269                         gl_object_editor_prepare_fill_page (editor);
270                         pages++;
271                         break;
272
273                 case GL_OBJECT_EDITOR_LINE_PAGE:
274                         gl_object_editor_prepare_line_page (editor);
275                         pages++;
276                         break;
277
278                 case GL_OBJECT_EDITOR_IMAGE_PAGE:
279                         gl_object_editor_prepare_image_page (editor);
280                         pages++;
281                         break;
282
283                 case GL_OBJECT_EDITOR_TEXT_PAGE:
284                         gl_object_editor_prepare_text_page (editor);
285                         pages++;
286                         break;
287
288                 case GL_OBJECT_EDITOR_EDIT_PAGE:
289                         gl_object_editor_prepare_edit_page (editor);
290                         pages++;
291                         break;
292
293                 case GL_OBJECT_EDITOR_BC_PAGE:
294                         gl_object_editor_prepare_bc_page (editor);
295                         pages++;
296                         break;
297
298                 case GL_OBJECT_EDITOR_DATA_PAGE:
299                         gl_object_editor_prepare_data_page (editor);
300                         pages++;
301                         break;
302
303                 case GL_OBJECT_EDITOR_SHADOW_PAGE:
304                         gl_object_editor_prepare_shadow_page (editor);
305                         pages++;
306                         break;
307
308                 default:
309                         g_message ("option = %d", option);
310                         g_assert_not_reached ();
311                 }
312                 
313         }
314         if (pages) {
315                 gtk_widget_show (editor->priv->notebook);
316         }
317
318         g_signal_connect_swapped (G_OBJECT (gl_prefs), "changed",
319                                   G_CALLBACK (prefs_changed_cb),
320                                   editor);
321         if (label)
322         {
323                 label_changed_cb (label, editor);
324                 g_signal_connect (G_OBJECT (label), "size_changed",
325                                   G_CALLBACK (label_changed_cb),
326                                   editor);
327                 g_signal_connect (G_OBJECT (label), "merge_changed",
328                                   G_CALLBACK (label_changed_cb),
329                                   editor);
330         }
331
332         gl_debug (DEBUG_EDITOR, "END");
333 }
334
335 /*--------------------------------------------------------------------------*/
336 /* PRIVATE. Widget changed callback.  Emit our "changed" signal.            */
337 /*--------------------------------------------------------------------------*/
338 void
339 gl_object_editor_changed_cb (glObjectEditor *editor)
340 {
341         if (editor->priv->stop_signals) return;
342
343         gl_debug (DEBUG_EDITOR, "START");
344
345         /* Emit our "changed" signal */
346         g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0);
347
348         gl_debug (DEBUG_EDITOR, "END");
349 }
350
351 /*--------------------------------------------------------------------------*/
352 /* PRIVATE. Widget size changed callback.  Emit our "size-changed" signal.  */
353 /*--------------------------------------------------------------------------*/
354 void
355 gl_object_editor_size_changed_cb (glObjectEditor *editor)
356 {
357         if (editor->priv->stop_signals) return;
358
359         gl_debug (DEBUG_EDITOR, "START");
360
361         /* Emit our "size_changed" signal */
362         g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[SIZE_CHANGED], 0);
363
364         gl_debug (DEBUG_EDITOR, "END");
365 }
366
367 /*****************************************************************************/
368 /* Set possible key names from merge object.                                 */
369 /*****************************************************************************/
370 void
371 gl_object_editor_set_key_names (glObjectEditor      *editor,
372                                 glMerge             *merge)
373 {
374         GList     *keys;
375         GtkWidget *combo;
376         gboolean   fixed_flag;
377         gboolean   state;
378  
379         gl_debug (DEBUG_EDITOR, "START");
380
381         if (editor->priv->edit_key_label) {
382                 gtk_widget_set_sensitive (editor->priv->edit_key_label, merge != NULL);
383         }
384  
385         if (editor->priv->edit_key_combo) {
386                 gtk_widget_set_sensitive (editor->priv->edit_key_combo, merge != NULL);
387         }
388  
389         if (editor->priv->text_auto_shrink_check) {
390                 gtk_widget_set_sensitive (editor->priv->text_auto_shrink_check,
391                                           merge != NULL);
392         }
393  
394         if (editor->priv->text_page_vbox) {
395                 gtk_widget_set_sensitive (editor->priv->text_color_key_radio, merge != NULL);
396                 if (merge == NULL) {
397                         gtk_toggle_button_set_active (
398                                 GTK_TOGGLE_BUTTON(editor->priv->text_color_radio), TRUE);
399                         gtk_widget_set_sensitive (editor->priv->text_color_combo, TRUE);
400                         gtk_widget_set_sensitive (editor->priv->text_color_key_combo, FALSE);
401                 } else {
402                         state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->text_color_key_radio));
403                         gtk_widget_set_sensitive (editor->priv->text_color_combo, !state);
404                         gtk_widget_set_sensitive (editor->priv->text_color_key_combo, state);
405                                                   
406                 }
407         }
408
409         if (editor->priv->edit_insert_field_button) {
410                 gtk_widget_set_sensitive (editor->priv->edit_insert_field_button,
411                                           merge != NULL);
412         }
413
414         if (editor->priv->img_key_combo) {
415                 gtk_widget_set_sensitive (editor->priv->img_key_combo, merge != NULL);
416         }
417  
418         if (editor->priv->img_key_radio) {
419                 gtk_widget_set_sensitive (editor->priv->img_key_radio, merge != NULL);
420                 if (merge == NULL) {
421                         gtk_toggle_button_set_active (
422                                 GTK_TOGGLE_BUTTON(editor->priv->img_file_radio), TRUE);
423                 }
424         }
425
426         if (editor->priv->data_key_combo) {
427                 gtk_widget_set_sensitive (editor->priv->data_key_combo, merge != NULL);
428         }
429  
430         if (editor->priv->data_key_radio) {
431                 gtk_widget_set_sensitive (editor->priv->data_key_radio, merge != NULL);
432                 if (merge == NULL) {
433                         gtk_toggle_button_set_active (
434                                 GTK_TOGGLE_BUTTON(editor->priv->data_literal_radio), TRUE);
435                 }
436         }
437         
438         fixed_flag = editor->priv->data_format_fixed_flag;
439         if (editor->priv->data_format_label) {
440                 gtk_widget_set_sensitive (editor->priv->data_format_label,
441                                           (merge != NULL));
442         }
443         if (editor->priv->data_ex_label) {
444                 gtk_widget_set_sensitive (editor->priv->data_ex_label,
445                                           (merge != NULL));
446         }
447         if (editor->priv->data_digits_label) {
448                 gtk_widget_set_sensitive (editor->priv->data_digits_label,
449                                           (merge != NULL) && !fixed_flag);
450         }
451         if (editor->priv->data_digits_spin) {
452                 gtk_widget_set_sensitive (editor->priv->data_digits_spin,
453                                           (merge != NULL) && !fixed_flag);
454         }
455
456         if (editor->priv->fill_page_vbox) {
457                 gtk_widget_set_sensitive (editor->priv->fill_key_radio, merge != NULL);
458                 if (merge == NULL) {
459                         gtk_toggle_button_set_active (
460                                 GTK_TOGGLE_BUTTON(editor->priv->fill_color_radio), TRUE);
461                         gtk_widget_set_sensitive (editor->priv->fill_color_combo, TRUE);
462                         gtk_widget_set_sensitive (editor->priv->fill_key_combo, FALSE);
463                 } else {
464                         state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->fill_key_radio));
465                         gtk_widget_set_sensitive (editor->priv->fill_color_combo, !state);
466                         gtk_widget_set_sensitive (editor->priv->fill_key_combo, state);
467                                                   
468                 }
469         }
470
471         if (editor->priv->line_page_vbox) {
472                 gtk_widget_set_sensitive (editor->priv->line_key_radio, merge != NULL);
473                 if (merge == NULL) {
474                         gtk_toggle_button_set_active (
475                                 GTK_TOGGLE_BUTTON(editor->priv->line_color_radio), TRUE);
476                         gtk_widget_set_sensitive (editor->priv->line_color_combo, TRUE);
477                         gtk_widget_set_sensitive (editor->priv->line_key_combo, FALSE);
478                 } else {
479                         state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->line_key_radio));
480                         gtk_widget_set_sensitive (editor->priv->line_color_combo, !state);
481                         gtk_widget_set_sensitive (editor->priv->line_key_combo, state);
482                                                   
483                 }
484         }
485
486         if (editor->priv->bc_page_vbox) {
487                 gtk_widget_set_sensitive (editor->priv->bc_key_radio, merge != NULL);
488                 if (merge == NULL) {
489                         gtk_toggle_button_set_active (
490                                 GTK_TOGGLE_BUTTON(editor->priv->bc_color_radio), TRUE);
491                         gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE);
492                         gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE);
493                 } else {
494                         state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->bc_key_radio));
495                         gtk_widget_set_sensitive (editor->priv->bc_color_combo, !state);
496                         gtk_widget_set_sensitive (editor->priv->bc_key_combo, state);
497                                                   
498                 }
499         }
500
501         if (editor->priv->shadow_page_vbox) {
502                 gtk_widget_set_sensitive (editor->priv->shadow_key_radio, merge != NULL);
503                 if (merge == NULL) {
504                         gtk_toggle_button_set_active (
505                                 GTK_TOGGLE_BUTTON(editor->priv->shadow_color_radio), TRUE);
506                         gtk_widget_set_sensitive (editor->priv->shadow_color_combo, TRUE);
507                         gtk_widget_set_sensitive (editor->priv->shadow_key_combo, FALSE);
508                 } else {
509                         state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->shadow_key_radio));
510                         gtk_widget_set_sensitive (editor->priv->shadow_color_combo, !state);
511                         gtk_widget_set_sensitive (editor->priv->shadow_key_combo, state);
512                                                   
513                 }
514         }
515
516         keys = gl_merge_get_key_list (merge);
517         if ( keys == NULL ) {
518                 keys = g_list_append (keys, g_strdup (""));
519         }
520
521         combo = editor->priv->img_key_combo;
522         if (combo) {
523                 gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
524         }
525
526         combo = editor->priv->edit_key_combo;
527         if (combo) {
528                 gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
529         }
530
531         combo = editor->priv->data_key_combo;
532         if (combo) {
533                 gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
534         }
535                 
536         combo = editor->priv->fill_key_combo;
537         if (combo) {
538                 gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
539         }
540
541         combo = editor->priv->text_color_key_combo;
542         if (combo) {
543                 gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
544         }
545
546         combo = editor->priv->line_key_combo;
547         if (combo) {
548                 gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
549         }
550                 
551         combo = editor->priv->bc_key_combo;
552         if (combo) {
553                 gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
554         }
555                 
556         combo = editor->priv->shadow_key_combo;
557         if (combo) {
558                 gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
559         }
560
561         gl_merge_free_key_list (&keys);
562  
563         gl_debug (DEBUG_EDITOR, "END");
564 }
565
566 /*****************************************************************************/
567 /* Construct color combo "Custom widget".                                    */
568 /*****************************************************************************/
569 GtkWidget *
570 gl_object_editor_construct_color_combo (gchar *name,
571                                         gchar *string1,
572                                         gchar *string2,
573                                         gint   int1,
574                                         gint   int2)
575 {
576         GtkWidget  *color_combo;
577         ColorGroup *cg;
578         gchar      *cg_name;
579         GdkColor   *gdk_color;
580         gchar      *no_color;
581
582         switch (int1) {
583
584         case 3:
585                 cg_name  = "shadow_color_group";
586                 gdk_color = gl_color_to_gdk_color (GL_COLOR_SHADOW_DEFAULT);
587                 no_color = _("Default");
588                 break;
589
590         case 2:
591                 cg_name  = "text_color_group";
592                 gdk_color = gl_color_to_gdk_color (gl_prefs->default_text_color);
593                 no_color = _("Default");
594                 break;
595
596         case 1:
597                 cg_name  = "line_color_group";
598                 gdk_color = NULL;
599                 no_color = _("No line");
600                 break;
601
602         case 0:
603         default:
604                 cg_name  = "fill_color_group";
605                 gdk_color = NULL;
606                 no_color = _("No fill");
607                 break;
608
609         }
610
611         cg = color_group_fetch (cg_name, NULL);
612         color_combo = color_combo_new (NULL, no_color, gdk_color, cg);
613         g_free (gdk_color);
614
615         color_combo_box_set_preview_relief (COLOR_COMBO(color_combo), GTK_RELIEF_NORMAL);
616
617         return color_combo;
618 }
619
620 /*****************************************************************************/
621 /* Construct chain button "Custom widget".                                   */
622 /*****************************************************************************/
623 GtkWidget *
624 gl_object_editor_construct_chain_button (gchar *name,
625                                          gchar *string1,
626                                          gchar *string2,
627                                          gint   int1,
628                                          gint   int2)
629 {
630         GtkWidget  *chain_button;
631
632         chain_button = gl_wdgt_chain_button_new (GL_WDGT_CHAIN_RIGHT);
633         gl_wdgt_chain_button_set_active (GL_WDGT_CHAIN_BUTTON(chain_button), TRUE);
634
635         return chain_button;
636 }
637
638 /*--------------------------------------------------------------------------*/
639 /* PRIVATE. Prefs changed callback.  Update units related items.            */
640 /*--------------------------------------------------------------------------*/
641 static void
642 prefs_changed_cb (glObjectEditor *editor)
643 {
644
645         gl_debug (DEBUG_EDITOR, "START");
646
647         if (editor->priv->lsize_r_spin) {
648                 lsize_prefs_changed_cb (editor);
649         }
650                 
651         if (editor->priv->size_w_spin) {
652                 size_prefs_changed_cb (editor);
653         }
654                 
655         if (editor->priv->pos_x_spin) {
656                 position_prefs_changed_cb (editor);
657         }
658
659         if (editor->priv->shadow_x_spin) {
660                 shadow_prefs_changed_cb (editor);
661         }
662
663         gl_debug (DEBUG_EDITOR, "END");
664 }
665
666 /*---------------------------------------------------------------------------*/
667 /* PRIVATE. label "changed" callback.                                        */
668 /*---------------------------------------------------------------------------*/
669 static void
670 label_changed_cb (glLabel        *label,
671                   glObjectEditor *editor)
672 {
673         gdouble   label_width, label_height;
674         glMerge  *merge;
675
676         gl_debug (DEBUG_EDITOR, "START");
677
678         gl_label_get_size (label, &label_width, &label_height);
679         gl_object_editor_set_max_position (GL_OBJECT_EDITOR (editor),
680                                            label_width, label_height);
681         gl_object_editor_set_max_size (GL_OBJECT_EDITOR (editor),
682                                        label_width, label_height);
683         gl_object_editor_set_max_lsize (GL_OBJECT_EDITOR (editor),
684                                        label_width, label_height);
685         gl_object_editor_set_max_shadow_offset (GL_OBJECT_EDITOR (editor),
686                                                 label_width, label_height);
687         
688         merge = gl_label_get_merge (label);
689         gl_object_editor_set_key_names (editor, merge);
690
691         gl_debug (DEBUG_EDITOR, "END");
692 }
693