]> git.sur5r.net Git - glabels/blob - src/object-editor-bc-page.c
Theme friendly, glabels specific, action icons.
[glabels] / 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 "field-button.h"
33 #include "combo-util.h"
34 #include "builder-util.h"
35 #include "bc-backends.h"
36
37 #include "object-editor-private.h"
38
39 #include "debug.h"
40
41
42 /*===========================================*/
43 /* Private macros                            */
44 /*===========================================*/
45
46
47 /*===========================================*/
48 /* Private data types                        */
49 /*===========================================*/
50
51
52 /*===========================================*/
53 /* Private globals                           */
54 /*===========================================*/
55
56
57 /*===========================================*/
58 /* Local function prototypes                 */
59 /*===========================================*/
60
61 static void backend_changed_cb          (glObjectEditor       *editor);
62 static void style_changed_cb            (glObjectEditor       *editor);
63 static void bc_radio_toggled_cb         (glObjectEditor       *editor);
64 static void data_digits_spin_changed_cb (glObjectEditor       *editor);
65
66
67 /*--------------------------------------------------------------------------*/
68 /* PRIVATE.  Prepare size page.                                             */
69 /*--------------------------------------------------------------------------*/
70 void
71 gl_object_editor_prepare_bc_page (glObjectEditor       *editor)
72 {
73         GList        *backends = NULL;
74         GList        *p;
75
76         gl_debug (DEBUG_EDITOR, "START");
77
78         /* Extract widgets from XML tree. */
79         gl_builder_util_get_widgets (editor->priv->builder,
80                                      "bc_page_vbox",      &editor->priv->bc_page_vbox,
81                                      "bc_backend_combo",  &editor->priv->bc_backend_combo,
82                                      "bc_style_combo",    &editor->priv->bc_style_combo,
83                                      "bc_text_check",     &editor->priv->bc_text_check,
84                                      "bc_cs_check",       &editor->priv->bc_cs_check,
85                                      "bc_color_hbox",     &editor->priv->bc_color_hbox,
86                                      "bc_key_hbox",       &editor->priv->bc_key_hbox,
87                                      "bc_key_radio",      &editor->priv->bc_key_radio,
88                                      "bc_color_radio",    &editor->priv->bc_color_radio,
89                                      "data_format_label", &editor->priv->data_format_label,
90                                      "data_ex_label",     &editor->priv->data_ex_label,
91                                      "data_digits_label", &editor->priv->data_digits_label,
92                                      "data_digits_spin",  &editor->priv->data_digits_spin,
93                                      NULL);
94
95         editor->priv->data_format_fixed_flag = FALSE;
96
97         editor->priv->bc_color_combo = gl_color_combo_new (_("Default"),
98                                                            GL_COLOR_BC_DEFAULT,
99                                                            gl_prefs_model_get_default_line_color (gl_prefs));
100         gtk_box_pack_start (GTK_BOX (editor->priv->bc_color_hbox),
101                             editor->priv->bc_color_combo,
102                             FALSE, FALSE, 0);
103
104         editor->priv->bc_key_combo = gl_field_button_new (NULL);
105         gtk_box_pack_start (GTK_BOX (editor->priv->bc_key_hbox),
106                             editor->priv->bc_key_combo,
107                             TRUE, TRUE, 0);
108
109         gl_combo_util_add_text_model ( GTK_COMBO_BOX(editor->priv->bc_backend_combo));
110         gl_combo_util_add_text_model ( GTK_COMBO_BOX(editor->priv->bc_style_combo));
111
112         /* Load barcode backends */
113         backends = gl_barcode_backends_get_backend_list ();
114         gl_combo_util_set_strings (GTK_COMBO_BOX(editor->priv->bc_backend_combo),
115                                    backends);
116
117         /* Kludge: Load styles for each backend once, so that when they are loaded for real the size of
118          * of the widget has already been established and does't cause the sidebar to change size. */
119         for ( p = backends; p != NULL; p=p->next )
120         {
121                 gl_object_editor_load_bc_styles (editor, gl_barcode_backends_backend_name_to_id ((gchar *)p->data));
122         }
123
124         gl_barcode_backends_free_backend_list (backends);
125
126         /* Modify widgets */
127         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->bc_color_radio), TRUE);
128         gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE);
129         gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE);
130         
131         /* Un-hide */
132         gtk_widget_show_all (editor->priv->bc_page_vbox);
133
134         /* Connect signals */
135         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_backend_combo),
136                                   "changed",
137                                   G_CALLBACK (backend_changed_cb),
138                                   G_OBJECT (editor));
139         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_style_combo),
140                                   "changed",
141                                   G_CALLBACK (style_changed_cb),
142                                   G_OBJECT (editor));
143         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_text_check),
144                                   "toggled",
145                                   G_CALLBACK (gl_object_editor_changed_cb),
146                                   G_OBJECT (editor));
147         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_cs_check),
148                                   "toggled",
149                                   G_CALLBACK (gl_object_editor_changed_cb),
150                                   G_OBJECT (editor));
151         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_color_combo),
152                                   "color_changed",
153                                   G_CALLBACK (gl_object_editor_changed_cb),
154                                   G_OBJECT (editor));
155         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_key_combo),
156                                   "changed",
157                                   G_CALLBACK (gl_object_editor_changed_cb),
158                                   G_OBJECT (editor));
159         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_color_radio),
160                                   "toggled",
161                                   G_CALLBACK (bc_radio_toggled_cb),
162                                   G_OBJECT (editor));                             
163         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_key_radio),
164                                   "toggled",
165                                   G_CALLBACK (bc_radio_toggled_cb),
166                                   G_OBJECT (editor));
167         g_signal_connect_swapped (G_OBJECT (editor->priv->data_digits_spin),
168                                   "changed",
169                                   G_CALLBACK (data_digits_spin_changed_cb),
170                                   G_OBJECT (editor));
171
172         gl_debug (DEBUG_EDITOR, "END");
173 }
174
175
176 /*--------------------------------------------------------------------------*/
177 /* PRIVATE.  Callback for when backend has changed.                         */
178 /*--------------------------------------------------------------------------*/
179 static void
180 backend_changed_cb (glObjectEditor       *editor)
181 {
182         gchar          *backend_name = NULL;
183         const gchar    *backend_id;
184         const gchar    *style_name;
185
186         if (editor->priv->stop_signals) return;
187
188         backend_name =
189                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->bc_backend_combo));
190
191         backend_id = gl_barcode_backends_backend_name_to_id (backend_name);
192
193         gl_object_editor_load_bc_styles (editor, backend_id);
194
195         style_name = gl_barcode_backends_style_id_to_name (backend_id, NULL);
196         gl_combo_util_set_active_text (GTK_COMBO_BOX (editor->priv->bc_style_combo),
197                                        style_name);
198
199         g_free (backend_name);
200 }
201
202
203 /*--------------------------------------------------------------------------*/
204 /* PRIVATE.  Callback for when style has changed.                           */
205 /*--------------------------------------------------------------------------*/
206 static void
207 style_changed_cb (glObjectEditor       *editor)
208 {
209         gchar          *backend_name = NULL;
210         const gchar    *backend_id;
211         gchar          *style_string = NULL;
212         const gchar    *id;
213         gchar          *ex_string = NULL;
214         guint           digits;
215
216         if (editor->priv->stop_signals) return;
217
218         backend_name =
219                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->bc_backend_combo));
220
221         backend_id = gl_barcode_backends_backend_name_to_id (backend_name);
222
223         style_string =
224                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->bc_style_combo));
225
226         /* Don't emit if entry is empty. */
227         if ( style_string && *style_string != 0 ) {
228                 id = gl_barcode_backends_style_name_to_id (backend_id, style_string);
229                                                                                 
230                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(editor->priv->bc_text_check),
231                                               gl_barcode_backends_style_can_text (backend_id, id));
232                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(editor->priv->bc_cs_check),
233                                               gl_barcode_backends_style_can_csum (backend_id, id));
234                                                                                 
235                 gtk_widget_set_sensitive (editor->priv->bc_text_check,
236                                           gl_barcode_backends_style_text_optional (backend_id, id));
237                 gtk_widget_set_sensitive (editor->priv->bc_cs_check,
238                                           gl_barcode_backends_style_csum_optional (backend_id, id));
239                                                                                 
240                 editor->priv->data_format_fixed_flag = !gl_barcode_backends_style_can_freeform (backend_id, id);
241                 digits = gl_barcode_backends_style_get_prefered_n(backend_id, id);
242                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->data_digits_spin), digits);
243                                                                                 
244                 ex_string = gl_barcode_backends_style_default_digits (backend_id, id, digits);
245                 gtk_label_set_text (GTK_LABEL(editor->priv->data_ex_label), ex_string);
246
247                 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->data_literal_radio))) {
248                         gtk_widget_set_sensitive (editor->priv->data_format_label, FALSE);
249                         gtk_widget_set_sensitive (editor->priv->data_ex_label, FALSE);
250                         gtk_widget_set_sensitive (editor->priv->data_digits_label, FALSE);
251                         gtk_widget_set_sensitive (editor->priv->data_digits_spin, FALSE);
252                 } else {
253                         gtk_widget_set_sensitive (editor->priv->data_format_label, TRUE);
254                         gtk_widget_set_sensitive (editor->priv->data_ex_label, TRUE);
255                         gtk_widget_set_sensitive (editor->priv->data_digits_label,
256                                                   !editor->priv->data_format_fixed_flag);
257                         gtk_widget_set_sensitive (editor->priv->data_digits_spin,
258                                                   !editor->priv->data_format_fixed_flag);
259                 }
260  
261                 gl_object_editor_changed_cb (editor);
262         }
263                                                                                 
264         g_free (style_string);
265         g_free (ex_string);
266 }
267                                                                                 
268
269 /*****************************************************************************/
270 /* Load barcode styles based on backend_id.                                  */
271 /*****************************************************************************/
272 void
273 gl_object_editor_load_bc_styles (glObjectEditor      *editor,
274                                  const gchar         *backend_id)
275 {
276         GList       *styles;
277  
278         gl_debug (DEBUG_EDITOR, "START");
279
280         editor->priv->stop_signals = TRUE;
281
282         styles = gl_barcode_backends_get_styles_list (backend_id);
283         gl_combo_util_set_strings (GTK_COMBO_BOX(editor->priv->bc_style_combo), styles);
284         gl_barcode_backends_free_styles_list (styles);
285
286         editor->priv->stop_signals = FALSE;
287
288         gl_debug (DEBUG_EDITOR, "END");
289 }
290
291
292 /*****************************************************************************/
293 /* Set barcode style.                                                        */
294 /*****************************************************************************/
295 void
296 gl_object_editor_set_bc_style (glObjectEditor            *editor,
297                                const glLabelBarcodeStyle *bc_style)
298 {
299         const gchar *backend_name;
300         const gchar *style_name;
301         gchar       *ex_string;
302         gint         format_digits;
303  
304         gl_debug (DEBUG_EDITOR, "START");
305
306         editor->priv->stop_signals = TRUE;
307
308         backend_name = gl_barcode_backends_backend_id_to_name (bc_style->backend_id);
309         style_name   = gl_barcode_backends_style_id_to_name (bc_style->backend_id, bc_style->id);
310
311         gl_combo_util_set_active_text (GTK_COMBO_BOX (editor->priv->bc_backend_combo),
312                                        backend_name);
313         gl_combo_util_set_active_text (GTK_COMBO_BOX (editor->priv->bc_style_combo),
314                                        style_name);
315  
316         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->bc_text_check),
317                                       bc_style->text_flag);
318  
319         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->bc_cs_check),
320                                       bc_style->checksum_flag);
321
322         gtk_widget_set_sensitive (editor->priv->bc_text_check,
323                                   gl_barcode_backends_style_text_optional (bc_style->backend_id, bc_style->id));
324         gtk_widget_set_sensitive (editor->priv->bc_cs_check,
325                                   gl_barcode_backends_style_csum_optional (bc_style->backend_id, bc_style->id));
326
327         editor->priv->data_format_fixed_flag = !gl_barcode_backends_style_can_freeform (bc_style->backend_id, bc_style->id);
328
329         format_digits = bc_style->format_digits;
330         if (editor->priv->data_format_fixed_flag) {
331                 format_digits = gl_barcode_backends_style_get_prefered_n (bc_style->backend_id, bc_style->id);
332         }
333
334         ex_string = gl_barcode_backends_style_default_digits (bc_style->backend_id, bc_style->id, format_digits);
335         gtk_label_set_text (GTK_LABEL(editor->priv->data_ex_label), ex_string);
336         g_free (ex_string);
337
338         gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->data_digits_spin), format_digits);
339
340         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->data_literal_radio))) {
341                 gtk_widget_set_sensitive (editor->priv->data_format_label, FALSE);
342                 gtk_widget_set_sensitive (editor->priv->data_ex_label, FALSE);
343                 gtk_widget_set_sensitive (editor->priv->data_digits_label, FALSE);
344                 gtk_widget_set_sensitive (editor->priv->data_digits_spin, FALSE);
345         } else {
346                 gtk_widget_set_sensitive (editor->priv->data_format_label, TRUE);
347                 gtk_widget_set_sensitive (editor->priv->data_ex_label, TRUE);
348                 gtk_widget_set_sensitive (editor->priv->data_digits_label,
349                                           !editor->priv->data_format_fixed_flag);
350                 gtk_widget_set_sensitive (editor->priv->data_digits_spin,
351                                           !editor->priv->data_format_fixed_flag);
352         }
353  
354         editor->priv->stop_signals = FALSE;
355
356         gl_debug (DEBUG_EDITOR, "END");
357 }
358
359
360 /*****************************************************************************/
361 /* Query barcode style.                                                      */
362 /*****************************************************************************/
363 glLabelBarcodeStyle *
364 gl_object_editor_get_bc_style (glObjectEditor      *editor)
365 {
366         gchar       *backend_name;
367         const gchar *backend_id;
368         gchar       *style_name;
369         const gchar *id;
370
371         glLabelBarcodeStyle *bc_style;
372
373         gl_debug (DEBUG_EDITOR, "START");
374                                                                                 
375         backend_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->bc_backend_combo));
376         backend_id = gl_barcode_backends_backend_name_to_id (backend_name);
377
378         style_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->bc_style_combo));
379         id = gl_barcode_backends_style_name_to_id (backend_id, style_name);
380
381         bc_style = gl_label_barcode_style_new ();
382
383         gl_label_barcode_style_set_backend_id (bc_style, backend_id);
384         gl_label_barcode_style_set_style_id (bc_style, id);
385
386         bc_style->text_flag     = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->bc_text_check));
387         bc_style->checksum_flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->bc_cs_check));
388         bc_style->format_digits = gtk_spin_button_get_value (GTK_SPIN_BUTTON(editor->priv->data_digits_spin));
389
390         g_free (backend_name);
391         g_free (style_name);
392
393         gl_debug (DEBUG_EDITOR, "END");
394
395         return bc_style;
396 }
397
398
399 /*****************************************************************************/
400 /* Set bc color.                                                             */
401 /*****************************************************************************/
402 void
403 gl_object_editor_set_bc_color (glObjectEditor      *editor,
404                                gboolean             merge_flag,
405                                glColorNode         *color_node)
406 {
407         gl_debug (DEBUG_EDITOR, "START");
408
409         editor->priv->stop_signals = TRUE;
410
411         gtk_widget_set_sensitive (editor->priv->bc_key_radio, merge_flag);
412
413         if ( color_node->color == GL_COLOR_NONE ) {
414
415                 gl_color_combo_set_to_default (GL_COLOR_COMBO(editor->priv->bc_color_combo));
416
417         } else {
418
419                 gl_color_combo_set_color (GL_COLOR_COMBO(editor->priv->bc_color_combo),
420                                           color_node->color);
421         }
422         
423         if (!color_node->field_flag || !merge_flag) {
424                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
425                                                   (editor->priv->bc_color_radio), TRUE); 
426                 gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE);
427                 gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE);
428                 
429         } else {
430                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
431                                                   (editor->priv->bc_key_radio), TRUE); 
432                 gtk_widget_set_sensitive (editor->priv->bc_color_combo, FALSE);
433                 gtk_widget_set_sensitive (editor->priv->bc_key_combo, TRUE);
434                 
435                 gl_field_button_set_key (GL_FIELD_BUTTON (editor->priv->bc_key_combo),
436                                            color_node->key);
437         }       
438         
439         editor->priv->stop_signals = FALSE;
440         
441         gl_debug (DEBUG_EDITOR, "END");
442 }
443
444
445 /*****************************************************************************/
446 /* Query bc color.                                                           */
447 /*****************************************************************************/
448 glColorNode*
449 gl_object_editor_get_bc_color (glObjectEditor      *editor)
450 {
451         guint         color;
452         glColorNode  *color_node;
453         gboolean      is_default;
454
455         gl_debug (DEBUG_EDITOR, "START");
456
457         color_node = gl_color_node_new_default ();
458         
459         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->bc_key_radio))) {
460                 color_node->field_flag = TRUE;
461                 color_node->color = gl_prefs_model_get_default_line_color (gl_prefs);
462                 color_node->key = 
463                         gl_field_button_get_key (GL_FIELD_BUTTON (editor->priv->bc_key_combo));
464         } else {
465                 color_node->field_flag = FALSE;
466                 color_node->key = NULL;
467                 color = gl_color_combo_get_color (GL_COLOR_COMBO(editor->priv->bc_color_combo),
468                                                   &is_default);
469
470                 if (is_default) {
471                         color_node->color = gl_prefs_model_get_default_line_color (gl_prefs);
472                 } else {
473                         color_node->color = color;
474                 }
475         }
476         
477         gl_debug (DEBUG_EDITOR, "END");
478
479         return color_node;
480 }
481
482
483 /*--------------------------------------------------------------------------*/
484 /* PRIVATE.  barcode color radio callback.                                  */
485 /*--------------------------------------------------------------------------*/
486 static void
487 bc_radio_toggled_cb (glObjectEditor *editor)
488 {
489         if (editor->priv->stop_signals) return;
490
491         gl_debug (DEBUG_EDITOR, "START");
492         
493         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->bc_color_radio))) {
494                 gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE);
495                 gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE);
496         } else {
497                 gtk_widget_set_sensitive (editor->priv->bc_color_combo, FALSE);
498                 gtk_widget_set_sensitive (editor->priv->bc_key_combo, TRUE);
499                 
500         }
501  
502         gl_object_editor_changed_cb (editor);
503 }
504
505
506 /*--------------------------------------------------------------------------*/
507 /* PRIVATE.  digits spin changed callback.                                  */
508 /*--------------------------------------------------------------------------*/
509 static void
510 data_digits_spin_changed_cb (glObjectEditor *editor)
511 {
512         gchar          *backend_name;
513         const gchar    *backend_id;
514         gchar          *style_name;
515         const gchar    *id;
516         guint           digits;
517         gchar          *ex_string;
518
519         if (editor->priv->stop_signals) return;
520
521         backend_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->bc_backend_combo));
522         backend_id = gl_barcode_backends_backend_name_to_id (backend_name);
523
524         style_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->bc_style_combo));
525         if ( *style_name != 0 ) {
526                 id = gl_barcode_backends_style_name_to_id (backend_id, style_name);
527
528                 digits = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->data_digits_spin));
529                 ex_string = gl_barcode_backends_style_default_digits (backend_id, id, digits);
530                 gtk_label_set_text (GTK_LABEL(editor->priv->data_ex_label), ex_string);
531         }
532
533         g_free (backend_name);
534         g_free (style_name);
535         g_free (ex_string);
536
537         gl_object_editor_changed_cb (editor);
538 }
539
540
541
542 /*
543  * Local Variables:       -- emacs
544  * mode: C                -- emacs
545  * c-basic-offset: 8      -- emacs
546  * tab-width: 8           -- emacs
547  * indent-tabs-mode: nil  -- emacs
548  * End:                   -- emacs
549  */