X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fobject-editor.c;h=68cfa4930b9944c1d0c755704e9f14112aa7860a;hb=087020da573f07b54a9d6f62ff67f73567efb18f;hp=02a153d6b5f26e1bc782741d55f781e35e42dfe2;hpb=b13649a65b7dfa46ba1ed7fe9e8afa4aaef70f79;p=glabels diff --git a/src/object-editor.c b/src/object-editor.c index 02a153d6..68cfa493 100644 --- a/src/object-editor.c +++ b/src/object-editor.c @@ -1,65 +1,65 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ - -/** - * (GLABELS) Label and Business Card Creation program for GNOME - * - * object-editor.c: object properties editor module +/* + * object-editor.c + * Copyright (C) 2003-2009 Jim Evins . * - * Copyright (C) 2003 Jim Evins . + * This file is part of gLabels. * - * This program is free software; you can redistribute it and/or modify + * gLabels is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, + * gLabels is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * along with gLabels. If not, see . */ + #include #include "object-editor.h" #include -#include -#include -#include -#include -#include - +#include #include #include "prefs.h" -#include "mygal/widget-color-combo.h" +#include "color-combo.h" #include "color.h" #include "wdgt-chain-button.h" +#include "field-button.h" #include "marshal.h" -#include "util.h" +#include "combo-util.h" +#include "builder-util.h" +#include "label-box.h" +#include "label-ellipse.h" +#include "label-line.h" +#include "label-image.h" +#include "label-text.h" +#include "label-barcode.h" #include "object-editor-private.h" #include "debug.h" + /*===========================================*/ /* Private macros */ /*===========================================*/ + /*===========================================*/ /* Private data types */ /*===========================================*/ -typedef void (*ChangedSignal) (GObject * object, gpointer data); /*===========================================*/ /* Private globals */ /*===========================================*/ -gint gl_object_editor_signals[LAST_SIGNAL] = { 0 }; /*===========================================*/ /* Local function prototypes */ @@ -67,21 +67,36 @@ gint gl_object_editor_signals[LAST_SIGNAL] = { 0 }; static void gl_object_editor_finalize (GObject *object); -static void gl_object_notebook_construct_valist (glObjectEditor *editor, - glLabel *label, - glObjectEditorOption first_option, - va_list args); +static void set_object (glObjectEditor *editor, + glLabelObject *object); static void prefs_changed_cb (glObjectEditor *editor); static void label_changed_cb (glLabel *label, glObjectEditor *editor); - +static void selection_changed_cb (glLabel *label, + glObjectEditor *editor); + +static void merge_changed_cb (glLabel *label, + glObjectEditor *editor); + +static void set_key_names (glObjectEditor *editor, + glMerge *merge); + +static void object_changed_cb (glLabelObject *object, + glObjectEditor *editor); + +static void object_moved_cb (glLabelObject *object, + glObjectEditor *editor); + + + /*****************************************************************************/ /* Boilerplate object stuff. */ /*****************************************************************************/ -G_DEFINE_TYPE (glObjectEditor, gl_object_editor, GTK_TYPE_VBOX); +G_DEFINE_TYPE (glObjectEditor, gl_object_editor, GTK_TYPE_VBOX) + static void gl_object_editor_class_init (glObjectEditorClass *class) @@ -93,66 +108,72 @@ gl_object_editor_class_init (glObjectEditorClass *class) gl_object_editor_parent_class = g_type_class_peek_parent (class); object_class->finalize = gl_object_editor_finalize; - - gl_object_editor_signals[CHANGED] = - g_signal_new ("changed", - G_OBJECT_CLASS_TYPE(object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (glObjectEditorClass, changed), - NULL, NULL, - gl_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - gl_object_editor_signals[SIZE_CHANGED] = - g_signal_new ("size_changed", - G_OBJECT_CLASS_TYPE(object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (glObjectEditorClass, size_changed), - NULL, NULL, - gl_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - gl_debug (DEBUG_EDITOR, "END"); } + static void gl_object_editor_init (glObjectEditor *editor) { + gchar *builder_filename; + static gchar *object_ids[] = { "editor_vbox", + "adjustment1", "adjustment2", "adjustment3", + "adjustment4", "adjustment5", "adjustment6", + "adjustment7", "adjustment8", "adjustment9", + "adjustment10", "adjustment11", "adjustment12", + "adjustment13", "page_sizegroup", "width_sizegroup", + NULL }; + GError *error = NULL; + gchar *s; + gl_debug (DEBUG_EDITOR, "START"); editor->priv = g_new0 (glObjectEditorPrivate, 1); - editor->priv->gui = glade_xml_new (GLABELS_GLADE_DIR "object-editor.glade", - "editor_vbox", - NULL); + editor->priv->builder = gtk_builder_new (); - if (!editor->priv->gui) { - g_critical ("Could not open object-editor.glade. gLabels may not be installed correctly!"); + builder_filename = g_build_filename (GLABELS_DATA_DIR, "ui", "object-editor.ui", NULL); + gtk_builder_add_objects_from_file (editor->priv->builder, builder_filename, object_ids, &error); + g_free (builder_filename); + if (error) { + g_critical ("%s\n\ngLabels may not be installed correctly!", error->message); + g_error_free (error); return; } - editor->priv->editor_vbox = glade_xml_get_widget (editor->priv->gui, - "editor_vbox"); + gl_builder_util_get_widgets (editor->priv->builder, + "editor_vbox", &editor->priv->editor_vbox, + "title_image", &editor->priv->title_image, + "title_label", &editor->priv->title_label, + "notebook", &editor->priv->notebook, + NULL); + gtk_box_pack_start (GTK_BOX(editor), editor->priv->editor_vbox, FALSE, FALSE, 0); - editor->priv->title_image = glade_xml_get_widget (editor->priv->gui, - "title_image"); - editor->priv->title_label = glade_xml_get_widget (editor->priv->gui, - "title_label"); - editor->priv->notebook = glade_xml_get_widget (editor->priv->gui, - "notebook"); - gtk_widget_show_all (GTK_WIDGET(editor)); + gtk_image_set_from_icon_name (GTK_IMAGE(editor->priv->title_image), + "glabels-object-properties", + GTK_ICON_SIZE_LARGE_TOOLBAR); + + s = g_strdup_printf ("%s", + _("Object properties")); + gtk_label_set_text (GTK_LABEL(editor->priv->title_label), s); + gtk_label_set_use_markup (GTK_LABEL(editor->priv->title_label), TRUE); + g_free (s); + + gtk_widget_set_sensitive (editor->priv->title_image, FALSE); + gtk_widget_set_sensitive (editor->priv->title_label, FALSE); + /* Hide all notebook pages to start with. */ - gtk_widget_hide_all (editor->priv->notebook); + gtk_widget_hide (editor->priv->notebook); gtk_widget_set_no_show_all (editor->priv->notebook, TRUE); gl_debug (DEBUG_EDITOR, "END"); } + static void gl_object_editor_finalize (GObject *object) { @@ -166,10 +187,28 @@ gl_object_editor_finalize (GObject *object) g_signal_handlers_disconnect_by_func (G_OBJECT(gl_prefs), prefs_changed_cb, editor); - g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->label), - label_changed_cb, editor); - g_object_unref (editor->priv->gui); + if (editor->priv->label) + { + g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->label), + label_changed_cb, editor); + g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->label), + merge_changed_cb, editor); + g_object_unref (editor->priv->label); + } + + if (editor->priv->object) + { + g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->object), + object_changed_cb, editor); + g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->object), + object_moved_cb, editor); + g_object_unref (editor->priv->object); + } + + g_object_unref (editor->priv->builder); + + g_free (editor->priv->current_backend_id); g_free (editor->priv); G_OBJECT_CLASS (gl_object_editor_parent_class)->finalize (object); @@ -177,517 +216,877 @@ gl_object_editor_finalize (GObject *object) gl_debug (DEBUG_EDITOR, "END"); } + /*****************************************************************************/ -/* NEW object editor. */ +/* NEW object editor. */ /*****************************************************************************/ GtkWidget* -gl_object_editor_new (gchar *image, - gchar *title, - glLabel *label, - glObjectEditorOption first_option, ...) +gl_object_editor_new (void) { glObjectEditor *editor; - va_list args; gl_debug (DEBUG_EDITOR, "START"); editor = GL_OBJECT_EDITOR (g_object_new (GL_TYPE_OBJECT_EDITOR, NULL)); - if (image) { - gtk_image_set_from_stock (GTK_IMAGE(editor->priv->title_image), - image, - GTK_ICON_SIZE_LARGE_TOOLBAR); - } + gtk_widget_set_sensitive (editor->priv->title_image, FALSE); + gtk_widget_set_sensitive (editor->priv->title_label, FALSE); + + gl_object_editor_prepare_position_page (editor); + gl_object_editor_prepare_size_page (editor); + gl_object_editor_prepare_lsize_page (editor); + gl_object_editor_prepare_fill_page (editor); + gl_object_editor_prepare_line_page (editor); + gl_object_editor_prepare_image_page (editor); + gl_object_editor_prepare_text_page (editor); + gl_object_editor_prepare_edit_page (editor); + gl_object_editor_prepare_bc_page (editor); + gl_object_editor_prepare_data_page (editor); + gl_object_editor_prepare_shadow_page (editor); + + g_signal_connect_swapped (G_OBJECT (gl_prefs), "changed", + G_CALLBACK (prefs_changed_cb), editor); + + gl_debug (DEBUG_EDITOR, "END"); + + return GTK_WIDGET(editor); +} + + +/*****************************************************************************/ +/* Set label. */ +/*****************************************************************************/ +void +gl_object_editor_set_label (glObjectEditor *editor, + glLabel *label) +{ + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->label = g_object_ref (label); + + label_changed_cb (label, editor); + merge_changed_cb (label, editor); - if (title) { - gchar *s; + g_signal_connect (G_OBJECT(label), "selection_changed", + G_CALLBACK(selection_changed_cb), editor); + g_signal_connect (G_OBJECT (label), "size_changed", + G_CALLBACK (label_changed_cb), editor); + g_signal_connect (G_OBJECT (label), "merge_changed", + G_CALLBACK (merge_changed_cb), editor); + + gl_debug (DEBUG_EDITOR, "END"); +} + + +/*--------------------------------------------------------------------------*/ +/* Private. Set object. */ +/*--------------------------------------------------------------------------*/ +static void +set_object (glObjectEditor *editor, + glLabelObject *object) +{ + gchar *image; + gchar *title; + gchar *s; + GtkTextBuffer *buffer; + gint old_page, new_page; + + gl_debug (DEBUG_EDITOR, "START"); + + if ( editor->priv->object != NULL ) + { + g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->object), + object_changed_cb, editor); + g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->object), + object_moved_cb, editor); + g_object_unref (editor->priv->object); + } + + if (object) + { + editor->priv->object = g_object_ref (object); + + old_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (editor->priv->notebook)); + + if (GL_IS_LABEL_BOX (object)) + { + image = "glabels-box"; + title = _("Box object properties"); + + gtk_widget_show_all (editor->priv->pos_page_vbox); + gtk_widget_show_all (editor->priv->size_page_vbox); + gtk_widget_hide (editor->priv->lsize_page_vbox); + gtk_widget_show_all (editor->priv->fill_page_vbox); + gtk_widget_show_all (editor->priv->line_page_vbox); + gtk_widget_hide (editor->priv->img_page_vbox); + gtk_widget_hide (editor->priv->text_page_vbox); + gtk_widget_hide (editor->priv->edit_page_vbox); + gtk_widget_hide (editor->priv->bc_page_vbox); + gtk_widget_hide (editor->priv->data_page_vbox); + gtk_widget_show_all (editor->priv->shadow_page_vbox); + + gtk_widget_hide (editor->priv->size_reset_image_button); + } + else if (GL_IS_LABEL_ELLIPSE (object)) + { + image = "glabels-ellipse"; + title = _("Ellipse object properties"); + + gtk_widget_show_all (editor->priv->pos_page_vbox); + gtk_widget_show_all (editor->priv->size_page_vbox); + gtk_widget_hide (editor->priv->lsize_page_vbox); + gtk_widget_show_all (editor->priv->fill_page_vbox); + gtk_widget_show_all (editor->priv->line_page_vbox); + gtk_widget_hide (editor->priv->img_page_vbox); + gtk_widget_hide (editor->priv->text_page_vbox); + gtk_widget_hide (editor->priv->edit_page_vbox); + gtk_widget_hide (editor->priv->bc_page_vbox); + gtk_widget_hide (editor->priv->data_page_vbox); + gtk_widget_show_all (editor->priv->shadow_page_vbox); + + gtk_widget_hide (editor->priv->size_reset_image_button); + } + else if (GL_IS_LABEL_LINE (object)) + { + image = "glabels-line"; + title = _("Line object properties"); + + gtk_widget_show_all (editor->priv->pos_page_vbox); + gtk_widget_hide (editor->priv->size_page_vbox); + gtk_widget_show_all (editor->priv->lsize_page_vbox); + gtk_widget_hide (editor->priv->fill_page_vbox); + gtk_widget_show_all (editor->priv->line_page_vbox); + gtk_widget_hide (editor->priv->img_page_vbox); + gtk_widget_hide (editor->priv->text_page_vbox); + gtk_widget_hide (editor->priv->edit_page_vbox); + gtk_widget_hide (editor->priv->bc_page_vbox); + gtk_widget_hide (editor->priv->data_page_vbox); + gtk_widget_show_all (editor->priv->shadow_page_vbox); + } + else if (GL_IS_LABEL_IMAGE (object)) + { + image = "glabels-image"; + title = _("Image object properties"); + + gtk_widget_show_all (editor->priv->pos_page_vbox); + gtk_widget_show_all (editor->priv->size_page_vbox); + gtk_widget_hide (editor->priv->lsize_page_vbox); + gtk_widget_hide (editor->priv->fill_page_vbox); + gtk_widget_hide (editor->priv->line_page_vbox); + gtk_widget_show_all (editor->priv->img_page_vbox); + gtk_widget_hide (editor->priv->text_page_vbox); + gtk_widget_hide (editor->priv->edit_page_vbox); + gtk_widget_hide (editor->priv->bc_page_vbox); + gtk_widget_hide (editor->priv->data_page_vbox); + gtk_widget_show_all (editor->priv->shadow_page_vbox); + } + else if (GL_IS_LABEL_TEXT (object)) + { + image = "glabels-text"; + title = _("Text object properties"); + + gtk_widget_show_all (editor->priv->pos_page_vbox); + gtk_widget_show_all (editor->priv->size_page_vbox); + gtk_widget_hide (editor->priv->lsize_page_vbox); + gtk_widget_hide (editor->priv->fill_page_vbox); + gtk_widget_hide (editor->priv->line_page_vbox); + gtk_widget_hide (editor->priv->img_page_vbox); + gtk_widget_show_all (editor->priv->text_page_vbox); + gtk_widget_show_all (editor->priv->edit_page_vbox); + gtk_widget_hide (editor->priv->bc_page_vbox); + gtk_widget_hide (editor->priv->data_page_vbox); + gtk_widget_show_all (editor->priv->shadow_page_vbox); + + gtk_widget_hide (editor->priv->size_reset_image_button); + + buffer = gl_label_text_get_buffer (GL_LABEL_TEXT(object)); + gl_object_editor_set_text_buffer (editor, buffer); + } + else if (GL_IS_LABEL_BARCODE (object)) + { + image = "glabels-barcode"; + title = _("Barcode object properties"); + + gtk_widget_show_all (editor->priv->pos_page_vbox); + gtk_widget_show_all (editor->priv->size_page_vbox); + gtk_widget_hide (editor->priv->lsize_page_vbox); + gtk_widget_hide (editor->priv->fill_page_vbox); + gtk_widget_hide (editor->priv->line_page_vbox); + gtk_widget_hide (editor->priv->img_page_vbox); + gtk_widget_hide (editor->priv->text_page_vbox); + gtk_widget_hide (editor->priv->edit_page_vbox); + gtk_widget_show_all (editor->priv->bc_page_vbox); + gtk_widget_show_all (editor->priv->data_page_vbox); + gtk_widget_hide (editor->priv->shadow_page_vbox); + + gtk_widget_hide (editor->priv->size_reset_image_button); + } + + gtk_image_set_from_icon_name (GTK_IMAGE(editor->priv->title_image), + image, + GTK_ICON_SIZE_LARGE_TOOLBAR); s = g_strdup_printf ("%s", title); gtk_label_set_text (GTK_LABEL(editor->priv->title_label), s); + gtk_label_set_use_markup (GTK_LABEL(editor->priv->title_label), TRUE); g_free (s); + gtk_widget_set_sensitive (editor->priv->title_image, TRUE); + gtk_widget_set_sensitive (editor->priv->title_label, TRUE); + + gtk_widget_show (editor->priv->notebook); + + /* if the old active page is no longer visible, set to 1st visible page. */ + new_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (editor->priv->notebook)); + if ( old_page != new_page ) + { + /* Trick: try in reverse order, only the last visible attempt will stick. */ + gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 5); + gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 4); + gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 3); + gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 2); + gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 1); + gtk_notebook_set_current_page (GTK_NOTEBOOK (editor->priv->notebook), 0); + } + + object_moved_cb (object, editor); + object_changed_cb (object, editor); + + g_signal_connect (G_OBJECT (object), "changed", + G_CALLBACK (object_changed_cb), editor); + g_signal_connect (G_OBJECT (object), "moved", + G_CALLBACK (object_moved_cb), editor); + } + else + { + editor->priv->object = NULL; + + gtk_image_set_from_icon_name (GTK_IMAGE(editor->priv->title_image), + "glabels-object-properties", + GTK_ICON_SIZE_LARGE_TOOLBAR); + + s = g_strdup_printf ("%s", + _("Object properties")); + gtk_label_set_text (GTK_LABEL(editor->priv->title_label), s); gtk_label_set_use_markup (GTK_LABEL(editor->priv->title_label), TRUE); - - } + g_free (s); - gtk_notebook_set_homogeneous_tabs (GTK_NOTEBOOK(editor->priv->notebook), TRUE); + gtk_widget_set_sensitive (editor->priv->title_image, FALSE); + gtk_widget_set_sensitive (editor->priv->title_label, FALSE); - va_start (args, first_option); - gl_object_notebook_construct_valist (editor, label, first_option, args); - va_end (args); + gtk_widget_hide (editor->priv->notebook); + } gl_debug (DEBUG_EDITOR, "END"); - - return GTK_WIDGET(editor); } + /*--------------------------------------------------------------------------*/ -/* PRIVATE. Construct notebook. */ +/* PRIVATE. Prefs changed callback. Update units related items. */ /*--------------------------------------------------------------------------*/ static void -gl_object_notebook_construct_valist (glObjectEditor *editor, - glLabel *label, - glObjectEditorOption first_option, - va_list args) +prefs_changed_cb (glObjectEditor *editor) { - glObjectEditorOption option; - gint pages = 0; gl_debug (DEBUG_EDITOR, "START"); - editor->priv->label = label; - - option = first_option; - - for ( option=first_option; option; option=va_arg (args, glObjectEditorOption) ) { - - switch (option) { - - case GL_OBJECT_EDITOR_EMPTY: - gtk_widget_set_sensitive (editor->priv->title_image, FALSE); - gtk_widget_set_sensitive (editor->priv->title_label, FALSE); - break; - - case GL_OBJECT_EDITOR_POSITION_PAGE: - gl_object_editor_prepare_position_page (editor); - pages++; - break; - - case GL_OBJECT_EDITOR_SIZE_PAGE: - case GL_OBJECT_EDITOR_SIZE_IMAGE_PAGE: - gl_object_editor_prepare_size_page (editor, option); - pages++; - break; - - case GL_OBJECT_EDITOR_SIZE_LINE_PAGE: - gl_object_editor_prepare_lsize_page (editor); - pages++; - break; - - case GL_OBJECT_EDITOR_FILL_PAGE: - gl_object_editor_prepare_fill_page (editor); - pages++; - break; - - case GL_OBJECT_EDITOR_LINE_PAGE: - gl_object_editor_prepare_line_page (editor); - pages++; - break; - - case GL_OBJECT_EDITOR_IMAGE_PAGE: - gl_object_editor_prepare_image_page (editor); - pages++; - break; - - case GL_OBJECT_EDITOR_TEXT_PAGE: - gl_object_editor_prepare_text_page (editor); - pages++; - break; - - case GL_OBJECT_EDITOR_EDIT_PAGE: - gl_object_editor_prepare_edit_page (editor); - pages++; - break; - - case GL_OBJECT_EDITOR_BC_PAGE: - gl_object_editor_prepare_bc_page (editor); - pages++; - break; - - case GL_OBJECT_EDITOR_DATA_PAGE: - gl_object_editor_prepare_data_page (editor); - pages++; - break; - - case GL_OBJECT_EDITOR_SHADOW_PAGE: - gl_object_editor_prepare_shadow_page (editor); - pages++; - break; - - default: - g_message ("option = %d", option); - g_assert_not_reached (); - } + if (editor->priv->lsize_r_spin) { + lsize_prefs_changed_cb (editor); + } + if (editor->priv->size_w_spin) { + size_prefs_changed_cb (editor); } - if (pages) { - gtk_widget_show (editor->priv->notebook); + + if (editor->priv->pos_x_spin) { + position_prefs_changed_cb (editor); } - g_signal_connect_swapped (G_OBJECT (gl_prefs), "changed", - G_CALLBACK (prefs_changed_cb), - editor); - if (label) + if (editor->priv->shadow_x_spin) { + shadow_prefs_changed_cb (editor); + } + + gl_debug (DEBUG_EDITOR, "END"); +} + + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Label "selection state changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +selection_changed_cb (glLabel *label, + glObjectEditor *editor) +{ + glLabelObject *object; + + gl_debug (DEBUG_EDITOR, "START"); + + g_return_if_fail (label && GL_IS_LABEL (label)); + g_return_if_fail (editor && GL_IS_OBJECT_EDITOR (editor)); + + if (!gl_label_is_selection_atomic (label)) { - label_changed_cb (label, editor); - g_signal_connect (G_OBJECT (label), "size_changed", - G_CALLBACK (label_changed_cb), - editor); - g_signal_connect (G_OBJECT (label), "merge_changed", - G_CALLBACK (label_changed_cb), - editor); - } + set_object (editor, NULL); + } + else + { + object = gl_label_get_1st_selected_object (label); + set_object (editor, object); + } gl_debug (DEBUG_EDITOR, "END"); } -/*--------------------------------------------------------------------------*/ -/* PRIVATE. Widget changed callback. Emit our "changed" signal. */ -/*--------------------------------------------------------------------------*/ -void -gl_object_editor_changed_cb (glObjectEditor *editor) + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label "size_changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +label_changed_cb (glLabel *label, + glObjectEditor *editor) { - if (editor->priv->stop_signals) return; + gdouble label_width, label_height; gl_debug (DEBUG_EDITOR, "START"); - /* Emit our "changed" signal */ - g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0); + gl_label_get_size (label, &label_width, &label_height); + gl_object_editor_set_max_position (GL_OBJECT_EDITOR (editor), + label_width, label_height); + gl_object_editor_set_max_size (GL_OBJECT_EDITOR (editor), + label_width, label_height); + gl_object_editor_set_max_lsize (GL_OBJECT_EDITOR (editor), + label_width, label_height); + gl_object_editor_set_max_shadow_offset (GL_OBJECT_EDITOR (editor), + label_width, label_height); gl_debug (DEBUG_EDITOR, "END"); } -/*--------------------------------------------------------------------------*/ -/* PRIVATE. Widget size changed callback. Emit our "size-changed" signal. */ -/*--------------------------------------------------------------------------*/ -void -gl_object_editor_size_changed_cb (glObjectEditor *editor) + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label "merge_changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +merge_changed_cb (glLabel *label, + glObjectEditor *editor) { - if (editor->priv->stop_signals) return; + glMerge *merge; gl_debug (DEBUG_EDITOR, "START"); - /* Emit our "size_changed" signal */ - g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[SIZE_CHANGED], 0); + merge = gl_label_get_merge (label); + set_key_names (editor, merge); gl_debug (DEBUG_EDITOR, "END"); } -/*****************************************************************************/ -/* Set possible key names from merge object. */ -/*****************************************************************************/ -void -gl_object_editor_set_key_names (glObjectEditor *editor, - glMerge *merge) + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Load up possible key names from merge into various widgets. */ +/*---------------------------------------------------------------------------*/ +static void +set_key_names (glObjectEditor *editor, + glMerge *merge) { GList *keys; - GtkWidget *combo; + GtkWidget *button; gboolean fixed_flag; gboolean state; gl_debug (DEBUG_EDITOR, "START"); - if (editor->priv->edit_key_label) { - gtk_widget_set_sensitive (editor->priv->edit_key_label, merge != NULL); - } - - if (editor->priv->edit_key_combo) { - gtk_widget_set_sensitive (editor->priv->edit_key_combo, merge != NULL); - } - - if (editor->priv->text_auto_shrink_check) { - gtk_widget_set_sensitive (editor->priv->text_auto_shrink_check, - merge != NULL); - } + gtk_widget_set_sensitive (editor->priv->text_auto_shrink_check, + merge != NULL); - if (editor->priv->text_page_vbox) { - gtk_widget_set_sensitive (editor->priv->text_color_key_radio, merge != NULL); - if (merge == NULL) { - gtk_toggle_button_set_active ( - GTK_TOGGLE_BUTTON(editor->priv->text_color_radio), TRUE); - gtk_widget_set_sensitive (editor->priv->text_color_combo, TRUE); - gtk_widget_set_sensitive (editor->priv->text_color_key_combo, FALSE); - } else { - state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->text_color_key_radio)); - gtk_widget_set_sensitive (editor->priv->text_color_combo, !state); - gtk_widget_set_sensitive (editor->priv->text_color_key_combo, state); - - } + gtk_widget_set_sensitive (editor->priv->text_color_key_radio, merge != NULL); + if (merge == NULL) + { + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(editor->priv->text_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->text_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->text_color_key_combo, FALSE); + } + else + { + state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->text_color_key_radio)); + gtk_widget_set_sensitive (editor->priv->text_color_combo, !state); + gtk_widget_set_sensitive (editor->priv->text_color_key_combo, state); } - if (editor->priv->edit_insert_field_button) { - gtk_widget_set_sensitive (editor->priv->edit_insert_field_button, - merge != NULL); - } + gtk_widget_set_sensitive (editor->priv->edit_insert_field_button, + merge != NULL); - if (editor->priv->img_key_combo) { - gtk_widget_set_sensitive (editor->priv->img_key_combo, merge != NULL); - } + gtk_widget_set_sensitive (editor->priv->img_key_combo, merge != NULL); - if (editor->priv->img_key_radio) { - gtk_widget_set_sensitive (editor->priv->img_key_radio, merge != NULL); - if (merge == NULL) { - gtk_toggle_button_set_active ( - GTK_TOGGLE_BUTTON(editor->priv->img_file_radio), TRUE); - } - } + gtk_widget_set_sensitive (editor->priv->img_key_radio, merge != NULL); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(editor->priv->img_file_radio), + merge == NULL); - if (editor->priv->data_key_combo) { - gtk_widget_set_sensitive (editor->priv->data_key_combo, merge != NULL); - } + gtk_widget_set_sensitive (editor->priv->data_key_combo, merge != NULL); - if (editor->priv->data_key_radio) { - gtk_widget_set_sensitive (editor->priv->data_key_radio, merge != NULL); - if (merge == NULL) { - gtk_toggle_button_set_active ( - GTK_TOGGLE_BUTTON(editor->priv->data_literal_radio), TRUE); - } - } + gtk_widget_set_sensitive (editor->priv->data_key_radio, merge != NULL); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(editor->priv->data_literal_radio), + merge == NULL); fixed_flag = editor->priv->data_format_fixed_flag; - if (editor->priv->data_format_label) { - gtk_widget_set_sensitive (editor->priv->data_format_label, - (merge != NULL)); - } - if (editor->priv->data_ex_label) { - gtk_widget_set_sensitive (editor->priv->data_ex_label, - (merge != NULL)); - } - if (editor->priv->data_digits_label) { - gtk_widget_set_sensitive (editor->priv->data_digits_label, - (merge != NULL) && !fixed_flag); - } - if (editor->priv->data_digits_spin) { - gtk_widget_set_sensitive (editor->priv->data_digits_spin, - (merge != NULL) && !fixed_flag); - } - - if (editor->priv->fill_page_vbox) { - gtk_widget_set_sensitive (editor->priv->fill_key_radio, merge != NULL); - if (merge == NULL) { - gtk_toggle_button_set_active ( - GTK_TOGGLE_BUTTON(editor->priv->fill_color_radio), TRUE); - gtk_widget_set_sensitive (editor->priv->fill_color_combo, TRUE); - gtk_widget_set_sensitive (editor->priv->fill_key_combo, FALSE); - } else { - state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->fill_key_radio)); - gtk_widget_set_sensitive (editor->priv->fill_color_combo, !state); - gtk_widget_set_sensitive (editor->priv->fill_key_combo, state); - - } - } + gtk_widget_set_sensitive (editor->priv->data_format_label, merge != NULL); + gtk_widget_set_sensitive (editor->priv->data_ex_label, merge != NULL); + gtk_widget_set_sensitive (editor->priv->data_digits_label, + (merge != NULL) && !fixed_flag); + gtk_widget_set_sensitive (editor->priv->data_digits_spin, + (merge != NULL) && !fixed_flag); + + gtk_widget_set_sensitive (editor->priv->fill_key_radio, merge != NULL); + if (merge == NULL) + { + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(editor->priv->fill_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->fill_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->fill_key_combo, FALSE); + } + else + { + state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->fill_key_radio)); + gtk_widget_set_sensitive (editor->priv->fill_color_combo, !state); + gtk_widget_set_sensitive (editor->priv->fill_key_combo, state); + } - if (editor->priv->line_page_vbox) { - gtk_widget_set_sensitive (editor->priv->line_key_radio, merge != NULL); - if (merge == NULL) { - gtk_toggle_button_set_active ( - GTK_TOGGLE_BUTTON(editor->priv->line_color_radio), TRUE); - gtk_widget_set_sensitive (editor->priv->line_color_combo, TRUE); - gtk_widget_set_sensitive (editor->priv->line_key_combo, FALSE); - } else { - state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->line_key_radio)); - gtk_widget_set_sensitive (editor->priv->line_color_combo, !state); - gtk_widget_set_sensitive (editor->priv->line_key_combo, state); - - } - } + gtk_widget_set_sensitive (editor->priv->line_key_radio, merge != NULL); + if (merge == NULL) + { + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(editor->priv->line_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->line_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->line_key_combo, FALSE); + } + else + { + state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->line_key_radio)); + gtk_widget_set_sensitive (editor->priv->line_color_combo, !state); + gtk_widget_set_sensitive (editor->priv->line_key_combo, state); + } - if (editor->priv->bc_page_vbox) { - gtk_widget_set_sensitive (editor->priv->bc_key_radio, merge != NULL); - if (merge == NULL) { - gtk_toggle_button_set_active ( - GTK_TOGGLE_BUTTON(editor->priv->bc_color_radio), TRUE); - gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE); - gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE); - } else { - state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->bc_key_radio)); - gtk_widget_set_sensitive (editor->priv->bc_color_combo, !state); - gtk_widget_set_sensitive (editor->priv->bc_key_combo, state); - - } - } + gtk_widget_set_sensitive (editor->priv->bc_key_radio, merge != NULL); + if (merge == NULL) + { + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(editor->priv->bc_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE); + } + else + { + state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->bc_key_radio)); + gtk_widget_set_sensitive (editor->priv->bc_color_combo, !state); + gtk_widget_set_sensitive (editor->priv->bc_key_combo, state); + } - if (editor->priv->shadow_page_vbox) { - gtk_widget_set_sensitive (editor->priv->shadow_key_radio, merge != NULL); - if (merge == NULL) { - gtk_toggle_button_set_active ( - GTK_TOGGLE_BUTTON(editor->priv->shadow_color_radio), TRUE); - gtk_widget_set_sensitive (editor->priv->shadow_color_combo, TRUE); - gtk_widget_set_sensitive (editor->priv->shadow_key_combo, FALSE); - } else { - state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->shadow_key_radio)); - gtk_widget_set_sensitive (editor->priv->shadow_color_combo, !state); - gtk_widget_set_sensitive (editor->priv->shadow_key_combo, state); - - } - } + gtk_widget_set_sensitive (editor->priv->shadow_key_radio, merge != NULL); + if (merge == NULL) + { + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(editor->priv->shadow_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->shadow_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->shadow_key_combo, FALSE); + } + else + { + state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->shadow_key_radio)); + gtk_widget_set_sensitive (editor->priv->shadow_color_combo, !state); + gtk_widget_set_sensitive (editor->priv->shadow_key_combo, state); + } keys = gl_merge_get_key_list (merge); if ( keys == NULL ) { keys = g_list_append (keys, g_strdup ("")); } - combo = editor->priv->img_key_combo; - if (combo) { - gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys); - } + button = editor->priv->img_key_combo; + gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys); - combo = editor->priv->edit_key_combo; - if (combo) { - gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys); - } + button = editor->priv->edit_insert_field_button; + gl_field_button_set_keys (GL_FIELD_BUTTON(button), keys); - combo = editor->priv->data_key_combo; - if (combo) { - gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys); - } + button = editor->priv->data_key_combo; + gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys); - combo = editor->priv->fill_key_combo; - if (combo) { - gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys); - } + button = editor->priv->fill_key_combo; + gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys); - combo = editor->priv->text_color_key_combo; - if (combo) { - gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys); - } + button = editor->priv->text_color_key_combo; + gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys); - combo = editor->priv->line_key_combo; - if (combo) { - gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys); - } + button = editor->priv->line_key_combo; + gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys); - combo = editor->priv->bc_key_combo; - if (combo) { - gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys); - } + button = editor->priv->bc_key_combo; + gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys); - combo = editor->priv->shadow_key_combo; - if (combo) { - gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys); - } + button = editor->priv->shadow_key_combo; + gl_field_button_set_keys (GL_FIELD_BUTTON (button), keys); gl_merge_free_key_list (&keys); gl_debug (DEBUG_EDITOR, "END"); } -/*****************************************************************************/ -/* Construct color combo "Custom widget". */ -/*****************************************************************************/ -GtkWidget * -gl_object_editor_construct_color_combo (gchar *name, - gchar *string1, - gchar *string2, - gint int1, - gint int2) + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. object "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +object_changed_cb (glLabelObject *object, + glObjectEditor *editor) { - GtkWidget *color_combo; - ColorGroup *cg; - gchar *cg_name; - GdkColor *gdk_color; - gchar *no_color; - - switch (int1) { - - case 3: - cg_name = "shadow_color_group"; - gdk_color = gl_color_to_gdk_color (GL_COLOR_SHADOW_DEFAULT); - no_color = _("Default"); - break; - - case 2: - cg_name = "text_color_group"; - gdk_color = gl_color_to_gdk_color (gl_prefs->default_text_color); - no_color = _("Default"); - break; - - case 1: - cg_name = "line_color_group"; - gdk_color = NULL; - no_color = _("No line"); - break; - - case 0: - default: - cg_name = "fill_color_group"; - gdk_color = NULL; - no_color = _("No fill"); - break; + gdouble w, h; + glColorNode *line_color_node; + gdouble line_width; + glColorNode *fill_color_node; + gchar *font_family; + gdouble font_size; + PangoWeight font_weight; + gboolean font_italic_flag; + glColorNode *text_color_node; + PangoAlignment align; + gdouble text_line_spacing; + gboolean auto_shrink; + gdouble image_w, image_h; + glTextNode *filename; + glTextNode *bc_data; + glLabelBarcodeStyle *bc_style; + gboolean shadow_state; + gdouble shadow_x, shadow_y; + glColorNode *shadow_color_node; + gdouble shadow_opacity; + glLabel *label; + glMerge *merge; + + gl_debug (DEBUG_EDITOR, "BEGIN"); + + + label = gl_label_object_get_parent (object); + merge = gl_label_get_merge (label); + + + if ( GL_IS_LABEL_BOX (object) || GL_IS_LABEL_ELLIPSE (object) ) + { - } + gl_label_object_get_size (object, &w, &h); + fill_color_node = gl_label_object_get_fill_color (GL_LABEL_OBJECT(object)); + line_color_node = gl_label_object_get_line_color (GL_LABEL_OBJECT(object)); + line_width = gl_label_object_get_line_width (GL_LABEL_OBJECT(object)); + + gl_object_editor_set_size (editor, w, h); + gl_object_editor_set_fill_color (editor, (merge != NULL), fill_color_node); + gl_object_editor_set_line_color (editor, (merge != NULL), line_color_node); + gl_object_editor_set_line_width (editor, line_width); + + gl_color_node_free (&fill_color_node); + gl_color_node_free (&line_color_node); + + } + else if ( GL_IS_LABEL_LINE (object) ) + { + + gl_label_object_get_size (object, &w, &h); + line_color_node = gl_label_object_get_line_color (GL_LABEL_OBJECT(object)); + line_width = gl_label_object_get_line_width (GL_LABEL_OBJECT(object)); + + gl_object_editor_set_lsize (editor, w, h); + gl_object_editor_set_line_color (editor, (merge != NULL), line_color_node); + gl_object_editor_set_line_width (editor, line_width); + + gl_color_node_free (&line_color_node); + + } + else if ( GL_IS_LABEL_IMAGE (object) ) + { + + gl_label_object_get_size (object, &w, &h); + filename = gl_label_image_get_filename (GL_LABEL_IMAGE(object)); + + gl_label_image_get_base_size (GL_LABEL_IMAGE(object), &image_w, &image_h); + + gl_object_editor_set_size (editor, w, h); + gl_object_editor_set_base_size (editor, image_w, image_h); + gl_object_editor_set_image (editor, (merge != NULL), filename); + + gl_text_node_free (&filename); + + } + else if ( GL_IS_LABEL_TEXT (object) ) + { + + gl_label_object_get_size (object, &w, &h); + font_family = gl_label_object_get_font_family (object); + font_size = gl_label_object_get_font_size (object); + font_weight = gl_label_object_get_font_weight (object); + font_italic_flag = gl_label_object_get_font_italic_flag (object); + text_color_node = gl_label_object_get_text_color (object); + align = gl_label_object_get_text_alignment (object); + text_line_spacing = gl_label_object_get_text_line_spacing (object); + auto_shrink = gl_label_text_get_auto_shrink (GL_LABEL_TEXT (object)); + + gl_object_editor_set_size (editor, w, h); + gl_object_editor_set_font_family (editor, font_family); + gl_object_editor_set_font_size (editor, font_size); + gl_object_editor_set_font_weight (editor, font_weight); + gl_object_editor_set_font_italic_flag (editor, font_italic_flag); + gl_object_editor_set_text_color (editor, (merge != NULL), text_color_node); + gl_object_editor_set_text_alignment (editor, align); + gl_object_editor_set_text_line_spacing (editor, text_line_spacing); + gl_object_editor_set_text_auto_shrink (editor, auto_shrink); + + gl_color_node_free (&text_color_node); + g_free (font_family); + + } + else if ( GL_IS_LABEL_BARCODE (object) ) + { + + gl_label_object_get_size (object, &w, &h); + bc_data = gl_label_barcode_get_data (GL_LABEL_BARCODE(object)); + bc_style = gl_label_barcode_get_style (GL_LABEL_BARCODE(object)); + line_color_node = gl_label_object_get_line_color (GL_LABEL_OBJECT(object)); - cg = color_group_fetch (cg_name, NULL); - color_combo = color_combo_new (NULL, no_color, gdk_color, cg); - g_free (gdk_color); + gl_object_editor_set_size (editor, w, h); + gl_object_editor_set_data (editor, (merge != NULL), bc_data); + gl_object_editor_set_bc_style (editor, bc_style); + gl_object_editor_set_bc_color (editor, (merge != NULL), line_color_node); + + gl_text_node_free (&bc_data); + gl_label_barcode_style_free (bc_style); + + } - color_combo_box_set_preview_relief (COLOR_COMBO(color_combo), GTK_RELIEF_NORMAL); - return color_combo; + shadow_state = gl_label_object_get_shadow_state (object); + gl_label_object_get_shadow_offset (object, &shadow_x, &shadow_y); + shadow_color_node = gl_label_object_get_shadow_color (object); + shadow_opacity = gl_label_object_get_shadow_opacity (object); + + gl_object_editor_set_shadow_state (editor, shadow_state); + gl_object_editor_set_shadow_offset (editor, shadow_x, shadow_y); + gl_object_editor_set_shadow_color (editor, (merge != NULL), shadow_color_node); + gl_object_editor_set_shadow_opacity (editor, shadow_opacity); + + gl_color_node_free (&shadow_color_node); + + + gl_debug (DEBUG_EDITOR, "END"); } -/*****************************************************************************/ -/* Construct chain button "Custom widget". */ -/*****************************************************************************/ -GtkWidget * -gl_object_editor_construct_chain_button (gchar *name, - gchar *string1, - gchar *string2, - gint int1, - gint int2) + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. object "moved" callback. */ +/*---------------------------------------------------------------------------*/ +static void +object_moved_cb (glLabelObject *object, + glObjectEditor *editor) { - GtkWidget *chain_button; + gdouble x, y; - chain_button = gl_wdgt_chain_button_new (GL_WDGT_CHAIN_RIGHT); - gl_wdgt_chain_button_set_active (GL_WDGT_CHAIN_BUTTON(chain_button), TRUE); + gl_debug (DEBUG_EDITOR, "BEGIN"); - return chain_button; + gl_label_object_get_position (object, &x, &y); + gl_object_editor_set_position (editor, x, y); + + gl_debug (DEBUG_EDITOR, "END"); } -/*--------------------------------------------------------------------------*/ -/* PRIVATE. Prefs changed callback. Update units related items. */ -/*--------------------------------------------------------------------------*/ -static void -prefs_changed_cb (glObjectEditor *editor) + +/*****************************************************************************/ +/* Object editor "changed" callback. */ +/*****************************************************************************/ +void +gl_object_editor_changed_cb (glObjectEditor *editor) { + glLabelObject *object = editor->priv->object; + gdouble x, y; + glColorNode *line_color_node; + gdouble line_width; + glColorNode *fill_color_node; + gchar *font_family; + gdouble font_size; + PangoWeight font_weight; + gboolean font_italic_flag; + glColorNode *text_color_node; + PangoAlignment align; + gdouble text_line_spacing; + gboolean auto_shrink; + glTextNode *filename; + gdouble w, h; + gdouble image_w, image_h; + gdouble new_w, new_h; + glTextNode *bc_data; + glLabelBarcodeStyle *bc_style; + gboolean shadow_state; + gdouble shadow_x, shadow_y; + glColorNode *shadow_color_node; + gdouble shadow_opacity; + + gl_debug (DEBUG_EDITOR, "BEGIN"); + + + g_signal_handlers_block_by_func (G_OBJECT (object), object_changed_cb, editor); + g_signal_handlers_block_by_func (G_OBJECT (object), object_moved_cb, editor); + + + gl_object_editor_get_position (editor, &x, &y); + gl_label_object_set_position (object, x, y, TRUE); + + + if ( GL_IS_LABEL_BOX (object) || GL_IS_LABEL_ELLIPSE (object) ) + { - gl_debug (DEBUG_EDITOR, "START"); + fill_color_node = gl_object_editor_get_fill_color (editor); + line_color_node = gl_object_editor_get_line_color (editor); + line_width = gl_object_editor_get_line_width (editor); - if (editor->priv->lsize_r_spin) { - lsize_prefs_changed_cb (editor); - } - - if (editor->priv->size_w_spin) { - size_prefs_changed_cb (editor); - } - - if (editor->priv->pos_x_spin) { - position_prefs_changed_cb (editor); - } + gl_label_object_set_fill_color (object, fill_color_node, TRUE); + gl_label_object_set_line_color (object, line_color_node, TRUE); + gl_label_object_set_line_width (object, line_width, TRUE); - if (editor->priv->shadow_x_spin) { - shadow_prefs_changed_cb (editor); - } + gl_color_node_free (&fill_color_node); + gl_color_node_free (&line_color_node); - gl_debug (DEBUG_EDITOR, "END"); + } + else if (GL_IS_LABEL_LINE (object)) + { + + line_color_node = gl_object_editor_get_line_color (editor); + line_width = gl_object_editor_get_line_width (editor); + + gl_label_object_set_line_color (object, line_color_node, TRUE); + gl_label_object_set_line_width (object, line_width, TRUE); + + gl_color_node_free (&line_color_node); + + } + else if ( GL_IS_LABEL_IMAGE (object) ) + { + + filename = gl_object_editor_get_image (editor); + + gl_label_image_set_filename (GL_LABEL_IMAGE(object), filename, TRUE); + + /* Setting filename may have modified the size. */ + gl_object_editor_get_size (editor, &w, &h); + gl_label_object_get_size (object, &new_w, &new_h); + if ( (new_w != w) || (new_h != h) ) + { + gl_object_editor_set_size (editor, new_w, new_h); + } + + /* It may also have a new base size. */ + gl_label_image_get_base_size (GL_LABEL_IMAGE(object), &image_w, &image_h); + gl_object_editor_set_base_size (editor, image_w, image_h); + + gl_text_node_free (&filename); + + } + else if (GL_IS_LABEL_TEXT (object)) + { + + font_family = gl_object_editor_get_font_family (editor); + font_size = gl_object_editor_get_font_size (editor); + font_weight = gl_object_editor_get_font_weight (editor); + font_italic_flag = gl_object_editor_get_font_italic_flag (editor); + text_color_node = gl_object_editor_get_text_color (editor); + align = gl_object_editor_get_text_alignment (editor); + text_line_spacing = gl_object_editor_get_text_line_spacing (editor); + auto_shrink = gl_object_editor_get_text_auto_shrink (editor); + + gl_label_object_set_font_family (object, font_family, TRUE); + gl_label_object_set_font_size (object, font_size, TRUE); + gl_label_object_set_font_weight (object, font_weight, TRUE); + gl_label_object_set_font_italic_flag (object, font_italic_flag, TRUE); + gl_label_object_set_text_color (object, text_color_node, TRUE); + gl_label_object_set_text_alignment (object, align, TRUE); + gl_label_object_set_text_line_spacing (object, text_line_spacing, TRUE); + gl_label_text_set_auto_shrink (GL_LABEL_TEXT (object), auto_shrink, TRUE); + + gl_color_node_free (&text_color_node); + g_free (font_family); + + } + else if (GL_IS_LABEL_BARCODE (object)) + { + + line_color_node = gl_object_editor_get_bc_color (editor); + bc_data = gl_object_editor_get_data (editor); + bc_style = gl_object_editor_get_bc_style (editor); + + gl_label_object_set_line_color (object, line_color_node, TRUE); + gl_label_barcode_set_data (GL_LABEL_BARCODE(object), bc_data, TRUE); + gl_label_barcode_set_style (GL_LABEL_BARCODE(object), bc_style, TRUE); + + gl_color_node_free (&line_color_node); + gl_text_node_free (&bc_data); + gl_label_barcode_style_free (bc_style); + + } + + + shadow_state = gl_object_editor_get_shadow_state (editor); + gl_object_editor_get_shadow_offset (editor, &shadow_x, &shadow_y); + shadow_color_node = gl_object_editor_get_shadow_color (editor); + shadow_opacity = gl_object_editor_get_shadow_opacity (editor); + + gl_label_object_set_shadow_state (object, shadow_state, TRUE); + gl_label_object_set_shadow_offset (object, shadow_x, shadow_y, TRUE); + gl_label_object_set_shadow_color (object, shadow_color_node, TRUE); + gl_label_object_set_shadow_opacity (object, shadow_opacity, TRUE); + + gl_color_node_free (&shadow_color_node); + + + g_signal_handlers_unblock_by_func (G_OBJECT (object), object_changed_cb, editor); + g_signal_handlers_unblock_by_func (G_OBJECT (object), object_moved_cb, editor); + + gl_debug (DEBUG_EDITOR, "END"); } -/*---------------------------------------------------------------------------*/ -/* PRIVATE. label "changed" callback. */ -/*---------------------------------------------------------------------------*/ -static void -label_changed_cb (glLabel *label, - glObjectEditor *editor) + +/*****************************************************************************/ +/* Object editor "size_changed" callback. */ +/*****************************************************************************/ +void +gl_object_editor_size_changed_cb (glObjectEditor *editor) { - gdouble label_width, label_height; - glMerge *merge; + glLabelObject *object = editor->priv->object; + gdouble w, h; - gl_debug (DEBUG_EDITOR, "START"); + gl_debug (DEBUG_EDITOR, "BEGIN"); - gl_label_get_size (label, &label_width, &label_height); - gl_object_editor_set_max_position (GL_OBJECT_EDITOR (editor), - label_width, label_height); - gl_object_editor_set_max_size (GL_OBJECT_EDITOR (editor), - label_width, label_height); - gl_object_editor_set_max_lsize (GL_OBJECT_EDITOR (editor), - label_width, label_height); - gl_object_editor_set_max_shadow_offset (GL_OBJECT_EDITOR (editor), - label_width, label_height); - - merge = gl_label_get_merge (label); - gl_object_editor_set_key_names (editor, merge); + g_signal_handlers_block_by_func (G_OBJECT (object), object_changed_cb, editor); - gl_debug (DEBUG_EDITOR, "END"); + + if ( GL_IS_LABEL_LINE (object) ) + { + gl_object_editor_get_lsize (editor, &w, &h); + } + else + { + gl_object_editor_get_size (editor, &w, &h); + } + + gl_label_object_set_size (object, w, h, TRUE); + + + g_signal_handlers_unblock_by_func (G_OBJECT (object), object_changed_cb, editor); + + gl_debug (DEBUG_EDITOR, "END"); } + + +/* + * Local Variables: -- emacs + * mode: C -- emacs + * c-basic-offset: 8 -- emacs + * tab-width: 8 -- emacs + * indent-tabs-mode: nil -- emacs + * End: -- emacs + */