2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * view_barcode.c: GLabels label barcode object widget
6 * Copyright (C) 2001-2002 Jim Evins <evins@snaught.com>.
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.
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.
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
25 #include <libgnomeprint/gnome-glyphlist.h>
27 #include "view-barcode.h"
28 #include "canvas-hacktext.h"
30 #include "view-highlight.h"
32 #include "wdgt-bc-data.h"
33 #include "wdgt-bc-props.h"
34 #include "wdgt-bc-style.h"
35 #include "wdgt-position.h"
39 #include "pixmaps/cursor_barcode.xbm"
40 #include "pixmaps/cursor_barcode_mask.xbm"
44 /*========================================================*/
45 /* Private macros and constants. */
46 /*========================================================*/
48 /*========================================================*/
50 /*========================================================*/
52 struct _glViewBarcodePrivate {
67 /*========================================================*/
68 /* Private globals. */
69 /*========================================================*/
71 static glViewObjectClass *parent_class = NULL;
74 /*========================================================*/
75 /* Private function prototypes. */
76 /*========================================================*/
78 static void gl_view_barcode_class_init (glViewBarcodeClass *klass);
79 static void gl_view_barcode_instance_init (glViewBarcode *view_barcode);
80 static void gl_view_barcode_finalize (GObject *object);
82 static void update_view_barcode_cb (glLabelObject *object,
83 glViewBarcode *view_barcode);
85 static GtkWidget *construct_properties_dialog (glViewBarcode *view_barcode);
87 static void response_cb (GtkDialog *dialog,
89 glViewBarcode *view_barcode);
91 static void bc_data_changed_cb (glWdgtBCData *bc_data,
92 glViewBarcode *view_barcode);
94 static void bc_props_changed_cb (glWdgtBCProps *bc_props,
95 glViewBarcode *view_barcode);
97 static void bc_style_changed_cb (glWdgtBCStyle *bc_style,
98 glViewBarcode *view_barcode);
100 static void position_changed_cb (glWdgtPosition *position,
101 glViewBarcode *view_barcode);
103 static void update_dialog_cb (glLabelObject *object,
104 glViewBarcode *view_barcode);
106 static void update_dialog_from_move_cb (glLabelObject *object,
109 glViewBarcode *view_barcode);
111 static void draw_barcode (glViewBarcode *view_barcode);
114 /*****************************************************************************/
115 /* Boilerplate object stuff. */
116 /*****************************************************************************/
118 gl_view_barcode_get_type (void)
120 static GType type = 0;
124 sizeof (glViewBarcodeClass),
127 (GClassInitFunc) gl_view_barcode_class_init,
130 sizeof (glViewBarcode),
132 (GInstanceInitFunc) gl_view_barcode_instance_init,
135 type = g_type_register_static (GL_TYPE_VIEW_OBJECT,
136 "glViewBarcode", &info, 0);
143 gl_view_barcode_class_init (glViewBarcodeClass *klass)
145 GObjectClass *object_class = (GObjectClass *) klass;
147 gl_debug (DEBUG_VIEW, "START");
149 parent_class = g_type_class_peek_parent (klass);
151 object_class->finalize = gl_view_barcode_finalize;
153 gl_debug (DEBUG_VIEW, "END");
157 gl_view_barcode_instance_init (glViewBarcode *view_barcode)
159 gl_debug (DEBUG_VIEW, "START");
161 view_barcode->private = g_new0 (glViewBarcodePrivate, 1);
163 gl_debug (DEBUG_VIEW, "END");
167 gl_view_barcode_finalize (GObject *object)
171 gl_debug (DEBUG_VIEW, "START");
173 g_return_if_fail (object && GL_IS_VIEW_BARCODE (object));
175 G_OBJECT_CLASS (parent_class)->finalize (object);
177 gl_debug (DEBUG_VIEW, "END");
180 /*****************************************************************************/
181 /* NEW barcode object view. */
182 /*****************************************************************************/
184 gl_view_barcode_new (glLabelBarcode *object,
187 glViewBarcode *view_barcode;
190 gl_debug (DEBUG_VIEW, "START");
191 g_return_if_fail (object && GL_IS_LABEL_BARCODE (object));
192 g_return_if_fail (view && GL_IS_VIEW (view));
194 view_barcode = g_object_new (gl_view_barcode_get_type(), NULL);
196 gl_view_object_set_view (GL_VIEW_OBJECT(view_barcode), view);
197 gl_view_object_set_object (GL_VIEW_OBJECT(view_barcode),
198 GL_LABEL_OBJECT(object),
199 GL_VIEW_HIGHLIGHT_SIMPLE);
201 /* Create analogous canvas items. */
202 draw_barcode (view_barcode);
204 g_signal_connect (G_OBJECT (object), "changed",
205 G_CALLBACK (update_view_barcode_cb), view_barcode);
207 /* Create a dialog for controlling/viewing object properties. */
208 gl_view_object_set_dlg_constructor (GL_VIEW_OBJECT(view_barcode),
209 GL_VIEW_OBJECT_DLG_CONSTRUCTOR(construct_properties_dialog));
211 gl_debug (DEBUG_VIEW, "END");
213 return GL_VIEW_OBJECT (view_barcode);
216 /*---------------------------------------------------------------------------*/
217 /* PRIVATE. label object "changed" callback. */
218 /*---------------------------------------------------------------------------*/
220 update_view_barcode_cb (glLabelObject *object,
221 glViewBarcode *view_barcode)
224 GnomeCanvasItem *group;
226 gl_debug (DEBUG_VIEW, "START");
228 view = gl_view_object_get_view (GL_VIEW_OBJECT(view_barcode));
230 /* Adjust appearance of analogous canvas items. */
231 draw_barcode (view_barcode);
233 gl_debug (DEBUG_VIEW, "END");
236 /*****************************************************************************/
237 /* Create a properties dialog for a barcode object. */
238 /*****************************************************************************/
240 construct_properties_dialog (glViewBarcode *view_barcode)
242 GtkWidget *dialog, *wsection;
243 glLabelObject *object;
244 gdouble x, y, w, h, label_width, label_height;
245 glTextNode *text_node;
246 glBarcodeStyle style;
251 GtkSizeGroup *label_size_group;
254 gl_debug (DEBUG_VIEW, "START");
256 /* retrieve object and query parameters */
257 object = gl_view_object_get_object (GL_VIEW_OBJECT(view_barcode));
258 gl_label_object_get_position (GL_LABEL_OBJECT(object), &x, &y);
259 text_node = gl_label_barcode_get_data(GL_LABEL_BARCODE(object));
260 gl_label_barcode_get_props (GL_LABEL_BARCODE(object),
261 &style, &text_flag, &color, &scale);
262 gl_label_get_size (GL_LABEL(object->parent),
263 &label_width, &label_height);
264 merge = gl_label_get_merge (GL_LABEL(object->parent));
266 /*-----------------------------------------------------------------*/
268 /*-----------------------------------------------------------------*/
269 window = gtk_widget_get_toplevel (
270 GTK_WIDGET(gl_view_object_get_view(GL_VIEW_OBJECT(view_barcode))));
271 dialog = gl_hig_dialog_new_with_buttons ( _("Edit barcode object properties"),
273 GTK_DIALOG_DESTROY_WITH_PARENT,
277 gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
278 g_signal_connect (G_OBJECT (dialog), "response",
279 G_CALLBACK (response_cb), view_barcode);
281 label_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
283 /*---------------------------*/
285 /*---------------------------*/
286 wsection = gl_hig_category_new (_("Data"));
287 gl_hig_dialog_add_widget (GL_HIG_DIALOG(dialog), wsection);
290 view_barcode->private->bc_data =
291 gl_wdgt_bc_data_new (merge->field_defs);
292 gl_wdgt_bc_data_set_label_size_group (GL_WDGT_BC_DATA(view_barcode->private->bc_data),
294 gl_wdgt_bc_data_set_data (GL_WDGT_BC_DATA(view_barcode->private->bc_data),
295 (merge->type != GL_MERGE_NONE),
297 gl_hig_category_add_widget (GL_HIG_CATEGORY(wsection),
298 view_barcode->private->bc_data);
299 g_signal_connect ( G_OBJECT(view_barcode->private->bc_data),
300 "changed", G_CALLBACK (bc_data_changed_cb),
304 /*---------------------------*/
305 /* Appearance section */
306 /*---------------------------*/
307 wsection = gl_hig_category_new (_("Properties"));
308 gl_hig_dialog_add_widget (GL_HIG_DIALOG(dialog), wsection);
310 /* Barcode style widget */
311 view_barcode->private->bc_style = gl_wdgt_bc_style_new ();
312 gl_wdgt_bc_style_set_label_size_group (GL_WDGT_BC_STYLE(view_barcode->private->bc_style),
314 gl_wdgt_bc_style_set_params (GL_WDGT_BC_STYLE (view_barcode->private->bc_style),
316 gl_hig_category_add_widget (GL_HIG_CATEGORY(wsection),
317 view_barcode->private->bc_style);
318 g_signal_connect (G_OBJECT (view_barcode->private->bc_style),
319 "changed", G_CALLBACK (bc_style_changed_cb),
322 /* barcode props entry */
323 gl_debug (DEBUG_VIEW, "Creating props entry...");
324 view_barcode->private->bc_props = gl_wdgt_bc_props_new ();
325 gl_wdgt_bc_props_set_label_size_group (GL_WDGT_BC_PROPS(view_barcode->private->bc_props),
327 gl_wdgt_bc_props_set_params (GL_WDGT_BC_PROPS(view_barcode->private->bc_props),
329 gl_hig_category_add_widget (GL_HIG_CATEGORY(wsection),
330 view_barcode->private->bc_props);
331 g_signal_connect ( G_OBJECT(view_barcode->private->bc_props),
332 "changed", G_CALLBACK (bc_props_changed_cb),
336 /*----------------------------*/
337 /* Position section */
338 /*----------------------------*/
339 wsection = gl_hig_category_new (_("Position"));
340 gl_hig_dialog_add_widget (GL_HIG_DIALOG(dialog), wsection);
342 /* ------ Position Frame ------ */
343 view_barcode->private->position = gl_wdgt_position_new ();
344 gl_wdgt_position_set_label_size_group (GL_WDGT_POSITION(view_barcode->private->position),
346 gl_wdgt_position_set_params (GL_WDGT_POSITION (view_barcode->private->position),
348 label_width, label_height);
349 gl_hig_category_add_widget (GL_HIG_CATEGORY(wsection),
350 view_barcode->private->position);
351 g_signal_connect (G_OBJECT (view_barcode->private->position),
353 G_CALLBACK(position_changed_cb), view_barcode);
356 /*----------------------------*/
357 /* Track object changes. */
358 /*----------------------------*/
359 g_signal_connect (G_OBJECT (object), "changed",
360 G_CALLBACK (update_dialog_cb), view_barcode);
361 g_signal_connect (G_OBJECT (object), "moved",
362 G_CALLBACK (update_dialog_from_move_cb),
365 gl_debug (DEBUG_VIEW, "END");
370 /*---------------------------------------------------------------------------*/
371 /* PRIVATE. "Response" callback. */
372 /*---------------------------------------------------------------------------*/
374 response_cb (GtkDialog *dialog,
376 glViewBarcode *view_barcode)
378 gl_debug (DEBUG_VIEW, "START");
380 g_return_if_fail(dialog != NULL);
381 g_return_if_fail(GTK_IS_DIALOG(dialog));
384 case GTK_RESPONSE_CLOSE:
385 gtk_widget_hide (GTK_WIDGET(dialog));
387 case GTK_RESPONSE_DELETE_EVENT:
390 g_print ("response = %d", response);
391 g_assert_not_reached();
394 gl_debug (DEBUG_VIEW, "END");
397 /*---------------------------------------------------------------------------*/
398 /* PRIVATE. barcode data "changed" callback. */
399 /*---------------------------------------------------------------------------*/
401 bc_data_changed_cb (glWdgtBCData *bc_data,
402 glViewBarcode *view_barcode)
404 glLabelObject *object;
405 glTextNode *text_node;
407 gl_debug (DEBUG_VIEW, "START");
409 object = gl_view_object_get_object (GL_VIEW_OBJECT(view_barcode));
411 text_node = gl_wdgt_bc_data_get_data (bc_data);
413 g_signal_handlers_block_by_func (G_OBJECT(object),
414 update_dialog_cb, view_barcode);
415 gl_label_barcode_set_data (GL_LABEL_BARCODE(object), text_node);
416 g_signal_handlers_unblock_by_func (G_OBJECT(object),
417 update_dialog_cb, view_barcode);
419 gl_text_node_free (&text_node);
421 gl_debug (DEBUG_VIEW, "END");
424 /*---------------------------------------------------------------------------*/
425 /* PRIVATE. barcode props "changed" callback. */
426 /*---------------------------------------------------------------------------*/
428 bc_props_changed_cb (glWdgtBCProps *text_props,
429 glViewBarcode *view_barcode)
431 glLabelObject *object;
432 glBarcodeStyle style;
438 gl_debug (DEBUG_VIEW, "START");
440 object = gl_view_object_get_object (GL_VIEW_OBJECT(view_barcode));
442 gl_label_barcode_get_props (GL_LABEL_BARCODE(object),
443 &style, &text_flag, &color, &scale);
444 gl_wdgt_bc_props_get_params (text_props, &scale, &color);
446 g_signal_handlers_block_by_func (G_OBJECT(object),
447 update_dialog_cb, view_barcode);
448 gl_label_barcode_set_props (GL_LABEL_BARCODE(object),
449 style, text_flag, color, scale);
450 g_signal_handlers_unblock_by_func (G_OBJECT(object),
451 update_dialog_cb, view_barcode);
453 gl_debug (DEBUG_VIEW, "END");
456 /*---------------------------------------------------------------------------*/
457 /* PRIVATE. barcode style "changed" callback. */
458 /*---------------------------------------------------------------------------*/
460 bc_style_changed_cb (glWdgtBCStyle *bc_style,
461 glViewBarcode *view_barcode)
463 glLabelObject *object;
464 glBarcodeStyle style;
470 gl_debug (DEBUG_VIEW, "START");
472 object = gl_view_object_get_object (GL_VIEW_OBJECT(view_barcode));
474 gl_label_barcode_get_props (GL_LABEL_BARCODE(object),
475 &style, &text_flag, &color, &scale);
476 gl_wdgt_bc_style_get_params (bc_style, &style, &text_flag);
478 g_signal_handlers_block_by_func (G_OBJECT(object),
479 update_dialog_cb, view_barcode);
480 gl_label_barcode_set_props (GL_LABEL_BARCODE(object),
481 style, text_flag, color, scale);
482 g_signal_handlers_unblock_by_func (G_OBJECT(object),
483 update_dialog_cb, view_barcode);
485 gl_debug (DEBUG_VIEW, "END");
488 /*---------------------------------------------------------------------------*/
489 /* PRIVATE. position "changed" callback. */
490 /*---------------------------------------------------------------------------*/
492 position_changed_cb (glWdgtPosition *position,
493 glViewBarcode *view_barcode)
495 glLabelObject *object;
498 gl_debug (DEBUG_VIEW, "START");
500 gl_wdgt_position_get_position (GL_WDGT_POSITION (position), &x, &y);
502 object = gl_view_object_get_object (GL_VIEW_OBJECT(view_barcode));
504 g_signal_handlers_block_by_func (G_OBJECT(object),
505 update_dialog_cb, view_barcode);
506 gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y);
507 g_signal_handlers_unblock_by_func (G_OBJECT(object),
508 update_dialog_cb, view_barcode);
510 gl_debug (DEBUG_VIEW, "END");
513 /*---------------------------------------------------------------------------*/
514 /* PRIVATE. label object "changed" callback. */
515 /*---------------------------------------------------------------------------*/
517 update_dialog_cb (glLabelObject *object,
518 glViewBarcode *view_barcode)
521 glTextNode *text_node;
522 glBarcodeStyle style;
528 gl_debug (DEBUG_VIEW, "START");
530 /* Query properties of object. */
531 text_node = gl_label_barcode_get_data(GL_LABEL_BARCODE(object));
532 gl_label_barcode_get_props (GL_LABEL_BARCODE(object),
533 &style, &text_flag, &color, &scale);
534 gl_label_object_get_position (GL_LABEL_OBJECT(object), &x, &y);
535 merge = gl_label_get_merge (GL_LABEL(object->parent));
537 /* Block widget handlers to prevent recursion */
538 g_signal_handlers_block_by_func (G_OBJECT(view_barcode->private->bc_data),
539 bc_data_changed_cb, view_barcode);
540 g_signal_handlers_block_by_func (G_OBJECT(view_barcode->private->bc_props),
541 bc_props_changed_cb, view_barcode);
542 g_signal_handlers_block_by_func (G_OBJECT(view_barcode->private->bc_style),
543 bc_style_changed_cb, view_barcode);
544 g_signal_handlers_block_by_func (G_OBJECT(view_barcode->private->position),
545 position_changed_cb, view_barcode);
547 /* Update widgets in property dialog */
549 gl_wdgt_bc_data_set_data (GL_WDGT_BC_DATA(view_barcode->private->bc_data),
550 (merge->type != GL_MERGE_NONE),
552 gl_wdgt_bc_data_set_field_defs (GL_WDGT_BC_DATA(view_barcode->private->bc_data),
554 gl_wdgt_bc_props_set_params (GL_WDGT_BC_PROPS(view_barcode->private->bc_props),
556 gl_wdgt_bc_style_set_params (GL_WDGT_BC_STYLE(view_barcode->private->bc_style),
558 gl_wdgt_position_set_position (GL_WDGT_POSITION(view_barcode->private->position),
561 /* Unblock widget handlers */
562 g_signal_handlers_unblock_by_func (G_OBJECT(view_barcode->private->bc_data),
563 bc_data_changed_cb, view_barcode);
564 g_signal_handlers_unblock_by_func (G_OBJECT(view_barcode->private->bc_props),
565 bc_props_changed_cb, view_barcode);
566 g_signal_handlers_unblock_by_func (G_OBJECT(view_barcode->private->bc_style),
567 bc_style_changed_cb, view_barcode);
568 g_signal_handlers_unblock_by_func (G_OBJECT(view_barcode->private->position),
569 position_changed_cb, view_barcode);
571 gl_text_node_free (&text_node);
573 gl_debug (DEBUG_VIEW, "END");
576 /*---------------------------------------------------------------------------*/
577 /* PRIVATE. label object "moved" callback. */
578 /*---------------------------------------------------------------------------*/
580 update_dialog_from_move_cb (glLabelObject *object,
583 glViewBarcode *view_barcode)
587 gl_debug (DEBUG_VIEW, "START");
589 /* Query properties of object. */
590 gl_label_object_get_position (GL_LABEL_OBJECT(object), &x, &y);
592 /* Block widget handlers to prevent recursion */
593 g_signal_handlers_block_by_func (G_OBJECT(view_barcode->private->position),
594 position_changed_cb, view_barcode);
596 /* Update widgets in property dialog */
597 gl_wdgt_position_set_position (GL_WDGT_POSITION(view_barcode->private->position),
600 /* Unblock widget handlers */
601 g_signal_handlers_unblock_by_func (G_OBJECT(view_barcode->private->position),
602 position_changed_cb, view_barcode);
604 gl_debug (DEBUG_VIEW, "END");
607 /*****************************************************************************/
608 /* Return apropos cursor for create object mode. */
609 /*****************************************************************************/
611 gl_view_barcode_get_create_cursor (void)
613 static GdkCursor *cursor = NULL;
614 GdkPixmap *pixmap_data, *pixmap_mask;
615 GdkColor fg = { 0, 0, 0, 0 };
616 GdkColor bg = { 0, 65535, 65535, 65535 };
618 gl_debug (DEBUG_VIEW, "START");
621 pixmap_data = gdk_bitmap_create_from_data (NULL,
623 cursor_barcode_width,
624 cursor_barcode_height);
625 pixmap_mask = gdk_bitmap_create_from_data (NULL,
626 cursor_barcode_mask_bits,
627 cursor_barcode_mask_width,
628 cursor_barcode_mask_height);
630 gdk_cursor_new_from_pixmap (pixmap_data, pixmap_mask, &fg,
631 &bg, cursor_barcode_x_hot,
632 cursor_barcode_y_hot);
635 gl_debug (DEBUG_VIEW, "END");
640 /*****************************************************************************/
641 /* Canvas event handler for creating barcode objects. */
642 /*****************************************************************************/
644 gl_view_barcode_create_event_handler (GnomeCanvas *canvas,
648 static gdouble x0, y0;
649 static gboolean dragging = FALSE;
650 static glViewObject *view_barcode;
651 static GObject *object;
653 glTextNode *text_node;
655 gl_debug (DEBUG_VIEW, "");
657 switch (event->type) {
659 case GDK_BUTTON_PRESS:
660 gl_debug (DEBUG_VIEW, "BUTTON_PRESS");
661 switch (event->button.button) {
664 gdk_pointer_grab (GTK_WIDGET (view->canvas)->window,
666 GDK_POINTER_MOTION_MASK |
667 GDK_BUTTON_RELEASE_MASK |
668 GDK_BUTTON_PRESS_MASK,
669 NULL, NULL, event->button.time);
670 gnome_canvas_window_to_world (canvas,
672 event->button.y, &x, &y);
673 object = gl_label_barcode_new (view->label);
674 gl_label_object_set_position (GL_LABEL_OBJECT(object),
676 text_node = gl_text_node_new_from_text ("123456789");
677 gl_label_barcode_set_data (GL_LABEL_BARCODE(object),
679 gl_label_barcode_set_props (GL_LABEL_BARCODE(object),
680 GL_BARCODE_STYLE_POSTNET,
682 gl_color_set_opacity (gl_prefs->default_line_color, 0.5),
684 view_barcode = gl_view_barcode_new (GL_LABEL_BARCODE(object),
694 case GDK_BUTTON_RELEASE:
695 gl_debug (DEBUG_VIEW, "BUTTON_RELEASE");
696 switch (event->button.button) {
699 gdk_pointer_ungrab (event->button.time);
700 gnome_canvas_window_to_world (canvas,
702 event->button.y, &x, &y);
703 gl_label_object_set_position (GL_LABEL_OBJECT(object),
705 gl_label_barcode_set_props (GL_LABEL_BARCODE(object),
706 GL_BARCODE_STYLE_POSTNET,
708 gl_prefs->default_line_color,
710 gl_view_unselect_all (view);
711 gl_view_object_select (GL_VIEW_OBJECT(view_barcode));
712 gl_view_arrow_mode (view);
719 case GDK_MOTION_NOTIFY:
720 gl_debug (DEBUG_VIEW, "MOTION_NOTIFY");
721 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
722 gnome_canvas_window_to_world (canvas,
724 event->motion.y, &x, &y);
725 gl_label_object_set_position (GL_LABEL_OBJECT(object),
738 /*--------------------------------------------------------------------------*/
739 /* PRIVATE. Draw barcode to item (group). */
740 /*--------------------------------------------------------------------------*/
742 draw_barcode (glViewBarcode *view_barcode)
744 glLabelObject *object;
745 GnomeCanvasItem *item;
746 glTextNode *text_node;
747 glBarcodeStyle style;
752 glBarcodeChar *bchar;
755 GList *item_list = NULL;
756 GnomeCanvasPoints *points;
757 gchar *digits, *cstring;
759 GnomeGlyphList *glyphlist;
762 gl_debug (DEBUG_VIEW, "START");
764 /* Query label object and properties */
765 object = gl_view_object_get_object (GL_VIEW_OBJECT(view_barcode));
766 gl_label_barcode_get_props (GL_LABEL_BARCODE(object),
767 &style, &text_flag, &color, &scale);
768 text_node = gl_label_barcode_get_data(GL_LABEL_BARCODE(object));
769 if (text_node->field_flag) {
770 digits = gl_barcode_default_digits (style);
772 digits = gl_text_node_expand (text_node, NULL);
775 /* remove previous items from group. */
776 for (li = view_barcode->private->item_list; li!=NULL; li = li->next) {
777 gl_debug (DEBUG_VIEW, "in loop");
778 gtk_object_destroy (GTK_OBJECT (li->data));
780 gl_debug (DEBUG_VIEW, "1");
781 g_list_free (view_barcode->private->item_list);
782 view_barcode->private->item_list = NULL;
783 gl_debug (DEBUG_VIEW, "2");
786 font = gnome_font_find_closest_from_weight_slant (GL_BARCODE_FONT_FAMILY,
787 GL_BARCODE_FONT_WEIGHT,
791 gbc = gl_barcode_new (style, text_flag, scale, digits);
794 cstring = _("Invalid barcode");
795 glyphlist = gnome_glyphlist_from_text_sized_dumb (font,
801 y_offset = 10.0 - gnome_font_get_descender (font);
802 item = gl_view_object_item_new (GL_VIEW_OBJECT(view_barcode),
803 gl_canvas_hacktext_get_type (),
806 "glyphlist", glyphlist, NULL);
808 view_barcode->private->item_list =
809 g_list_prepend (view_barcode->private->item_list, item);
812 points = gnome_canvas_points_new (2);
813 for (li = gbc->lines; li != NULL; li = li->next) {
814 line = (glBarcodeLine *) li->data;
816 points->coords[0] = line->x;
817 points->coords[1] = line->y;
818 points->coords[2] = line->x;
819 points->coords[3] = line->y + line->length;
821 item = gl_view_object_item_new (GL_VIEW_OBJECT(view_barcode),
822 gnome_canvas_line_get_type (),
824 "width_units", line->width,
825 "fill_color_rgba", color,
827 view_barcode->private->item_list =
828 g_list_prepend (view_barcode->private->item_list, item);
830 gnome_canvas_points_free (points);
832 for (li = gbc->chars; li != NULL; li = li->next) {
833 bchar = (glBarcodeChar *) li->data;
835 font = gnome_font_find_closest_from_weight_slant (
836 GL_BARCODE_FONT_FAMILY,
837 GL_BARCODE_FONT_WEIGHT,
838 FALSE, bchar->fsize);
839 glyphlist = gnome_glyphlist_from_text_sized_dumb (font,
848 bchar->fsize - gnome_font_get_descender (font);
849 item = gl_view_object_item_new (GL_VIEW_OBJECT(view_barcode),
850 gnome_canvas_hacktext_get_type (),
852 "y", bchar->y + y_offset,
853 "glyphlist", glyphlist,
856 view_barcode->private->item_list =
857 g_list_prepend (view_barcode->private->item_list, item);
864 gl_barcode_free (&gbc);
867 gl_debug (DEBUG_VIEW, "END");