]> git.sur5r.net Git - glabels/blob - glabels2/src/object-editor-data-page.c
2005-04-19 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / object-editor-data-page.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  object-editor.c:  object properties editor module
5  *
6  *  Copyright (C) 2003  Jim Evins <evins@snaught.com>.
7  *
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.
12  *
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.
17  *
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
21  */
22 #include <config.h>
23
24 #include "object-editor.h"
25
26 #include <glib/gi18n.h>
27 #include <gtk/gtkeditable.h>
28 #include <gtk/gtkcombobox.h>
29 #include <gtk/gtktogglebutton.h>
30 #include <math.h>
31
32 #include "prefs.h"
33
34 #include "object-editor-private.h"
35
36 #include "debug.h"
37
38 /*===========================================*/
39 /* Private macros                            */
40 /*===========================================*/
41
42 /*===========================================*/
43 /* Private data types                        */
44 /*===========================================*/
45
46 /*===========================================*/
47 /* Private globals                           */
48 /*===========================================*/
49
50 /*===========================================*/
51 /* Local function prototypes                 */
52 /*===========================================*/
53
54 static void data_radio_toggled_cb                (glObjectEditor        *editor);
55
56
57 \f
58 /*--------------------------------------------------------------------------*/
59 /* PRIVATE.  Prepare data page.                                             */
60 /*--------------------------------------------------------------------------*/
61 void
62 gl_object_editor_prepare_data_page (glObjectEditor *editor)
63 {
64         GdkColor     *gdk_color;
65
66         gl_debug (DEBUG_EDITOR, "START");
67
68         /* Extract widgets from XML tree. */
69         editor->priv->data_page_vbox     = glade_xml_get_widget (editor->priv->gui,
70                                                                  "data_page_vbox");
71         editor->priv->data_literal_radio = glade_xml_get_widget (editor->priv->gui,
72                                                                  "data_literal_radio");
73         editor->priv->data_key_radio     = glade_xml_get_widget (editor->priv->gui,
74                                                                  "data_key_radio");
75         editor->priv->data_text_entry    = glade_xml_get_widget (editor->priv->gui,
76                                                                  "data_text_entry");
77         editor->priv->data_key_combo     = glade_xml_get_widget (editor->priv->gui,
78                                                                  "data_key_combo");
79
80         gl_util_combo_box_add_text_model ( GTK_COMBO_BOX(editor->priv->data_key_combo));
81
82         /* Un-hide */
83         gtk_widget_show_all (editor->priv->data_page_vbox);
84
85         /* Connect signals */
86         g_signal_connect_swapped (G_OBJECT (editor->priv->data_text_entry),
87                                   "changed",
88                                   G_CALLBACK (gl_object_editor_changed_cb),
89                                   G_OBJECT (editor));
90         g_signal_connect_swapped (G_OBJECT (editor->priv->data_key_combo),
91                                   "changed",
92                                   G_CALLBACK (gl_object_editor_changed_cb),
93                                   G_OBJECT (editor));
94         g_signal_connect_swapped (G_OBJECT (editor->priv->data_literal_radio),
95                                   "toggled",
96                                   G_CALLBACK (data_radio_toggled_cb),
97                                   G_OBJECT (editor));
98         g_signal_connect_swapped (G_OBJECT (editor->priv->data_key_radio),
99                                   "toggled",
100                                   G_CALLBACK (data_radio_toggled_cb),
101                                   G_OBJECT (editor));
102
103         gl_debug (DEBUG_EDITOR, "END");
104 }
105
106 /*--------------------------------------------------------------------------*/
107 /* PRIVATE.  data radio callback.                                           */
108 /*--------------------------------------------------------------------------*/
109 static void
110 data_radio_toggled_cb (glObjectEditor *editor)
111 {
112         gl_debug (DEBUG_WDGT, "START");
113  
114         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->data_literal_radio))) {
115                 gtk_widget_set_sensitive (editor->priv->data_text_entry, TRUE);
116                 gtk_widget_set_sensitive (editor->priv->data_key_combo, FALSE);
117                 gtk_widget_set_sensitive (editor->priv->data_format_label, FALSE);
118                 gtk_widget_set_sensitive (editor->priv->data_ex_label, FALSE);
119                 gtk_widget_set_sensitive (editor->priv->data_digits_label, FALSE);
120                 gtk_widget_set_sensitive (editor->priv->data_digits_spin, FALSE);
121         } else {
122                 gtk_widget_set_sensitive (editor->priv->data_text_entry, FALSE);
123                 gtk_widget_set_sensitive (editor->priv->data_key_combo, TRUE);
124                 gtk_widget_set_sensitive (editor->priv->data_format_label, TRUE);
125                 gtk_widget_set_sensitive (editor->priv->data_ex_label, TRUE);
126                 gtk_widget_set_sensitive (editor->priv->data_digits_label,
127                                           !editor->priv->data_format_fixed_flag);
128                 gtk_widget_set_sensitive (editor->priv->data_digits_spin,
129                                           !editor->priv->data_format_fixed_flag);
130         }
131  
132         /* Emit our "changed" signal */
133         g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0);
134  
135         gl_debug (DEBUG_WDGT, "END");
136 }
137
138 /*****************************************************************************/
139 /* Set data.                                                                 */
140 /*****************************************************************************/
141 void
142 gl_object_editor_set_data (glObjectEditor      *editor,
143                             gboolean            merge_flag,
144                             glTextNode         *text_node)
145 {
146         gint pos;
147  
148         gl_debug (DEBUG_EDITOR, "START");
149  
150         g_signal_handlers_block_by_func (G_OBJECT (editor->priv->data_text_entry),
151                                          G_CALLBACK (gl_object_editor_changed_cb),
152                                          editor);
153         g_signal_handlers_block_by_func (G_OBJECT (editor->priv->data_key_combo),
154                                          G_CALLBACK (gl_object_editor_changed_cb),
155                                          editor);
156
157         gtk_widget_set_sensitive (editor->priv->data_key_radio, merge_flag);
158  
159         if (!text_node->field_flag) {
160  
161                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
162                                               (editor->priv->data_literal_radio), TRUE); 
163                 gtk_widget_set_sensitive (editor->priv->data_text_entry, TRUE);
164                 gtk_widget_set_sensitive (editor->priv->data_key_combo, FALSE);
165                 gtk_widget_set_sensitive (editor->priv->data_format_label, FALSE);
166                 gtk_widget_set_sensitive (editor->priv->data_ex_label, FALSE);
167                 gtk_widget_set_sensitive (editor->priv->data_digits_spin, FALSE);
168                 gtk_widget_set_sensitive (editor->priv->data_digits_label, FALSE);
169  
170                 gtk_editable_delete_text (GTK_EDITABLE (editor->priv->data_text_entry), 0, -1);
171                 pos = 0;
172                 if (text_node->data != NULL ) {
173                         gtk_editable_insert_text (GTK_EDITABLE (editor->priv->data_text_entry),
174                                                   text_node->data,
175                                                   strlen (text_node->data),
176                                                   &pos);
177                 }
178
179         } else {
180                                                                                 
181                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
182                                               (editor->priv->data_key_radio), TRUE);
183                                                                                 
184                 gtk_widget_set_sensitive (editor->priv->data_text_entry, FALSE);
185                 gtk_widget_set_sensitive (editor->priv->data_key_combo, TRUE);
186                 gtk_widget_set_sensitive (editor->priv->data_format_label, TRUE);
187                 gtk_widget_set_sensitive (editor->priv->data_ex_label, TRUE);
188                 gtk_widget_set_sensitive (editor->priv->data_digits_label,
189                                           !editor->priv->data_format_fixed_flag);
190                 gtk_widget_set_sensitive (editor->priv->data_digits_spin,
191                                           !editor->priv->data_format_fixed_flag);
192                                                                                 
193
194                 gl_util_combo_box_set_active_text (GTK_COMBO_BOX (editor->priv->data_key_combo),
195                                                    text_node->data);
196         }
197                                                                                 
198
199         g_signal_handlers_unblock_by_func (G_OBJECT (editor->priv->data_text_entry),
200                                            G_CALLBACK (gl_object_editor_changed_cb),
201                                            editor);
202         g_signal_handlers_unblock_by_func (G_OBJECT (editor->priv->data_key_combo),
203                                            G_CALLBACK (gl_object_editor_changed_cb),
204                                            editor);
205
206         gl_debug (DEBUG_EDITOR, "END");
207 }
208
209 /*****************************************************************************/
210 /* Query data.                                                              */
211 /*****************************************************************************/
212 glTextNode *
213 gl_object_editor_get_data (glObjectEditor      *editor)
214 {
215         glTextNode *text_node;
216  
217         gl_debug (DEBUG_EDITOR, "START");
218  
219         text_node = g_new0(glTextNode,1);
220  
221         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->data_literal_radio))) {
222                 text_node->field_flag = FALSE;
223                 text_node->data =
224                     gtk_editable_get_chars (GTK_EDITABLE (editor->priv->data_text_entry),
225                                             0, -1);
226         } else {
227                 text_node->field_flag = TRUE;
228                 text_node->data =
229                         gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->data_key_combo));
230         }
231  
232         gl_debug (DEBUG_EDITOR, "text_node: field_flag=%d, data=%s",
233                   text_node->field_flag, text_node->data);
234
235         gl_debug (DEBUG_EDITOR, "END");
236  
237         return text_node;
238 }