]> git.sur5r.net Git - glabels/blob - glabels2/src/object-editor-bc-page.c
2009-09-22 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / object-editor-bc-page.c
1 /*
2  *  object-editor-bc-page.c
3  *  Copyright (C) 2003-2009  Jim Evins <evins@snaught.com>.
4  *
5  *  This file is part of gLabels.
6  *
7  *  gLabels is free software: you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation, either version 3 of the License, or
10  *  (at your option) any later version.
11  *
12  *  gLabels is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with gLabels.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <config.h>
22
23 #include "object-editor.h"
24
25 #include <glib/gi18n.h>
26 #include <gtk/gtk.h>
27 #include <math.h>
28
29 #include "prefs.h"
30 #include "color-combo.h"
31 #include "color.h"
32 #include "combo-util.h"
33 #include "builder-util.h"
34
35 #include "object-editor-private.h"
36
37 #include "debug.h"
38
39
40 /*===========================================*/
41 /* Private macros                            */
42 /*===========================================*/
43
44
45 /*===========================================*/
46 /* Private data types                        */
47 /*===========================================*/
48
49
50 /*===========================================*/
51 /* Private globals                           */
52 /*===========================================*/
53
54
55 /*===========================================*/
56 /* Local function prototypes                 */
57 /*===========================================*/
58
59 static void style_changed_cb     (glObjectEditor       *editor);
60 static void bc_radio_toggled_cb  (glObjectEditor       *editor);
61
62
63 /*--------------------------------------------------------------------------*/
64 /* PRIVATE.  Prepare size page.                                             */
65 /*--------------------------------------------------------------------------*/
66 void
67 gl_object_editor_prepare_bc_page (glObjectEditor       *editor)
68 {
69         GList        *styles = NULL;
70
71         gl_debug (DEBUG_EDITOR, "START");
72
73         /* Extract widgets from XML tree. */
74         gl_builder_util_get_widgets (editor->priv->builder,
75                                      "bc_page_vbox",      &editor->priv->bc_page_vbox,
76                                      "bc_style_combo",    &editor->priv->bc_style_combo,
77                                      "bc_text_check",     &editor->priv->bc_text_check,
78                                      "bc_cs_check",       &editor->priv->bc_cs_check,
79                                      "bc_color_hbox",     &editor->priv->bc_color_hbox,
80                                      "bc_key_combo",      &editor->priv->bc_key_combo,
81                                      "bc_key_radio",      &editor->priv->bc_key_radio,
82                                      "bc_color_radio",    &editor->priv->bc_color_radio,
83                                      "data_format_label", &editor->priv->data_format_label,
84                                      "data_ex_label",     &editor->priv->data_ex_label,
85                                      "data_digits_label", &editor->priv->data_digits_label,
86                                      "data_digits_spin",  &editor->priv->data_digits_spin,
87                                      NULL);
88
89         editor->priv->data_format_fixed_flag = FALSE;
90
91         editor->priv->bc_color_combo = gl_color_combo_new (_("Default"),
92                                                            GL_COLOR_BC_DEFAULT,
93                                                            gl_prefs->default_line_color);
94         gtk_box_pack_start (GTK_BOX (editor->priv->bc_color_hbox),
95                             editor->priv->bc_color_combo,
96                             FALSE, FALSE, 0);
97
98         gl_combo_util_add_text_model ( GTK_COMBO_BOX(editor->priv->bc_style_combo));
99         gl_combo_util_add_text_model ( GTK_COMBO_BOX(editor->priv->bc_key_combo));
100
101         /* Load barcode styles */
102         styles = gl_barcode_get_styles_list ();
103         gl_combo_util_set_strings (GTK_COMBO_BOX(editor->priv->bc_style_combo),
104                                    styles);
105         gl_barcode_free_styles_list (styles);
106
107         /* Modify widgets */
108         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->bc_color_radio), TRUE);
109         gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE);
110         gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE);
111         
112         /* Un-hide */
113         gtk_widget_show_all (editor->priv->bc_page_vbox);
114
115         /* Connect signals */
116         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_style_combo),
117                                   "changed",
118                                   G_CALLBACK (style_changed_cb),
119                                   G_OBJECT (editor));
120         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_text_check),
121                                   "toggled",
122                                   G_CALLBACK (gl_object_editor_changed_cb),
123                                   G_OBJECT (editor));
124         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_cs_check),
125                                   "toggled",
126                                   G_CALLBACK (gl_object_editor_changed_cb),
127                                   G_OBJECT (editor));
128         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_color_combo),
129                                   "color_changed",
130                                   G_CALLBACK (gl_object_editor_changed_cb),
131                                   G_OBJECT (editor));
132         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_key_combo),
133                                   "changed",
134                                   G_CALLBACK (gl_object_editor_changed_cb),
135                                   G_OBJECT (editor));
136         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_color_radio),
137                                   "toggled",
138                                   G_CALLBACK (bc_radio_toggled_cb),
139                                   G_OBJECT (editor));                             
140         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_key_radio),
141                                   "toggled",
142                                   G_CALLBACK (bc_radio_toggled_cb),
143                                   G_OBJECT (editor));
144         g_signal_connect_swapped (G_OBJECT (editor->priv->data_digits_spin),
145                                   "changed",
146                                   G_CALLBACK (gl_object_editor_changed_cb),
147                                   G_OBJECT (editor));
148
149         gl_debug (DEBUG_EDITOR, "END");
150 }
151
152
153 /*--------------------------------------------------------------------------*/
154 /* PRIVATE.  Callback for when style has changed.                           */
155 /*--------------------------------------------------------------------------*/
156 static void
157 style_changed_cb (glObjectEditor       *editor)
158 {
159         gchar          *style_string = NULL;
160         const gchar    *id;
161         gchar          *ex_string = NULL;
162         guint           digits;
163
164         if (editor->priv->stop_signals) return;
165
166         style_string =
167                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->bc_style_combo));
168                                                                                 
169         /* Don't emit if entry is empty. */
170         if ( *style_string != 0 ) {
171                 id = gl_barcode_name_to_id (style_string);
172                                                                                 
173                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(editor->priv->bc_text_check),
174                                               gl_barcode_can_text (id));
175                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(editor->priv->bc_cs_check),
176                                               gl_barcode_can_csum (id));
177                                                                                 
178                 gtk_widget_set_sensitive (editor->priv->bc_text_check,
179                                           gl_barcode_text_optional (id));
180                 gtk_widget_set_sensitive (editor->priv->bc_cs_check,
181                                           gl_barcode_csum_optional (id));
182                                                                                 
183                 editor->priv->data_format_fixed_flag = !gl_barcode_can_freeform (id);
184                 digits = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->data_digits_spin));
185                 if (editor->priv->data_format_fixed_flag) {
186                         digits = gl_barcode_get_prefered_n(id);
187                         gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->data_digits_spin), 
188                                                    digits);
189                 }
190                                                                                 
191                 ex_string = gl_barcode_default_digits (id, digits);
192                 gtk_label_set_text (GTK_LABEL(editor->priv->data_ex_label), ex_string);
193
194                 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->data_literal_radio))) {
195                         gtk_widget_set_sensitive (editor->priv->data_format_label, FALSE);
196                         gtk_widget_set_sensitive (editor->priv->data_ex_label, FALSE);
197                         gtk_widget_set_sensitive (editor->priv->data_digits_label, FALSE);
198                         gtk_widget_set_sensitive (editor->priv->data_digits_spin, FALSE);
199                 } else {
200                         gtk_widget_set_sensitive (editor->priv->data_format_label, TRUE);
201                         gtk_widget_set_sensitive (editor->priv->data_ex_label, TRUE);
202                         gtk_widget_set_sensitive (editor->priv->data_digits_label,
203                                                   !editor->priv->data_format_fixed_flag);
204                         gtk_widget_set_sensitive (editor->priv->data_digits_spin,
205                                                   !editor->priv->data_format_fixed_flag);
206                 }
207  
208                 /* Emit our "changed" signal */
209                 g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0);
210         }
211                                                                                 
212         g_free (style_string);
213         g_free (ex_string);
214 }
215                                                                                 
216
217 /*****************************************************************************/
218 /* Set barcode style.                                                        */
219 /*****************************************************************************/
220 void
221 gl_object_editor_set_bc_style (glObjectEditor      *editor,
222                                gchar               *id,
223                                gboolean             text_flag,
224                                gboolean             checksum_flag,
225                                guint                format_digits)
226 {
227         const gchar *style_string;
228         gchar       *ex_string;
229  
230         gl_debug (DEBUG_EDITOR, "START");
231
232         editor->priv->stop_signals = TRUE;
233
234         style_string = gl_barcode_id_to_name (id);
235  
236         gl_combo_util_set_active_text (GTK_COMBO_BOX (editor->priv->bc_style_combo),
237                                        style_string);
238  
239         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->bc_text_check),
240                                       text_flag);
241  
242         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->bc_cs_check),
243                                       checksum_flag);
244
245         gtk_widget_set_sensitive (editor->priv->bc_text_check,
246                                   gl_barcode_text_optional (id));
247         gtk_widget_set_sensitive (editor->priv->bc_cs_check,
248                                   gl_barcode_csum_optional (id));
249
250         editor->priv->data_format_fixed_flag = !gl_barcode_can_freeform (id);
251
252         if (editor->priv->data_format_fixed_flag) {
253                 format_digits = gl_barcode_get_prefered_n (id);
254         }
255
256         ex_string = gl_barcode_default_digits (id, format_digits);
257         gtk_label_set_text (GTK_LABEL(editor->priv->data_ex_label), ex_string);
258         g_free (ex_string);
259
260         gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->data_digits_spin), 
261                                    format_digits);
262
263         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->data_literal_radio))) {
264                 gtk_widget_set_sensitive (editor->priv->data_format_label, FALSE);
265                 gtk_widget_set_sensitive (editor->priv->data_ex_label, FALSE);
266                 gtk_widget_set_sensitive (editor->priv->data_digits_label, FALSE);
267                 gtk_widget_set_sensitive (editor->priv->data_digits_spin, FALSE);
268         } else {
269                 gtk_widget_set_sensitive (editor->priv->data_format_label, TRUE);
270                 gtk_widget_set_sensitive (editor->priv->data_ex_label, TRUE);
271                 gtk_widget_set_sensitive (editor->priv->data_digits_label,
272                                           !editor->priv->data_format_fixed_flag);
273                 gtk_widget_set_sensitive (editor->priv->data_digits_spin,
274                                           !editor->priv->data_format_fixed_flag);
275         }
276  
277         editor->priv->stop_signals = FALSE;
278
279         gl_debug (DEBUG_EDITOR, "END");
280 }
281
282
283 /*****************************************************************************/
284 /* Query barcode style.                                                      */
285 /*****************************************************************************/
286 void
287 gl_object_editor_get_bc_style (glObjectEditor      *editor,
288                                gchar              **id,
289                                gboolean            *text_flag,
290                                gboolean            *checksum_flag,
291                                guint               *format_digits)
292 {
293         gchar *style_string;
294
295         gl_debug (DEBUG_EDITOR, "START");
296                                                                                 
297         style_string =
298                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->bc_style_combo));
299         *id = g_strdup (gl_barcode_name_to_id (style_string));
300                                                                                 
301         *text_flag =
302             gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->bc_text_check));
303                                                                                 
304         *checksum_flag =
305             gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->bc_cs_check));
306                                                                                 
307
308         *format_digits =
309                 gtk_spin_button_get_value (GTK_SPIN_BUTTON(editor->priv->data_digits_spin));
310
311         g_free (style_string);
312
313         gl_debug (DEBUG_EDITOR, "END");
314 }
315
316
317 /*****************************************************************************/
318 /* Set bc color.                                                             */
319 /*****************************************************************************/
320 void
321 gl_object_editor_set_bc_color (glObjectEditor      *editor,
322                                gboolean             merge_flag,
323                                glColorNode         *color_node)
324 {
325         gl_debug (DEBUG_EDITOR, "START");
326
327         editor->priv->stop_signals = TRUE;
328
329         gtk_widget_set_sensitive (editor->priv->bc_key_radio, merge_flag);
330
331         if ( color_node->color == GL_COLOR_NONE ) {
332
333                 gl_color_combo_set_to_default (GL_COLOR_COMBO(editor->priv->bc_color_combo));
334
335         } else {
336
337                 gl_color_combo_set_color (GL_COLOR_COMBO(editor->priv->bc_color_combo),
338                                           color_node->color);
339         }
340         
341         if (!color_node->field_flag) {
342                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
343                                                   (editor->priv->bc_color_radio), TRUE); 
344                 gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE);
345                 gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE);
346                 
347         } else {
348                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
349                                                   (editor->priv->bc_key_radio), TRUE); 
350                 gtk_widget_set_sensitive (editor->priv->bc_color_combo, FALSE);
351                 gtk_widget_set_sensitive (editor->priv->bc_key_combo, TRUE);
352                 
353                 gl_combo_util_set_active_text (GTK_COMBO_BOX (editor->priv->bc_key_combo),
354                                                color_node->key);
355         }       
356         
357         editor->priv->stop_signals = FALSE;
358         
359         gl_debug (DEBUG_EDITOR, "END");
360 }
361
362
363 /*****************************************************************************/
364 /* Query bc color.                                                           */
365 /*****************************************************************************/
366 glColorNode*
367 gl_object_editor_get_bc_color (glObjectEditor      *editor)
368 {
369         guint         color;
370         glColorNode  *color_node;
371         gboolean      is_default;
372
373         gl_debug (DEBUG_EDITOR, "START");
374
375         color_node = gl_color_node_new_default ();
376         
377         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->bc_key_radio))) {
378                 color_node->field_flag = TRUE;
379                 color_node->color = gl_prefs->default_line_color;
380                 color_node->key = 
381                         gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->bc_key_combo));
382         } else {
383                 color_node->field_flag = FALSE;
384                 color_node->key = NULL;
385                 color = gl_color_combo_get_color (GL_COLOR_COMBO(editor->priv->bc_color_combo),
386                                                   &is_default);
387
388                 if (is_default) {
389                         color_node->color = gl_prefs->default_line_color;
390                 } else {
391                         color_node->color = color;
392                 }
393         }
394         
395         gl_debug (DEBUG_EDITOR, "END");
396
397         return color_node;
398 }
399
400
401 /*--------------------------------------------------------------------------*/
402 /* PRIVATE.  barcode color radio callback.                                  */
403 /*--------------------------------------------------------------------------*/
404 static void
405 bc_radio_toggled_cb (glObjectEditor *editor)
406 {
407         if (editor->priv->stop_signals) return;
408
409         gl_debug (DEBUG_EDITOR, "START");
410         
411         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->bc_color_radio))) {
412                 gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE);
413                 gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE);
414     } else {
415                 gtk_widget_set_sensitive (editor->priv->bc_color_combo, FALSE);
416                 gtk_widget_set_sensitive (editor->priv->bc_key_combo, TRUE);
417                 
418         }
419  
420     /* Emit our "changed" signal */
421     g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0);
422  
423     gl_debug (DEBUG_EDITOR, "END");
424 }
425
426
427
428 /*
429  * Local Variables:       -- emacs
430  * mode: C                -- emacs
431  * c-basic-offset: 8      -- emacs
432  * tab-width: 8           -- emacs
433  * indent-tabs-mode: nil  -- emacs
434  * End:                   -- emacs
435  */