2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * object-editor.c: object properties editor module
6 * Copyright (C) 2003 Jim Evins <evins@snaught.com>.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #include <glade/glade-xml.h>
28 #include "object-editor.h"
30 #include "mygal/widget-color-combo.h"
32 #include "wdgt-chain-button.h"
35 #include "object-editor-private.h"
39 /*===========================================*/
41 /*===========================================*/
43 /*===========================================*/
44 /* Private data types */
45 /*===========================================*/
47 typedef void (*ChangedSignal) (GObject * object, gpointer data);
49 /*===========================================*/
51 /*===========================================*/
53 gint gl_object_editor_signals[LAST_SIGNAL] = { 0 };
55 static GtkVBoxClass *parent_class = NULL;
57 /*===========================================*/
58 /* Local function prototypes */
59 /*===========================================*/
61 static void gl_object_editor_class_init (glObjectEditorClass *klass);
62 static void gl_object_editor_init (glObjectEditor *editor);
63 static void gl_object_editor_finalize (GObject *object);
65 static void gl_object_notebook_construct_valist (glObjectEditor *editor,
66 glObjectEditorOption first_option,
69 static void prefs_changed_cb (glObjectEditor *editor);
72 /*****************************************************************************/
73 /* Boilerplate object stuff. */
74 /*****************************************************************************/
76 gl_object_editor_get_type (void)
78 static GType type = 0;
82 static const GTypeInfo info =
84 sizeof (glObjectEditorClass),
86 NULL, /* base_finalize */
87 (GClassInitFunc) gl_object_editor_class_init,
88 NULL, /* class_finalize */
89 NULL, /* class_data */
90 sizeof (glObjectEditor),
92 (GInstanceInitFunc) gl_object_editor_init,
96 type = g_type_register_static (GTK_TYPE_VBOX,
97 "glObjectEditor", &info, 0);
104 gl_object_editor_class_init (glObjectEditorClass *klass)
106 GObjectClass *object_class = G_OBJECT_CLASS (klass);
108 gl_debug (DEBUG_EDITOR, "START");
110 parent_class = g_type_class_peek_parent (klass);
112 object_class->finalize = gl_object_editor_finalize;
114 gl_object_editor_signals[CHANGED] =
115 g_signal_new ("changed",
116 G_OBJECT_CLASS_TYPE(object_class),
118 G_STRUCT_OFFSET (glObjectEditorClass, changed),
120 gl_marshal_VOID__VOID,
123 gl_object_editor_signals[SIZE_CHANGED] =
124 g_signal_new ("size_changed",
125 G_OBJECT_CLASS_TYPE(object_class),
127 G_STRUCT_OFFSET (glObjectEditorClass, size_changed),
129 gl_marshal_VOID__VOID,
132 gl_debug (DEBUG_EDITOR, "END");
136 gl_object_editor_init (glObjectEditor *editor)
138 gl_debug (DEBUG_EDITOR, "START");
140 editor->priv = g_new0 (glObjectEditorPrivate, 1);
142 editor->priv->gui = glade_xml_new (GLABELS_GLADE_DIR "object-editor.glade",
146 if (!editor->priv->gui) {
147 g_warning ("Could not open object-editor.glade, reinstall glabels!");
151 editor->priv->editor_vbox = glade_xml_get_widget (editor->priv->gui,
153 gtk_box_pack_start (GTK_BOX(editor),
154 editor->priv->editor_vbox,
157 editor->priv->title_image = glade_xml_get_widget (editor->priv->gui,
159 editor->priv->title_label = glade_xml_get_widget (editor->priv->gui,
161 editor->priv->notebook = glade_xml_get_widget (editor->priv->gui,
164 gtk_widget_show_all (GTK_WIDGET(editor));
166 /* Hide all notebook pages to start with. */
167 gtk_widget_hide_all (editor->priv->notebook);
169 gl_debug (DEBUG_EDITOR, "END");
173 gl_object_editor_finalize (GObject *object)
175 glObjectEditor* editor;
177 gl_debug (DEBUG_EDITOR, "START");
179 g_return_if_fail (object != NULL);
181 editor = GL_OBJECT_EDITOR (object);
183 g_return_if_fail (GL_IS_OBJECT_EDITOR (editor));
184 g_return_if_fail (editor->priv != NULL);
186 g_free (editor->priv);
188 g_signal_handlers_disconnect_by_func (G_OBJECT(gl_prefs),
189 prefs_changed_cb, editor);
191 G_OBJECT_CLASS (parent_class)->finalize (object);
193 gl_debug (DEBUG_EDITOR, "END");
196 /*****************************************************************************/
197 /* NEW object editor. */
198 /*****************************************************************************/
200 gl_object_editor_new (gchar *image,
202 glObjectEditorOption first_option, ...)
204 glObjectEditor *editor;
207 gl_debug (DEBUG_EDITOR, "START");
209 editor = GL_OBJECT_EDITOR (g_object_new (GL_TYPE_OBJECT_EDITOR, NULL));
212 gtk_image_set_from_stock (GTK_IMAGE(editor->priv->title_image),
214 GTK_ICON_SIZE_LARGE_TOOLBAR);
220 s = g_strdup_printf ("<span weight=\"bold\">%s</span>",
222 gtk_label_set_text (GTK_LABEL(editor->priv->title_label), s);
225 gtk_label_set_use_markup (GTK_LABEL(editor->priv->title_label), TRUE);
229 gtk_notebook_set_homogeneous_tabs (GTK_NOTEBOOK(editor->priv->notebook), TRUE);
231 va_start (args, first_option);
232 gl_object_notebook_construct_valist (editor, first_option, args);
235 gl_debug (DEBUG_EDITOR, "END");
237 return GTK_WIDGET(editor);
240 /*--------------------------------------------------------------------------*/
241 /* PRIVATE. Construct notebook. */
242 /*--------------------------------------------------------------------------*/
244 gl_object_notebook_construct_valist (glObjectEditor *editor,
245 glObjectEditorOption first_option,
248 glObjectEditorOption option;
251 gl_debug (DEBUG_EDITOR, "START");
253 option = first_option;
255 for ( option=first_option; option; option=va_arg (args, glObjectEditorOption) ) {
259 case GL_OBJECT_EDITOR_EMPTY:
260 gtk_widget_set_sensitive (editor->priv->title_image, FALSE);
261 gtk_widget_set_sensitive (editor->priv->title_label, FALSE);
264 case GL_OBJECT_EDITOR_POSITION_PAGE:
265 gl_object_editor_prepare_position_page (editor);
269 case GL_OBJECT_EDITOR_SIZE_PAGE:
270 case GL_OBJECT_EDITOR_SIZE_IMAGE_PAGE:
271 gl_object_editor_prepare_size_page (editor, option);
275 case GL_OBJECT_EDITOR_SIZE_LINE_PAGE:
276 gl_object_editor_prepare_lsize_page (editor);
280 case GL_OBJECT_EDITOR_FILL_PAGE:
281 gl_object_editor_prepare_fill_page (editor);
285 case GL_OBJECT_EDITOR_LINE_PAGE:
286 gl_object_editor_prepare_line_page (editor);
290 case GL_OBJECT_EDITOR_IMAGE_PAGE:
291 gl_object_editor_prepare_image_page (editor);
295 case GL_OBJECT_EDITOR_TEXT_PAGE:
296 gl_object_editor_prepare_text_page (editor);
300 case GL_OBJECT_EDITOR_EDIT_PAGE:
301 gl_object_editor_prepare_edit_page (editor);
305 case GL_OBJECT_EDITOR_BC_PAGE:
306 gl_object_editor_prepare_bc_page (editor);
310 case GL_OBJECT_EDITOR_DATA_PAGE:
311 gl_object_editor_prepare_data_page (editor);
316 g_warning ("option = %d", option);
317 g_assert_not_reached ();
322 gtk_widget_show (editor->priv->notebook);
325 g_signal_connect_swapped (G_OBJECT (gl_prefs), "changed",
326 G_CALLBACK (prefs_changed_cb),
329 gl_debug (DEBUG_EDITOR, "END");
332 /*--------------------------------------------------------------------------*/
333 /* PRIVATE. Widget changed callback. Emit our "changed" signal. */
334 /*--------------------------------------------------------------------------*/
336 gl_object_editor_changed_cb (glObjectEditor *editor)
338 gl_debug (DEBUG_EDITOR, "START");
340 /* Emit our "changed" signal */
341 g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0);
343 gl_debug (DEBUG_EDITOR, "END");
346 /*--------------------------------------------------------------------------*/
347 /* PRIVATE. Widget size changed callback. Emit our "size-changed" signal. */
348 /*--------------------------------------------------------------------------*/
350 gl_object_editor_size_changed_cb (glObjectEditor *editor)
352 gl_debug (DEBUG_EDITOR, "START");
354 /* Emit our "size_changed" signal */
355 g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[SIZE_CHANGED], 0);
357 gl_debug (DEBUG_EDITOR, "END");
360 /*****************************************************************************/
361 /* Set possible key names from merge object. */
362 /*****************************************************************************/
364 gl_object_editor_set_key_names (glObjectEditor *editor,
371 gl_debug (DEBUG_EDITOR, "START");
373 if (editor->priv->edit_key_label) {
374 gtk_widget_set_sensitive (editor->priv->edit_key_label, merge != NULL);
377 if (editor->priv->edit_key_combo) {
378 gtk_widget_set_sensitive (editor->priv->edit_key_combo, merge != NULL);
381 if (editor->priv->text_auto_shrink_check) {
382 gtk_widget_set_sensitive (editor->priv->text_auto_shrink_check,
386 if (editor->priv->text_color_key_combo) {
387 gtk_widget_set_sensitive (editor->priv->text_color_key_combo, merge != NULL);
390 if (editor->priv->text_color_key_radio) {
391 gtk_widget_set_sensitive (editor->priv->text_color_key_radio, merge != NULL);
393 gtk_toggle_button_set_active (
394 GTK_TOGGLE_BUTTON(editor->priv->text_color_radio), TRUE);
398 if (editor->priv->edit_insert_field_button) {
399 gtk_widget_set_sensitive (editor->priv->edit_insert_field_button,
403 if (editor->priv->img_key_combo) {
404 gtk_widget_set_sensitive (editor->priv->img_key_combo, merge != NULL);
407 if (editor->priv->img_key_radio) {
408 gtk_widget_set_sensitive (editor->priv->img_key_radio, merge != NULL);
410 gtk_toggle_button_set_active (
411 GTK_TOGGLE_BUTTON(editor->priv->img_file_radio), TRUE);
415 if (editor->priv->data_key_combo) {
416 gtk_widget_set_sensitive (editor->priv->data_key_combo, merge != NULL);
419 if (editor->priv->data_key_radio) {
420 gtk_widget_set_sensitive (editor->priv->data_key_radio, merge != NULL);
422 gtk_toggle_button_set_active (
423 GTK_TOGGLE_BUTTON(editor->priv->data_literal_radio), TRUE);
427 fixed_flag = editor->priv->data_format_fixed_flag;
428 if (editor->priv->data_format_label) {
429 gtk_widget_set_sensitive (editor->priv->data_format_label,
432 if (editor->priv->data_ex_label) {
433 gtk_widget_set_sensitive (editor->priv->data_ex_label,
436 if (editor->priv->data_digits_label) {
437 gtk_widget_set_sensitive (editor->priv->data_digits_label,
438 (merge != NULL) && !fixed_flag);
440 if (editor->priv->data_digits_spin) {
441 gtk_widget_set_sensitive (editor->priv->data_digits_spin,
442 (merge != NULL) && !fixed_flag);
445 if (editor->priv->fill_key_combo) {
446 gtk_widget_set_sensitive (editor->priv->fill_key_combo, merge != NULL);
449 if (editor->priv->fill_key_radio) {
450 gtk_widget_set_sensitive (editor->priv->fill_key_radio, merge != NULL);
452 gtk_toggle_button_set_active (
453 GTK_TOGGLE_BUTTON(editor->priv->fill_color_radio), TRUE);
457 if (editor->priv->line_key_combo) {
458 gtk_widget_set_sensitive (editor->priv->line_key_combo, merge != NULL);
461 if (editor->priv->line_key_radio) {
462 gtk_widget_set_sensitive (editor->priv->line_key_radio, merge != NULL);
464 gtk_toggle_button_set_active (
465 GTK_TOGGLE_BUTTON(editor->priv->line_color_radio), TRUE);
469 if (editor->priv->bc_key_combo) {
470 gtk_widget_set_sensitive (editor->priv->bc_key_combo, merge != NULL);
473 if (editor->priv->bc_key_radio) {
474 gtk_widget_set_sensitive (editor->priv->bc_key_radio, merge != NULL);
476 gtk_toggle_button_set_active (
477 GTK_TOGGLE_BUTTON(editor->priv->bc_color_radio), TRUE);
481 keys = gl_merge_get_key_list (merge);
482 if ( keys != NULL ) {
484 combo = editor->priv->img_key_combo;
486 gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
489 combo = editor->priv->edit_key_combo;
491 gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
494 combo = editor->priv->data_key_combo;
496 gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
499 combo = editor->priv->fill_key_combo;
501 gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
504 combo = editor->priv->text_color_key_combo;
506 gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
509 combo = editor->priv->line_key_combo;
511 gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
514 combo = editor->priv->bc_key_combo;
516 gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
519 gl_merge_free_key_list (&keys);
522 keys = g_list_append (keys, "");
524 combo = editor->priv->img_key_combo;
526 gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
529 combo = editor->priv->edit_key_combo;
531 gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
534 combo = editor->priv->data_key_combo;
536 gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
539 combo = editor->priv->fill_key_combo;
541 gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
544 combo = editor->priv->text_color_key_combo;
546 gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
549 combo = editor->priv->line_key_combo;
551 gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
554 combo = editor->priv->bc_key_combo;
556 gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
562 gl_debug (DEBUG_EDITOR, "END");
565 /*****************************************************************************/
566 /* Construct color combo "Custom widget". */
567 /*****************************************************************************/
569 gl_object_editor_construct_color_combo (gchar *name,
575 GtkWidget *color_combo;
585 cg_name = "text_color_group";
586 color = gl_prefs->default_text_color;
587 no_color = _("Default");
591 cg_name = "line_color_group";
592 color = gl_prefs->default_line_color;
593 no_color = _("No line");
598 cg_name = "fill_color_group";
599 color = gl_prefs->default_fill_color;
600 no_color = _("No fill");
605 cg = color_group_fetch (cg_name, NULL);
606 gdk_color = gl_color_to_gdk_color (color);
607 color_combo = color_combo_new (NULL, no_color, gdk_color, cg);
610 color_combo_box_set_preview_relief (COLOR_COMBO(color_combo), GTK_RELIEF_NORMAL);
615 /*****************************************************************************/
616 /* Construct chain button "Custom widget". */
617 /*****************************************************************************/
619 gl_object_editor_construct_chain_button (gchar *name,
625 GtkWidget *chain_button;
627 chain_button = gl_wdgt_chain_button_new (GL_WDGT_CHAIN_RIGHT);
628 gl_wdgt_chain_button_set_active (GL_WDGT_CHAIN_BUTTON(chain_button), TRUE);
633 /*--------------------------------------------------------------------------*/
634 /* PRIVATE. Prefs changed callback. Update units related items. */
635 /*--------------------------------------------------------------------------*/
637 prefs_changed_cb (glObjectEditor *editor)
640 gl_debug (DEBUG_EDITOR, "START");
642 if (editor->priv->lsize_r_spin) {
643 lsize_prefs_changed_cb (editor);
646 if (editor->priv->size_w_spin) {
647 size_prefs_changed_cb (editor);
650 if (editor->priv->pos_x_spin) {
651 position_prefs_changed_cb (editor);
654 gl_debug (DEBUG_EDITOR, "END");