]> git.sur5r.net Git - glabels/blob - src/object-editor-bc-page.c
Cleanup of shadows for boxes and ellipses.
[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
36 #include "object-editor-private.h"
37
38 #include "debug.h"
39
40
41 /*===========================================*/
42 /* Private macros                            */
43 /*===========================================*/
44
45
46 /*===========================================*/
47 /* Private data types                        */
48 /*===========================================*/
49
50
51 /*===========================================*/
52 /* Private globals                           */
53 /*===========================================*/
54
55
56 /*===========================================*/
57 /* Local function prototypes                 */
58 /*===========================================*/
59
60 static void style_changed_cb            (glObjectEditor       *editor);
61 static void bc_radio_toggled_cb         (glObjectEditor       *editor);
62 static void data_digits_spin_changed_cb (glObjectEditor       *editor);
63
64
65 /*--------------------------------------------------------------------------*/
66 /* PRIVATE.  Prepare size page.                                             */
67 /*--------------------------------------------------------------------------*/
68 void
69 gl_object_editor_prepare_bc_page (glObjectEditor       *editor)
70 {
71         GList        *styles = NULL;
72
73         gl_debug (DEBUG_EDITOR, "START");
74
75         /* Extract widgets from XML tree. */
76         gl_builder_util_get_widgets (editor->priv->builder,
77                                      "bc_page_vbox",      &editor->priv->bc_page_vbox,
78                                      "bc_style_combo",    &editor->priv->bc_style_combo,
79                                      "bc_text_check",     &editor->priv->bc_text_check,
80                                      "bc_cs_check",       &editor->priv->bc_cs_check,
81                                      "bc_color_hbox",     &editor->priv->bc_color_hbox,
82                                      "bc_key_hbox",       &editor->priv->bc_key_hbox,
83                                      "bc_key_radio",      &editor->priv->bc_key_radio,
84                                      "bc_color_radio",    &editor->priv->bc_color_radio,
85                                      "data_format_label", &editor->priv->data_format_label,
86                                      "data_ex_label",     &editor->priv->data_ex_label,
87                                      "data_digits_label", &editor->priv->data_digits_label,
88                                      "data_digits_spin",  &editor->priv->data_digits_spin,
89                                      NULL);
90
91         editor->priv->data_format_fixed_flag = FALSE;
92
93         editor->priv->bc_color_combo = gl_color_combo_new (_("Default"),
94                                                            GL_COLOR_BC_DEFAULT,
95                                                            gl_prefs_model_get_default_line_color (gl_prefs));
96         gtk_box_pack_start (GTK_BOX (editor->priv->bc_color_hbox),
97                             editor->priv->bc_color_combo,
98                             FALSE, FALSE, 0);
99
100         editor->priv->bc_key_combo = gl_field_button_new (NULL);
101         gtk_box_pack_start (GTK_BOX (editor->priv->bc_key_hbox),
102                             editor->priv->bc_key_combo,
103                             TRUE, TRUE, 0);
104
105         gl_combo_util_add_text_model ( GTK_COMBO_BOX(editor->priv->bc_style_combo));
106
107         /* Load barcode styles */
108         styles = gl_barcode_get_styles_list ();
109         gl_combo_util_set_strings (GTK_COMBO_BOX(editor->priv->bc_style_combo),
110                                    styles);
111         gl_barcode_free_styles_list (styles);
112
113         /* Modify widgets */
114         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->bc_color_radio), TRUE);
115         gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE);
116         gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE);
117         
118         /* Un-hide */
119         gtk_widget_show_all (editor->priv->bc_page_vbox);
120
121         /* Connect signals */
122         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_style_combo),
123                                   "changed",
124                                   G_CALLBACK (style_changed_cb),
125                                   G_OBJECT (editor));
126         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_text_check),
127                                   "toggled",
128                                   G_CALLBACK (gl_object_editor_changed_cb),
129                                   G_OBJECT (editor));
130         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_cs_check),
131                                   "toggled",
132                                   G_CALLBACK (gl_object_editor_changed_cb),
133                                   G_OBJECT (editor));
134         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_color_combo),
135                                   "color_changed",
136                                   G_CALLBACK (gl_object_editor_changed_cb),
137                                   G_OBJECT (editor));
138         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_key_combo),
139                                   "changed",
140                                   G_CALLBACK (gl_object_editor_changed_cb),
141                                   G_OBJECT (editor));
142         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_color_radio),
143                                   "toggled",
144                                   G_CALLBACK (bc_radio_toggled_cb),
145                                   G_OBJECT (editor));                             
146         g_signal_connect_swapped (G_OBJECT (editor->priv->bc_key_radio),
147                                   "toggled",
148                                   G_CALLBACK (bc_radio_toggled_cb),
149                                   G_OBJECT (editor));
150         g_signal_connect_swapped (G_OBJECT (editor->priv->data_digits_spin),
151                                   "changed",
152                                   G_CALLBACK (data_digits_spin_changed_cb),
153                                   G_OBJECT (editor));
154
155         gl_debug (DEBUG_EDITOR, "END");
156 }
157
158
159 /*--------------------------------------------------------------------------*/
160 /* PRIVATE.  Callback for when style has changed.                           */
161 /*--------------------------------------------------------------------------*/
162 static void
163 style_changed_cb (glObjectEditor       *editor)
164 {
165         gchar          *style_string = NULL;
166         const gchar    *id;
167         gchar          *ex_string = NULL;
168         guint           digits;
169
170         if (editor->priv->stop_signals) return;
171
172         style_string =
173                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->bc_style_combo));
174                                                                                 
175         /* Don't emit if entry is empty. */
176         if ( *style_string != 0 ) {
177                 id = gl_barcode_name_to_id (style_string);
178                                                                                 
179                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(editor->priv->bc_text_check),
180                                               gl_barcode_can_text (id));
181                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(editor->priv->bc_cs_check),
182                                               gl_barcode_can_csum (id));
183                                                                                 
184                 gtk_widget_set_sensitive (editor->priv->bc_text_check,
185                                           gl_barcode_text_optional (id));
186                 gtk_widget_set_sensitive (editor->priv->bc_cs_check,
187                                           gl_barcode_csum_optional (id));
188                                                                                 
189                 editor->priv->data_format_fixed_flag = !gl_barcode_can_freeform (id);
190                 digits = gl_barcode_get_prefered_n(id);
191                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->data_digits_spin), digits);
192                                                                                 
193                 ex_string = gl_barcode_default_digits (id, digits);
194                 gtk_label_set_text (GTK_LABEL(editor->priv->data_ex_label), ex_string);
195
196                 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->data_literal_radio))) {
197                         gtk_widget_set_sensitive (editor->priv->data_format_label, FALSE);
198                         gtk_widget_set_sensitive (editor->priv->data_ex_label, FALSE);
199                         gtk_widget_set_sensitive (editor->priv->data_digits_label, FALSE);
200                         gtk_widget_set_sensitive (editor->priv->data_digits_spin, FALSE);
201                 } else {
202                         gtk_widget_set_sensitive (editor->priv->data_format_label, TRUE);
203                         gtk_widget_set_sensitive (editor->priv->data_ex_label, TRUE);
204                         gtk_widget_set_sensitive (editor->priv->data_digits_label,
205                                                   !editor->priv->data_format_fixed_flag);
206                         gtk_widget_set_sensitive (editor->priv->data_digits_spin,
207                                                   !editor->priv->data_format_fixed_flag);
208                 }
209  
210                 gl_object_editor_changed_cb (editor);
211         }
212                                                                                 
213         g_free (style_string);
214         g_free (ex_string);
215 }
216                                                                                 
217
218 /*****************************************************************************/
219 /* Set barcode style.                                                        */
220 /*****************************************************************************/
221 void
222 gl_object_editor_set_bc_style (glObjectEditor      *editor,
223                                gchar               *id,
224                                gboolean             text_flag,
225                                gboolean             checksum_flag,
226                                guint                format_digits)
227 {
228         const gchar *style_string;
229         gchar       *ex_string;
230  
231         gl_debug (DEBUG_EDITOR, "START");
232
233         editor->priv->stop_signals = TRUE;
234
235         style_string = gl_barcode_id_to_name (id);
236  
237         gl_combo_util_set_active_text (GTK_COMBO_BOX (editor->priv->bc_style_combo),
238                                        style_string);
239  
240         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->bc_text_check),
241                                       text_flag);
242  
243         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->bc_cs_check),
244                                       checksum_flag);
245
246         gtk_widget_set_sensitive (editor->priv->bc_text_check,
247                                   gl_barcode_text_optional (id));
248         gtk_widget_set_sensitive (editor->priv->bc_cs_check,
249                                   gl_barcode_csum_optional (id));
250
251         editor->priv->data_format_fixed_flag = !gl_barcode_can_freeform (id);
252
253         if (editor->priv->data_format_fixed_flag) {
254                 format_digits = gl_barcode_get_prefered_n (id);
255         }
256
257         ex_string = gl_barcode_default_digits (id, format_digits);
258         gtk_label_set_text (GTK_LABEL(editor->priv->data_ex_label), ex_string);
259         g_free (ex_string);
260
261         gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->data_digits_spin), 
262                                    format_digits);
263
264         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->data_literal_radio))) {
265                 gtk_widget_set_sensitive (editor->priv->data_format_label, FALSE);
266                 gtk_widget_set_sensitive (editor->priv->data_ex_label, FALSE);
267                 gtk_widget_set_sensitive (editor->priv->data_digits_label, FALSE);
268                 gtk_widget_set_sensitive (editor->priv->data_digits_spin, FALSE);
269         } else {
270                 gtk_widget_set_sensitive (editor->priv->data_format_label, TRUE);
271                 gtk_widget_set_sensitive (editor->priv->data_ex_label, TRUE);
272                 gtk_widget_set_sensitive (editor->priv->data_digits_label,
273                                           !editor->priv->data_format_fixed_flag);
274                 gtk_widget_set_sensitive (editor->priv->data_digits_spin,
275                                           !editor->priv->data_format_fixed_flag);
276         }
277  
278         editor->priv->stop_signals = FALSE;
279
280         gl_debug (DEBUG_EDITOR, "END");
281 }
282
283
284 /*****************************************************************************/
285 /* Query barcode style.                                                      */
286 /*****************************************************************************/
287 void
288 gl_object_editor_get_bc_style (glObjectEditor      *editor,
289                                gchar              **id,
290                                gboolean            *text_flag,
291                                gboolean            *checksum_flag,
292                                guint               *format_digits)
293 {
294         gchar *style_string;
295
296         gl_debug (DEBUG_EDITOR, "START");
297                                                                                 
298         style_string =
299                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->bc_style_combo));
300         *id = g_strdup (gl_barcode_name_to_id (style_string));
301                                                                                 
302         *text_flag =
303             gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->bc_text_check));
304                                                                                 
305         *checksum_flag =
306             gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->bc_cs_check));
307                                                                                 
308
309         *format_digits =
310                 gtk_spin_button_get_value (GTK_SPIN_BUTTON(editor->priv->data_digits_spin));
311
312         g_free (style_string);
313
314         gl_debug (DEBUG_EDITOR, "END");
315 }
316
317
318 /*****************************************************************************/
319 /* Set bc color.                                                             */
320 /*****************************************************************************/
321 void
322 gl_object_editor_set_bc_color (glObjectEditor      *editor,
323                                gboolean             merge_flag,
324                                glColorNode         *color_node)
325 {
326         gl_debug (DEBUG_EDITOR, "START");
327
328         editor->priv->stop_signals = TRUE;
329
330         gtk_widget_set_sensitive (editor->priv->bc_key_radio, merge_flag);
331
332         if ( color_node->color == GL_COLOR_NONE ) {
333
334                 gl_color_combo_set_to_default (GL_COLOR_COMBO(editor->priv->bc_color_combo));
335
336         } else {
337
338                 gl_color_combo_set_color (GL_COLOR_COMBO(editor->priv->bc_color_combo),
339                                           color_node->color);
340         }
341         
342         if (!color_node->field_flag || !merge_flag) {
343                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
344                                                   (editor->priv->bc_color_radio), TRUE); 
345                 gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE);
346                 gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE);
347                 
348         } else {
349                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
350                                                   (editor->priv->bc_key_radio), TRUE); 
351                 gtk_widget_set_sensitive (editor->priv->bc_color_combo, FALSE);
352                 gtk_widget_set_sensitive (editor->priv->bc_key_combo, TRUE);
353                 
354                 gl_field_button_set_key (GL_FIELD_BUTTON (editor->priv->bc_key_combo),
355                                            color_node->key);
356         }       
357         
358         editor->priv->stop_signals = FALSE;
359         
360         gl_debug (DEBUG_EDITOR, "END");
361 }
362
363
364 /*****************************************************************************/
365 /* Query bc color.                                                           */
366 /*****************************************************************************/
367 glColorNode*
368 gl_object_editor_get_bc_color (glObjectEditor      *editor)
369 {
370         guint         color;
371         glColorNode  *color_node;
372         gboolean      is_default;
373
374         gl_debug (DEBUG_EDITOR, "START");
375
376         color_node = gl_color_node_new_default ();
377         
378         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->bc_key_radio))) {
379                 color_node->field_flag = TRUE;
380                 color_node->color = gl_prefs_model_get_default_line_color (gl_prefs);
381                 color_node->key = 
382                         gl_field_button_get_key (GL_FIELD_BUTTON (editor->priv->bc_key_combo));
383         } else {
384                 color_node->field_flag = FALSE;
385                 color_node->key = NULL;
386                 color = gl_color_combo_get_color (GL_COLOR_COMBO(editor->priv->bc_color_combo),
387                                                   &is_default);
388
389                 if (is_default) {
390                         color_node->color = gl_prefs_model_get_default_line_color (gl_prefs);
391                 } else {
392                         color_node->color = color;
393                 }
394         }
395         
396         gl_debug (DEBUG_EDITOR, "END");
397
398         return color_node;
399 }
400
401
402 /*--------------------------------------------------------------------------*/
403 /* PRIVATE.  barcode color radio callback.                                  */
404 /*--------------------------------------------------------------------------*/
405 static void
406 bc_radio_toggled_cb (glObjectEditor *editor)
407 {
408         if (editor->priv->stop_signals) return;
409
410         gl_debug (DEBUG_EDITOR, "START");
411         
412         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->bc_color_radio))) {
413                 gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE);
414                 gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE);
415         } else {
416                 gtk_widget_set_sensitive (editor->priv->bc_color_combo, FALSE);
417                 gtk_widget_set_sensitive (editor->priv->bc_key_combo, TRUE);
418                 
419         }
420  
421         gl_object_editor_changed_cb (editor);
422 }
423
424
425 /*--------------------------------------------------------------------------*/
426 /* PRIVATE.  digits spin changed callback.                                  */
427 /*--------------------------------------------------------------------------*/
428 static void
429 data_digits_spin_changed_cb (glObjectEditor *editor)
430 {
431         gchar          *style_string;
432         const gchar    *id;
433         guint           digits;
434         gchar          *ex_string;
435
436         if (editor->priv->stop_signals) return;
437
438         style_string = gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->bc_style_combo));
439         if ( *style_string != 0 ) {
440                 id = gl_barcode_name_to_id (style_string);
441
442                 digits = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->data_digits_spin));
443                 ex_string = gl_barcode_default_digits (id, digits);
444                 gtk_label_set_text (GTK_LABEL(editor->priv->data_ex_label), ex_string);
445         }
446
447         g_free (style_string);
448         g_free (ex_string);
449
450         gl_object_editor_changed_cb (editor);
451 }
452
453
454
455 /*
456  * Local Variables:       -- emacs
457  * mode: C                -- emacs
458  * c-basic-offset: 8      -- emacs
459  * tab-width: 8           -- emacs
460  * indent-tabs-mode: nil  -- emacs
461  * End:                   -- emacs
462  */