From ea75118a021e733fa7e2281456581dab61d9c811 Mon Sep 17 00:00:00 2001 From: Jim Evins Date: Tue, 25 Dec 2007 06:10:58 +0000 Subject: [PATCH] Creating glabels-2.2 branch. git-svn-id: https://glabels.svn.sourceforge.net/svnroot/glabels/branches/glabels-2_2@713 f5e0f49d-192f-0410-a22d-a8d8700d0965 --- glabels2/AUTHORS | 166 + glabels2/COPYING | 340 ++ glabels2/COPYING-DOCS | 355 ++ glabels2/COPYING-LIBGLABELS | 482 ++ glabels2/COPYING.README_FIRST | 28 + glabels2/ChangeLog | 3891 ++++++++++++ glabels2/INSTALL | 236 + glabels2/MESSAGE-OF-DOOM | 15 + glabels2/Makefile.am | 32 + glabels2/NEWS | 97 + glabels2/README | 44 + glabels2/TODO | 46 + glabels2/autogen.sh | 24 + glabels2/barcode-0.98/COPYING | 339 ++ glabels2/barcode-0.98/ChangeLog | 460 ++ glabels2/barcode-0.98/INSTALL | 31 + glabels2/barcode-0.98/Makefile.am | 73 + glabels2/barcode-0.98/Makefile.in.dist | 141 + glabels2/barcode-0.98/README | 93 + glabels2/barcode-0.98/README.glabels | 7 + glabels2/barcode-0.98/TODO | 23 + glabels2/barcode-0.98/barcode.h | 119 + glabels2/barcode-0.98/barcode.spec | 84 + glabels2/barcode-0.98/bookland/bookland.py | 884 +++ glabels2/barcode-0.98/cmdline.c | 177 + glabels2/barcode-0.98/cmdline.h | 58 + glabels2/barcode-0.98/codabar.c | 182 + glabels2/barcode-0.98/code128.c | 607 ++ glabels2/barcode-0.98/code39.c | 173 + glabels2/barcode-0.98/code93.c | 213 + glabels2/barcode-0.98/compat/getopt.c | 831 +++ glabels2/barcode-0.98/compat/getopt.h | 129 + glabels2/barcode-0.98/configure | 5197 +++++++++++++++++ glabels2/barcode-0.98/configure.in.dist | 65 + .../barcode-0.98/contrib/barcode-SVG.tar.gz | Bin 0 -> 2880 bytes .../contrib/barcode-SVG.tar.gz.README | 24 + .../contrib/barcode-for-delphi.tar.gz | Bin 0 -> 19010 bytes .../contrib/barcode-for-delphi.tar.gz.README | 10 + .../barcode-0.98/contrib/barcodeps-0.1.tgz | Bin 0 -> 2036 bytes .../contrib/barcodeps-0.1.tgz.README | 25 + .../barcode-0.98/contrib/grab-0.0.4.tar.gz | Bin 0 -> 28320 bytes .../contrib/grab-0.0.4.tar.gz.README | 13 + glabels2/barcode-0.98/debian/README.debian | 9 + glabels2/barcode-0.98/debian/changelog | 27 + glabels2/barcode-0.98/debian/control | 14 + glabels2/barcode-0.98/debian/copyright | 8 + glabels2/barcode-0.98/debian/dirs | 3 + glabels2/barcode-0.98/debian/info | 15 + glabels2/barcode-0.98/debian/rules | 50 + glabels2/barcode-0.98/doc/Makefile.in | 135 + glabels2/barcode-0.98/doc/README | 5 + glabels2/barcode-0.98/doc/barcode.info | 747 +++ glabels2/barcode-0.98/doc/barcode.pdf | Bin 0 -> 192464 bytes glabels2/barcode-0.98/doc/barcode.ps | 2378 ++++++++ glabels2/barcode-0.98/doc/barcodedoc.txt | 734 +++ glabels2/barcode-0.98/doc/doc.barcode | 939 +++ glabels2/barcode-0.98/doc/infofilter | 16 + glabels2/barcode-0.98/doc/manpager | 120 + glabels2/barcode-0.98/doc/mktxt | 38 + glabels2/barcode-0.98/doc/texi2html | 2021 +++++++ glabels2/barcode-0.98/ean.c | 774 +++ glabels2/barcode-0.98/i25.c | 164 + glabels2/barcode-0.98/install-sh | 238 + glabels2/barcode-0.98/library.c | 244 + glabels2/barcode-0.98/main.c | 604 ++ glabels2/barcode-0.98/missing | 198 + glabels2/barcode-0.98/mkinstalldirs | 40 + glabels2/barcode-0.98/msi.c | 155 + glabels2/barcode-0.98/pcl.c | 200 + glabels2/barcode-0.98/plessey.c | 164 + glabels2/barcode-0.98/ps.c | 272 + glabels2/barcode-0.98/sample.c | 98 + glabels2/configure.in | 215 + glabels2/data/Makefile.am | 5 + glabels2/data/desktop/Makefile.am | 13 + glabels2/data/desktop/glabels.desktop.in | 11 + glabels2/data/dtd/Makefile.am | 9 + glabels2/data/dtd/glabels-2.2.dtd | 380 ++ glabels2/data/glade/Makefile.am | 18 + .../data/glade/merge-properties-dialog.glade | 375 ++ glabels2/data/glade/new-label-dialog.glade | 158 + glabels2/data/glade/object-editor.glade | 3469 +++++++++++ glabels2/data/glade/prefs-dialog.glade | 1308 +++++ glabels2/data/glade/print-custom-widget.glade | 287 + glabels2/data/glade/property-bar.glade | 375 ++ glabels2/data/glade/template-designer.glade | 3445 +++++++++++ glabels2/data/glade/wdgt-media-select.glade | 352 ++ glabels2/data/glade/wdgt-rotate-label.glade | 62 + glabels2/data/man/Makefile.am | 6 + glabels2/data/man/glabels.1 | 67 + glabels2/data/mime/Makefile.am | 53 + glabels2/data/mime/glabels.applications | 9 + glabels2/data/mime/glabels.keys.in | 9 + glabels2/data/mime/glabels.mime | 2 + glabels2/data/mime/glabels.xml.in | 8 + glabels2/data/pixmaps/Makefile.am | 26 + glabels2/data/pixmaps/ex-1layout.png | Bin 0 -> 1567 bytes glabels2/data/pixmaps/ex-2layouts.png | Bin 0 -> 1610 bytes glabels2/data/pixmaps/ex-cd-size.png | Bin 0 -> 32300 bytes glabels2/data/pixmaps/ex-rect-size.png | Bin 0 -> 4972 bytes glabels2/data/pixmaps/ex-round-size.png | Bin 0 -> 16682 bytes glabels2/data/pixmaps/glabels-about-logo.png | Bin 0 -> 7734 bytes .../pixmaps/glabels-application-x-glabels.png | Bin 0 -> 2573 bytes glabels2/data/pixmaps/glabels-splash.png | Bin 0 -> 110600 bytes glabels2/data/pixmaps/glabels.png | Bin 0 -> 2074 bytes glabels2/data/templates/Makefile.am | 17 + .../data/templates/avery-iso-templates.xml | 278 + .../data/templates/avery-other-templates.xml | 22 + .../data/templates/avery-us-templates.xml | 765 +++ glabels2/data/templates/categories.xml | 13 + .../data/templates/misc-iso-templates.xml | 544 ++ .../data/templates/misc-other-templates.xml | 33 + glabels2/data/templates/misc-us-templates.xml | 212 + glabels2/data/templates/paper-sizes.xml | 37 + .../templates/zweckform-iso-templates.xml | 233 + glabels2/docs/Makefile.am | 3 + glabels2/docs/libglabels/Makefile.am | 69 + .../docs/libglabels/libglabels-decl-list.txt | 166 + glabels2/docs/libglabels/libglabels-docs.sgml | 33 + .../docs/libglabels/libglabels-overrides.txt | 0 .../docs/libglabels/libglabels-sections.txt | 194 + .../libglabels/libglabels-undocumented.txt | 9 + glabels2/docs/libglabels/libglabels.types | 0 glabels2/docs/libglabels/tmpl/category.sgml | 55 + glabels2/docs/libglabels/tmpl/db.sgml | 314 + glabels2/docs/libglabels/tmpl/enums.sgml | 33 + .../libglabels/tmpl/libglabels-unused.sgml | 1519 +++++ glabels2/docs/libglabels/tmpl/libglabels.sgml | 19 + glabels2/docs/libglabels/tmpl/paper.sgml | 59 + glabels2/docs/libglabels/tmpl/str.sgml | 30 + glabels2/docs/libglabels/tmpl/template.sgml | 532 ++ .../docs/libglabels/tmpl/xml-category.sgml | 47 + glabels2/docs/libglabels/tmpl/xml-paper.sgml | 47 + .../docs/libglabels/tmpl/xml-template.sgml | 78 + glabels2/docs/libglabels/tmpl/xml.sgml | 194 + glabels2/glabels.spec.in | 106 + glabels2/gtk-doc.make | 155 + glabels2/help/C/Makefile.am | 9 + .../help/C/figures/glabels-template-cd.png | Bin 0 -> 9930 bytes .../help/C/figures/glabels-template-label.png | Bin 0 -> 3115 bytes .../C/figures/glabels-template-layout.png | Bin 0 -> 6012 bytes glabels2/help/C/figures/main-window-empty.png | Bin 0 -> 24965 bytes glabels2/help/C/figures/merge-ex1-1.png | Bin 0 -> 33290 bytes glabels2/help/C/figures/merge-ex1-2.png | Bin 0 -> 65785 bytes glabels2/help/C/figures/merge-ex1-3.png | Bin 0 -> 25588 bytes glabels2/help/C/figures/merge-ex1-4.png | Bin 0 -> 42154 bytes glabels2/help/C/figures/merge-ex2-1.png | Bin 0 -> 32534 bytes glabels2/help/C/figures/merge-ex2-2.png | Bin 0 -> 54708 bytes glabels2/help/C/figures/merge-ex2-3.png | Bin 0 -> 24091 bytes glabels2/help/C/figures/merge-ex2-4.png | Bin 0 -> 35276 bytes .../help/C/figures/object-editor-sidebar.png | Bin 0 -> 33661 bytes glabels2/help/C/figures/print-copies.png | Bin 0 -> 6642 bytes glabels2/help/C/figures/print-merge.png | Bin 0 -> 7866 bytes glabels2/help/C/glabels-C.omf | 22 + glabels2/help/C/glabels.xml | 2136 +++++++ glabels2/help/C/legal.xml | 76 + glabels2/help/Makefile.am | 3 + glabels2/iec16022-0.2.1/BUGS | 6 + glabels2/iec16022-0.2.1/CHANGELOG | 26 + glabels2/iec16022-0.2.1/CREDITS | 10 + glabels2/iec16022-0.2.1/INSTALL | 8 + glabels2/iec16022-0.2.1/LICENSE | 340 ++ glabels2/iec16022-0.2.1/Makefile.am | 35 + glabels2/iec16022-0.2.1/Makefile.dist | 40 + glabels2/iec16022-0.2.1/README | 13 + glabels2/iec16022-0.2.1/README.glabels | 6 + glabels2/iec16022-0.2.1/TODO | 9 + glabels2/iec16022-0.2.1/iec16022.1 | 52 + glabels2/iec16022-0.2.1/iec16022.c | 462 ++ glabels2/iec16022-0.2.1/iec16022ecc200.c | 963 +++ glabels2/iec16022-0.2.1/iec16022ecc200.h | 47 + glabels2/iec16022-0.2.1/image.c | 668 +++ glabels2/iec16022-0.2.1/image.h | 49 + glabels2/iec16022-0.2.1/reedsol.c | 172 + glabels2/iec16022-0.2.1/reedsol.h | 29 + .../iec16022-0.2.1/test/testsuite-example.bin | 1 + .../iec16022-0.2.1/test/testsuite-example.eps | 15 + .../iec16022-0.2.1/test/testsuite-example.hex | 2 + .../iec16022-0.2.1/test/testsuite-example.png | Bin 0 -> 412 bytes .../test/testsuite-example.text | 32 + glabels2/iec16022-0.2.1/test/testsuite.sh | 19 + glabels2/libglabels/Makefile.am | 58 + glabels2/libglabels/category.c | 129 + glabels2/libglabels/category.h | 59 + glabels2/libglabels/db.c | 1616 +++++ glabels2/libglabels/db.h | 148 + glabels2/libglabels/enums.h | 49 + glabels2/libglabels/libglabels-private.h | 46 + glabels2/libglabels/libglabels.h | 40 + glabels2/libglabels/libglabels.pc.in | 12 + glabels2/libglabels/paper.c | 136 + glabels2/libglabels/paper.h | 63 + glabels2/libglabels/str.c | 84 + glabels2/libglabels/str.h | 41 + glabels2/libglabels/template.c | 1121 ++++ glabels2/libglabels/template.h | 380 ++ glabels2/libglabels/xml-category.c | 169 + glabels2/libglabels/xml-category.h | 46 + glabels2/libglabels/xml-paper.c | 173 + glabels2/libglabels/xml-paper.h | 46 + glabels2/libglabels/xml-template.c | 970 +++ glabels2/libglabels/xml-template.h | 55 + glabels2/libglabels/xml.c | 539 ++ glabels2/libglabels/xml.h | 113 + glabels2/po/ChangeLog | 0 glabels2/po/POTFILES.in | 174 + glabels2/po/cs.po | 2484 ++++++++ glabels2/po/de.po | 2659 +++++++++ glabels2/po/eo.po | 2438 ++++++++ glabels2/po/es.po | 2565 ++++++++ glabels2/po/fr.po | 3311 +++++++++++ glabels2/po/it.po | 2427 ++++++++ glabels2/po/ja.po | 2457 ++++++++ glabels2/po/pl.po | 2650 +++++++++ glabels2/po/pt_BR.po | 2624 +++++++++ glabels2/po/ru.po | 2459 ++++++++ glabels2/po/zh_TW.Big5.po | 2650 +++++++++ glabels2/src/Makefile.am | 289 + glabels2/src/base64.c | 204 + glabels2/src/base64.h | 45 + glabels2/src/bc-gnubarcode.c | 459 ++ glabels2/src/bc-gnubarcode.h | 40 + glabels2/src/bc-iec16022.c | 151 + glabels2/src/bc-iec16022.h | 40 + glabels2/src/bc-postnet.c | 222 + glabels2/src/bc-postnet.h | 40 + glabels2/src/bc.c | 386 ++ glabels2/src/bc.h | 90 + glabels2/src/cairo-ellipse-path.c | 79 + glabels2/src/cairo-ellipse-path.h | 40 + glabels2/src/cairo-label-path.c | 263 + glabels2/src/cairo-label-path.h | 40 + glabels2/src/cairo-markup-path.c | 315 + glabels2/src/cairo-markup-path.h | 40 + glabels2/src/color.c | 243 + glabels2/src/color.h | 119 + glabels2/src/critical-error-handler.c | 83 + glabels2/src/critical-error-handler.h | 36 + glabels2/src/debug.c | 129 + glabels2/src/debug.h | 110 + glabels2/src/file.c | 844 +++ glabels2/src/file.h | 65 + glabels2/src/glabels-batch.c | 171 + glabels2/src/glabels.c | 218 + glabels2/src/hig.h | 35 + glabels2/src/label-barcode.c | 472 ++ glabels2/src/label-barcode.h | 78 + glabels2/src/label-box.c | 402 ++ glabels2/src/label-box.h | 61 + glabels2/src/label-ellipse.c | 407 ++ glabels2/src/label-ellipse.h | 61 + glabels2/src/label-image.c | 326 ++ glabels2/src/label-image.h | 71 + glabels2/src/label-line.c | 323 + glabels2/src/label-line.h | 62 + glabels2/src/label-object.c | 1525 +++++ glabels2/src/label-object.h | 345 ++ glabels2/src/label-text.c | 1098 ++++ glabels2/src/label-text.h | 74 + glabels2/src/label.c | 674 +++ glabels2/src/label.h | 154 + glabels2/src/marshal.list | 7 + glabels2/src/merge-evolution.c | 509 ++ glabels2/src/merge-evolution.h | 70 + glabels2/src/merge-init.c | 94 + glabels2/src/merge-init.h | 35 + glabels2/src/merge-properties-dialog.c | 659 +++ glabels2/src/merge-properties-dialog.h | 66 + glabels2/src/merge-text.c | 694 +++ glabels2/src/merge-text.h | 68 + glabels2/src/merge-vcard.c | 383 ++ glabels2/src/merge-vcard.h | 70 + glabels2/src/merge.c | 791 +++ glabels2/src/merge.h | 130 + glabels2/src/mini-preview-pixbuf-cache.c | 149 + glabels2/src/mini-preview-pixbuf-cache.h | 42 + glabels2/src/mini-preview-pixbuf.c | 225 + glabels2/src/mini-preview-pixbuf.h | 40 + glabels2/src/mygal/Makefile.am | 41 + glabels2/src/mygal/color-group.c | 333 ++ glabels2/src/mygal/color-group.h | 77 + glabels2/src/mygal/color-palette.c | 661 +++ glabels2/src/mygal/color-palette.h | 113 + glabels2/src/mygal/e-colors.c | 106 + glabels2/src/mygal/e-colors.h | 47 + glabels2/src/mygal/e-marshal.list | 51 + glabels2/src/mygal/e-util.h | 234 + glabels2/src/mygal/mygal-combo-box.c | 837 +++ glabels2/src/mygal/mygal-combo-box.h | 94 + glabels2/src/mygal/widget-color-combo.c | 335 ++ glabels2/src/mygal/widget-color-combo.h | 86 + glabels2/src/new-label-dialog.c | 289 + glabels2/src/new-label-dialog.h | 84 + glabels2/src/object-editor-bc-page.c | 426 ++ glabels2/src/object-editor-data-page.c | 232 + glabels2/src/object-editor-edit-page.c | 133 + glabels2/src/object-editor-fill-page.c | 224 + glabels2/src/object-editor-image-page.c | 350 ++ glabels2/src/object-editor-line-page.c | 271 + glabels2/src/object-editor-lsize-page.c | 254 + glabels2/src/object-editor-position-page.c | 253 + glabels2/src/object-editor-private.h | 202 + glabels2/src/object-editor-shadow-page.c | 489 ++ glabels2/src/object-editor-size-page.c | 445 ++ glabels2/src/object-editor-text-page.c | 629 ++ glabels2/src/object-editor.c | 650 +++ glabels2/src/object-editor.h | 300 + glabels2/src/pixbuf-cache.c | 254 + glabels2/src/pixbuf-cache.h | 53 + glabels2/src/pixmaps/Makefile.am | 18 + glabels2/src/pixmaps/checkerboard.xpm | 29 + glabels2/src/pixmaps/collate.xpm | 34 + glabels2/src/pixmaps/cursor_barcode.xbm | 16 + glabels2/src/pixmaps/cursor_barcode_mask.xbm | 16 + glabels2/src/pixmaps/cursor_box.xbm | 16 + glabels2/src/pixmaps/cursor_box_mask.xbm | 16 + glabels2/src/pixmaps/cursor_ellipse.xbm | 16 + glabels2/src/pixmaps/cursor_ellipse_mask.xbm | 16 + glabels2/src/pixmaps/cursor_image.xbm | 16 + glabels2/src/pixmaps/cursor_image_mask.xbm | 16 + glabels2/src/pixmaps/cursor_line.xbm | 16 + glabels2/src/pixmaps/cursor_line_mask.xbm | 16 + glabels2/src/pixmaps/cursor_text.xbm | 16 + glabels2/src/pixmaps/cursor_text_mask.xbm | 16 + glabels2/src/pixmaps/nocollate.xpm | 34 + glabels2/src/prefs-dialog.c | 694 +++ glabels2/src/prefs-dialog.h | 65 + glabels2/src/prefs-model.c | 733 +++ glabels2/src/prefs-model.h | 124 + glabels2/src/prefs.c | 214 + glabels2/src/prefs.h | 56 + glabels2/src/print-op.c | 629 ++ glabels2/src/print-op.h | 88 + glabels2/src/print.c | 567 ++ glabels2/src/print.h | 70 + glabels2/src/recent.c | 155 + glabels2/src/recent.h | 45 + glabels2/src/stock-pixmaps/Makefile.am | 95 + .../stock-pixmaps/stock_align_bottom_16.png | Bin 0 -> 204 bytes .../stock-pixmaps/stock_align_hcenter_16.png | Bin 0 -> 212 bytes .../src/stock-pixmaps/stock_align_left_16.png | Bin 0 -> 207 bytes .../stock-pixmaps/stock_align_right_16.png | Bin 0 -> 219 bytes .../src/stock-pixmaps/stock_align_top_16.png | Bin 0 -> 209 bytes .../stock-pixmaps/stock_align_vcenter_16.png | Bin 0 -> 230 bytes glabels2/src/stock-pixmaps/stock_arrow_16.png | Bin 0 -> 234 bytes glabels2/src/stock-pixmaps/stock_arrow_24.png | Bin 0 -> 367 bytes .../src/stock-pixmaps/stock_barcode_16.png | Bin 0 -> 293 bytes .../src/stock-pixmaps/stock_barcode_24.png | Bin 0 -> 241 bytes glabels2/src/stock-pixmaps/stock_box_16.png | Bin 0 -> 199 bytes glabels2/src/stock-pixmaps/stock_box_24.png | Bin 0 -> 320 bytes .../stock-pixmaps/stock_bucket_fill_16.png | Bin 0 -> 521 bytes .../stock-pixmaps/stock_bucket_fill_24.png | Bin 0 -> 589 bytes .../stock-pixmaps/stock_center_horiz_16.png | Bin 0 -> 202 bytes .../stock-pixmaps/stock_center_vert_16.png | Bin 0 -> 206 bytes .../src/stock-pixmaps/stock_ellipse_16.png | Bin 0 -> 376 bytes .../src/stock-pixmaps/stock_ellipse_24.png | Bin 0 -> 744 bytes .../src/stock-pixmaps/stock_flip_horiz_16.png | Bin 0 -> 183 bytes .../src/stock-pixmaps/stock_flip_vert_16.png | Bin 0 -> 194 bytes .../src/stock-pixmaps/stock_hchain_24.png | Bin 0 -> 302 bytes .../stock-pixmaps/stock_hchain_broken_24.png | Bin 0 -> 325 bytes glabels2/src/stock-pixmaps/stock_image_16.png | Bin 0 -> 485 bytes glabels2/src/stock-pixmaps/stock_image_24.png | Bin 0 -> 704 bytes glabels2/src/stock-pixmaps/stock_line_16.png | Bin 0 -> 252 bytes glabels2/src/stock-pixmaps/stock_line_24.png | Bin 0 -> 325 bytes glabels2/src/stock-pixmaps/stock_merge_16.png | Bin 0 -> 459 bytes glabels2/src/stock-pixmaps/stock_merge_24.png | Bin 0 -> 758 bytes .../stock-pixmaps/stock_order_bottom_16.png | Bin 0 -> 200 bytes .../src/stock-pixmaps/stock_order_top_16.png | Bin 0 -> 194 bytes .../src/stock-pixmaps/stock_pencil_16.png | Bin 0 -> 489 bytes .../src/stock-pixmaps/stock_pencil_24.png | Bin 0 -> 618 bytes .../src/stock-pixmaps/stock_properties_16.png | Bin 0 -> 395 bytes .../src/stock-pixmaps/stock_properties_24.png | Bin 0 -> 484 bytes .../stock-pixmaps/stock_rotate_left_16.png | Bin 0 -> 243 bytes .../stock-pixmaps/stock_rotate_right_16.png | Bin 0 -> 241 bytes glabels2/src/stock-pixmaps/stock_text_16.png | Bin 0 -> 160 bytes glabels2/src/stock-pixmaps/stock_text_24.png | Bin 0 -> 285 bytes .../src/stock-pixmaps/stock_vchain_24.png | Bin 0 -> 326 bytes .../stock-pixmaps/stock_vchain_broken_24.png | Bin 0 -> 333 bytes glabels2/src/stock.c | 221 + glabels2/src/stock.h | 68 + glabels2/src/template-designer.c | 1758 ++++++ glabels2/src/template-designer.h | 73 + glabels2/src/text-node.c | 356 ++ glabels2/src/text-node.h | 58 + glabels2/src/ui-commands.c | 1168 ++++ glabels2/src/ui-commands.h | 203 + glabels2/src/ui-property-bar.c | 1335 +++++ glabels2/src/ui-property-bar.h | 74 + glabels2/src/ui-sidebar.c | 216 + glabels2/src/ui-sidebar.h | 69 + glabels2/src/ui-util.c | 126 + glabels2/src/ui-util.h | 45 + glabels2/src/ui.c | 1178 ++++ glabels2/src/ui.h | 57 + glabels2/src/util.c | 355 ++ glabels2/src/util.h | 58 + glabels2/src/view-barcode.c | 455 ++ glabels2/src/view-barcode.h | 81 + glabels2/src/view-box.c | 519 ++ glabels2/src/view-box.h | 81 + glabels2/src/view-ellipse.c | 519 ++ glabels2/src/view-ellipse.h | 81 + glabels2/src/view-image.c | 447 ++ glabels2/src/view-image.h | 81 + glabels2/src/view-line.c | 488 ++ glabels2/src/view-line.h | 81 + glabels2/src/view-object.c | 764 +++ glabels2/src/view-object.h | 137 + glabels2/src/view-text.c | 564 ++ glabels2/src/view-text.h | 81 + glabels2/src/view.c | 3658 ++++++++++++ glabels2/src/view.h | 357 ++ glabels2/src/warning-handler.c | 81 + glabels2/src/warning-handler.h | 36 + glabels2/src/wdgt-chain-button.c | 324 + glabels2/src/wdgt-chain-button.h | 98 + glabels2/src/wdgt-media-select.c | 878 +++ glabels2/src/wdgt-media-select.h | 78 + glabels2/src/wdgt-mini-preview.c | 724 +++ glabels2/src/wdgt-mini-preview.h | 83 + glabels2/src/wdgt-print-copies.c | 368 ++ glabels2/src/wdgt-print-copies.h | 81 + glabels2/src/wdgt-print-merge.c | 317 + glabels2/src/wdgt-print-merge.h | 82 + glabels2/src/wdgt-rotate-label.c | 395 ++ glabels2/src/wdgt-rotate-label.h | 74 + glabels2/src/window.c | 616 ++ glabels2/src/window.h | 101 + glabels2/src/xml-label-04.c | 504 ++ glabels2/src/xml-label-04.h | 40 + glabels2/src/xml-label.c | 1795 ++++++ glabels2/src/xml-label.h | 55 + 432 files changed, 132741 insertions(+) create mode 100644 glabels2/AUTHORS create mode 100644 glabels2/COPYING create mode 100644 glabels2/COPYING-DOCS create mode 100644 glabels2/COPYING-LIBGLABELS create mode 100644 glabels2/COPYING.README_FIRST create mode 100644 glabels2/ChangeLog create mode 100644 glabels2/INSTALL create mode 100644 glabels2/MESSAGE-OF-DOOM create mode 100644 glabels2/Makefile.am create mode 100644 glabels2/NEWS create mode 100644 glabels2/README create mode 100644 glabels2/TODO create mode 100755 glabels2/autogen.sh create mode 100644 glabels2/barcode-0.98/COPYING create mode 100644 glabels2/barcode-0.98/ChangeLog create mode 100644 glabels2/barcode-0.98/INSTALL create mode 100644 glabels2/barcode-0.98/Makefile.am create mode 100644 glabels2/barcode-0.98/Makefile.in.dist create mode 100644 glabels2/barcode-0.98/README create mode 100644 glabels2/barcode-0.98/README.glabels create mode 100644 glabels2/barcode-0.98/TODO create mode 100644 glabels2/barcode-0.98/barcode.h create mode 100644 glabels2/barcode-0.98/barcode.spec create mode 100644 glabels2/barcode-0.98/bookland/bookland.py create mode 100644 glabels2/barcode-0.98/cmdline.c create mode 100644 glabels2/barcode-0.98/cmdline.h create mode 100644 glabels2/barcode-0.98/codabar.c create mode 100644 glabels2/barcode-0.98/code128.c create mode 100644 glabels2/barcode-0.98/code39.c create mode 100644 glabels2/barcode-0.98/code93.c create mode 100644 glabels2/barcode-0.98/compat/getopt.c create mode 100644 glabels2/barcode-0.98/compat/getopt.h create mode 100755 glabels2/barcode-0.98/configure create mode 100644 glabels2/barcode-0.98/configure.in.dist create mode 100644 glabels2/barcode-0.98/contrib/barcode-SVG.tar.gz create mode 100644 glabels2/barcode-0.98/contrib/barcode-SVG.tar.gz.README create mode 100644 glabels2/barcode-0.98/contrib/barcode-for-delphi.tar.gz create mode 100644 glabels2/barcode-0.98/contrib/barcode-for-delphi.tar.gz.README create mode 100644 glabels2/barcode-0.98/contrib/barcodeps-0.1.tgz create mode 100644 glabels2/barcode-0.98/contrib/barcodeps-0.1.tgz.README create mode 100644 glabels2/barcode-0.98/contrib/grab-0.0.4.tar.gz create mode 100644 glabels2/barcode-0.98/contrib/grab-0.0.4.tar.gz.README create mode 100644 glabels2/barcode-0.98/debian/README.debian create mode 100644 glabels2/barcode-0.98/debian/changelog create mode 100644 glabels2/barcode-0.98/debian/control create mode 100644 glabels2/barcode-0.98/debian/copyright create mode 100644 glabels2/barcode-0.98/debian/dirs create mode 100644 glabels2/barcode-0.98/debian/info create mode 100755 glabels2/barcode-0.98/debian/rules create mode 100644 glabels2/barcode-0.98/doc/Makefile.in create mode 100644 glabels2/barcode-0.98/doc/README create mode 100644 glabels2/barcode-0.98/doc/barcode.info create mode 100644 glabels2/barcode-0.98/doc/barcode.pdf create mode 100644 glabels2/barcode-0.98/doc/barcode.ps create mode 100644 glabels2/barcode-0.98/doc/barcodedoc.txt create mode 100644 glabels2/barcode-0.98/doc/doc.barcode create mode 100755 glabels2/barcode-0.98/doc/infofilter create mode 100755 glabels2/barcode-0.98/doc/manpager create mode 100755 glabels2/barcode-0.98/doc/mktxt create mode 100755 glabels2/barcode-0.98/doc/texi2html create mode 100644 glabels2/barcode-0.98/ean.c create mode 100644 glabels2/barcode-0.98/i25.c create mode 100644 glabels2/barcode-0.98/install-sh create mode 100644 glabels2/barcode-0.98/library.c create mode 100644 glabels2/barcode-0.98/main.c create mode 100755 glabels2/barcode-0.98/missing create mode 100755 glabels2/barcode-0.98/mkinstalldirs create mode 100644 glabels2/barcode-0.98/msi.c create mode 100644 glabels2/barcode-0.98/pcl.c create mode 100644 glabels2/barcode-0.98/plessey.c create mode 100644 glabels2/barcode-0.98/ps.c create mode 100644 glabels2/barcode-0.98/sample.c create mode 100644 glabels2/configure.in create mode 100644 glabels2/data/Makefile.am create mode 100644 glabels2/data/desktop/Makefile.am create mode 100644 glabels2/data/desktop/glabels.desktop.in create mode 100644 glabels2/data/dtd/Makefile.am create mode 100644 glabels2/data/dtd/glabels-2.2.dtd create mode 100644 glabels2/data/glade/Makefile.am create mode 100644 glabels2/data/glade/merge-properties-dialog.glade create mode 100644 glabels2/data/glade/new-label-dialog.glade create mode 100644 glabels2/data/glade/object-editor.glade create mode 100644 glabels2/data/glade/prefs-dialog.glade create mode 100644 glabels2/data/glade/print-custom-widget.glade create mode 100644 glabels2/data/glade/property-bar.glade create mode 100644 glabels2/data/glade/template-designer.glade create mode 100644 glabels2/data/glade/wdgt-media-select.glade create mode 100644 glabels2/data/glade/wdgt-rotate-label.glade create mode 100644 glabels2/data/man/Makefile.am create mode 100644 glabels2/data/man/glabels.1 create mode 100644 glabels2/data/mime/Makefile.am create mode 100644 glabels2/data/mime/glabels.applications create mode 100644 glabels2/data/mime/glabels.keys.in create mode 100644 glabels2/data/mime/glabels.mime create mode 100644 glabels2/data/mime/glabels.xml.in create mode 100644 glabels2/data/pixmaps/Makefile.am create mode 100644 glabels2/data/pixmaps/ex-1layout.png create mode 100644 glabels2/data/pixmaps/ex-2layouts.png create mode 100644 glabels2/data/pixmaps/ex-cd-size.png create mode 100644 glabels2/data/pixmaps/ex-rect-size.png create mode 100644 glabels2/data/pixmaps/ex-round-size.png create mode 100644 glabels2/data/pixmaps/glabels-about-logo.png create mode 100644 glabels2/data/pixmaps/glabels-application-x-glabels.png create mode 100644 glabels2/data/pixmaps/glabels-splash.png create mode 100644 glabels2/data/pixmaps/glabels.png create mode 100644 glabels2/data/templates/Makefile.am create mode 100644 glabels2/data/templates/avery-iso-templates.xml create mode 100644 glabels2/data/templates/avery-other-templates.xml create mode 100644 glabels2/data/templates/avery-us-templates.xml create mode 100644 glabels2/data/templates/categories.xml create mode 100644 glabels2/data/templates/misc-iso-templates.xml create mode 100644 glabels2/data/templates/misc-other-templates.xml create mode 100644 glabels2/data/templates/misc-us-templates.xml create mode 100644 glabels2/data/templates/paper-sizes.xml create mode 100644 glabels2/data/templates/zweckform-iso-templates.xml create mode 100644 glabels2/docs/Makefile.am create mode 100644 glabels2/docs/libglabels/Makefile.am create mode 100644 glabels2/docs/libglabels/libglabels-decl-list.txt create mode 100644 glabels2/docs/libglabels/libglabels-docs.sgml create mode 100644 glabels2/docs/libglabels/libglabels-overrides.txt create mode 100644 glabels2/docs/libglabels/libglabels-sections.txt create mode 100644 glabels2/docs/libglabels/libglabels-undocumented.txt create mode 100644 glabels2/docs/libglabels/libglabels.types create mode 100644 glabels2/docs/libglabels/tmpl/category.sgml create mode 100644 glabels2/docs/libglabels/tmpl/db.sgml create mode 100644 glabels2/docs/libglabels/tmpl/enums.sgml create mode 100644 glabels2/docs/libglabels/tmpl/libglabels-unused.sgml create mode 100644 glabels2/docs/libglabels/tmpl/libglabels.sgml create mode 100644 glabels2/docs/libglabels/tmpl/paper.sgml create mode 100644 glabels2/docs/libglabels/tmpl/str.sgml create mode 100644 glabels2/docs/libglabels/tmpl/template.sgml create mode 100644 glabels2/docs/libglabels/tmpl/xml-category.sgml create mode 100644 glabels2/docs/libglabels/tmpl/xml-paper.sgml create mode 100644 glabels2/docs/libglabels/tmpl/xml-template.sgml create mode 100644 glabels2/docs/libglabels/tmpl/xml.sgml create mode 100644 glabels2/glabels.spec.in create mode 100644 glabels2/gtk-doc.make create mode 100644 glabels2/help/C/Makefile.am create mode 100644 glabels2/help/C/figures/glabels-template-cd.png create mode 100644 glabels2/help/C/figures/glabels-template-label.png create mode 100644 glabels2/help/C/figures/glabels-template-layout.png create mode 100644 glabels2/help/C/figures/main-window-empty.png create mode 100644 glabels2/help/C/figures/merge-ex1-1.png create mode 100644 glabels2/help/C/figures/merge-ex1-2.png create mode 100644 glabels2/help/C/figures/merge-ex1-3.png create mode 100644 glabels2/help/C/figures/merge-ex1-4.png create mode 100644 glabels2/help/C/figures/merge-ex2-1.png create mode 100644 glabels2/help/C/figures/merge-ex2-2.png create mode 100644 glabels2/help/C/figures/merge-ex2-3.png create mode 100644 glabels2/help/C/figures/merge-ex2-4.png create mode 100644 glabels2/help/C/figures/object-editor-sidebar.png create mode 100644 glabels2/help/C/figures/print-copies.png create mode 100644 glabels2/help/C/figures/print-merge.png create mode 100644 glabels2/help/C/glabels-C.omf create mode 100644 glabels2/help/C/glabels.xml create mode 100644 glabels2/help/C/legal.xml create mode 100644 glabels2/help/Makefile.am create mode 100644 glabels2/iec16022-0.2.1/BUGS create mode 100644 glabels2/iec16022-0.2.1/CHANGELOG create mode 100644 glabels2/iec16022-0.2.1/CREDITS create mode 100644 glabels2/iec16022-0.2.1/INSTALL create mode 100644 glabels2/iec16022-0.2.1/LICENSE create mode 100644 glabels2/iec16022-0.2.1/Makefile.am create mode 100644 glabels2/iec16022-0.2.1/Makefile.dist create mode 100644 glabels2/iec16022-0.2.1/README create mode 100644 glabels2/iec16022-0.2.1/README.glabels create mode 100644 glabels2/iec16022-0.2.1/TODO create mode 100644 glabels2/iec16022-0.2.1/iec16022.1 create mode 100644 glabels2/iec16022-0.2.1/iec16022.c create mode 100644 glabels2/iec16022-0.2.1/iec16022ecc200.c create mode 100644 glabels2/iec16022-0.2.1/iec16022ecc200.h create mode 100644 glabels2/iec16022-0.2.1/image.c create mode 100644 glabels2/iec16022-0.2.1/image.h create mode 100644 glabels2/iec16022-0.2.1/reedsol.c create mode 100644 glabels2/iec16022-0.2.1/reedsol.h create mode 100644 glabels2/iec16022-0.2.1/test/testsuite-example.bin create mode 100644 glabels2/iec16022-0.2.1/test/testsuite-example.eps create mode 100644 glabels2/iec16022-0.2.1/test/testsuite-example.hex create mode 100644 glabels2/iec16022-0.2.1/test/testsuite-example.png create mode 100644 glabels2/iec16022-0.2.1/test/testsuite-example.text create mode 100755 glabels2/iec16022-0.2.1/test/testsuite.sh create mode 100644 glabels2/libglabels/Makefile.am create mode 100644 glabels2/libglabels/category.c create mode 100644 glabels2/libglabels/category.h create mode 100644 glabels2/libglabels/db.c create mode 100644 glabels2/libglabels/db.h create mode 100644 glabels2/libglabels/enums.h create mode 100644 glabels2/libglabels/libglabels-private.h create mode 100644 glabels2/libglabels/libglabels.h create mode 100644 glabels2/libglabels/libglabels.pc.in create mode 100644 glabels2/libglabels/paper.c create mode 100644 glabels2/libglabels/paper.h create mode 100644 glabels2/libglabels/str.c create mode 100644 glabels2/libglabels/str.h create mode 100644 glabels2/libglabels/template.c create mode 100644 glabels2/libglabels/template.h create mode 100644 glabels2/libglabels/xml-category.c create mode 100644 glabels2/libglabels/xml-category.h create mode 100644 glabels2/libglabels/xml-paper.c create mode 100644 glabels2/libglabels/xml-paper.h create mode 100644 glabels2/libglabels/xml-template.c create mode 100644 glabels2/libglabels/xml-template.h create mode 100644 glabels2/libglabels/xml.c create mode 100644 glabels2/libglabels/xml.h create mode 100644 glabels2/po/ChangeLog create mode 100644 glabels2/po/POTFILES.in create mode 100644 glabels2/po/cs.po create mode 100644 glabels2/po/de.po create mode 100644 glabels2/po/eo.po create mode 100644 glabels2/po/es.po create mode 100644 glabels2/po/fr.po create mode 100644 glabels2/po/it.po create mode 100644 glabels2/po/ja.po create mode 100644 glabels2/po/pl.po create mode 100644 glabels2/po/pt_BR.po create mode 100644 glabels2/po/ru.po create mode 100644 glabels2/po/zh_TW.Big5.po create mode 100644 glabels2/src/Makefile.am create mode 100644 glabels2/src/base64.c create mode 100644 glabels2/src/base64.h create mode 100644 glabels2/src/bc-gnubarcode.c create mode 100644 glabels2/src/bc-gnubarcode.h create mode 100644 glabels2/src/bc-iec16022.c create mode 100644 glabels2/src/bc-iec16022.h create mode 100644 glabels2/src/bc-postnet.c create mode 100644 glabels2/src/bc-postnet.h create mode 100644 glabels2/src/bc.c create mode 100644 glabels2/src/bc.h create mode 100644 glabels2/src/cairo-ellipse-path.c create mode 100644 glabels2/src/cairo-ellipse-path.h create mode 100644 glabels2/src/cairo-label-path.c create mode 100644 glabels2/src/cairo-label-path.h create mode 100644 glabels2/src/cairo-markup-path.c create mode 100644 glabels2/src/cairo-markup-path.h create mode 100644 glabels2/src/color.c create mode 100644 glabels2/src/color.h create mode 100644 glabels2/src/critical-error-handler.c create mode 100644 glabels2/src/critical-error-handler.h create mode 100644 glabels2/src/debug.c create mode 100644 glabels2/src/debug.h create mode 100644 glabels2/src/file.c create mode 100644 glabels2/src/file.h create mode 100644 glabels2/src/glabels-batch.c create mode 100644 glabels2/src/glabels.c create mode 100644 glabels2/src/hig.h create mode 100644 glabels2/src/label-barcode.c create mode 100644 glabels2/src/label-barcode.h create mode 100644 glabels2/src/label-box.c create mode 100644 glabels2/src/label-box.h create mode 100644 glabels2/src/label-ellipse.c create mode 100644 glabels2/src/label-ellipse.h create mode 100644 glabels2/src/label-image.c create mode 100644 glabels2/src/label-image.h create mode 100644 glabels2/src/label-line.c create mode 100644 glabels2/src/label-line.h create mode 100644 glabels2/src/label-object.c create mode 100644 glabels2/src/label-object.h create mode 100644 glabels2/src/label-text.c create mode 100644 glabels2/src/label-text.h create mode 100644 glabels2/src/label.c create mode 100644 glabels2/src/label.h create mode 100644 glabels2/src/marshal.list create mode 100644 glabels2/src/merge-evolution.c create mode 100644 glabels2/src/merge-evolution.h create mode 100644 glabels2/src/merge-init.c create mode 100644 glabels2/src/merge-init.h create mode 100644 glabels2/src/merge-properties-dialog.c create mode 100644 glabels2/src/merge-properties-dialog.h create mode 100644 glabels2/src/merge-text.c create mode 100644 glabels2/src/merge-text.h create mode 100644 glabels2/src/merge-vcard.c create mode 100644 glabels2/src/merge-vcard.h create mode 100644 glabels2/src/merge.c create mode 100644 glabels2/src/merge.h create mode 100644 glabels2/src/mini-preview-pixbuf-cache.c create mode 100644 glabels2/src/mini-preview-pixbuf-cache.h create mode 100644 glabels2/src/mini-preview-pixbuf.c create mode 100644 glabels2/src/mini-preview-pixbuf.h create mode 100644 glabels2/src/mygal/Makefile.am create mode 100644 glabels2/src/mygal/color-group.c create mode 100644 glabels2/src/mygal/color-group.h create mode 100644 glabels2/src/mygal/color-palette.c create mode 100644 glabels2/src/mygal/color-palette.h create mode 100644 glabels2/src/mygal/e-colors.c create mode 100644 glabels2/src/mygal/e-colors.h create mode 100644 glabels2/src/mygal/e-marshal.list create mode 100644 glabels2/src/mygal/e-util.h create mode 100644 glabels2/src/mygal/mygal-combo-box.c create mode 100644 glabels2/src/mygal/mygal-combo-box.h create mode 100644 glabels2/src/mygal/widget-color-combo.c create mode 100644 glabels2/src/mygal/widget-color-combo.h create mode 100644 glabels2/src/new-label-dialog.c create mode 100644 glabels2/src/new-label-dialog.h create mode 100644 glabels2/src/object-editor-bc-page.c create mode 100644 glabels2/src/object-editor-data-page.c create mode 100644 glabels2/src/object-editor-edit-page.c create mode 100644 glabels2/src/object-editor-fill-page.c create mode 100644 glabels2/src/object-editor-image-page.c create mode 100644 glabels2/src/object-editor-line-page.c create mode 100644 glabels2/src/object-editor-lsize-page.c create mode 100644 glabels2/src/object-editor-position-page.c create mode 100644 glabels2/src/object-editor-private.h create mode 100644 glabels2/src/object-editor-shadow-page.c create mode 100644 glabels2/src/object-editor-size-page.c create mode 100644 glabels2/src/object-editor-text-page.c create mode 100644 glabels2/src/object-editor.c create mode 100644 glabels2/src/object-editor.h create mode 100644 glabels2/src/pixbuf-cache.c create mode 100644 glabels2/src/pixbuf-cache.h create mode 100644 glabels2/src/pixmaps/Makefile.am create mode 100644 glabels2/src/pixmaps/checkerboard.xpm create mode 100644 glabels2/src/pixmaps/collate.xpm create mode 100644 glabels2/src/pixmaps/cursor_barcode.xbm create mode 100644 glabels2/src/pixmaps/cursor_barcode_mask.xbm create mode 100644 glabels2/src/pixmaps/cursor_box.xbm create mode 100644 glabels2/src/pixmaps/cursor_box_mask.xbm create mode 100644 glabels2/src/pixmaps/cursor_ellipse.xbm create mode 100644 glabels2/src/pixmaps/cursor_ellipse_mask.xbm create mode 100644 glabels2/src/pixmaps/cursor_image.xbm create mode 100644 glabels2/src/pixmaps/cursor_image_mask.xbm create mode 100644 glabels2/src/pixmaps/cursor_line.xbm create mode 100644 glabels2/src/pixmaps/cursor_line_mask.xbm create mode 100644 glabels2/src/pixmaps/cursor_text.xbm create mode 100644 glabels2/src/pixmaps/cursor_text_mask.xbm create mode 100644 glabels2/src/pixmaps/nocollate.xpm create mode 100644 glabels2/src/prefs-dialog.c create mode 100644 glabels2/src/prefs-dialog.h create mode 100644 glabels2/src/prefs-model.c create mode 100644 glabels2/src/prefs-model.h create mode 100644 glabels2/src/prefs.c create mode 100644 glabels2/src/prefs.h create mode 100644 glabels2/src/print-op.c create mode 100644 glabels2/src/print-op.h create mode 100644 glabels2/src/print.c create mode 100644 glabels2/src/print.h create mode 100644 glabels2/src/recent.c create mode 100644 glabels2/src/recent.h create mode 100644 glabels2/src/stock-pixmaps/Makefile.am create mode 100644 glabels2/src/stock-pixmaps/stock_align_bottom_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_align_hcenter_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_align_left_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_align_right_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_align_top_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_align_vcenter_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_arrow_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_arrow_24.png create mode 100644 glabels2/src/stock-pixmaps/stock_barcode_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_barcode_24.png create mode 100644 glabels2/src/stock-pixmaps/stock_box_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_box_24.png create mode 100644 glabels2/src/stock-pixmaps/stock_bucket_fill_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_bucket_fill_24.png create mode 100644 glabels2/src/stock-pixmaps/stock_center_horiz_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_center_vert_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_ellipse_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_ellipse_24.png create mode 100644 glabels2/src/stock-pixmaps/stock_flip_horiz_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_flip_vert_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_hchain_24.png create mode 100644 glabels2/src/stock-pixmaps/stock_hchain_broken_24.png create mode 100644 glabels2/src/stock-pixmaps/stock_image_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_image_24.png create mode 100644 glabels2/src/stock-pixmaps/stock_line_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_line_24.png create mode 100644 glabels2/src/stock-pixmaps/stock_merge_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_merge_24.png create mode 100644 glabels2/src/stock-pixmaps/stock_order_bottom_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_order_top_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_pencil_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_pencil_24.png create mode 100644 glabels2/src/stock-pixmaps/stock_properties_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_properties_24.png create mode 100644 glabels2/src/stock-pixmaps/stock_rotate_left_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_rotate_right_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_text_16.png create mode 100644 glabels2/src/stock-pixmaps/stock_text_24.png create mode 100644 glabels2/src/stock-pixmaps/stock_vchain_24.png create mode 100644 glabels2/src/stock-pixmaps/stock_vchain_broken_24.png create mode 100644 glabels2/src/stock.c create mode 100644 glabels2/src/stock.h create mode 100644 glabels2/src/template-designer.c create mode 100644 glabels2/src/template-designer.h create mode 100644 glabels2/src/text-node.c create mode 100644 glabels2/src/text-node.h create mode 100644 glabels2/src/ui-commands.c create mode 100644 glabels2/src/ui-commands.h create mode 100644 glabels2/src/ui-property-bar.c create mode 100644 glabels2/src/ui-property-bar.h create mode 100644 glabels2/src/ui-sidebar.c create mode 100644 glabels2/src/ui-sidebar.h create mode 100644 glabels2/src/ui-util.c create mode 100644 glabels2/src/ui-util.h create mode 100644 glabels2/src/ui.c create mode 100644 glabels2/src/ui.h create mode 100644 glabels2/src/util.c create mode 100644 glabels2/src/util.h create mode 100644 glabels2/src/view-barcode.c create mode 100644 glabels2/src/view-barcode.h create mode 100644 glabels2/src/view-box.c create mode 100644 glabels2/src/view-box.h create mode 100644 glabels2/src/view-ellipse.c create mode 100644 glabels2/src/view-ellipse.h create mode 100644 glabels2/src/view-image.c create mode 100644 glabels2/src/view-image.h create mode 100644 glabels2/src/view-line.c create mode 100644 glabels2/src/view-line.h create mode 100644 glabels2/src/view-object.c create mode 100644 glabels2/src/view-object.h create mode 100644 glabels2/src/view-text.c create mode 100644 glabels2/src/view-text.h create mode 100644 glabels2/src/view.c create mode 100644 glabels2/src/view.h create mode 100644 glabels2/src/warning-handler.c create mode 100644 glabels2/src/warning-handler.h create mode 100644 glabels2/src/wdgt-chain-button.c create mode 100644 glabels2/src/wdgt-chain-button.h create mode 100644 glabels2/src/wdgt-media-select.c create mode 100644 glabels2/src/wdgt-media-select.h create mode 100644 glabels2/src/wdgt-mini-preview.c create mode 100644 glabels2/src/wdgt-mini-preview.h create mode 100644 glabels2/src/wdgt-print-copies.c create mode 100644 glabels2/src/wdgt-print-copies.h create mode 100644 glabels2/src/wdgt-print-merge.c create mode 100644 glabels2/src/wdgt-print-merge.h create mode 100644 glabels2/src/wdgt-rotate-label.c create mode 100644 glabels2/src/wdgt-rotate-label.h create mode 100644 glabels2/src/window.c create mode 100644 glabels2/src/window.h create mode 100644 glabels2/src/xml-label-04.c create mode 100644 glabels2/src/xml-label-04.h create mode 100644 glabels2/src/xml-label.c create mode 100644 glabels2/src/xml-label.h diff --git a/glabels2/AUTHORS b/glabels2/AUTHORS new file mode 100644 index 00000000..5a493529 --- /dev/null +++ b/glabels2/AUTHORS @@ -0,0 +1,166 @@ +gLabels Author +============== + +Jim Evins + +Acknowledgments +=============== + +- The GNU Barcode Library provides a large chunk of the barcode functionality +and is distributed with glabels. See ./barcode-0.98/README for more +information. The author: + + Alessandro Rubini + +- The iec16022 library provides encoding for 2D barcodes. See +iec16022-0.2.1/README for more information. + +- Glabels includes modified versions of several widgets from the GAL library. +These are copyright: + + * Copyright 2000, 2001, Ximian, Inc. + * Copyright 2000, Michael Levy + * Copyright 2001, Almer S. Tigelaar + +- Glabels includes a modified version of the gimpchainbutton widget from the +gimp, as well as several stock icons from the gimp's default theme. +These are copyright: + + * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball + * Copyright (C) 1999-2000 Sven Neumann + +Glabels includes contributions from: + Frederic Ruaudel + Emmanuel Pacaud + Wayne Schuller + Austin Henry -- EDS and vcard backends + nestor di -- excellent splash screen + that first appeared in + 0.4.3: + Darren Warner + Javier Donaire Segarra + Alessandro Zummo + José Dapena Paz + Akkana + Dag Wieers + Mário Meyer + +Translations: + + Olivier Berger -- French (original) + Florent Morel -- French (2.0.2) + Claude Paroz -- French (2.1.4) + Marcus Bauer -- German (original) + Christian Neumair -- German (1.89.1) + Takeshi AIHANA -- Japanese + Paulo Rogério Ormenese -- Brazilian Portuguese + Víctor Moral -- Spanish translations + sergio rivadero -- Spanish Translations (2.0.3) + Vitaly Lipatov -- Russian translations + Shell, Hin-lik Hung -- Chinese Translations + Arkadiusz Lipiec -- Polish Translations + David Makovský (Yakeen) -- Czech Translations + Zbynek Mrkvicka -- Czech Translations (2.0.3) + Mancio -- Italian Translations + Daniele Medri -- Italian Translations (2.0.3) + Antonio C. Codazzi "la Filozofo" -- Esperanto + +The following people have submitted label templates or information about +particular products (I apologize if I have missed anybody): + + Hap + Olivier Berger + Marcus Bauer + Jochen Hein + Jonathan Buzzard + Jeff Davis + Ludger Solbach + Darren Ross + George Mitchell + Douglas Bollinger + Tim Jackson + John Stoffel + Dany De Bontridder + Andy Longton + Bostjan Muller + John Helms + no-exit + Mozilla from marela + Holger + Bill Tihen + Dan Gray + Keith Hudson + Tamas Bondar + George Mitchell + Erich Pfennig + Gwen Patton + Miek Gieben + Joerg Schmitz-Linneweber + David Makovský + Oliver Schwank + Akkana + Ted Poe + hans-helmut.belter + Uli Wachowitz + Stephan Hegel + Holger Reinmann + Michael Wojciechowski + Jim Mueller + Mark Fullalove + Zamiel Al'Shaitan + Philip Paeps + Bryan Fields + Martin Klaffenboeck + Lauri Ampuja + Allan Wind + Mark S Burgunder + Christian Holländer + Marvin P. Dickens + Julien BLACHE + James D Strandboge + Linas Jakucionis + Henrik Brix Andersen + Nigel Titley + Sean 'Shaleh' Perry + Anthony Brockman + Thorsten Hirsch + John Ross + Mike Machado + Rob Elshire + Niels + Ernst W. Winter + regis rampnoux + Sven Salzwedel + Dick Middleton + Ian Peake + Wayne Schuller + Thomas Vill + Fred Bacon + JBadger + Frank Altpeter + Matthew J. Lockner + Larry Harriman + Juan Carlos Valero + Nick Hill + Ali Akcaagac + Dan Clark + Peter L. Berghold + Vitaly Lipatov + Steve Saxon + Roman Kreisel + Steve Reppucci + Lionel CONS + Richard Lance + Anand Kumria + Alexandre Sauvé + Ironblade + Matthias Mailänder + Bernhard Walle + Stephen Hilliard + Alessandro Zummo + Herbert Straub + Dennis Böckmann + Anon + D. Leitner + +And many others for their many helpful suggestions and bug reports -- thanks. diff --git a/glabels2/COPYING b/glabels2/COPYING new file mode 100644 index 00000000..d60c31a9 --- /dev/null +++ b/glabels2/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/glabels2/COPYING-DOCS b/glabels2/COPYING-DOCS new file mode 100644 index 00000000..b42936be --- /dev/null +++ b/glabels2/COPYING-DOCS @@ -0,0 +1,355 @@ + GNU Free Documentation License + Version 1.1, March 2000 + + Copyright (C) 2000 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + +0. PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +written document "free" in the sense of freedom: to assure everyone +the effective freedom to copy and redistribute it, with or without +modifying it, either commercially or noncommercially. Secondarily, +this License preserves for the author and publisher a way to get +credit for their work, while not being considered responsible for +modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + +1. APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work that contains a +notice placed by the copyright holder saying it can be distributed +under the terms of this License. The "Document", below, refers to any +such manual or work. Any member of the public is a licensee, and is +addressed as "you". + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall subject +(or to related matters) and contains nothing that could fall directly +within that overall subject. (For example, if the Document is in part a +textbook of mathematics, a Secondary Section may not explain any +mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, whose contents can be viewed and edited directly and +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup has been designed to thwart or discourage +subsequent modification by readers is not Transparent. A copy that is +not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML designed for human modification. Opaque formats include +PostScript, PDF, proprietary formats that can be read and edited only +by proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML produced by some word processors for output +purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + + +2. VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + +3. COPYING IN QUANTITY + +If you publish printed copies of the Document numbering more than 100, +and the Document's license notice requires Cover Texts, you must enclose +the copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a publicly-accessible computer-network location containing a complete +Transparent copy of the Document, free of added material, which the +general network-using public has access to download anonymously at no +charge using public-standard network protocols. If you use the latter +option, you must take reasonably prudent steps, when you begin +distribution of Opaque copies in quantity, to ensure that this +Transparent copy will remain thus accessible at the stated location +until at least one year after the last time you distribute an Opaque +copy (directly or through your agents or retailers) of that edition to +the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + + +4. MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. +B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has less than five). +C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. +D. Preserve all the copyright notices of the Document. +E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. +F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. +G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. +H. Include an unaltered copy of this License. +I. Preserve the section entitled "History", and its title, and add to + it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. +J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. +K. In any section entitled "Acknowledgements" or "Dedications", + preserve the section's title, and preserve in the section all the + substance and tone of each of the contributor acknowledgements + and/or dedications given therein. +L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. +M. Delete any section entitled "Endorsements". Such a section + may not be included in the Modified Version. +N. Do not retitle any existing section as "Endorsements" + or to conflict in title with any Invariant Section. + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + +5. COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections entitled "History" +in the various original documents, forming one section entitled +"History"; likewise combine any sections entitled "Acknowledgements", +and any sections entitled "Dedications". You must delete all sections +entitled "Endorsements." + + +6. COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + + +7. AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, does not as a whole count as a Modified Version +of the Document, provided no compilation copyright is claimed for the +compilation. Such a compilation is called an "aggregate", and this +License does not apply to the other self-contained works thus compiled +with the Document, on account of their being thus compiled, if they +are not themselves derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one quarter +of the entire aggregate, the Document's Cover Texts may be placed on +covers that surround only the Document within the aggregate. +Otherwise they must appear on covers around the whole aggregate. + + +8. TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License provided that you also include the +original English version of this License. In case of a disagreement +between the translation and the original English version of this +License, the original English version will prevail. + + +9. TERMINATION + +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document is void, and will +automatically terminate your rights under this License. However, +parties who have received copies, or rights, from you under this +License will not have their licenses terminated so long as such +parties remain in full compliance. + + +10. FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. + + +ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.1 + or any later version published by the Free Software Foundation; + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + A copy of the license is included in the section entitled "GNU + Free Documentation License". + +If you have no Invariant Sections, write "with no Invariant Sections" +instead of saying which ones are invariant. If you have no +Front-Cover Texts, write "no Front-Cover Texts" instead of +"Front-Cover Texts being LIST"; likewise for Back-Cover Texts. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. diff --git a/glabels2/COPYING-LIBGLABELS b/glabels2/COPYING-LIBGLABELS new file mode 100644 index 00000000..161a3d1d --- /dev/null +++ b/glabels2/COPYING-LIBGLABELS @@ -0,0 +1,482 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/glabels2/COPYING.README_FIRST b/glabels2/COPYING.README_FIRST new file mode 100644 index 00000000..694c9efa --- /dev/null +++ b/glabels2/COPYING.README_FIRST @@ -0,0 +1,28 @@ + The gLabels official distribution is an aggregate of several components. + Each component is licensed as follows + + The gLabels application core, and other portions of the official gLabels + distribution not explicitly licensed otherwise, are licensed under + the GNU GENERAL PUBLIC LICENSE (GPL); either version 2 of the License, or + (at your option) any later version -- see the 'COPYING' file in this + directory for details. + + The libglabels library, located in the "libglabels/" subdirectory, is + licensed under the GNU LESSER GENERAL PUBLIC LICENSE (LGPL); either + version 2 of the License, or (at your option) any later version -- see + the 'COPYING-LIBGLABESL' in this directory for details. + + The gLabels and libglabels documentation, located in the "docs/" and "help/" + subdirectories, is licensed under the GNU FREE DOCUMENTATION LICENSE (GFDL) + with no Invariant Sections; either version 1.1 or (at your option) any + later version -- see 'COPYING-DOCS' in this directory for details. + + The "barcode-0.98/" and "iec16022-0.2.1/" subdirectories contain 3rd party + libraries, each licensed under the GNU GENERAL PUBLIC LICENSE (GPL); either + version 2 of the License, or (at your option) any later version -- see the + 'LICENSE' or 'COPYING' file in each of these directories for details. + + The XML files in the "data/templates/" subdirectory constitute the glabels + label database. This database is a simple collection of facts so it is + therefore considered to be public domain and can be used for any purpose. + diff --git a/glabels2/ChangeLog b/glabels2/ChangeLog new file mode 100644 index 00000000..1177cf67 --- /dev/null +++ b/glabels2/ChangeLog @@ -0,0 +1,3891 @@ +2007-12-21 Jim Evins + + * COPYING.LIBGLABELS: + * COPYING.README_FIRST: + * README: + Updating license information to make more complete and understandable. + +2007-12-16 Jim Evins + + * configure.in: + Updated version to 2.pre2. + * help/C/glabels.xml: + Updated documentation. + * src/ui-commands.c: (gl_ui_cmd_help_about): + Updated copyright string. + +2007-12-15 Jim Evins + + * data/glade/object-editor.glade: + Removed any GtkTable that contained a GtkComboBox because the size of + the combo box was not constrained properly. This sacrifices the nice + orderly labels for combo boxes that don't extend beyond the edge of the + window. + +2007-12-15 Jim Evins + + * libglabels/db.c: (lgl_db_lookup_template_from_name): + * src/object-editor.c: (gl_object_editor_finalize): + * src/wdgt-media-select.c: (gl_wdgt_media_select_finalize): + Fixed several small memory leaks. + +2007-12-14 Jim Evins + + * libglabels/db.c: + Optimize template search by name by using a GHashTable. + * src/mini-preview-pixbuf-cache.c: + * src/mini-preview-pixbuf-cache.h: + Store one pixbuf per template, but use a key for each alias. + * src/wdgt-media-select.c: + Optimize loading of tree data, thus optimizing the "new label" dialog. + +2007-12-12 Jim Evins + + * data/templates/avery-us-templates.xml: + More templates and aliases. + +2007-12-08 Jim Evins + + * TODO: + More prep for 2.1.5/2.2.0. + +2007-12-08 Jim Evins + + * NEWS: + * README: + * TODO: + * configure.in: + Preparation for 2.1.5. + +2007-12-08 Jim Evins + + * docs/libglabels/libglabels-decl-list.txt: + * docs/libglabels/libglabels-docs.sgml: + * docs/libglabels/libglabels-sections.txt: + * docs/libglabels/libglabels-undocumented.txt: + * docs/libglabels/tmpl/db.sgml: + * docs/libglabels/tmpl/str.sgml: + * libglabels/str.c: + Documentation cleanup for libglabels. + +2007-11-29 Jim Evins + + * libglabels/db.h: + * libglabels/db.c: + Added lgl_db_does_template_name_exist(). + In lgl_db_lookup_template_from_name() substitute brand/part of new template from + requested alias. + * src/prefs-model.c: + Proof read recent templates -- make sure they still exist. + * src/wdgt-media-select.c: + Default to "search all templates" tab if no recent templates found. + +2007-11-28 Jim Evins + + * data/glade/wdgt-media-select.glade: + * src/wdgt-media-select.c: + Added tabbed notebook to allow selection of recent template versus searching the + entire database. + + +2007-11-26 Jim Evins + + * libglabels/Makefile.am: + * libglabels/libglabels.h: + Make str.h public. + * src/label.c: + * src/prefs-dialog.c: + * src/prefs-model.c: + * src/prefs-model.h: + * src/prefs.c: + * src/prefs.h: + Added tracking of recently used templates. + +2007-11-20 Jim Evins + + * data/glade/template-designer.glade: + * src/template-designer.c: + Added warning icon when match brand and part match an existing template. + +2007-11-18 Jim Evins + + * libglabels/Makefile.am: + * libglabels/str.h: + * libglabels/str.c: + Added lgl_str_utf8_casecmp(). + * libglabels/libglabels-private.h: + Use lgl_str_utf8_casecmp() for UTF8_EQUAL macro -- do case insensitive comparisons. + * libglabels/db.c: (lgl_db_get_brand_list): + Use lgl_str_utf8_casecmp() to determine if we have seen brand before when building + brand list. + +2007-11-18 Jim Evins + + * data/glade/template-designer.glade: + * src/template-designer.c: + Don't advance past name page, if brand and part match an existing template. + +2007-11-18 Jim Evins + + * libglabels/db.c: (lgl_db_register_template), (read_templates): + When registering a new template, don't add to "User defined" category before + writing to file. Add to "User defined" category when reading from "~/.glabels" + directory instead. This will allow legacy templates (and manually created + templates) to be automatically added to the "user defined" category. + * libglabels/xml-template.c: + (lgl_xml_template_create_template_node): + Fixed typo/bug causing brand to be wrong. + +2007-11-16 Jim Evins + + * libglabels/db.c: + * libglabels/db.h: + Added return codes to lgl_db_register_template(). Added lgl_db_does_template_exist() + function. Automatically create "User defined" category and add to all user + registered templates. + * libglabels/xml-template.c: + * libglabels/xml-template.h: + Return number of bytes written from lgl_xml_template_write_templates_to_file() and + lgl_xml_template_write_template_to_file(). + * docs/libglabels/libglabels-decl-list.txt: + * docs/libglabels/libglabels-sections.txt: + * docs/libglabels/libglabels-undocumented.txt: + * docs/libglabels/tmpl/db.sgml: + * docs/libglabels/tmpl/xml-template.sgml: + Update documentation to reflect above changes. + +2007-10-28 Jim Evins + + * libglabels/xml-template.c: + Remove any leading white space from part #s when parsing old names. + * src/mini-preview-pixbuf-cache.c: + If name isn't in cache add it. + +2007-10-26 Jim Evins + + * libglabels/Makefile.am: + * libglabels/category.c: + * libglabels/category.h: + * libglabels/db.c: + * libglabels/db.h: + * libglabels/libglabels-private.h: + * libglabels/libglabels.h: + * libglabels/paper.c: + * libglabels/paper.h: + * libglabels/template.c: + * libglabels/template.h: + * libglabels/xml-template.c: + Another pass at screwing with the libglabels API. Moved all + database related stuff to db.[ch]. + * docs/libglabels/libglabels-decl-list.txt: + * docs/libglabels/libglabels-docs.sgml: + * docs/libglabels/libglabels-sections.txt: + * docs/libglabels/libglabels-undocumented.txt: + * docs/libglabels/tmpl/category.sgml: + * docs/libglabels/tmpl/db.sgml: + * docs/libglabels/tmpl/init.sgml: + * docs/libglabels/tmpl/libglabels-unused.sgml: + * docs/libglabels/tmpl/paper.sgml: + * docs/libglabels/tmpl/template-construction.sgml: + * docs/libglabels/tmpl/template-db.sgml: + * docs/libglabels/tmpl/template-misc.sgml: + * docs/libglabels/tmpl/template-struct.sgml: + * docs/libglabels/tmpl/template.sgml: + Updated documentation to reflect above changes to libglabels API. + * src/file.c: + * src/glabels-batch.c: + * src/glabels.c: + * src/mini-preview-pixbuf-cache.c: + * src/prefs-model.c: + * src/print.c: + * src/template-designer.c: + * src/wdgt-media-select.c: + * src/wdgt-mini-preview.c: + * src/wdgt-rotate-label.c: + * src/xml-label-04.c: + * src/xml-label.c: + Reconciled usage with above libglabels API changes. + +2007-10-21 Jim Evins + + * data/glade/wdgt-media-select.glade: + * src/wdgt-media-select.c: + Added brand to filter settings. + +2007-10-21 Jim Evins + + * data/dtd/glabels-2.2.dtd: + Forgot to replace Alias name attribute with brand and part attributes. + * data/templates/avery-iso-templates.xml: + * data/templates/avery-other-templates.xml: + * data/templates/avery-us-templates.xml: + * data/templates/misc-iso-templates.xml: + * data/templates/misc-other-templates.xml: + * data/templates/misc-us-templates.xml: + * data/templates/zweckform-iso-templates.xml: + Replaced all name attributes with brand/part attribute pairs. + +2007-10-20 Jim Evins + + * src/stock-pixmaps/*.png + Updated icons to use Tango color palette. + +2007-10-20 Jim Evins + + * data/dtd/Makefile.am: + * data/dtd/glabels-2.0.dtd: + * data/dtd/glabels-2.2.dtd: + Rename glabels-2.0.dtd to glabels-2.2.dtd. Added brand and part attributes to + template node. + * libglabels/template.c: + * libglabels/template.h: + * libglabels/xml-template.c: + * libglabels/xml.h: + Added brand and part attributes to template and alias structures and nodes. + * src/file.c: + * src/label.c: + * src/mini-preview-pixbuf-cache.c: + * src/template-designer.c: + * src/wdgt-media-select.c: + Use modified libglabels API. + * docs/libglabels/libglabels-decl-list.txt: + * docs/libglabels/libglabels-sections.txt: + * docs/libglabels/libglabels-undocumented.txt: + * docs/libglabels/tmpl/template-construction.sgml: + * docs/libglabels/tmpl/template-db.sgml: + * docs/libglabels/tmpl/template-struct.sgml: + Update libglabels documentation to reflect above modifications. + +2007-10-14 Jim Evins + + * docs/libglabels/libglabels-decl-list.txt: + * docs/libglabels/libglabels-sections.txt: + * docs/libglabels/libglabels-undocumented.txt: + * docs/libglabels/tmpl/category.sgml: + * libglabels/category.c: + * libglabels/category.h: + Added lgl_category_get_id_list() and lgl_category_free_id_list() to have + parity with paper functions. + +2007-10-12 Jim Evins + + * docs/libglabels/libglabels-decl-list.txt: + * docs/libglabels/libglabels-sections.txt: + * docs/libglabels/libglabels-undocumented.txt: + * docs/libglabels/tmpl/category.sgml: + * docs/libglabels/tmpl/enums.sgml: + * docs/libglabels/tmpl/libglabels-unused.sgml: + * docs/libglabels/tmpl/paper.sgml: + * docs/libglabels/tmpl/template-struct.sgml: + * libglabels/init.c: + * libglabels/template.c: + * libglabels/template.h: + Another pass at fleshing out the libglabels documentation. + * src/cairo-label-path.c: + * src/cairo-markup-path.c: + * src/label.c: + * src/mini-preview-pixbuf.c: + * src/print-op.c: + * src/print.c: + * src/view.c: + * src/wdgt-media-select.c: + * src/wdgt-mini-preview.c: + * src/wdgt-print-copies.c: + * src/wdgt-print-merge.c: + * src/wdgt-rotate-label.c: + Removed lgl_template_get_first_frame() from libglabels API and all references. + +2007-10-11 Jim Evins + * configure.in: + Extended checks for deprecated symbols. + * libglabels/template.c: + Removed g_strcasecmp references, which are deprecated. + +2007-10-09 Jim Evins + + * src/merge-evolution.c: + Create address book if it does not exist. Also, be more robust about handling + error conditions -- don't just assume GError has been set. + +2007-10-08 Jim Evins + + * libglabels/template.c: + * libglabels/xml-template.c: + * src/template-designer.c: + Missed some symbols with libglabels API work. + +2007-10-01 Jim Evins + + * docs/libglabels/libglabels-decl-list.txt: + * docs/libglabels/libglabels-docs.sgml: + * docs/libglabels/libglabels-sections.txt: + * docs/libglabels/libglabels-undocumented.txt: + * docs/libglabels/tmpl/category.sgml: + * docs/libglabels/tmpl/enums.sgml: + * docs/libglabels/tmpl/init.sgml: + * docs/libglabels/tmpl/libglabels-unused.sgml: + * docs/libglabels/tmpl/paper.sgml: + * docs/libglabels/tmpl/template-construction.sgml: + * docs/libglabels/tmpl/template-db.sgml: + * docs/libglabels/tmpl/template-misc.sgml: + * docs/libglabels/tmpl/template-struct.sgml: + * docs/libglabels/tmpl/template.sgml: + * docs/libglabels/tmpl/xml-category.sgml: + * docs/libglabels/tmpl/xml-template.sgml: + * libglabels/category.h: + * libglabels/init.c: + * libglabels/libglabels-private.h: + * libglabels/paper.h: + * libglabels/template.c: + * libglabels/template.h: + * libglabels/xml-template.h: + Basic documentation framework for libglabels updated. This still needs some + fleshing out. + +2007-09-27 Jim Evins + + * docs/libglabels/libglabels-decl-list.txt: + * docs/libglabels/libglabels-docs.sgml: + * docs/libglabels/libglabels-sections.txt: + * docs/libglabels/libglabels-undocumented.txt: + * docs/libglabels/tmpl/enums.sgml: + * docs/libglabels/tmpl/init.sgml: + * docs/libglabels/tmpl/libglabels-unused.sgml: + * docs/libglabels/tmpl/paper.sgml: + * docs/libglabels/tmpl/template.sgml: + * docs/libglabels/tmpl/xml-paper.sgml: + * docs/libglabels/tmpl/xml-template.sgml: + * docs/libglabels/tmpl/xml.sgml: + * libglabels/Makefile.am: + * libglabels/category.c: + * libglabels/category.h: + * libglabels/enums.h: + * libglabels/init.c: + * libglabels/init.h: + * libglabels/libglabels-private.h: + * libglabels/libglabels.h: + * libglabels/paper.c: + * libglabels/paper.h: + * libglabels/template.c: + * libglabels/template.h: + * libglabels/xml-category.c: + * libglabels/xml-category.h: + * libglabels/xml-paper.c: + * libglabels/xml-paper.h: + * libglabels/xml-template.c: + * libglabels/xml-template.h: + * libglabels/xml.c: + * libglabels/xml.h: + * src/cairo-label-path.c: + * src/cairo-label-path.h: + * src/cairo-markup-path.c: + * src/cairo-markup-path.h: + * src/file.c: + * src/glabels-batch.c: + * src/glabels.c: + * src/label-object.c: + * src/label.c: + * src/label.h: + * src/mini-preview-pixbuf-cache.c: + * src/mini-preview-pixbuf.c: + * src/mini-preview-pixbuf.h: + * src/prefs-dialog.c: + * src/prefs-model.c: + * src/prefs-model.h: + * src/prefs.c: + * src/prefs.h: + * src/print-op.c: + * src/print.c: + * src/template-designer.c: + * src/view-barcode.c: + * src/view-box.c: + * src/view-ellipse.c: + * src/view-image.c: + * src/view-line.c: + * src/view.c: + * src/wdgt-media-select.c: + * src/wdgt-mini-preview.c: + * src/wdgt-mini-preview.h: + * src/wdgt-print-copies.c: + * src/wdgt-print-merge.c: + * src/wdgt-rotate-label.c: + * src/xml-label-04.c: + * src/xml-label.c: + Major cleanup of libglabels API -- this breaks API compatibility with older + development and stable versions -- as far as I know, there are currently + no external users of this library yet. + +2007-09-14 Jim Evins + + * src/marshal.list: + * src/label.c: + * src/label.h: + * src/label-object.c: + * src/label-object.h: + * src/label-barcode.c: + * src/label-ellipse.c: + * src/view.c: + * src/view-object.c: + * src/view-barcode.c: + * src/view-box.c: + * src/view-ellipse.c: + * src/view-image.c: + * src/view-line.c: + * src/view-text.c: + Better separation of model from view. + +2007-08-21 Jim Evins + + * src/print-op.c: (create_custom_widget_cb): + Fix problem with force_outline_flag -- don't override with default. + +2007-08-21 Jim Evins + + * data/dtd/glabels-2.0.dtd: + * libglabels/template.c: + * libglabels/template.h: + * libglabels/xml-template.c: + * src/cairo-markup-path.c: + Added "Markup-rect" element to template format. + +2007-08-21 Jim Evins + + * configure.in: + Changed version to 2.1.pre5svn. + * src/view.c: (draw_markup_layer): + Do a stroke for each markup path, otherwise multiple markups + get connected. + +2007-08-17 Jim Evins + + * configure.in: + Bump libglabels revision numbers for 2.1.4 release. + +2007-08-16 Jim Evins + + * Makefile.am: + Include subdir iec16022-0.2.1. + * NEWS: + * configure.in: + * glabels.spec.in: + Preparation for 2.1.4. + + +2007-08-11 Jim Evins + + * po/POTFILES.in: + Updated file list. + * configure.in: + * po/eo.po: + Added Esperanto translation. Provided by Antonio C. + Codazzi "la Filozofo" . + * po/fr.po: + Updated French translation. Provided by Claude Paroz + . + * AUTHORS: + Updated to reflect above translations. + +2007-08-11 Jim Evins + + * AUTHORS: + * data/templates/avery-iso-templates.xml: + * data/templates/avery-us-templates.xml: + * data/templates/misc-iso-templates.xml: + * data/templates/misc-other-templates.xml: + * data/templates/misc-us-templates.xml: + * data/templates/zweckform-iso-templates.xml: + Caught up with backlog of template submissions. + +2007-08-10 Jim Evins + + * src/bc-postnet.c: (gl_barcode_postnet_new): + * src/bc.c: + Added support for Brazilian CEPNet barcodes. This is simply an + instance of the US POSTNET format with 8 digits. Patch supplied + by Mário Meyer in bug # 1768792. + * AUTHORS: + Updated acknowledgments to reflect above patch and recent shuffling + of underlying technology. + +2007-05-13 Jim Evins + + * src/merge-text.c: (parse_line), (parse_field): + Remove leading and trailing spaces from CSV fields, unless quoted. + +2007-05-09 Jim Evins + + * src/object-editor-bc-page.c: + * src/object-editor-data-page.c: + * src/object-editor-fill-page.c: + * src/object-editor-image-page.c: + * src/object-editor-line-page.c: + * src/object-editor-lsize-page.c: + * src/object-editor-position-page.c: + * src/object-editor-private.h: + * src/object-editor-shadow-page.c: + * src/object-editor-size-page.c: + * src/object-editor-text-page.c: + * src/object-editor.c: + * src/prefs-dialog.c: + * src/template-designer.c: + * src/ui-property-bar.c: + * src/wdgt-media-select.c: + Replaced signal block/unblock pairs with simple flags. This reduces + some code clutter, hopefully making it easier to read. + +2007-05-05 Jim Evins + + * src/template-designer.c: (apply_cb): + Add new template to mini-preview pixbuf cache. + +2007-05-03 Jim Evins + + * src/label-image.c: (gl_label_image_init), (draw_object): + Scale default pixbuf up, to prevent bluring. Use cairo_fill to + render image. + +2007-05-02 Jim Evins + + * src/view.c: (draw_select_region_layer), (motion_notify_event_cb), + (button_release_event_cb): + Removed attempt at rendering optimization by clipping the updates + to areas affected -- this actually seemed to hurt update performance. + +2007-04-30 Jim Evins + + * src/color.h: + * src/color.c: (gl_color_shadow), (gl_color_node_new_default), + (gl_color_node_equal), (gl_color_node_expand): + * src/label-barcode.c: (draw_object): + * src/label-box.c: (draw_object), (draw_shadow): + * src/label-ellipse.c: (draw_object), (draw_shadow): + * src/label-line.c: (draw_object), (draw_shadow): + * src/label-text.c: (draw_object), (draw_shadow): + * src/wdgt-mini-preview.c: (draw_shadow), (draw_labels): + * src/wdgt-rotate-label.c: (drawingarea_update): + Some cleanup to color related code. + +2007-04-30 Jim Evins + + * src/label.h: + Added glLabelRegion structure type. + * src/label-object.c: (gl_label_object_get_extent): + * src/label-object.h: + Modified gl_label_object_get_extent() to fill in a glLabelRegion struct. + * src/view.h: + * src/view.c: (gl_view_update_region), (draw_select_region_layer), + (gl_view_select_region), (gl_view_align_selection_left), + (gl_view_align_selection_right), (gl_view_align_selection_hcenter), + (gl_view_align_selection_top), (gl_view_align_selection_bottom), + (gl_view_align_selection_vcenter), + (gl_view_center_selection_horiz), (gl_view_center_selection_vert), + (gl_view_move_selection), (gl_view_can_selection_text), + (motion_notify_event_cb), (button_press_event_cb), + (button_release_event_cb): + - Reconcile with new gl_label_object_get_extent() API. + - Use glLabelRegion for view->select_region. + - Added gl_view_update_region() to clip updates to region. + - Use gl_view_update_region() during manipulation of view->select_region. + +2007-04-26 Jim Evins + + * src/mini-preview-pixbuf.c: (draw_paper), (draw_label_outlines), + (draw_label_outline): + * src/print.c: (print_crop_marks), (draw_outline): + * src/view-object.c: (gl_view_object_draw_handles): + * src/view.c: (draw_bg_layer), (draw_grid_layer), + (draw_markup_layer), (draw_fg_layer), (draw_select_region_layer): + * src/wdgt-mini-preview.c: (draw_paper), (draw_labels): + * src/wdgt-rotate-label.c: (drawingarea_update): + Added defines for various magic numbers. + +2007-04-25 Jim Evins + + * src/label-text.c: (get_size), (draw_object), (draw_shadow): + Scale text down. Cairo seems to render text too large. + +2007-04-25 Jim Evins + + * src/view.h: + * src/view.c: (gl_view_update), (expose_cb), + (motion_notify_event_cb), (button_press_event_cb), + (button_release_event_cb): + - Try not to let updates get backed up. + - Grab pointer when doing any drag operations. + +2007-04-11 Jim Evins + + * src/cairo-label-path.c: (gl_cairo_label_path), + (gl_cairo_rect_label_path), (gl_cairo_round_label_path), + (gl_cairo_cd_label_path): + * src/cairo-label-path.h: + * src/mini-preview-pixbuf.c: (draw_paper), (draw_label_outlines), + (draw_label_outline): + * src/print.c: (draw_outline), (clip_to_outline): + * src/view.c: (draw_bg_layer), (draw_fg_layer): + * src/wdgt-mini-preview.c: (draw_labels): + * src/wdgt-rotate-label.c: (drawingarea_update): + Modified to universally use gl_cairo_label_path() to create paths + for labels. Added shadow to mini preview in rotate widget. + +2007-04-10 Jim Evins + + * libglabels/template.h: + * libglabels/template.c: (gl_template_get_name_list_unique), + (gl_template_get_name_list_all), (gl_template_from_name): + Modified libglabels to allow you to get a list of all template names + including all aliases or just a list of primary names of each unique + template. + * src/Makefile.am: + * src/file.c: (gl_file_properties): + * src/glabels.c: (main): + * src/mini-preview-pixbuf-cache.h: + * src/mini-preview-pixbuf-cache.c: + * src/wdgt-media-select.c: (gl_wdgt_media_select_construct), + (filter_changed_cb), (load_list): + Added mini-preview pixbuf cache, so that only one mini-preview is + needed for a unique template and gets reused for all aliases. These + pixbufs will also live for the life of the program so they are not + rebuilt everytime a new label dialog is invoked. + * src/mini-preview-pixbuf.c: (draw_paper), + (draw_rect_label_outline), (draw_round_label_outline), + (draw_cd_label_outline): + Removed some comment artifacts. + +2007-04-04 Jim Evins + + * src/mini-preview-pixbuf.c: (gl_mini_preview_pixbuf_new), + (draw_paper), (draw_label_outlines), (draw_rect_label_outline), + (draw_round_label_outline), (draw_cd_label_outline): + * src/wdgt-media-select.c: (load_list): + * src/wdgt-rotate-label.c: (draw_cd_label_outline): + Cosmetic enhancments to mini previews. + +2007-04-04 Jim Evins + + * src/ui-property-bar.c: (gl_ui_property_bar_finalize), + (gl_ui_property_bar_construct): + Save copy of GladeXML tree so that we don't lose tooltips. + +2007-04-02 Jim Evins + + * src/merge-properties-dialog.c: + * src/new-label-dialog.c: + * src/object-editor.c: + * src/prefs-dialog.c: + * src/print-op.c: + * src/template-designer.c: + * src/ui-property-bar.c: + * src/wdgt-media-select.c: + * src/wdgt-rotate-label.c: + Fixed several memory leaks. + +2007-04-01 Jim Evins + + * src/label-text.c: (gl_label_text_init), (copy), + (gl_label_text_set_lines), (buffer_changed_cb), (get_size), + (set_font_family), (set_font_size), (set_font_weight), + (set_font_italic_flag), (set_text_alignment), + (set_text_line_spacing): + Cache object size, so that expensive extent calculations are only done + when needed. + +2007-03-30 Jim Evins + + * src/prefs-model.c: (gl_prefs_model_load_settings): + Default to an unlimited list of recent documents, since this parameter + seems to be pre-filter anyway. + +2007-03-30 Jim Evins + + * src/label-box.c: (draw_shadow): + * src/label-ellipse.c: (draw_shadow): + Added missing shadow fill. + +2007-03-28 Jim Evins + + * src/ui-commands.c: (gl_ui_cmd_file_print): + Unreferencing the print operation sometimes crashes. Just don't do it + right now. + +2007-03-28 Jim Evins + + * src/print-op.c: (gl_print_op_construct), + (gl_print_op_get_settings), (gl_print_op_set_settings), + (gl_print_op_free_settings), (create_custom_widget_cb): + * src/print-op.h: + * src/ui-commands.c: (gl_ui_cmd_file_print): + * src/window.c: (gl_window_init): + * src/window.h: + Save print settings and custom settings between print operations + on the same window. + +2007-03-24 Jim Evins + + * src/object-editor-image-page.c: + (gl_object_editor_prepare_image_page), + (gl_object_editor_set_image), (img_selection_changed_cb): + Workaround for GtkFileChooserButton bug # 327243. This the root + cause for gLabels bug # 1192884. I have actually observed 3 delayed + "selection-changed" signals -- the first 2 return NULL -- this is + what caused the image to reset to the default followed by setting + it back to the original image, trying to fit it into a new bounding + box. This sequence of events is much more evident with the new + cairo rendering. + +2007-03-23 Jim Evins + + Merged all changes from experimental cairo branch to trunk. + Trunk no longer depends on libgnomecanvas or libgnomeprint[ui]. + +2007-03-23 Jim Evins + + * src/label-object.h: + * src/label-object.c: (gl_label_object_class_init), + (gl_label_object_get_raw_size), (gl_label_object_get_size): + Created "get_raw_size" method. + * src/label-barcode.c: (get_size): + * src/xml-label.c: (xml_create_object_text), + (xml_create_object_barcode): + Use new "get_raw_size" method on label-objects when apropos. + * src/label-text.h: + * src/label-text.c: (get_size), (draw_object), (draw_shadow), + (auto_shrink_font_size): + Added "auto shrink" functionality back. + +2007-03-19 Jim Evins + + * src/label-text.c: (draw_object), (draw_shadow): + Don't use negative scales in workaround from previous commit. + + +2007-03-18 Jim Evins + + * src/xml-label.c: + Forgot to remove include of xml-lable-191 in previous commit. + * src/label-text.c: (get_size), (draw_object), (draw_shadow): + Workaround for pango Bug #341481. Render text at device scale, + and scale font size accordingly. Also, don't do any hinting. + +2007-03-18 Jim Evins + + * src/cairo-ellipse-path.c: + * src/cairo-ellipse-path.h: + Forgot to add these new files during last mass commit. + +2007-03-18 Jim Evins + + * src/Makefile.am: + * src/xml-label-191.c: + * src/xml-label-191.h: + Removed -- Very buggy. Version 1.91 is a very old "unstable" version, + so there is no need to keep compatability. + * src/base64.c: + * src/bc-iec16022.c: + * src/cairo-label-path.c: + * src/cairo-label-path.h: + * src/cairo-markup-path.c: + * src/color.c: + * src/debug.c: + * src/file.c: + * src/glabels-batch.c: + * src/glabels.c: + * src/label-barcode.c: + * src/label-box.c: + * src/label-ellipse.c: + * src/label-image.c: + * src/label-line.c: + * src/label-object.c: + * src/label-object.h: + * src/label-text.c: + * src/label.c: + * src/label.h: + * src/merge-properties-dialog.c: + * src/merge.c: + * src/new-label-dialog.c: + * src/object-editor-bc-page.c: + * src/object-editor-data-page.c: + * src/object-editor-edit-page.c: + * src/object-editor-fill-page.c: + * src/object-editor-image-page.c: + * src/object-editor-line-page.c: + * src/object-editor-private.h: + * src/object-editor-shadow-page.c: + * src/object-editor-text-page.c: + * src/object-editor.c: + * src/pixbuf-cache.c: + * src/print-op.c: + * src/print.c: + * src/recent.c: + * src/stock.c: + * src/template-designer.c: + * src/text-node.c: + * src/ui-property-bar.c: + * src/ui.c: + * src/view-barcode.c: + * src/view-box.c: + * src/view-ellipse.c: + * src/view-image.c: + * src/view-line.c: + * src/view-object.c: + * src/view-object.h: + * src/view-text.c: + * src/view.c: + * src/wdgt-media-select.c: + * src/wdgt-print-copies.c: + * src/wdgt-print-merge.c: + * src/window.c: + * src/xml-label-04.c: + * src/xml-label.c: + Many changes, including: + - Move draw methods from view-*() to label-*(). + - Use same drawing code for on screen view and printing. + - Fix all issues exposed with '-Wall -Werror'. + +2007-03-14 Jim Evins + + * src/Makefile.am: + * src/cairo-handle-path.c: + * src/cairo-handle-path.h: + * src/cairo-object-path.c: + * src/cairo-object-path.h: + Removed cairo-handle-path.[ch] and cairo-object-path.[ch]. + * src/view-barcode.c: (gl_view_barcode_class_init), (draw_object), + (object_at): + * src/view-box.c: (gl_view_box_class_init), (draw_object), + (draw_shadow), (object_at): + * src/view-ellipse.c: (gl_view_ellipse_class_init), + (create_ellipse_path), (draw_object), (draw_shadow), (object_at): + * src/view-image.c: (gl_view_image_class_init), (draw_object), + (object_at): + * src/view-line.c: (gl_view_line_class_init), (draw_object), + (draw_shadow), (object_at): + * src/view-object.c: (gl_view_object_draw), (gl_view_object_at), + (create_handle_path), (gl_view_object_draw_handles), + (gl_view_object_handle_at): + * src/view-object.h: + * src/view-text.c: (gl_view_text_class_init), (draw_object), + (draw_shadow), (object_at): + * src/view.c: (motion_notify_event_cb), (button_press_event_cb): + Some restructuring of new code. + +2007-03-12 Jim Evins + + * src/Makefile.am: + * src/cairo-object-path.c: + * src/view-barcode.c: + * src/view-barcode.h: + * src/view.c: + Added barcode object support to view. + +2007-03-12 Jim Evins + + * src/Makefile.am: + * src/view-text.h: + * src/view-text.c: + * src/view.c: + * src/cairo-object-path.c: + * src/cairo-object-path.h: + * src/view-box.c: + * src/view-ellipse.c: + * src/view-image.c: + * src/view-line.c: + * src/view-object.c: + * src/view-object.h: + Added text object support to view. Added object_at method to all + view_objects. + +2007-03-11 Jim Evins + + * src/Makefile.am: + * src/cairo-object-path.c: (gl_cairo_object_path), + (gl_cairo_image_object_path): + * src/view-image.c: (gl_view_image_class_init), + (gl_view_image_finalize), (gl_view_image_new), + (update_editor_from_label_cb), (draw), + (gl_view_image_get_create_cursor), + (gl_view_image_create_button_press_event), + (gl_view_image_create_motion_event), + (gl_view_image_create_button_release_event): + * src/view-image.h: + * src/view.c: (gl_view_construct), (gl_view_object_create_mode), + (selection_received_cb), (motion_notify_event_cb), + (button_press_event_cb), (button_release_event_cb): + Added image object support to view. + +2007-03-11 Jim Evins + + * src/Makefile.am: + * src/cairo-object-path.c: (gl_cairo_object_path), + (gl_cairo_line_object_path): + * src/view-line.c: (gl_view_line_class_init), (gl_view_line_new), + (update_object_from_editor_cb), (update_editor_from_object_cb), + (update_editor_from_label_cb), (draw), + (gl_view_line_get_create_cursor), + (gl_view_line_create_button_press_event), + (gl_view_line_create_motion_event), + (gl_view_line_create_button_release_event): + * src/view-line.h: + * src/view-object.c: (gl_view_object_resize_event): + * src/view.c: (gl_view_construct), (gl_view_object_create_mode), + (selection_received_cb), (motion_notify_event_cb), + (button_press_event_cb), (button_release_event_cb): + Added line object support to view. + * src/cairo-handle-path.c: + Made handles slightly larger. + + +2007-03-11 Jim Evins + + * src/Makefile.am: + * src/cairo-handle-path.c: + * src/cairo-label-path.c: (gl_cairo_rect_label_path), + (gl_cairo_round_label_path), (gl_cairo_cd_label_path): + * src/cairo-markup-path.c: (gl_cairo_markup_margin_rect_path), + (gl_cairo_markup_margin_round_path), + (gl_cairo_markup_margin_cd_path), (gl_cairo_markup_circle_path): + * src/cairo-object-path.c: (gl_cairo_object_path), + (gl_cairo_ellipse_object_path): + * src/label-object.c: (gl_label_object_rotate): + * src/view-box.c: + * src/view-box.h: + * src/view-ellipse.c: (gl_view_ellipse_class_init), + (gl_view_ellipse_new), (update_object_from_editor_cb), + (update_editor_from_object_cb), (update_editor_from_label_cb), + (draw), (gl_view_ellipse_get_create_cursor), + (gl_view_ellipse_create_button_press_event), + (gl_view_ellipse_create_motion_event), + (gl_view_ellipse_create_button_release_event): + * src/view-ellipse.h: + * src/view-object.c: + * src/view-object.h: + * src/view.c: (gl_view_construct), (gl_view_object_create_mode), + (select_object_real), (selection_received_cb), + (motion_notify_event_cb), (button_press_event_cb), + (button_release_event_cb): + * src/view.h: + Added ellipse object support to view. Plus other cleanup. + +2007-03-11 Jim Evins + + * src/view-box.h: + * src/view-box.c: (gl_view_box_get_create_cursor), + (gl_view_box_create_button_press_event), + (gl_view_box_create_motion_event), + (gl_view_box_create_button_release_event): + * src/view-object.c: (gl_view_object_set_view), + (gl_view_object_handle_at): + * src/view.h: + * src/view.c: (gl_view_arrow_mode), (gl_view_object_create_mode), + (motion_notify_event_cb), (button_press_event_cb), + (button_release_event_cb), (key_press_event_cb): + Added creation code for box object. + +2007-03-09 Jim Evins + + * src/view-object.c: (gl_view_object_resize_event): + * src/view-object.h: + * src/view.c: (motion_notify_event_cb): + Fix bugs with resizing transformed objects. + * src/cairo-handle-path.c: (gl_cairo_handle_path): + * src/cairo-object-path.c: (gl_cairo_object_path): + * src/cairo-object-path.h: + * src/label-object.c: (gl_label_object_init), + (gl_label_object_dup), (gl_label_object_get_extent), + (gl_label_object_flip_horiz), (gl_label_object_flip_vert), + (gl_label_object_rotate), (gl_label_object_set_matrix), + (gl_label_object_get_matrix): + * src/label-object.h: + * src/print.c: (draw_object): + * src/view-box.c: + * src/view-highlight.c: + * src/view-highlight.h: + * src/xml-label-191.c: (xml191_parse_object): + * src/xml-label.c: (xml_parse_affine_attrs), + (xml_create_affine_attrs): + Replace libart affine matrices with cairo matrices. + +2007-03-08 Jim Evins + + * src/view-object.h: + * src/view.c: (gl_view_update), (motion_notify_event_cb): + * src/view-object.c: (gl_view_object_handle_at), + (gl_view_object_resize_event): + Added resize code -- still a bit buggy. + +2007-03-07 Jim Evins + + * src/Makefile.am: + * src/cairo-handle-path.c: + * src/cairo-handle-path.h: + * src/view-box.c: (gl_view_box_new): + * src/view-object.c: (gl_view_object_set_object), + (gl_view_object_draw_handles), (gl_view_object_handle_at): + * src/view-object.h: + * src/view.c: (draw_highlight_layer), (select_object_real), + (unselect_object_real), (view_handle_at), (motion_notify_event_cb), + (button_press_event_cb), (button_release_event_cb), + (key_press_event_cb): + * src/view.h: + Added beginnings of object resize handles. + +2007-03-07 Jim Evins + + * src/view.h: + * src/view.c: (gl_view_init), (gl_view_arrow_mode), + (gl_view_object_create_mode), (motion_notify_event_cb), + (button_press_event_cb), (button_release_event_cb), + (key_press_event_cb): + Added move selection support. + +2007-03-05 Jim Evins + + * src/cairo-object-path.c: (gl_cairo_object_path): + * src/view-object.c: (gl_view_object_draw), + (gl_view_object_draw_highlight): + * src/view.c: (view_object_at), (motion_notify_event_cb), + (button_press_event_cb), (button_release_event_cb): + Additional refinements to select logic. + +2007-03-05 Jim Evins + + * src/view.h: + * src/view.c: (gl_view_init), (gl_view_construct), + (label_changed_cb), (draw_layers), (draw_select_region_layer), + (gl_view_select_region), (object_at), (motion_notify_event_cb), + (button_press_event_cb), (button_release_event_cb): + Added initial select region support and context menu. + +2007-03-04 Jim Evins + + * configure.in: + * src/Makefile.am: + * src/debug.c: + * src/debug.h: + * src/file.c: + * src/label.c: + * src/label.h: + * src/print-op.c: + * src/print.c: + * src/ui-commands.c: + * src/view-box.c: + * src/view-box.h: + * src/view-object.c: + * src/view-object.h: + * src/view.c: + * src/view.h: + * src/wdgt-print-copies.c: + * src/wdgt-print-merge.c: + * src/xml-label.c: + Initial port to a raw Cairo canvas. This removes all remaining + dependencies on libgnomecanvas and libgnomeprint[ui]. Basically + the view is becoming a canvas widget in its own right. Still needs + a lot of work. + * src/cairo-label-path.c: + * src/cairo-label-path.h: + * src/cairo-markup-path.c: + * src/cairo-markup-path.h: + * src/cairo-object-path.c: + * src/cairo-object-path.h: + New files to support cairo canvas. + * src/canvas-hacktext.c: + * src/canvas-hacktext.h: + Removed. + +2007-02-18 Jim Evins + + * src/bc.h: + GNOME_FONT_BOOK changed to PANGO_WEIGHT_NORMAL. + +2007-02-14 Jim Evins + + * src/base64.c: + * src/base64.h: + * src/bc-gnubarcode.c: + * src/bc-gnubarcode.h: + * src/bc-postnet.c: + * src/bc-postnet.h: + * src/bc.c: + * src/bc.h: + * src/canvas-hacktext.c: + * src/canvas-hacktext.h: + * src/debug.c: + * src/debug.h: + * src/file.c: + * src/file.h: + * src/glabels.c: + * src/hig.h: + * src/label-barcode.c: + * src/label-barcode.h: + * src/label-box.c: + * src/label-box.h: + * src/label-ellipse.c: + * src/label-ellipse.h: + * src/label-image.c: + * src/label-image.h: + * src/label-line.c: + * src/label-line.h: + * src/label-object.c: + * src/label-object.h: + * src/label-text.c: + * src/label-text.h: + * src/label.c: + * src/label.h: + * src/merge-evolution.c: + * src/merge-evolution.h: + * src/merge-init.c: + * src/merge-init.h: + * src/merge-properties-dialog.c: + * src/merge-properties-dialog.h: + * src/merge-text.c: + * src/merge-text.h: + * src/merge-vcard.c: + * src/merge-vcard.h: + * src/merge.c: + * src/merge.h: + * src/mini-preview-pixbuf.h: + * src/new-label-dialog.c: + * src/new-label-dialog.h: + * src/object-editor-bc-page.c: + * src/object-editor-data-page.c: + * src/object-editor-edit-page.c: + * src/object-editor-fill-page.c: + * src/object-editor-image-page.c: + * src/object-editor-line-page.c: + * src/object-editor-lsize-page.c: + * src/object-editor-position-page.c: + * src/object-editor-private.h: + * src/object-editor-size-page.c: + * src/object-editor-text-page.c: + * src/object-editor.c: + * src/object-editor.h: + * src/pixbuf-cache.c: + * src/pixbuf-cache.h: + * src/prefs-dialog.c: + * src/prefs-dialog.h: + * src/prefs-model.c: + * src/prefs-model.h: + * src/prefs.c: + * src/prefs.h: + * src/print-op.c: + * src/stock.c: + * src/stock.h: + * src/template-designer.c: + * src/text-node.c: + * src/text-node.h: + * src/ui-commands.c: + * src/ui-commands.h: + * src/ui-property-bar.c: + * src/ui-property-bar.h: + * src/ui-sidebar.c: + * src/ui-sidebar.h: + * src/ui-util.c: + * src/ui-util.h: + * src/ui.c: + * src/ui.h: + * src/util.c: + * src/util.h: + * src/view-barcode.c: + * src/view-barcode.h: + * src/view-box.c: + * src/view-box.h: + * src/view-ellipse.c: + * src/view-ellipse.h: + * src/view-highlight.c: + * src/view-highlight.h: + * src/view-image.c: + * src/view-image.h: + * src/view-line.c: + * src/view-line.h: + * src/view-object.c: + * src/view-object.h: + * src/view-text.c: + * src/view-text.h: + * src/view.c: + * src/view.h: + * src/wdgt-chain-button.c: + * src/wdgt-chain-button.h: + * src/wdgt-media-select.c: + * src/wdgt-mini-preview.c: + * src/wdgt-print-copies.c: + * src/wdgt-print-copies.h: + * src/wdgt-print-merge.c: + * src/wdgt-print-merge.h: + * src/wdgt-rotate-label.c: + * src/window.h: + * src/xml-label-04.c: + * src/xml-label-04.h: + * src/xml-label-191.c: + * src/xml-label-191.h: + * src/xml-label.c: + * src/xml-label.h: + + Assorted superficial cleanup. Including: + - Use G_DEFINE_TYPE for all objects. + - Reconcile style of all class initializer functions + - Reconcile style of all finalize functions + - Add emacs mode line to all source files + +2007-02-06 Jim Evins + +Assorted cleanup and removal of deprecated items. + + * src/splash.c: + * src/splash.h: + * src/Makefile.am: + Removed annoying splash screen. + * src/glabels-batch.c: (main): + * src/glabels.c: (main): + Converted from popt to GOption. + * src/object-editor-shadow-page.c: + (gl_object_editor_set_shadow_state): + Removed deprecated method on GtkToggleButton. + * src/ui-commands.c: (gl_ui_cmd_help_about): + Removed dependency on libgnomui/qnome-url.h. + * src/template-designer.c: + Removed dependency on libgnome/gnome-program.h. + + +2007-02-04 Jim Evins + + * src/color.c: + * src/color.h: + * src/prefs-model.c: + * src/print.c: (draw_text_object): + * src/wdgt-mini-preview.c: (gl_wdgt_mini_preview_construct): + Removed GnomeCanvas artifacts from color.[ch] and related modules. + +2007-02-04 Jim Evins + + * src/wdgt-mini-preview.c: + * src/wdgt-mini-preview.h: + Ported widget from GnomeCanvas to Cairo. + +2007-02-03 Jim Evins + + * data/glade/template-designer.glade: + * src/template-designer.c: + * src/template-designer.h: + Ported GnomeDruid to GtkAssistant. Since libglade does not + yet support the GtkAssistant and we derive directly from + the Assistant, the pages are layed out in a GtkNotebook in + the glade description -- we then append each page to the + assistant. + +2007-01-25 Jim Evins + + * data/glade/object-editor.glade: + Added dummy page to notebook, to prevent shadow page from + becoming the default current page at creation. + * src/view-box.c: (construct_properties_editor): + * src/view-ellipse.c: (construct_properties_editor): + * src/view-line.c: (construct_properties_editor): + * src/view-text.c: (construct_properties_editor): + Reconciled order of params. + +2007-01-19 Jim Evins + + * src/label-barcode.h: + * src/label-object.c: (gl_label_object_set_font_weight), + (gl_label_object_set_text_alignment), + (gl_label_object_get_font_weight), + (gl_label_object_get_text_alignment): + * src/label-object.h: + * src/label-text.c: (gl_label_text_instance_init), (copy), + (get_size), (set_font_family), (set_font_weight), + (set_text_alignment), (get_font_weight), (get_text_alignment): + * src/label-text.h: + * src/object-editor-text-page.c: + (gl_object_editor_prepare_text_page), + (gl_object_editor_set_font_family), + (gl_object_editor_set_font_weight), + (gl_object_editor_get_font_weight), + (gl_object_editor_set_text_alignment), + (gl_object_editor_get_text_alignment), + (gl_object_editor_set_text_color): + * src/object-editor.h: + * src/prefs-dialog.c: (construct_object_page), + (update_object_page_from_prefs), (update_prefs_from_object_page): + * src/prefs-model.c: (gl_prefs_model_save_settings), + (gl_prefs_model_load_settings): + * src/prefs-model.h: + * src/print.c: (draw_text_object): + * src/ui-property-bar.c: (gl_ui_property_bar_construct), + (reset_to_default_properties), (update_text_properties), + (font_bold_toggled_cb), (text_align_toggled_cb): + * src/ui-sidebar.c: + * src/util.c: (gl_util_align_to_string), (gl_util_string_to_align), + (gl_util_weight_to_string), (gl_util_string_to_weight), + (gl_util_get_font_family_list), (gl_util_font_family_list_free): + * src/util.h: + * src/view-text.c: (update_object_from_editor_cb), + (update_editor_from_object_cb), (draw_hacktext), (draw_cursor): + * src/view.c: (gl_view_set_selection_text_alignment), + (gl_view_set_default_text_alignment), + (gl_view_get_default_text_alignment): + * src/view.h: + * src/xml-label-04.c: (xml04_parse_text_props): + * src/xml-label-191.c: (xml191_parse_text_props): + * src/xml-label.c: (xml_parse_object_text), + (xml_parse_toplevel_span), (xml_create_object_text), + (xml_create_toplevel_span): + Converted all model internals to Pango. GnomeFont remains in + view until GnomeCanvas can be replaced with a cairo-based canvas. + +2007-01-17 Jim Evins + + * src/Makefile.am: + * src/hig.c: + Deleted hig.c. + * src/hig.h: + * src/wdgt-print-copies.c: (gl_wdgt_print_copies_get_type), + (gl_wdgt_print_copies_construct): + * src/wdgt-print-copies.h: + * src/wdgt-print-merge.c: (gl_wdgt_print_merge_get_type), + (gl_wdgt_print_merge_construct): + * src/wdgt-print-merge.h: + Removed all remaining HIG wrapper widgets. + +2007-01-16 Jim Evins + + * src/Makefile.am: + * src/print-dialog.c: + * src/print-dialog.h: + * src/print-op.c: + * src/print-op.h: + * src/template-designer.c: (print_test_cb): + * src/ui-commands.c: (gl_ui_cmd_file_print): + * src/print.c: + Renamed PrintDialog to PrintOp. Added constructor for batch + printing. + * src/glabels-batch.c: (main): + Converted to use new PrintOp object for printing. + +2007-01-15 Jim Evins + + * data/glade/Makefile.am: + * data/glade/print-custom-widget.glade: + * src/print-dialog.c: + * src/print-dialog.h: + * src/print.c: + * src/print.h: + * src/template-designer.c: (print_test_cb): + * src/ui-commands.c: (gl_ui_cmd_file_print): + * src/wdgt-print-merge.c: (gl_wdgt_print_merge_get_copies): + * src/wdgt-print-merge.h: + * src/window.c: (gl_window_init): + * src/window.h: + Initial conversion to GtkPrintOperation. + Still to do: + - Remove font and other libgnomeprint[ui] from elsewhere + - Add batch initialization of print operation + +2007-01-08 Jim Evins + * configure.in: + Updated dependencies. Set version to 2.1.pre4cvs. + +2007-01-03 Jim Evins + + * src/recent-files/* + Removed EggRecent stuff. + * configure.in: + * src/Makefile.am: + * src/file.c: + * src/recent.c: + * src/recent.h: + * src/ui-commands.c: + * src/ui-commands.h: + * src/ui.c: + Ported from EggRecent to GtkRecentManager. + + +2007-01-02 Jim Evins + + * configure.in: + * iec16022-0.2.1/BUGS: + * iec16022-0.2.1/CHANGELOG: + * iec16022-0.2.1/CREDITS: + * iec16022-0.2.1/INSTALL: + * iec16022-0.2.1/LICENSE: + * iec16022-0.2.1/Makefile.am: + * iec16022-0.2.1/Makefile.dist: + * iec16022-0.2.1/README: + * iec16022-0.2.1/README.glabels: + * iec16022-0.2.1/TODO: + * iec16022-0.2.1/iec16022.1: + * iec16022-0.2.1/iec16022.c: + * iec16022-0.2.1/iec16022ecc200.c: + * iec16022-0.2.1/iec16022ecc200.h: + * iec16022-0.2.1/image.c: + * iec16022-0.2.1/image.h: + * iec16022-0.2.1/reedsol.c: + * iec16022-0.2.1/reedsol.h: + * iec16022-0.2.1/test/testsuite-example.bin: + * iec16022-0.2.1/test/testsuite-example.eps: + * iec16022-0.2.1/test/testsuite-example.hex: + * iec16022-0.2.1/test/testsuite-example.png: + * iec16022-0.2.1/test/testsuite-example.text: + * iec16022-0.2.1/test/testsuite.sh: + Include modified copy of iec16022-0.2.1 to provide encoding + support for datamatrix 2D barcodes. + * src/Makefile.am: + * src/bc-iec16022.c: + * src/bc-iec16022.h: + * src/bc.c: + Added initial datamatrix 2D barcode backend to barcode code. + * INSTALL: + * gtk-doc.make: + Automatic updates to later versions of these files. + +2006-11-28 Jim Evins + + * data/templates/avery-iso-templates.xml: + * data/templates/avery-us-templates.xml: + * data/templates/categories.xml: + * data/templates/misc-iso-templates.xml: + * data/templates/misc-us-templates.xml: + * data/templates/zweckform-iso-templates.xml: + More categorization. + +2006-09-12 Jim Evins + + * data/dtd/glabels-2.0.dtd: + * data/templates/Makefile.am: + * data/templates/avery-iso-templates.xml: + * data/templates/avery-other-templates.xml: + * data/templates/avery-us-templates.xml: + * data/templates/categories.xml: + * data/templates/misc-iso-templates.xml: + * data/templates/misc-other-templates.xml: + * data/templates/zweckform-iso-templates.xml: + * data/glade/Makefile.am: + * data/glade/new-label-dialog.glade: + * data/glade/wdgt-media-select.glade: + * data/glade/wdgt-rotate-label.glade: + * libglabels/Makefile.am: + * libglabels/category.c: + * libglabels/category.h: + * libglabels/libglabels.h: + * libglabels/paper.c: + * libglabels/template.c: + * libglabels/template.h: + * libglabels/xml-category.c: + * libglabels/xml-category.h: + * libglabels/xml-template.c: + Added support for category meta data. + * src/Makefile.am: + * src/file.c: + * src/mini-preview-pixbuf.c: + * src/mini-preview-pixbuf.h: + * src/new-label-dialog.c: + * src/new-label-dialog.h: + * src/wdgt-media-select.c: + * src/wdgt-media-select.h: + * src/wdgt-rotate-label.c: + * src/wdgt-rotate-label.h: + New "new label" dialog. + +2006-05-27 Jim Evins + + * NEWS: + * autogen.sh: + * configure.in: + Preparation for 2.1.3. + * acinclude.m4: + * omf.make: + * xmldocs.make: + Removed. + +2006-05-22 Jim Evins + + * src/print.c: (draw_barcode_object): + Don't print "Invalid barcode data" if data field is empty. Patch provided + by Darren Warner . Fixes Bug #1479839. + * AUTHORS: + Added acknowledgment for above patch. + * src/bc-gnubarcode.c: (gl_barcode_gnubarcode_new): + * src/bc-postnet.c: (postnet_code): + Removed "Invalid barcode data" warnings from stderr. + * src/view-barcode.c: (draw_barcode): + Draw box around barcode extent if data empty or invalid. Center a + message whether the data is empty or invalid in box. + +2006-05-22 Jim Evins + + * src/print.c: (draw_text_object): + Check shadow state when printing text. + +2006-05-20 Jim Evins + + * src/ui-commands.c: (gl_ui_cmd_view_grid_toggle), + (gl_ui_cmd_view_markup_toggle): + Fixed crash when grid or markup have been toggled off during + a previous session. Bug #1434324. + +2006-04-05 Jim Evins + + * src/object-editor.c: (gl_object_editor_set_key_names): + Fixed potential crash when freeing empty key list. + +2006-03-11 Jim Evins + + * src/print.c: (draw_text_object): + * src/view-text.c: (gl_view_text_new), + (construct_properties_editor), (update_object_from_editor_cb), + (update_editor_from_object_cb), (update_editor_from_label_cb), + (draw_hacktext): + Added shadow support to text object. + +2006-02-18 Jim Evins + + * src/print.c: (draw_line_object): + * src/view-line.c: (gl_view_line_new), + (construct_properties_editor), (update_canvas_item_from_object_cb), + (update_object_from_editor_cb), (update_editor_from_object_cb), + (update_editor_from_label_cb): + Added shadow support to line object. + +2006-02-16 Jim Evins + + * src/view-box.c: + Comment changes. + * src/print.c: (draw_ellipse_object): + * src/view-ellipse.c: (gl_view_ellipse_new), + (construct_properties_editor), (update_canvas_item_from_object_cb), + (update_object_from_editor_cb), (update_editor_from_object_cb), + (update_editor_from_label_cb): + Added shadow support to ellipse object. + +2006-02-15 Jim Evins + + * src/label-object.c: + Changed default shadow offsets. + * src/view-box.c: (gl_view_box_new): + Simplified gl_view_box_new() so that is does not duplicate code + in update_canvas_item_from_object_cb(). + +2006-02-07 Jim Evins + + * data/glade/object-editor.glade: + Fixed color groups of color combos. + * src/color.h: + Added default shadow color. + * src/object-editor.c: (gl_object_editor_construct_color_combo): + Added shadow color group. + +2006-02-06 Jim Evins + + * src/object-editor-shadow-page.c: + Forgot to add this file. + * src/view-box.c: (gl_view_box_new), + (update_canvas_item_from_object_cb), (update_editor_from_label_cb): + Update limits on shadow offset spinbuttons. + +2006-01-19 Jim Evins + + * src/merge-evolution.c: (gl_merge_evolution_get_key_list): + Initialize key_list to NULL. + * data/glade/object-editor.glade: + * src/Makefile.am: + * src/color.c: + * src/color.h: + * src/label-object.c: + * src/label-object.h: + * src/object-editor-fill-page.c: + * src/object-editor-private.h: + * src/object-editor.c: + * src/object-editor.h: + * src/xml-label.c: + Created infrastructure for shadow support. + * src/view-box.c: + * src/print.c: + Initial shadow support in box object only. + +2006-01-05 Jim Evins + + * src/merge-properties-dialog.c: (src_changed_cb): + Be extra paranoid before calling strcmp(). + * src/merge.c: (gl_merge_set_src): + Don't make (merge == NULL) a critical error. + +2005-12-22 Jim Evins + + * src/glabels-batch.c: (main): + Compile warning free with gcc 4.0. + +2005-12-21 Jim Evins + + * glabels.spec.in: + Updated example RPM spec file. + +2005-12-21 Jim Evins + + * NEWS: + * configure.in: + Preparation for 2.1.2. + +2005-12-20 Jim Evins + + * src/Makefile.am: + Define unique G_LOG_DOMAIN for glabels. + * src/critical-error-handler.c: (gl_critical_error_handler_init): + * src/warning-handler.c: (gl_warning_handler_init), + (warning_handler): + Register for G_LOG_DOMAIN instead of NULL. + +2005-12-10 Jim Evins + + * src/merge-evolution.c: + * src/merge-vcard.c: + Fixed indentation. + +2005-12-08 Jim Evins + + * libglabels/paper.c: (read_paper_files_from_dir): + * libglabels/template.c: (gl_template_register), + (read_template_files_from_dir): + * libglabels/xml-paper.c: (gl_xml_paper_read_papers_from_file), + (gl_xml_paper_parse_papers_doc): + * libglabels/xml-template.c: + (gl_xml_template_read_templates_from_file), + (gl_xml_template_parse_templates_doc), + (gl_xml_template_parse_template_node), + (xml_parse_label_rectangle_node), (xml_parse_label_round_node), + (xml_parse_label_cd_node), (xml_parse_layout_node), + (xml_parse_markup_margin_node), (xml_parse_markup_line_node), + (xml_parse_markup_circle_node), + (gl_xml_template_write_templates_to_file), (xml_create_label_node): + * libglabels/xml.c: (gl_xml_get_prop_length): + Re-classified g_warnings to g_messages. + * src/Makefile.am: + * src/glabels.c: (main): + * src/warning-handler.c: (gl_warning_handler_init), + (warning_handler): + * src/warning-handler.h: + Added warning message handler to make sure the user is + presented with appropriate non-fatal errors. + * src/critical-error-handler.c: (critical_error_handler): + Changed exit to abort. + * src/bc-gnubarcode.c: (gl_barcode_gnubarcode_new), (render_pass1): + * src/bc-postnet.c: (postnet_code): + * src/bc.c: (id_to_index), (name_to_index): + * src/merge.c: (gl_merge_register_backend), (gl_merge_new): + * src/object-editor.c: (gl_object_notebook_construct_valist): + * src/prefs-dialog.c: (update_locale_page_from_prefs): + * src/prefs.c: (gl_prefs_get_units_per_point), + (gl_prefs_get_units_precision), (gl_prefs_get_units_step_size), + (gl_prefs_get_units_string): + * src/print.c: (draw_outline), (clip_to_outline), (clip_punchouts): + * src/splash.c: (gl_splash): + * src/ui-commands.c: (gl_ui_cmd_help_contents): + * src/view-highlight.c: (gl_view_highlight_new), + (highlight_resizable_box_construct), (object_changed_cb), + (view_scale_changed_cb): + * src/view.c: (draw_label_layer), (draw_bg_fg_layers), + (draw_markup_layer), (draw_markup_margin), + (gl_view_object_create_mode), (canvas_event), + (selection_received_cb): + * src/wdgt-mini-preview.c: (mini_outline_list_new): + * src/wdgt-rotate-label.c: (mini_preview_canvas_update): + * src/xml-label-04.c: (gl_xml_label_04_parse), + (xml04_parse_media_description), (xml04_parse_text_props), + (xml04_parse_barcode_props): + * src/xml-label-191.c: (gl_xml_label_191_parse), + (xml191_parse_objects), (xml191_parse_object), + (xml191_parse_text_props), (xml191_parse_image_props), + (xml191_parse_barcode_props), (xml191_parse_data), + (xml191_parse_sheet), (xml191_parse_label), (xml191_parse_layout), + (xml191_parse_markup): + * src/xml-label.c: (gl_xml_label_open), (gl_xml_label_open_buffer), + (xml_doc_to_label), (xml_parse_label), (xml_parse_objects), + (xml_parse_object_text), (xml_parse_object_image), + (xml_parse_object_barcode), (xml_parse_data), + (xml_parse_toplevel_span), (gl_xml_label_save), + (xml_create_objects): + Re-classified g_warnings to g_messages. + * src/merge-evolution.c: (gl_merge_evolution_open), + (gl_merge_evolution_close), (gl_merge_evolution_get_record): + Use g_warning to output errors encountered while + communicating with the evolution data server + instead of embedding them in the data. + +2005-12-08 Jim Evins + + * libglabels/libglabels-private.h: + Set G_LOG_DOMAIN + * libglabels/paper.c: (read_papers): + * libglabels/template.c: (read_templates): + Made appropriate warnings critical. + * src/Makefile.am: + * src/critical-error-handler.h: + * src/critical-error-handler.c: (gl_critical_error_handler_init), + (critical_error_handler): + Created critical error handler. + * src/glabels.c: (main): + Register critical error handler. + * src/merge-properties-dialog.c: (gl_merge_properties_dialog_init): + * src/object-editor.c: (gl_object_editor_init): + * src/prefs-dialog.c: (gl_prefs_dialog_init): + * src/template-designer.c: (gl_template_designer_init): + * src/ui-property-bar.c: (gl_ui_property_bar_instance_init): + Made appropriate warnings critical. + +2005-11-27 Jim Evins + + * src/merge-evolution.c: (gl_merge_evolution_get_key_list), + (gl_merge_evolution_get_primary_key), + (gl_merge_evolution_get_record): + Don't create "record_key" pseudo-key. Don't populate + fields with null data. + +2005-11-25 Jim Evins + + * src/merge-evolution.c: (gl_merge_evolution_finalize), + (gl_merge_evolution_get_key_list), (gl_merge_evolution_open), + (gl_merge_evolution_get_record), (gl_merge_evolution_copy), + (free_field_list): + Query EDS for all supported fields. Patch provided by + Austin Henry . + +2005-10-29 Jim Evins + + * src/glabels.c: (main): + * src/label-barcode.c: (gl_label_barcode_finalize): + * src/label-text.c: (gl_label_text_finalize), (set_font_family): + * src/label.c: (gl_label_instance_init), (gl_label_finalize): + * src/object-editor.c: (gl_object_editor_finalize): + Another pass at valgrinding -- plugged several memory leaks. + * src/view-text.c: (gl_view_text_new), + (update_canvas_item_from_object_cb), (draw_hacktext): + Commented out artifacts of edit-in-place code. + +2005-10-28 Jim Evins + + * src/canvas-hacktext.c: (gl_canvas_hacktext_set_arg): + Fixed use of uninitialized variable. Caught by + d binderman . + +2005-10-27 Jim Evins + + * src/merge-evolution.c: (gl_merge_evolution_get_record): + * src/merge-vcard.c: (gl_merge_vcard_get_record), + (parse_next_vcard): + Additional cleanup of EDS and vcard backends. Provided by + Austin Henry . + +2005-10-24 Jim Evins + + * AUTHORS: + * src/Makefile.am: + * src/merge-evolution.c: + * src/merge-evolution.h: + * src/merge-init.c: (gl_merge_init): + * src/merge-properties-dialog.c: (type_changed_cb): + * src/merge-vcard.c: + * src/merge-vcard.h: + * src/ui-commands.c: (gl_ui_cmd_help_about): + Added Evolution Data Server and VCard merge backends. Original patch + provided by Austin Henry . + * configure.in: + Only support EDS and VCard backends if libebook is installed. Allow + user to disable support, even if installed. + +2005-10-24 Jim Evins + + * AUTHORS: + * data/templates/avery-iso-templates.xml: + * data/templates/avery-us-templates.xml: + * data/templates/misc-iso-templates.xml: + * data/templates/zweckform-iso-templates.xml: + Collected all template changes and submissions since last + release. + +2005-10-23 Jim Evins + + * configure.in: + * data/mime/Makefile.am: + Added configure options to disable update-mime-database and + update-desktop-database as part of the install. Patch + provided by Leonardo Boshell (qhoracio@sourceforge.net). + +2005-10-23 Jim Evins + + * libglabels/xml.h: + * libglabels/xml.c: (gl_xml_get_prop_string), + (gl_xml_get_prop_i18n_string), (gl_xml_set_prop_string), + (gl_xml_is_node), (gl_xml_get_node_content): + Added new XML utility functions. + * libglabels/xml-paper.c: + * libglabels/xml-template.c: + * src/xml-label.c: + Cleanup by using new xml utilities created above. + * libglabels/paper.c: (gl_paper_free): + * src/file.c: (new_response): + * src/object-editor-image-page.c: (add_image_filters_to_chooser): + * src/pixbuf-cache.c: (gl_pixbuf_cache_add_pixbuf), + (gl_pixbuf_cache_get_pixbuf): + * src/ui-property-bar.c: + (gl_ui_property_bar_construct_color_combo): + * src/view-highlight.c: (gl_view_highlight_finalize): + * src/view-image.c: (update_object_from_editor_cb): + * src/view.c: (gl_view_finalize), (draw_bg_fg_layers), + (draw_bg_fg_rounded_rect), (draw_bg_fg_round), (draw_bg_fg_cd), + (draw_bg_fg_cd_bc), (draw_markup_layer), (draw_markup_margin), + (draw_markup_margin_rect), (draw_markup_margin_rounded_rect), + (draw_markup_margin_round), (draw_markup_margin_cd), + (draw_markup_margin_cd_bc): + * src/wdgt-mini-preview.c: (mini_outline_list_new): + * src/wdgt-rotate-label.c: (gl_wdgt_rotate_label_finalize): + Plugged various memory leaks located with valgrind. + * src/view-image.c: (update_canvas_item_from_object_cb): + Don't allow a width or height of zero when drawing pixbuf. + +2005-10-22 Jim Evins + + * libglabels/xml-paper.c: + * libglabels/xml-template.c: + * libglabels/xml.c: + * src/base64.c: + * src/bc-gnubarcode.c: + * src/canvas-hacktext.c: + * src/label-text.c: + * src/object-editor-data-page.c: + * src/print-dialog.c: + * src/print.c: + * src/recent.c: + * src/template-designer.c: + * src/text-node.c: + * src/ui-property-bar.c: + * src/ui.c: + * src/view-barcode.c: + * src/view-box.c: + * src/view-ellipse.c: + * src/view-image.c: + * src/view-line.c: + * src/view-text.c: + * src/view.c: + * src/wdgt-media-select.c: + * src/xml-label-04.c: + * src/xml-label-191.c: + * src/xml-label.c: + Modified to compile warning free with gcc-4.0. Mostly + casting to change signedness of characters. Did not + attack gnu-barcode library yet. + +2005-10-22 Jim Evins + + * src/glabels.c: (main): + * src/splash.c: (gl_splash): + Removed some small memory leaks. + * gtk-doc.make: + Added. + +2005-09-19 Jim Evins + + * data/glade/property-bar.glade: + Remove items from font_family_combo. This prevents the + double entry after adding text model and list of fonts. + * src/ui-property-bar.c: (reset_to_default_properties): + Free font_family_list. + +2005-07-01 Jim Evins + + * po/it.po: + Updated italian translation (Daniele Medri) + +2005-06-26 Jim Evins + + * docs/libglabels/libglabels-decl-list.txt: + Somehow never got checked in before. + * docs/libglabels/libglabels.types: + Removed -- don't need it afterall. + +2005-06-20 Jim Evins + + * NEWS: + Final prep for 2.1.1 release. + +2005-06-20 Jim Evins + + * configure.in: + Final preps for 2.1.1 release. + * docs/libglabels/libglabels.types: + Somehow never got checked in before. + * po/POTFILES.in: + Bring up-to-date with recent reorg of ui code. + + +2005-06-19 Jim Evins + + * src/template-designer.c: (construct_layout_page): + Removed attempt to match background color of mini preview widget to + background. + +2005-06-17 Jim Evins + + * help/C/figures/merge-ex2-4.png: + * help/C/glabels.xml: + Fixed spelling error. + +2005-06-13 Jim Evins + + * help/C/figures/merge-ex1-1.png: + * help/C/figures/merge-ex1-2.png: + * help/C/figures/merge-ex1-3.png: + * help/C/figures/merge-ex1-4.png: + * help/C/figures/merge-ex2-1.png: + * help/C/figures/merge-ex2-2.png: + * help/C/figures/merge-ex2-3.png: + * help/C/figures/merge-ex2-4.png: + Added figures for document merge tutorial. + * help/C/glabels.xml: + Added document merge tutorial. + +2005-05-19 Jim Evins + + * data/glade/merge-properties-dialog.glade: + Fixed irregular spacing. + * src/merge-properties-dialog.c: (gl_merge_properties_dialog_init), + (gl_merge_properties_dialog_construct): + Set outer padding and remove separator. + +2005-05-18 Jim Evins + + * src/hig.h: + * src/hig.c: + Removed glHigDialog class. + * src/file.c: (gl_file_new), (create_new_dialog_widgets), + (gl_file_properties), (create_properties_dialog_widgets): + * src/prefs-dialog.h: + * src/prefs-dialog.c: (gl_prefs_dialog_get_type), + (gl_prefs_dialog_init), (gl_prefs_dialog_construct): + * src/print-dialog.h: + * src/prefs-dialog.h: + * src/print-dialog.c: (gl_print_dialog_get_type), + (gl_print_dialog_init), (gl_print_dialog_construct): + Replaced all instances of glHigDialog with GtkDialog. + +2005-05-17 Jim Evins + + * src/hig.h: + * src/hig.c: + Removed HigAlert class since it is obsoleted by the GtkMessageDialog class. + * src/file.c: (open_response), (gl_file_open_real), (gl_file_save), + (save_as_response), (gl_file_close): + Replaced all instances of HigAlert widgets with GtkMessageDialog widgets. + +2005-05-15 Jim Evins + + * src/ui-commands.h: + * src/ui-util.c: + * src/ui-util.h: + * src/ui.c: + * src/ui.h: + * src/view.c: + * src/window.c: + * src/window.h: + A little code reformatting -- no functional changes. + +2005-05-14 Jim Evins + + * src/Makefile.am: + Removed obsolete macros. + * src/marshal.list: + Added marshalling template to support new view signal: "context_menu_activate." + * src/view.h: + * src/view.c: (gl_view_class_init), (gl_view_construct), + (canvas_event_arrow_mode): + - Removed hardcoded context menus and added new signal "context_menu_activate" + to push this up to the uimanager. + - Removed merge properties and print dialogs so that they can be managed with + the window by the uimanager. + * src/merge-properties-dialog.h: + * src/merge-properties-dialog.c: (gl_merge_properties_dialog_new), + (gl_merge_properties_dialog_construct): + Changed calling convention of gl_merge_properties_dialog_new() to use + glLabel and GtkWindow instead of view to make more consistent with other + dialogs. + * src/print-dialog.h: + * src/print-dialog.c: (gl_print_dialog_new), + (gl_print_dialog_construct): + Removed last artifact of libbonoboui. + * src/ui-commands.c: (gl_ui_cmd_file_print), + (gl_ui_cmd_objects_merge_properties), (gl_ui_cmd_help_about): + Reconciled style for launching dialogs. + * src/ui.c: (gl_ui_new): + Added context menus to ui manager. + * src/view-object.c: (item_event_arrow_mode): + No longer try to select objects with right-click. + * src/window.h: + * src/window.c: (gl_window_init), (gl_window_set_label), + (context_menu_activate_cb): + Context menus and all dialogs are now managed in a consistent way in window + by the ui manager. + +2005-05-11 Jim Evins + + * src/window.h: + * src/window.c: (gl_window_init), (gl_window_destroy): + * src/ui.c: (gl_ui_new), (gl_ui_unref), (recent_tooltip_func): + * src/ui-commands.c: (gl_ui_cmd_file_open_recent): + Moved management of recent_view back from window.c to ui.c -- it just feels + better there. + +2005-05-10 Jim Evins + + * src/window.h: + * src/window.c: (gl_window_init): + * src/ui.h: + * src/ui.c: (gl_ui_new), (connect_proxy_cb), (disconnect_proxy_cb), + (menu_item_select_cb), (menu_item_deselect_cb): + Added GtkStatusbar which displays menu tooltips. + +2005-05-09 Jim Evins + + Replaced libbonoboui with GtkUIManager for creation of basic user interface menus + and toolbars. + + * configure.in: + * glabels.spec.in: + Removed dependencies on libbonoboui. + * data/Makefile.am: + * data/ui/Makefile.am: + * data/ui/glabels-ui.xml: + Removed data/ui directory. + * data/glade/Makefile.am: + * data/property-bar.glade: + Added glade description of property-bar for new libglade implementation + of glUIPropertyBar. + * src/Makefile.am: + * src/commands.h: + * src/commands.c: + * src/tools.h: + * src/tools.c: + * src/ui-commands.h: + * src/ui-commands.c: + Replaced commands.[ch] and tools.[ch] with the single ui-commands.[ch] module + since the distinction between "commands" and "tools" is no longer that clear. + * src/file.h: + * src/file.c: + Modified to expect glWindow instead of GtkWindow. gl_file_open_recent() + no longer has knowledge of eggRecent*. + * src/glabels.c: (main): + Removed libbonobo initialization and replaced bonobo_main loop with gtk_main + loop. + * src/object-editor.c: (gl_object_editor_init): + Make sure notebook does not respond to a "show_all" on the parent. + * src/recent-files/Makefile.am: + * src/recent-files/*.[ch] + Updated from latest version of libegg which now has a view based on + GtkUIManager. Removed unused bonobo and gtk views. + * src/ui-property-bar.h: + * src/ui-property-bar.c: + New implementation based on libglade. + * src/ui-sidebar.h: + * src/ui-sidebar.c: + Sidebar is now simply a GtkWidget and does not expect to be a part of + a libbonoboui interface. + * src/ui-util.h: + * src/ui-util.c: + * src/ui.h: + * src/ui.c: + Converted for use with GtkUIManager. + * src/window.h: + * src/window.c: + Now derived from GtkWindow instead of BonoboWindow and uses GtkUIManager + to create menus and toolbars. + +2005-04-25 Jim Evins + + * data/templates/misc-iso-templates.xml: + Added Fellows 04715 template provided by Steve Saxon. + * AUTHORS: + Updated acknowledgement for above. + +2005-04-23 Jim Evins + + * src/util.c: (gl_util_combo_box_set_strings): + Make sure to clear model before loading a new list of strings. + * src/wdgt-media-select.h: + * src/wdgt-media-select.c: (gl_wdgt_media_select_instance_init), + (gl_wdgt_media_select_construct), (page_size_combo_changed_cb), + (template_combo_changed_cb), (prefs_changed_cb), + (gl_wdgt_media_select_get_name), (gl_wdgt_media_select_set_name), + (gl_wdgt_media_select_get_page_size), + (gl_wdgt_media_select_set_page_size): + Replaced the deprecated GtkCombo widget with the new + GtkComboBox. + +2005-04-21 Jim Evins + + * data/glade/template-designer.glade: + * src/template-designer.c: (construct_pg_size_page), + (pg_size_page_changed_cb), (build_template): + Replaced the deprecated GtkCombo widget with the new + GtkComboBox. + +2005-04-20 Jim Evins + + * data/glade/prefs-dialog.glade: + * src/prefs-dialog.c: (construct_object_page), + (update_object_page_from_prefs), (update_prefs_from_object_page): + Replaced the deprecated GtkCombo widget with the new + GtkComboBox. + +2005-04-19 Jim Evins + + * data/glade/object-editor.glade: + * src/object-editor-bc-page.c: (gl_object_editor_prepare_bc_page), + (style_changed_cb), (gl_object_editor_set_bc_style), + (gl_object_editor_get_bc_style), (gl_object_editor_set_bc_color), + (gl_object_editor_get_bc_color): + * src/object-editor-data-page.c: + (gl_object_editor_prepare_data_page), (gl_object_editor_set_data), + (gl_object_editor_get_data): + * src/object-editor-edit-page.c: + (gl_object_editor_prepare_edit_page), (insert_button_cb): + * src/object-editor-fill-page.c: + (gl_object_editor_prepare_fill_page), + (gl_object_editor_set_fill_color), + (gl_object_editor_get_fill_color): + * src/object-editor-image-page.c: + (gl_object_editor_prepare_image_page), + (gl_object_editor_set_image), (gl_object_editor_get_image): + * src/object-editor-line-page.c: + (gl_object_editor_prepare_line_page), + (gl_object_editor_set_line_color), + (gl_object_editor_get_line_color): + * src/object-editor-private.h: + * src/object-editor-text-page.c: + (gl_object_editor_prepare_text_page), + (gl_object_editor_set_font_family), + (gl_object_editor_get_font_family), + (gl_object_editor_set_text_color), + (gl_object_editor_get_text_color): + * src/object-editor.c: (gl_object_editor_set_key_names): + * src/ui-sidebar.c: + In the object editor: replaced all instances of the deprecated + GtkCombo widget with the new GtkComboBox. + +2005-04-18 Jim Evins + + * src/stock.c: + Neglected to save this one in previous checkin to support + header cleanup. + +2005-04-17 Jim Evins + + * libglabels/libglabels-private.h: + * libglabels/paper.c: + * libglabels/paper.h: + * libglabels/template.c: + * libglabels/template.h: + * libglabels/xml-paper.c: + * libglabels/xml-paper.h: + * libglabels/xml-template.c: + * libglabels/xml.c: + * libglabels/xml.h: + * src/base64.c: + * src/base64.h: + * src/bc-gnubarcode.c: + * src/bc-postnet.c: + * src/bc.c: + * src/bc.h: + * src/commands.c: + * src/debug.c: + * src/debug.h: + * src/file.c: + * src/file.h: + * src/hig.c: + * src/hig.h: + * src/label-barcode.c: + * src/label-box.c: + * src/label-ellipse.c: + * src/label-image.c: + * src/label-image.h: + * src/label-line.c: + * src/label-object.c: + * src/label-text.c: + * src/label-text.h: + * src/label.c: + * src/merge-properties-dialog.c: + * src/object-editor-bc-page.c: + * src/object-editor-data-page.c: + * src/object-editor-edit-page.c: + * src/object-editor-fill-page.c: + * src/object-editor-image-page.c: + * src/object-editor-line-page.c: + * src/object-editor-lsize-page.c: + * src/object-editor-position-page.c: + * src/object-editor-private.h: + * src/object-editor-size-page.c: + * src/object-editor-text-page.c: + * src/object-editor.c: + * src/object-editor.h: + * src/pixbuf-cache.h: + * src/prefs-dialog.c: + * src/prefs-dialog.h: + * src/prefs-model.c: + * src/prefs-model.h: + * src/prefs.c: + * src/print-dialog.c: + * src/print-dialog.h: + * src/print.c: + * src/print.h: + * src/recent.c: + * src/recent.h: + * src/splash.c: + * src/splash.h: + * src/stock.h: + * src/template-designer.c: + * src/template-designer.h: + * src/text-node.h: + * src/tools.c: + * src/ui-property-bar.c: (gl_ui_property_bar_construct): + * src/ui-sidebar.c: + * src/ui-util.c: + * src/ui.c: + * src/util.c: + * src/util.h: + * src/view-barcode.c: + * src/view-box.c: + * src/view-ellipse.c: + * src/view-highlight.c: + * src/view-highlight.h: + * src/view-image.c: + * src/view-line.c: + * src/view-object.c: + * src/view-object.h: + * src/view-text.c: + * src/view.c: + * src/view.h: + * src/wdgt-chain-button.c: + * src/wdgt-media-select.c: + * src/wdgt-media-select.h: + * src/wdgt-mini-preview.c: + * src/wdgt-mini-preview.h: + * src/wdgt-print-copies.c: + * src/wdgt-print-copies.h: + * src/wdgt-print-merge.c: + * src/wdgt-print-merge.h: + * src/wdgt-rotate-label.c: + * src/wdgt-rotate-label.h: + * src/window.c: + * src/window.h: + * src/xml-label-04.c: + * src/xml-label-191.c: + * src/xml-label.c: + Cleanup of header files: + - all header files are now stand-alone, verified by including + first in corresponding "c" files + - replaced blanket includes of gnome, gtk, and glib with + targetted includes + +2005-04-16 Jim Evins + + * data/glade/Makefile.am: + * data/glade/merge-properties-dialog.glade: + Added merge properties dialog glade description file. + * src/merge-properties-dialog.h: + * src/merge-properties-dialog.c: + (gl_merge_properties_dialog_get_type), + (gl_merge_properties_dialog_init), + (gl_merge_properties_dialog_finalize), + (gl_merge_properties_dialog_new), + (gl_merge_properties_dialog_construct), (type_changed_cb), + (src_changed_cb), (response_cb), (load_tree), + (record_select_toggled_cb), (select_all_button_clicked_cb), + (unselect_all_button_clicked_cb): + Modified merge properties dialog to use libglade. Added + "select all" and "unselect all" buttons. + * src/merge-text.c: (parse_line): + Handle empty lines better. + * src/merge.c: (gl_merge_eval_key): + Evaluate the key whether the record is selected or not. + * src/util.h: + * src/util.c: (gl_util_combo_box_add_text_model): + Since libglade does not use the gtk_combo_box_new_text() + constructor for GtkComboBoxes, a utility function was created + to add an appropriate text model to a GtkComboBox. + * src/view.c: (gl_view_edit_merge_props): + Removed unnecessary "show all's". + +2005-04-15 Jim Evins + + * po/ru.po: + Updated russian translation (Vitaly Lipatov) + * data/templates/misc-iso-templates.xml: + Added templates for russian business cards provided by Vitaly Lipatov. + * AUTHORS: + Updated acknowledgements for above. + +2005-04-15 Jim Evins + + * data/templates/avery-us-templates.xml: + Added Avery 5388 and 5389 templates provided by Peter L. Berghold. + * data/templates/misc-iso-templates.xml: + Added Ryman standard CD/DVD template, provided by Dan Clark. + * AUTHORS: + Added acknowledgements for above. + +2005-04-10 Jim Evins + + * libglabels/xml-paper.c: (gl_xml_paper_parse_paper_node): + * libglabels/xml-template.c: (gl_xml_template_parse_template_node), + (xml_parse_label_rectangle_node), (xml_parse_label_round_node), + (xml_parse_label_cd_node), (xml_parse_alias_node): + * libglabels/xml.c: (gl_xml_get_prop_double), + (gl_xml_get_prop_boolean), (gl_xml_get_prop_int), + (gl_xml_get_prop_uint), (gl_xml_get_prop_length): + * src/xml-label-04.c: (xml04_parse_media_description), + (xml04_parse_text_props), (xml04_parse_barcode_props), + (xml04_parse_merge_properties): + * src/xml-label-191.c: (xml191_parse_object), + (xml191_parse_text_props), (xml191_parse_barcode_props), + (xml191_parse_merge_fields), (xml191_parse_pixdata), + (xml191_parse_sheet), (xml191_parse_label), (xml191_parse_markup), + (xml191_parse_alias): + * src/xml-label.c: (xml_parse_object_text), + (xml_parse_object_barcode), (xml_parse_merge_fields), + (xml_parse_pixdata), (xml_parse_toplevel_span): + Make sure to use xmlFree for anything obtained from libxml + in case libxml and glib use different memory management + space. + +2005-04-08 Jim Evins + + * src/util.h: + * src/util.c: (gl_util_combo_box_set_strings), (search_text_func), + (gl_util_combo_box_set_active_text): + Added utility functions to simplify working with GtkComboBox + widgets in GTK-2.6. + * src/ui-property-bar.h: + * src/ui-property-bar.c: (gl_ui_property_bar_construct), + (reset_to_default_properties), (update_text_properties), + (font_family_changed_cb): + Replaced deprecated GtkCombo with GtkComboBox. + + +2005-04-03 Jim Evins + + * src/Makefile.am: + * src/wdgt-image-select.h: + * src/wdgt-image-select.c: + Removed obsolete wdgt-image-select.[ch] files. + * libglabels/paper.c: (gl_paper_dup): + Fixed rename of parameter introduced during documentation + updates. + * data/glade/object-editor.glade: + * src/object-editor-image-page.c: + (gl_object_editor_prepare_image_page), (img_radio_toggled_cb), + (gl_object_editor_set_image), (gl_object_editor_get_image), + (update_preview_cb), (add_image_filters_to_chooser): + * src/object-editor-private.h: + Replaced deprecated GnomePixmapEntry with + GtkFileChooserButton. + +2005-04-02 Jim Evins + + * src/mygal/mygal-combo-box.c: (deactivate_arrow), + (mygal_combo_box_popup_hide_unconditional), + (mygal_combo_box_popup_hide), (mygal_combo_box_popup_display), + (mygal_combo_toggle_pressed), (mygal_combo_box_init), + (mygal_combo_popup_tear_off), (mygal_combo_set_tearoff_state), + (mygal_combo_tearoff_bg_copy), (mygal_combo_popup_reparent), + (cb_tearable_button_release), (mygal_combo_box_set_tearable): + Renamed all internal gtk_combo functions to mygal_combo + to prevent namespace confusion. + +2005-04-02 Jim Evins + + * src/mygal/color-palette.c: (color_palette_change_custom_color), + (cust_color_set), (color_palette_setup): + * src/mygal/color-palette.h: + Replaced deprecated GnomeColorPicker with GtkColorButton. + +2005-04-02 Jim Evins + + * docs/libglabels/libglabels-sections.txt: + * docs/libglabels/libglabels-undocumented.txt: + * docs/libglabels/tmpl/enums.sgml: + * docs/libglabels/tmpl/paper.sgml: + * docs/libglabels/tmpl/xml-paper.sgml: + * docs/libglabels/tmpl/xml-template.sgml: + * libglabels/enums.h: + * libglabels/paper.c: (gl_paper_dup): + * libglabels/paper.h: + * libglabels/xml-paper.c: + * libglabels/xml-template.c: + More documentation updates for libglabels. + +2005-03-23 Jim Evins + + * INSTALL: + Automatically updated. + * Makefile.am: + * autogen.sh: + * configure.in: + * docs/Makefile.am: + * docs/libglabels/Makefile.am: + * docs/libglabels/libglabels-docs.sgml: + * docs/libglabels/libglabels-sections.txt: + * docs/libglabels/libglabels-undocumented.txt: + * docs/libglabels/tmpl/enums.sgml: + * docs/libglabels/tmpl/libglabels-unused.sgml: + * docs/libglabels/tmpl/libglabels.sgml: + * docs/libglabels/tmpl/paper.sgml: + * docs/libglabels/tmpl/template.sgml: + * docs/libglabels/tmpl/xml-paper.sgml: + * docs/libglabels/tmpl/xml-template.sgml: + * docs/libglabels/tmpl/xml.sgml: + Added basic gtk-doc stuff to support documenting libglabels + API. + * libglabels/xml.c: + Updated function comments with gtk-doc markup. + * missing: + Removed. + +2005-03-22 Jim Evins + + Since the development version now requires gtk-2.6/gnome-2.10, I + have made a first pass at removing deprecations. + + * configure.in: + * libglabels/Makefile.am: + * src/Makefile.am: + Added configure option to turn on X_DISABLE_DEPRECATED flags. + Also removed all remnants of HAVE_FILECHOOSER. + * src/file.c: (gl_file_open_real): + Removed code for old GtkFileSelection. + * libglabels/libglabels-private.h: + * libglabels/paper.c: + * libglabels/template.c: + * libglabels/xml-paper.c: + * libglabels/xml-template.c: + * libglabels/xml.c: + * src/bc.c: + * src/file.c: + * src/glabels-batch.c: + * src/glabels.c: + * src/label.c: + * src/merge-init.c: + * src/merge-properties-dialog.c: + * src/merge.c: + * src/object-editor.c: + * src/prefs-dialog.c: + * src/prefs.c: + * src/print-dialog.c: + * src/print.c: + * src/stock.c: + * src/template-designer.c: + * src/ui-property-bar.c: + * src/ui-sidebar.c: + * src/view-barcode.c: + * src/view-box.c: + * src/view-ellipse.c: + * src/view-image.c: + * src/view-line.c: + * src/view-text.c: + * src/view.c: + * src/wdgt-image-select.c: + * src/wdgt-media-select.c: + * src/wdgt-print-copies.c: + * src/wdgt-print-merge.c: + * src/wdgt-rotate-label.c: + * src/window.c: + * src/xml-label-04.c: + * src/xml-label-191.c: + * src/xml-label.c: + Added '#include " where needed. + Removed any unused '#include "s. + +2005-03-22 Jim Evins + + * src/commands.c: (activate_url), (gl_cmd_help_about): + Replaced GnomeAbout with GtkAboutDialog. Therefore the + development version of glabels now depends on GTK 2.6 and + GNOME 2.10. + * configure.in: + Updated library dependencies. + +2005-02-28 Jim Evins + + * AUTHORS: + * data/templates/misc-iso-templates.xml: + Added 'Ednet 45021' template provided by Ali Akcaagac + . + +2005-02-14 Jim Evins + + * data/templates/avery-us-templates.xml: + Updated templates to use inches instead of points. + * src/print-dialog.c: (printer_page_new): + Changed packing style when adding printer selector widget. This fixes + debian Bug#295274. + +2005-02-13 Jim Evins + + * AUTHORS: + * po/es.po: + Updated spanish translations. (sergio rivadero) + +2005-02-05 Jim Evins + + Some cleanup to libglabels. + + * configure.in: + Updated version to 2.1.1cvs. Added generation of libglabels.pc. + * libglabels/libglabels.pc.in + Created. + * libglabels/enums.h + Created. Currently only contains glUnitsType which provides enumerations + for all possible units of distance. + * libglabels/Makefile.am: + Incorporated new files enums.h and libglabels.pc[.in]. + * libglabels/libglabels.h: + Include enums.h. + * libglabels/template.h: + * libglabels/template.c: (gl_template_layout_new): + Changed parameters nx and ny to gint from gdouble. + * libglabels/xml.h: + * libglabels/xml.c: (gl_xml_get_prop_length), + (gl_xml_set_prop_length), (gl_xml_set_default_units): + Added support for different output units. + * src/prefs-dialog.c: (update_locale_page_from_prefs), + (update_prefs_from_locale_page): + * src/prefs-model.c: (string_to_units), (units_to_string): + * src/prefs-model.h: + * src/prefs.c: (gl_prefs_get_units_per_point), + (gl_prefs_get_units_precision), (gl_prefs_get_units_step_size), + (gl_prefs_get_units_string): + * src/prefs.h: + * src/wdgt-media-select.c: (details_update), (get_label_size_desc): + Reconciled all length enumerations with the new enumerations provided + in libglabels/enums.h. + +2005-02-03 Jim Evins + + * po/cs.po: + Updated Czech translations. (David Makovský and Zbynek Mrkvick) + * po/it.po: + Updated Italian translations. (Daniele Medri) + * AUTHORS: + Updated credits to reflect above translations. + + +2005-01-22 Jim Evins + + * MESSAGE-OF-DOOM: + Added. + * Makefile.am: + Added MESSAGE-OF-DOOM to EXTRA_DIST. + * NEWS: + Final prep for 2.1.0. + * configure.in: + Set version to 2.1.0. Output MESSAGE-OF-DOOM. + * glabels.spec.in: + Added '--remove-original' flag to desktop-file-install, so that there is + only one menu entry. + +2005-01-20 Jim Evins + + * data/glade/object-editor.glade: + - Font family entry should not be editable. + - img_key_entry should have sensitivity=YES, so that it follows the + sensitivity of img_key_combo. + +2005-01-19 Jim Evins + + * AUTHORS: + Give credit to Frederic Ruaudel for the color merge patches. + +2005-01-18 Frederic Ruaudel + + Add support to merge color for all other color attribute (Feature + Requests item #1008635. If the data is invalid, the color used is transparent + (GL_COLOR_NONE). The format for color in merge data file are those accepted + by gdk_color_parse() these include name for a color from rgb.txt, such as + DarkSlateGray, or a hex specification such as #305050. File format has been + changed but backward compatibility is preserved for all format. For + box/ellipse/line, keep attribute "line_color" for static color or replace by + "line_color_field" for merge data. For text/barcode objects, keep attribute + "color" for static color or replace by "color_field" for merge data. In the + edit canvas window, merged color are represented by half-transparent black + line/area. + + * data/dtd/glabels-2.0.dtd: + Added line_color_field to line_attrs. Added color_field to + Object-barcode and Span. + * data/glade/object-editor.glade: + Modify the layout of the editor to add merge possibility to color options + * src/color.c: + Fix a copy/paste error in a comment + * src/color.h: + Add default color for merge color representation in the editor canvas. + * src/label-barcode.c: + * src/object-editor-bc-page.c: + * src/view-barcode.c: + Add merge color support for barcode color. + * src/label-box.c: + * src/view-box.c: + Add merge color support for box border color. + * src/label-ellipse.c: + * src/view-ellipse.c: + Add merge color support for ellipse border color. + * src/label-line.c: + * src/view-line.c: + Add merge color support for line color. + * src/label-object.c: + * src/label-object.h: + * src/object-editor.c: + * src/object-editor.h: + * src/ui-property-bar.c: + * src/view.c: + * src/view.h: + * src/xml-label-04.c: + * src/xml-label-191.c: + Add support for merging to other color attribute. + * src/label-text.c: + * src/object-editor-text-page.c: + * src/view-text.c: + Add merge color support for text color. + * src/object-editor-fill-page.c: + Change a blocked handler that didn't match the good widget. Fix the type + of some debug message. + * src/object-editor-line-page.c: + Add merging support to line color option. + * src/object-editor-private.h: + Add variables for new widget. + * src/print.c: + Modify the draw functions to get merge data if needed. + * src/window.c: + Change the default size of the window in order to see all widget in the + "text style tab" of the editor. + * src/xml-label.c: + Modify the parser to record/retreive the field value for objects that need + "color" attribute. For box/ellipse/line, keep attribute "line_color" for + static color or replace by "line_color_field" for merge data. For + text/barcode objects, keep attribute "color" for static color or replace + by "color_field" for merge data. + +2005-01-17 Jim Evins + + * src/view.c: (screen_changed_cb): + Don't do anything if we don't have a screen. + +2005-01-06 Jim Evins + + * src/view.c: (get_home_scale): + Fixed bad call to gtk_widget_has_screen() -- huh?. + +2005-01-06 Jim Evins + + * data/dtd/glabels-2.0.dtd: + Added fill_color_field to fill_attrs. Also added xmlns attribute to all + top-level elements. + +2005-01-06 Jim Evins + + * data/glade/object-editor.glade: + Set entries for fill and data field key dropdowns to NOT editable. + * src/view-box.c: (construct_properties_editor): + * src/view-ellipse.c: (construct_properties_editor): + Update object editor when label's merge property has changed. + * src/xml-label.c: (xml_parse_object_ellipse): + Completed the merge color support for the ellipse item. + +2005-01-06 Frederic Ruaudel + + Add support to merge color for object that have a "Fill color" attribute (Feature + Requests item #1008635. If the data is invalid, the color used is transparent + (GL_COLOR_NONE). The format for color in merge data file are those accepted + by gdk_color_parse() these include name for a color from rgb.txt, such as + DarkSlateGray, or a hex specification such as #305050. File format has been + changed but backward compatibility is preserved for all format. For box/ellipse, + keep attribute "fill_color" for static color or replace by "fill_color_field" + for merge data. + + * data/glade/object-editor.glade: + Modify "Fill" tab to add the merge key combo and convert the labels into + radio button. + * src/color.h: + * src/color.c: + Add "glColorNode" structure and associated functions to manage it. This + structure is equivalent for color than the "glTextNode". It holds the color + and the key field. + * src/label-object.h: + * src/label-object.c: + * src/label-box.c: + * src/label-ellipse.c: + * src/ui-property-bar.c: + * src/view.h: + * src/view.c: + * src/view-box.c: + * src/view-ellipse.c: + * src/xml-label-04.c: + * src/xml-label-191.c: + Change functions of objects that have a "fill color" attribute to use the + new "glColorNode" structure. Use barcode code as example. + * src/Makefile.am: + Add the color.[ch] file to glabels_batch binary that now need support for + "glColorNode". + * src/object-editor.h: + * src/object-editor.c: + * src/object-editor-fill-page.c: + Manage the new widget of the editor's "Fill" tab : key combo and radio button + to choose between static color or merge key. Use barcode code as example. + * src/object-editor-private.h: + Add new widget in the "_glObjectEditorPrivate" structure. + * src/print.c: + Modify the draw functions to get merge data if needed. + * src/xml-label.c: + Modify the parser to record/retreive the field value for objects that need + "Fill color" attribute. For box/ellipse, put attribute "fill_color" for static + color or "fill_color_field" for merge data. + +2005-01-04 Jim Evins + + * AUTHORS: + * data/templates/avery-iso-templates.xml: + * data/templates/misc-iso-templates.xml: + * data/templates/misc-us-templates.xml: + Added templates, submitted by Larry Harriman, Juan Carlos Valero, and + Nick Hill. + +2004-11-26 Jim Evins + + * AUTHORS: + * po/fr.po: + Updated french translations provided by Florent Morel . + * src/view-barcode.c: + * src/view-box.c: + * src/view-ellipse.c: + * src/view-image.c: + * src/view-line.c: + * src/view-text.c: + Added '#include ' -- HAVE_*GETTEXT macros were not defined and + thus _() strings were not being translated. + +2004-11-14 Jim Evins + + * src/debug.h: + * src/debug.c: (gl_debug_init), (gl_debug): + Borrowed from gedit: use environmental variables to select debug + sections. + * src/splash.c: + Removed unused include of debug.h. + * src/glabels.c: (main): + Added call to gl_debug_init(), and removed debug clutter from command line + options. + * src/glabels-batch.c: (main): + Added call to gl_debug_init(). + +2004-11-13 Jim Evins + + Drawing and property toolbars were being initialized with the "icons and text" + look in Fedora Core 3. Even though none of the buttons had any text attached to + them, the buttons were being sized as if they were. This led to less real estate + for the property editor, leading to Bug #1064630. The + + * data/ui/glabels-ui.xml: + Added explicit "look" property to both drawing and property toolbars. + * src/prefs-model.c: (gl_prefs_model_save_settings), + (gl_prefs_model_load_settings): + * src/prefs-model.h: + Removed drawing_toolbar_button_style configuration parameter. + * src/ui.c: (view_menu_item_toggled_cb), + (set_app_drawing_toolbar_style): + Do not attempt to adjust look property of the drawing toolbar. + +2004-10-28 Jim Evins + + * data/pixmaps/glabels-about-logo.png: + Updated about logo. + +2004-10-28 Jim Evins + + * data/man/glabels.1: + * src/glabels-batch.c: (main): + * src/print.h: + * src/print.c: (gl_print_batch): + + Added option to glabels-batch to select the first label to begin + printing on. + +2004-09-26 Jim Evins + + * data/desktop/glabels.desktop.in: + Point to app icon, "glabels.png" + * data/mime/glabels.keys.in: + Point at mime icon, "glabels-application-x-glabels.png" + * data/pixmaps/Makefile.am: + Added glabels_app_icondir. Renamed icons. + * data/pixmaps/glabels.png: + New cleaned up app icon. Deleted glabels-icon.png. + * data/pixmaps/glabels-application-x-glabels.png: + New mime icon. + * data/pixmaps/glabels-splash.png: + Renamed glabels-logo to glabels-splash to be more correct about role. + * src/glabels.c: + * src/template-designer.c: + Point at app icon, "glabels.png" + * src/splash.c: + Point at renamed splash image, "glabels-splash.png" + +2004-08-22 Jim Evins + + * AUTHORS: + * src/glabels-batch.c: (main): + Applied patch with minor mods to allow selecting merge source and + crop-marks on glabels-batch's command line. Original patch provided by + José Dapena Paz . + +2004-08-15 Jim Evins + + * data/desktop/glabels.desktop.in: + - Added encoding line + - Removed period from comment + - Fixed Terminal line, changed "0" to "false" + - Added semicolen to Categories line + * po/ja.po: + - Made sure desktop.in comment string above still translated properly + +2004-08-14 Jim Evins + + * libglabels/xml-paper.c: (gl_xml_paper_parse_paper_node): + * libglabels/xml-template.c: (gl_xml_template_parse_template_node): + * src/xml-label-191.c: (xml191_parse_sheet): + Fixed improper freeing of gettext strings. Merged from 2.0.1. + * configure.in: + Reconciled libglabels versioning with 2.0.1. + + +2004-08-14 Jim Evins + + * configure.in: + Updated version to 2.1cvs. + +2004-08-14 Jim Evins + + * po/ja.po: + Updated 2.0.x translation by Takeshi AIHANA . + +2004-08-14 Jim Evins + + Fixes for Bug #1008181. + + * src/bc.c: (gl_barcode_default_digits): + Make a format of zero digits, harmless. + * src/xml-label.c: (xml_parse_object_barcode): + Set default value of the format property of barcode objects to 10, not + zero. This will prevent crashes when reading pre 2.0.x files. + +2004-08-09 Jim Evins + + * NEWS: + * TODO: + * help/C/glabels-C.omf: + * help/C/glabels.xml: + Brought documentation up-to-date for 2.0.0 release. + +2004-08-09 Jim Evins + + These are hopefully the final preparations for 2.0.0. + + * data/mime/Makefile.am: + Include glabels.xml in EXTRA_DIST. + * configure.in: + - Updated comment style. + - Added LIBGLABELS_VERSION_INFO macro, updated Current. + - Added package and version info to configuration printout + - Update version to 2.0.0 + * libglabels/Makefile.am: + Use the new LIBGLABELS_VERSION_INFO macro. + +2004-08-09 Jim Evins + + * configure.in: + * glabels.spec.in: + Cleanup of required library macros. + +2004-08-08 Jim Evins + + * glabels.spec.in: + - Updated URL + - More specific of what to install in /usr/bin and /usr/lib + - Remove built mime registration files from staging directory + +2004-08-08 Jim Evins + + * data/mime/Makefile.am: + Fixed typo: key_files should have been keys_files. + +2004-08-08 Jim Evins + + Reorganization of runtime data files. Also added registration of mimetype with + new freedesktop.org mime database if available. + + * data/* + Moved files to appropriate subdirectories, creating local Makefile.am + in each subdirectory. + - Moved paper-sizes.xml and *-templates.xml to templates subdirectory. + These are now installed at $datadir/glabels/templates. + - Moved glabels.1 to man subdirectory. + - Moved glabels-2.0.dtd to dtd subdirectory. + - Moved glabels.desktop.in to desktop subdirectory. + - Moved glabels.keys.in and glabels.mime to mime subdirectory. + * data/pixmaps/* + Moved "./pixmaps" to "./data/pixmaps" + * data/ui/* + Moved src/glabels-ui.xml to data/ui directory. Created Makefile.am. + * data/glade/* + Moved libglade files from src to data/glade. Created Makefile.am. + * Makefile.am: + Removed pixmaps from SUBDIRS. + * configure.in: + - Removed pixmaps from makefiles. + - Added makefiles for new subdirs of data. + - Added tests for freedesktop.org mime database. + * glabels.spec.in: + - Added tests for freedesktop.org mime database for post install and + post un-install actions. + * libglabels/Makefile.am: + Moved system template files to $(datadir)/glabels/templates. + * libglabels/libglabels-private.h: + Moved system template files to $(datadir)/glabels/templates. + * po/POTFILES.in: + - Accounted for movement of ui and libglade files. + - Added missing .in files. + - Reorganized by directory. + * src/Makefile.am: + Accounted for movement of ui and libglade files. + * data/mime/glabels.xml.in: + New file for registering with freedesktop.org mime database. + +2004-08-07 Jim Evins + + * src/recent-files/*: + Re-synced to latest libegg/recent-files. + +2004-08-07 Jim Evins + + * Makefile.am: + * configure.in: + * help/* + Renamed "./doc" directory to "./help" which contains user documentation, + to be more consistent with other GNOME applications. + + +2004-07-26 Jim Evins + + * src/merge-properties-dialog.c: (gl_merge_properties_dialog_init): + Corrected button order of merge properties dialog. + +2004-07-18 Jim Evins + + * data/glabels-2.0.dtd: + * src/bc.c: (gl_barcode_default_digits), (gl_barcode_can_freeform), + (gl_barcode_get_prefered_n): + * src/bc.h: + * src/label-barcode.c: (copy), (gl_label_barcode_set_props), + (gl_label_barcode_get_props), (get_size): + * src/label-barcode.h: + * src/object-editor-bc-page.c: (gl_object_editor_prepare_bc_page), + (style_changed_cb), (gl_object_editor_set_bc_style), + (gl_object_editor_get_bc_style): + * src/object-editor-data-page.c: (data_radio_toggled_cb), + (gl_object_editor_set_data), (gl_object_editor_get_data): + * src/object-editor-private.h: + * src/object-editor.c: (gl_object_editor_set_key_names): + * src/object-editor.glade: + * src/object-editor.h: + * src/print.c: (draw_barcode_object): + * src/view-barcode.c: (update_object_from_editor_cb), + (update_editor_from_object_cb), + (gl_view_barcode_create_event_handler), (draw_barcode): + * src/xml-label-04.c: (xml04_parse_barcode_props): + * src/xml-label-191.c: (xml191_parse_barcode_props): + * src/xml-label.c: (xml_parse_object_barcode), + (xml_create_object_barcode): + Added "format" attribute to barcode objects. This attribute is used + to properly format freeform barcodes barcodes prior to merge data is + applied, so that barcodes can be accurately layed out. This addresses + remaining issues of feature request #824787. Also added an example of + the format in the object editor. + +2004-07-12 Jim Evins + + Various code cleanups. + + * src/label-barcode.c: + Removed unneeded include of gnome-glyphlist.h. + + * src/label-text.c: (get_size): + Fixed memory leak: unref glyphlists when done with them. + + * src/object-editor-bc-page.c: (gl_object_editor_prepare_bc_page): + * src/object-editor-data-page.c: + (gl_object_editor_prepare_data_page): + * src/object-editor-image-page.c: + (gl_object_editor_prepare_image_page): + * src/object-editor-line-page.c: + (gl_object_editor_prepare_line_page): + * src/object-editor-lsize-page.c: + (gl_object_editor_prepare_lsize_page): + * src/object-editor-position-page.c: + (gl_object_editor_prepare_position_page): + * src/object-editor-size-page.c: + (gl_object_editor_prepare_size_page): + * src/object-editor-text-page.c: + (gl_object_editor_prepare_text_page): + Removed unneeded size groups, originally intended to keep widgets aligned. + Now use tables to lay these out in object-editor.glade. + + * src/print.c: (draw_text_object): + Fixed memory leak: unref glyphlists when done with them. + + * src/view-barcode.c: (draw_barcode): + Fixed memory leak: unref glyphlists when done with them. + + * src/view-text.c: (update_object_from_editor_cb), (draw_hacktext): + - Removed unneeded cast of gl_object_editor_get_text_line_spacing()s + return value. + - Fixed memory leak: unref glyphlists when done with them. + +2004-07-11 Jim Evins + + * data/glabels-2.0.dtd: + * src/label-text.c: (gl_label_text_instance_init), (copy), + (gl_label_text_set_auto_shrink), (gl_label_text_get_auto_shrink): + * src/label-text.h: + * src/object-editor-private.h: + * src/object-editor-text-page.c: + (gl_object_editor_prepare_text_page), + (gl_object_editor_set_text_auto_shrink), + (gl_object_editor_get_text_auto_shrink): + * src/object-editor.c: (gl_object_editor_set_key_names): + * src/object-editor.glade: + * src/object-editor.h: + * src/print.c: (draw_text_object): + * src/view-text.c: (update_object_from_editor_cb), + (update_editor_from_object_cb): + * src/xml-label.c: (xml_parse_object_text), + (xml_create_object_text): + Added option to allow document merge to auto shrink text size to fit + within the text box. The code in print.c that actually shrinks the + text is loosely based on a patch submitted by Mark Harrison + . This addresses feature request + #661421. + +2004-07-11 Jim Evins + + * data/glabels-2.0.dtd: + * libglabels/template.c: (gl_template_rect_label_type_new), + (gl_template_round_label_type_new), + (gl_template_cd_label_type_new), (gl_template_label_type_dup), + (template_full_page): + * libglabels/template.h: + * libglabels/xml-template.c: (xml_parse_label_rectangle_node), + (xml_create_label_node): + * pixmaps/ex-rect-size.png: + * src/print.c: (clip_to_outline), (clip_punchouts): + * src/template-designer.c: (construct_rect_size_page), + (rect_size_page_prepare_cb), (layout_page_prepare_cb), + (build_template): + * src/template-designer.glade: + * src/xml-label-191.c: (xml191_parse_label): + Modifications to allow separate horizontal (x_waste) and vertical (y_waste) + properties for rectangular labels. Templates remain backwards compatible, + but this breaks the libglabels API (I don't know of anyone outside of + glabels using libglabels at this time -- what can I say, the program is + is still "unstable"). This addresses the suggestion in Feature Request + #976313. + +2004-07-05 Jim Evins + * src/print.c: (print_crop_marks), (draw_outline): + Changed crop marks and label outlines to black, instead of 25% gray. + This addresses debian Bug #257460. + +2004-07-05 Jim Evins + + * src/object-editor-fill-page.c: (gl_object_editor_set_fill_color): + * src/object-editor-line-page.c: (gl_object_editor_set_line_color): + Preserve "is_default" of fill and line color_combos when creating from + existing objects. + +2004-07-02 Jim Evins + + * data/glabels.1: + Created man page. Based on page submitted by Matthew J. Lockner, however + it has been severely edited. + + * data/avery-other-templates.xml + * data/misc-other-templates.xml: + Started new files for predefined templates with non-standard sheet sizes. + These have been initially populated with the Avery 06141 and + OfficeMax #86112, both provided by Matthew J. Lockner. + + * data/Makefile.am: + Install above manpage and template files. + + * glabels.spec.in: + Make sure we install man pages. + + * src/glabels-batch.c: + Changed short form of help option to '-?' to be consistent with glabels. + + * AUTHORS: + Added acknowledgement for above labels. + +2004-07-02 Jim Evins + + * src/glabels.c: (main), (save_session_cb): + - Now include libbonoboui.h, recent.h, and file.h to provide missing + prototypes. + - save_session_cb() now returns gboolean. + - Minor formatting changes. + + * src/window.h: + * src/window.c: + - Now include file.h to provide missing prototype. + - gl_window_get_type() now returns GType, not guint. I believe this may + ultimately be cause of the segfault reported in Bug #982287, since + GType is actually a gulong, which may not be compatible on other + architectures (64bit) -- I cannot personally test this at this time. + I was sloppy in several other xxx_get_type() functions which also + returned guint -- see next group of files: + + * src/window.c: (gl_window_get_type): + * src/canvas-hacktext.c: (gl_canvas_hacktext_get_type): + * src/canvas-hacktext.h: + * src/hig.c: (gl_hig_alert_get_type), (gl_hig_dialog_get_type), + (gl_hig_category_get_type), (gl_hig_vbox_get_type), + (gl_hig_hbox_get_type): + * src/hig.h: + * src/label-barcode.c: (gl_label_barcode_get_type): + * src/label-barcode.h: + * src/label-box.c: (gl_label_box_get_type): + * src/label-box.h: + * src/label-ellipse.c: (gl_label_ellipse_get_type): + * src/label-ellipse.h: + * src/label-image.c: (gl_label_image_get_type): + * src/label-image.h: + * src/label-line.c: (gl_label_line_get_type): + * src/label-line.h: + * src/label-object.c: (gl_label_object_get_type): + * src/label-object.h: + * src/label-text.c: (gl_label_text_get_type): + * src/label-text.h: + * src/label.c: (gl_label_get_type): + * src/label.h: + * src/merge-properties-dialog.c: + (gl_merge_properties_dialog_get_type): + * src/merge-properties-dialog.h: + * src/merge-text.c: (gl_merge_text_get_type): + * src/merge-text.h: + * src/merge.c: (gl_merge_get_type): + * src/merge.h: + * src/object-editor.c: (gl_object_editor_get_type): + * src/prefs-dialog.c: (gl_prefs_dialog_get_type): + * src/prefs-dialog.h: + * src/prefs-model.c: (gl_prefs_model_get_type): + * src/prefs-model.h: + * src/print-dialog.c: (gl_print_dialog_get_type): + * src/print-dialog.h: + * src/template-designer.c: (gl_template_designer_get_type): + * src/template-designer.h: + * src/ui-property-bar.c: (gl_ui_property_bar_get_type): + * src/ui-property-bar.h: + * src/ui-sidebar.c: (gl_ui_sidebar_get_type): + * src/ui-sidebar.h: + * src/view-barcode.c: (gl_view_barcode_get_type): + * src/view-barcode.h: + * src/view-box.c: (gl_view_box_get_type): + * src/view-box.h: + * src/view-ellipse.c: (gl_view_ellipse_get_type): + * src/view-ellipse.h: + * src/view-highlight.c: (gl_view_highlight_get_type): + * src/view-highlight.h: + * src/view-image.c: (gl_view_image_get_type): + * src/view-image.h: + * src/view-line.c: (gl_view_line_get_type): + * src/view-line.h: + * src/view-object.c: (gl_view_object_get_type): + * src/view-object.h: + * src/view-text.c: (gl_view_text_get_type): + * src/view-text.h: + * src/view.c: (gl_view_get_type): + * src/view.h: + * src/wdgt-chain-button.c: (gl_wdgt_chain_button_get_type): + * src/wdgt-image-select.c: (gl_wdgt_image_select_get_type): + * src/wdgt-image-select.h: + * src/wdgt-media-select.c: (gl_wdgt_media_select_get_type): + * src/wdgt-media-select.h: + * src/wdgt-mini-preview.c: (gl_wdgt_mini_preview_get_type): + * src/wdgt-mini-preview.h: + * src/wdgt-print-copies.c: (gl_wdgt_print_copies_get_type): + * src/wdgt-print-copies.h: + * src/wdgt-print-merge.c: (gl_wdgt_print_merge_get_type): + * src/wdgt-print-merge.h: + * src/wdgt-rotate-label.c: (gl_wdgt_rotate_label_get_type): + * src/wdgt-rotate-label.h: + - Made sure all xxx_get_type functions returned GType, not guint. This + was the case in hig.[ch], window.[ch], ui-property-bar.[ch], + ui-sidebar.[ch], view.[ch], wdgt-image-select.[ch], + wdgt-media-select.[ch], wdgt-mini-preview.[ch], wdgt-print-copies.[ch], + wdt-print-merge.[ch], and wdgt-rotate-label.[ch]. See separate + window.[ch] details above for more info. + - Reconciled various coding style differences in all xxx_get_type() + functions: + * All prototypes include G_GNUC_CONST. + * All prototypes specify the return value as GType, not GtkType + or guint. + * Info structures are all declared as "static const." + * Generalized the names of type and info variables. + * Miscelaneous formatting. + +2004-06-08 Jim Evins + + * src/label.c: + * src/label.h: + * src/xml-label.c: + * AUTHORS: + Don't touch compression of original file -- still defaults to 9 for + new files. Original patch provided by Javier Donaire Segarra + (#912252 in patch tracker). + +2004-05-05 Jim Evins + + * data/glabels-2.0.dtd: + Broke DTD previously when adding new barcode types that contain a + plus sign (+). Simply changed the BC_STYLE_TYPE entity to "CDATA" + to avoid the problem. + * data/avery-iso-templates.xml: + * data/zweckform-iso-templates.xml: + * AUTHORS: + Added templates for Avery 7165, Zweckform 3688, 4732, and 6021. Templates + provided by Frank Altpeter. + * libglabels/xml-template.c: (xml_create_label_node): + Reordered markup and layout sub-nodes so that resulting templates will + validate against DTD. + +2004-03-13 Jim Evins + + * src/object-editor-size-page.c: (gl_object_editor_prepare_size_page): + Changed spin callback signals from "value-changed" back to "changed." + This was accidentally introduced in a previous revision, and can cause + size changes just by selecting the size tab. + +2004-03-06 Jim Evins + + * src/view.c: (draw_grid_layer): + For round labels (round and cd) adjust grid so that it lines up with + center of label. Also, no longer draw box around label in the grid layer, + it is hidden by he fg layer anyway. Feature suggested by + nemolivier@free.fr. Although the grid is aligned with the center of the + label, the coordinate system is still relative to the upper left corner + of the rectangle containing the label. + +2004-02-25 Jim Evins + + * configure.in: + Changed version to 2.0pre1cvs + + * libglabels/xml-template.c: (gl_xml_template_parse_templates_doc): + Removed extra xmlFreeDoc() calls upon error. Also print the doc->URL + instead of doc->name fields when errors encountered. + +2004-02-21 Jim Evins + + * data/avery-iso-templates.xml: + Added aliases for Avery 8651. Patch provided by Wayne Schuller. + + * glabels.spec.in: + Added libglabels library and include file to installed files. + + * configure.in: + Final prep for 1.93.3. + +2004-02-20 Jim Evins + + * src/glabels-batch.c: (main): + Changed key for setting output filename to GNOME_PRINT_KEY_OUTPUT_FILENAME + as suggested by Javier Donaire Segarra. This addresses bug #901063. + +2004-02-16 Jim Evins + + * configure.in: + If gtk+ >= 2.3.2 then define HAVE_FILE_CHOOSER. + + * src/Makefile.am: + Added HAVE_FILE_CHOOSER to INCLUDES. + + * src/file.c: (gl_file_open), (open_response), (gl_file_open_real), + (gl_file_save_as), (save_as_response): + Ported to use GtkFileChooserDialog if HAVE_FILE_CHOOSER is defined. + +2004-02-16 Jim Evins + + * src/xml-label-04.c: (xml04_parse_image_props): + * src/xml-label-191.c: (xml191_parse_image_props): + * src/xml-label.c: (xml_parse_object_image): + Delay setting image size until after image has been applied to new + object. + +2004-02-15 Jim Evins + + * src/label-barcode.c: (gl_label_barcode_set_data), + (gl_label_barcode_set_props): + Don't emit "changed" signal, if no change actually made for these + methods. Reduces number of unnecessary redraws of barcodes. + + * src/label-object.h: + * src/label-object.c: (gl_label_object_set_position), + (gl_label_object_set_position_relative), (set_size), + (gl_label_object_set_size), + (gl_label_object_set_size_honor_aspect): + Don't emit "changed" signal, if no change actually made for these + methods. + +2004-02-15 Jim Evins + + * data/glabels-2.0.dtd: + Added specific subtypes for various barcode types. + + * src/bc.h: + * src/bc.c: (id_to_index), (name_to_index), (gl_barcode_new), + (gl_barcode_get_styles_list), (gl_barcode_default_digits), + (gl_barcode_can_text), (gl_barcode_text_optional), + (gl_barcode_can_csum), (gl_barcode_csum_optional), + (gl_barcode_id_to_name), (gl_barcode_name_to_id): + Changed API to use a string id, rather than a fixed enumeration. Id and + name are separate strings. Added entries to backend table for specific + subtypes for various barcode types. + + * src/bc-postnet.h: + * src/bc-postnet.c: (gl_barcode_postnet_new), (postnet_code), + (is_length_valid): + Modified to conform to above API. Now more stringent with data length + for various subtypes. + + * src/bc-gnubarcode.h: + * src/bc-gnubarcode.c: (gl_barcode_gnubarcode_new), + (is_length_valid), (is_length1_valid), (is_length2_valid): + Modified to conform to above API. Now more stringent with data length + for various subtypes. + + * src/label-barcode.h: + * src/label-barcode.c: (copy), (gl_label_barcode_set_props), + (gl_label_barcode_get_props), (get_size): + Modified to use above API for storing barcode type. + + * src/object-editor.h: + * src/object-editor-bc-page.c: (style_changed_cb), + (gl_object_editor_set_bc_style), (gl_object_editor_get_bc_style): + Modified to use above API for storing barcode type. + + * src/object-editor-size-page.c: + (gl_object_editor_prepare_size_page), (aspect_toggle_cb), + (w_spin_cb), (h_spin_cb), (size_reset_cb): + Added debug markers. + + * src/object-editor.glade: + Made barcode style combo's text entry non-editable. + + * src/print.c: (draw_barcode_object): + Modified to use above API for barcode type. + + * src/view-barcode.c: (update_object_from_editor_cb), + (update_editor_from_object_cb), + (gl_view_barcode_create_event_handler), (draw_barcode): + Modified to use above API for barcode type. + + * src/xml-label-04.c: (xml04_parse_barcode_props): + * src/xml-label-191.c: (xml191_parse_barcode_props): + * src/xml-label.c: (xml_parse_object_barcode), + (xml_create_object_barcode): + Modified to use above API for barcode type. + +2004-02-07 Jim Evins + + * src/stock-pixmaps/Makefile.am: + * src/stock-pixmaps/stock_hchain_24.png: + * src/stock-pixmaps/stock_hchain_broken_24.png: + * src/stock-pixmaps/stock_vchain_24.png: + * src/stock-pixmaps/stock_vchain_broken_24.png: + Added chain pixmaps borrowed from the gimp's default theme. + + * src/stock.h: + * src/stock.c: (gl_stock_init), (add_button_icon): + Added above pixmaps to stock icon sets. Created add_button_icon() to + add these pixmaps sized as GTK_ICON_SIZE_BUTTON. + + * src/wdgt-chain-button.h + * src/wdgt-chain-button.c + * src/Makefile.am: + * po/POTFILES.in: + Added this Modified version of gimpchainbutton widget, borrowed from + the gimp. + + * AUTHORS: + Added acknowledgements of the above borrowing from the gimp. + + * src/object-editor-size-page.c: (aspect_toggle_cb), (w_spin_cb), + (h_spin_cb): + * src/object-editor.c: (gl_object_editor_construct_chain_button): + * src/object-editor.glade: + Replaced the keep aspect ratio check box with the above chain-button + widget. + + * src/text-node.c: (gl_text_node_equal): + * src/text-node.h: + Added function gl_text_node_equal() to compare text_nodes. + + * src/label-image.c: (gl_label_image_set_filename): + Replaced incomplete text_node comparison code with invocation of + gl_text_node_equal. This fixed the problem of not being able to + resize an image using the object_editor if the aspect ratio is not + locked. + +2004-02-04 Jim Evins + + * src/object-editor-image-page.c: + (gl_object_editor_prepare_image_page): + Track "changed" signal of pixmap entry's GtkEntry rather than its + "activate" signal -- this catches all changes to the entry rather than + just changes resulting from a browse, so one can easily pull previous + entries from the history. (This change is marked below on 2004-02-03, + but somehow never got checked in.) + + * src/view-highlight.c: (sl_resize_event_handler), + (sr_resize_event_handler), (st_resize_event_handler), + (sb_resize_event_handler): + Side resize handles will now confirm the actual resize that the object + accepted before adjusting position parameters. Previously some interesting + things happened when resizing a barcode to its minimum size. + +2004-02-03 Jim Evins + + * src/object-editor-image-page.c: + (gl_object_editor_prepare_image_page): + Track "changed" signal of pixmap entry's GtkEntry rather than its + "activate" signal -- this catches all changes to the entry rather than + just changes resulting from a browse, so one can easily pull previous + entries from the history. + + * src/view-highlight.c: (tl_resize_event_handler), + (tr_resize_event_handler), (bl_resize_event_handler), + (br_resize_event_handler): + Allow control key to be dropped while dragging a corner resize handle + without losing the aspect ratio lock. + +2004-02-02 Jim Evins + + * src/label-image.c: (gl_label_image_set_filename): + When setting a new filename adjust size such that the aspect ratio of + the image is preserved using the current size as a bounding box. + + * src/view-image.c: (update_object_from_editor_cb): + When updating object from editor, feed back possible size changes to + editor as a result of a possible change in image. + + * src/object-editor-size-page.c: (size_reset_cb): + Fixed typo when blocking spin handlers. If the base size is larger than + the max size, treat max size as a bounding box while keeping aspect + ratio. + + +2004-02-02 Jim Evins + + * src/label-object.h: + * src/label-object.c: (gl_label_object_set_size), + (gl_label_object_set_size_honor_aspect): + Added gl_label_object_set_size_honor_aspect() which will maintain the + current aspect ratio by modifying the supplied w or h apropriately. + + * src/view-highlight.c: (tl_resize_event_handler), + (tr_resize_event_handler), (bl_resize_event_handler), + (br_resize_event_handler): + Corner handles will now maintain the current aspect ratio if the + control key is pressed while resizing. This addresses feature + request #816603. + + +2004-01-31 Jim Evins + + * AUTHORS: + * data/avery-us-templates.xml: + Added entries for "LSK-3," "LSK-5," and "LSK-8." Submitted by JBadger. + + * libglabels/template.c: (read_template_files_from_dir): + Corrected problem with testing for extensions. + + * src/object-editor.glade: + Corrected grouping of radio buttons in barcode data page. + + * src/print.c: (draw_barcode_object): + * src/view-barcode.c: (draw_barcode): + Corrected problem with calculation of y_offset for locating characters. + +2004-01-24 Jim Evins + + * AUTHORS: + * data/avery-us-templates.xml: + Added Avery 5824, submitted by Fred Bacon. + +2004-01-20 Jim Evins + + Catching up on a couple of backlogged user template submissions. + + * data/avery-iso-templates.xml: + Added "DECAdry OLW-4731" and "DECAdry DLW-1731" aliases for Avery 7160. + Suggested by Linas Jakucionis. + + * data/zweckform-iso-templates.xml: + Added Zweckform 4760, submitted by Thomas Vill. + + * AUTHORS: + Updated to reflect above submissions. + +2004-01-06 Jim Evins + + Split-out template.[ch], paper.[ch], xml-template.[ch], xml-paper.[ch], and + xml.[ch] into a separate library called libglabels, to facilitate third + party use of glabels template files. This was suggested by Wayne Schuller. + Once split-out, some modifications to the structures and functions to + make a cleaner more useful API, hopefully. Rather extensive changes have + propogated to other modules. + + * src/paper.h: + * src/paper.c: + * src/template.h: + * src/template.c: + * src/xml-paper.h: + * src/xml-paper.c: + * src/xml-template.h: + * src/xml-template.c: + * src/xml.h: + * src/xml.c: + These files have been moved to libglabels/. API cleanup performed. + + * libglabels/libglabels.h: + * libglabels/libglabels-private.h: + * libglabels/Makefile.am: + These files have been added to finish out libglabels. + + * Makefile.am: + * configure.in: + * glabels.spec.in: + * po/POTFILES.in: + * src/Makefile.am: + Modified to reflect new sets of files in src/ and libglabels/. + + * COPYING.LIBGLABELS: + * COPYING-DOCS: + Added copy of the LGPL for libglabels, and a copy the GFDL for + documentation. + + * src/glabels-batch.c: + * src/glabels.c: + * src/label.c: (gl_label_finalize), (gl_label_set_template), + (gl_label_get_size): + * src/label.h: + * src/prefs-model.c: (gl_prefs_model_load_settings): + * src/print-dialog.c: + * src/print.c: (gl_print_simple), (gl_print_merge_collated), + (gl_print_merge_uncollated), (gl_print_batch), (print_info_free), + (print_crop_marks), (print_label), (draw_outline), + (clip_to_outline), (clip_punchouts): + * src/template-designer.c: (construct_pg_size_page), + (pg_size_page_changed_cb), (layout_page_changed_cb), + (print_test_cb), (build_template): + * src/util.c: (gl_util_fraction): + * src/util.h: + * src/view.c: (draw_bg_fg_layers), (draw_bg_fg_rect), + (draw_bg_fg_rounded_rect), (draw_bg_fg_round), (draw_bg_fg_cd), + (draw_bg_fg_cd_bc), (draw_markup_layer), (draw_markup_margin), + (draw_markup_margin_rect), (draw_markup_margin_rounded_rect), + (draw_markup_margin_round), (draw_markup_margin_cd), + (draw_markup_margin_cd_bc), (draw_markup_line), + (draw_markup_circle), (gl_view_copy): + * src/wdgt-media-select.c: (gl_wdgt_media_select_construct), + (page_size_entry_changed_cb), (details_update), (get_layout_desc), + (get_label_size_desc): + * src/wdgt-mini-preview.c: + (gl_wdgt_mini_preview_set_label_by_name), (mini_outline_list_new), + (cdbc_item): + * src/wdgt-print-copies.c: (gl_wdgt_print_copies_construct): + * src/wdgt-print-merge.c: (gl_wdgt_print_merge_construct): + * src/wdgt-rotate-label.c: (mini_preview_canvas_update), + (gl_wdgt_rotate_label_set_template_name), (cdbc_item): + * src/wdgt-rotate-label.h: + * src/xml-label-04.c: (xml04_parse_media_description): + * src/xml-label-191.c: (gl_xml_label_191_parse), + (xml191_parse_sheet), (xml191_parse_label), (xml191_parse_layout), + (xml191_parse_markup), (xml191_parse_alias): + * src/xml-label.c: (xml_doc_to_label), (xml_parse_label), + (xml_label_to_doc): + Various changes to accomodate new libglabels API. + +2004-01-03 Jim Evins + + * configure.in: + Release 1.93.2. + +2004-01-03 Jim Evins + + * AUTHORS: + Added acknowledgement of contributions by Wayne Schuller. + + * src/commands.c: (gl_cmd_file_print): + Create extra reference to print dialog, so that it can be properly re-used. + + * src/mygal/mygal-combo-box.h: + * src/mygal/mygal-combo-box.c: + (mygal_combo_box_popup_hide_unconditional), + (mygal_combo_box_popup_display), (mygal_combo_box_set_display), + (gtk_combo_set_tearoff_state), (mygal_combo_box_construct), + (mygal_combo_box_set_arrow_relief), (mygal_combo_box_set_title), + (mygal_combo_box_set_tearable): + Changed all occurances of GTK_IS_COMBO_BOX to MYGAL_IS_COMBO_BOX, to + complete the rename of this widget to prevent namespace collisions + with Gtk+-2.3. + + * src/prefs-dialog.glade: + Fixed alignment of Fill/Color widgets. + +2004-01-03 Jim Evins + + * data/avery-iso-templates.xml: + Added user submitted templates. + Avery 8435A & 8435B, submitted by Ludger Solbach. + + * doc/C/glabels.xml: + Added minimal documentation, noting the new template designer. + +2004-01-03 Jim Evins + + * pixmaps/ex-rect-size.png: + * pixmaps/ex-round-size.png: + * pixmaps/ex-cd-size.png: + * pixmaps/Makefile.am: + Added ex-rect-size.png, ex-round-size.png, and ex-cd-size.png image + files to be used as illustrations/examples in the template-designer. + + * src/template-designer.c: (construct_rect_size_page), + (construct_round_size_page), (construct_cd_size_page), + (construct_nlayouts_page), (rect_size_page_prepare_cb), + (round_size_page_prepare_cb), (cd_size_page_prepare_cb), + (layout_page_prepare_cb), (build_template): + * src/template-designer.glade: + Added illustrations for rectangle, round, and cd label size pages. + Added margin spinboxes to these pages, and now add a margin markup + to the constructed template. Added realistic default values for + some of the size spinboxes. Cleaned up the code for setting spinbox + ranges on the layouts page. + +2004-01-02 Jim Evins + + * src/object-editor-size-page.c: (h_spin_cb): + Fixed cut-n-paste error in h_spin_cb that loaded h from + the wrong spinbutton. + + * src/object-editor.h: + * src/object-editor.c: (gl_object_editor_class_init), + (gl_object_editor_changed_cb), (gl_object_editor_size_changed_cb): + * src/object-editor-private.h: + * src/object-editor-size-page.c: (w_spin_cb), (h_spin_cb), + (size_reset_cb): + Added "size_changed" signal. + + * src/view-text.c: (construct_properties_editor), + (update_object_from_editor_cb), + (update_object_from_editor_size_cb): + Track size changes from object editor separately from other + properties. This is so the default size (0,0) of a text + object is not modified unintentionally. + +2003-12-30 Wayne Schuller + + Added feature: line spacing - allows you to comfortably space a text box to + fit a label perfectly. + + * data/glabels-2.0.dtd: + * src/label-object.c: (gl_label_object_set_text_line_spacing), + (gl_label_object_get_text_alignment), + (gl_label_object_get_text_line_spacing): + * src/label-object.h: + * src/label-text.c: (gl_label_text_class_init), + (gl_label_text_instance_init), (copy), (get_size), + (set_text_line_spacing), (get_text_alignment), + (get_text_line_spacing): + * src/object-editor-private.h: + * src/object-editor-text-page.c: + (gl_object_editor_prepare_text_page), + (gl_object_editor_set_text_line_spacing), + (gl_object_editor_get_text_line_spacing): + * src/object-editor.glade: + * src/object-editor.h: + * src/prefs-dialog.c: (construct_object_page), + (update_object_page_from_prefs), (update_prefs_from_object_page): + * src/prefs-dialog.glade: + * src/prefs-model.c: (gl_prefs_model_save_settings), + (gl_prefs_model_load_settings), (get_float): + * src/prefs-model.h: + * src/print.c: (draw_text_object): + * src/ui-sidebar.c: + * src/view-text.c: (update_object_from_editor_cb), + (update_editor_from_object_cb), + (gl_view_text_create_event_handler), (draw_hacktext): + * src/view.c: (gl_view_construct), + (gl_view_set_selection_text_line_spacing), + (gl_view_set_default_text_line_spacing), + (gl_view_get_default_text_line_spacing): + * src/view.h: + * src/xml-label.c: (xml_parse_toplevel_span), + (xml_create_toplevel_span): + +2003-12-30 Jim Evins + + * src/template-designer.c: + * src/template-designer.h: + * src/template-designer.glade: + New template designer assistant. + + * po/POTFILES.in: + * src/Makefile.am: + Added entries for src/template-designer.* files. + + * pixmaps/ex-1layout.png + * pixmaps/ex-2layouts.png + * pixmaps/Makefile.am: + Added the new image files ex-*.png used as illustrations in the + template designer assistant. + + * src/print-dialog.h: + * src/print-dialog.c: (gl_print_dialog_finalize), + (gl_print_dialog_new), (gl_print_dialog_construct), + (gl_print_dialog_force_outline_flag): + Changed first argument of gl_print_dialog_new() from glView to glLabel, + to support printing from the template designer assistant which does not + have a full-fledged view. Nothing else from the view object was being + used by the dialog anyway. + + Added the gl_print_dialog_force_outline_flag() method, for better + integration with the template designer assistant. + + + * src/commands.h: + * src/commands.c: (gl_cmd_file_template_designer), + (gl_cmd_file_print): + Modified print command to provide label instead of view to dialog. + Added the gl_cmd_file_template_designer() command to invoke the + template designer assistant. + + * src/ui.c: + * src/glabels-ui.xml: + Added support for template designer assistant. + + * src/wdgt-mini-preview.h: + * src/wdgt-mini-preview.c: (gl_wdgt_mini_preview_set_template), + (gl_wdgt_mini_preview_set_bg_color): + Preview is now centered in canvas. Added + gl_wdgt_mini_preview_set_bg_color() to allow the template designer + assistant to match the background color with its own. + + * src/print.c: (clip_to_outline): + Fixed really stupid bug when adding waste to clip region of rectangular + labels/cards. Each side of the clip region needs to be extended by + twice the waste margin, as well as negatively offset by the waste + margin. + +2003-12-28 Jim Evins + + * src/prefs-dialog.c: (update_object_page_from_prefs): + Block intermediary function align_toggle_cb() instead of + update_prefs_from_object_page() for the three alignment + widgets. + +2003-12-28 Wayne Schuller + + * src/file.c: (gl_file_new), (gl_file_properties): + Swap button order and set default for higificatory pleasure. + +2003-12-27 Jim Evins + + * barcode-0.98/Makefile.am: + One last time: removed doc/Makefile and po/Makefile.in.in from + EXTRA_DIST files. + +2003-12-27 Jim Evins + + * barcode-0.98/Makefile.am: + Removed config.stat entry from EXTRA_DIST files. + + * barcode-0.98/Makefile.in: + Removed. + +2003-12-27 Jim Evins + + * configure.in: + Updated to work with latest gnome-common package from CVS. + Removed recursive configuration of barcode-0.98. + + * acconfig.h: + * macros/*: + Removed. + + * Makefile.am: + Added barcode-0.98/ as a SUBDIR, and removed dist-hook. + + * barcode-0.98/Makefile.in: + * barcode-0.98/configure.in: + * barcode-0.98/Makefile.am: + * barcode-0.98/README.glabels: + Modified to ignore the barcode package's build system, and build + as a part of glabels. + Renamed Makefile.in to Makefile.in.dist. + Renamed configure.in to configure.in.dist. + Added barcode-0.98/Makefile.am and barcode-0.98/README.glabels. + + * src/Makefile.am: + * src/mygal/Makefile.am: + * src/recent-files/Makefile.am: + In order to build against the GNOME 2.5 platform, + all use of *_DISABLE_DEPRECATED compile-time flags has been removed. + + * src/mygal/Makefile.am: + * src/mygal/mygal-combo-box.c: + * src/mygal/mygal-combo-box.h: + * src/mygal/widget-color-combo.c: + * src/mygal/widget-color-combo.h: + * po/POTFILES.in: + In order to build against the GNOME 2.5 platform, + Renamed gtk_combo_box widget to mygal_combo_box, to prevent namespace + collisions with the real gtk_combo_box widget, now a part of gtk. + +2003-12-26 Jim Evins + + * src/paper.c: + * src/template.c: + * src/util.c: + * src/util.h: + Moved local versions of get_home_data_dir() in paper.c and + template.c to util package. Cleaned up formatting in + util.[ch]. + + * src/template.c: + In gl_template_register() save a copy of the template in + ~/.glabels if the template is not known. Still need to + handle duplicate filename case and duplicate name but + different template case. + + * src/xml-label.c: + * src/xml.h: + Moved local definition of NAME_SPACE macro from xml-label.c + to xml.h. + + * src/xml-template.c: + * src/xml-template.h: + Added function gl_xml_template_write_template_to_file(), used + in gl_template_register(). diff --git a/glabels2/INSTALL b/glabels2/INSTALL new file mode 100644 index 00000000..23e5f25d --- /dev/null +++ b/glabels2/INSTALL @@ -0,0 +1,236 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + +By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). Here is a another example: + + /bin/bash ./configure CONFIG_SHELL=/bin/bash + +Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent +configuration-related scripts to be executed by `/bin/bash'. + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/glabels2/MESSAGE-OF-DOOM b/glabels2/MESSAGE-OF-DOOM new file mode 100644 index 00000000..9ddbfaa7 --- /dev/null +++ b/glabels2/MESSAGE-OF-DOOM @@ -0,0 +1,15 @@ + *** IMPORTANT *** + +This is an unstable (development) version of glabels. +It is for testing purposes only. + +Please, DO NOT use it in a production environment. +It will probably crash and you will lose your data. + +If you are looking for a stable release of glabels, it can be downloaded from: + + http://glabels.sourceforge.net/download + + *** END OF WARNING *** + + diff --git a/glabels2/Makefile.am b/glabels2/Makefile.am new file mode 100644 index 00000000..db73aa1d --- /dev/null +++ b/glabels2/Makefile.am @@ -0,0 +1,32 @@ +## Process this file with automake to produce Makefile.in + +LIB_BARCODE_DIR = barcode-0.98 +LIB_IEC16022_DIR = iec16022-0.2.1 + +SUBDIRS = \ + po \ + $(LIB_BARCODE_DIR) \ + $(LIB_IEC16022_DIR) \ + libglabels \ + src \ + data \ + help \ + docs + +EXTRA_DIST = \ + README \ + COPYING \ + COPYING-DOCS \ + COPYING.LIBGLABELS \ + AUTHORS \ + ChangeLog \ + INSTALL \ + NEWS \ + TODO \ + intltool-extract.in \ + intltool-merge.in \ + intltool-update.in \ + glabels.spec.in \ + glabels.spec \ + MESSAGE-OF-DOOM + diff --git a/glabels2/NEWS b/glabels2/NEWS new file mode 100644 index 00000000..a29d75d3 --- /dev/null +++ b/glabels2/NEWS @@ -0,0 +1,97 @@ +* gLabels 2.1.5 (unstable) release. Release date 2007-12-09. +- New label dialog now allows selection of recently used templates +- Store brand and part number as separate fields in templates +- Major cleanup of libglabels API and documentation +- Minor bug fixes (and probably some new bugs). + +* gLabels 2.1.4 (unstable) release. Release date 2007-08-17. + +- Added categorization of templates and an updated New Label dialog. +- Added initial support for datamatrix 2D barcodes. +- Migrated from EggRecent to GtkRecentManager. +- Migrated from libgnomeprint to GtkPrintOperation and Cairo. +- Migrated from libgnomeprint to Pango for text layout. +- Migrated GnomeDruid to GtkAssistant for template designer. +- Migrated from GnomeCanvas to Cairo. +- Removed splash screen. +- Added support for Brazilian CEPNet barcodes. +- Updated French translation (Claude Paroz) +- New Experanto translation (Antonio C. Codazzi) +- Minor bug fixes (and probably some new bugs). +- New templates. + + +* gLabels 2.1.3 (unstable) release. Release date 2006-05-27. + +- Don't print "Invalid barcode data" if data field is empty. (Bug #1479839) (Darren Warner) +- Fixed hangup when grid or markup have been toggled during a previous session. (Bug #1434324) +- Added shadow attribute to label objects. +- Fixed color groups in color combo widgets. +- Fixed several potential crashes. + + +* gLabels 2.1.2 (unstable) release. Release date 2005-12-21. + +- Updated Italian translation (Daniele Medri) +- Fixed double entry in property bar's font family combobox +- Don't allow zero width or height when drawing pixbufs +- Fixed various memory leaks +- New configure option to disable update-mime-database and update-desktop-database +- New merge backend for evolution data server (Austin Henry) +- New minimal merge backend for VCards using evolution data server API (Austin Henry) +- New templates and fixes + + +* gLabels 2.1.1 (unstable) release. Release date 2005-06-21. + +- Added document merge tutorial to help documentation +- Replaced deprecated widgets (now requires Gnome 2.10 and GTK+ 2.6) +- Replaced libbonoboui with GtkUIManager (now requires Gnome 2.10 and GTK+ 2.6) +- Updated Russian translation (Vitaly Lipatov) +- Updated Spanish translation (Sergio Rivadero) +- Updated Czech translation (David Makovský and Zbynek Mrkvick) +- Updated Italian translation (Daniele Medri) +- Added documentation for libglabels +- Minor bug fixes and cleanup +- New templates + + +* gLabels 2.1.0 (unstable) release. Release date 2005-01-22. + +- Added ability to select color from merge source (Frederic Ruaudel) +- See 2.0.2 + + +* gLabels 2.0.2 release. Release date 2005-01-22. + +- Desktop file reconciled with desktop-entry-spec +- New cleaned-up icon +- Added option to glabels-batch to allow selection of first label. +- Added options to glabels-batch to allow selection of merge source and crop marks. + (José Dapena Paz) +- Updated french translation (Florent Morel) +- Fixed translation problem with object editor labels +- Minor bug fixes and cleanup +- New templates + +* gLabels 2.0.1 release. Release date 2004-08-15. + +- Fixed crash when reading some labels created with 1.93.x. +- Updated japanese translations (Takeshi AIHANA) +- Fixed crash from improperly freeing translation strings. + + +* gLabels 2.0.0 release. Release date 2004-08-09. + +- Fixed crash when encountering old template files +- Align grid to label center for DVD/CD and round labels +- Don't touch compression of original file +- 64-bit fixes +- Added man page +- Fixed missing outline problem experienced with some printers +- Added separate horizontal and vertical waste properties for rectangular templates +- Added option to auto-shrink text during document merge +- Fixed memory leaks +- Added format attibute to barcode objects, to allow correct layout of merged labels +- Fixed mime type registration for GNOME 2.6 + diff --git a/glabels2/README b/glabels2/README new file mode 100644 index 00000000..a8c42416 --- /dev/null +++ b/glabels2/README @@ -0,0 +1,44 @@ +Copyright +========= + + Copyright (C) 2001-2007 Jim Evins + + gLabels contains components copyrighted by others -- see th 'AUTHORS' file in + this directory. + + For license information see the 'COPYING.README_FIRST' file in this directory. + + + +What is gLabels +=============== + +gLabels is a small stand-alone program for creating labels and business +cards using a laser or ink-jet printer. + + + +System Requirements +=================== + +GTK+-2.10.x +LIBGNOME[UI]-2.16.x +LIBXML-2.6.x +LIBGLADE-2.6.x + +All of these libraries are available as part of Gnome 2.16 + + + +Author and Acknowledgments: +=========================== + +See the AUTHORS file. + + + +Website +======= + +http://glabels.sourceforge.net/ + diff --git a/glabels2/TODO b/glabels2/TODO new file mode 100644 index 00000000..ed3140cc --- /dev/null +++ b/glabels2/TODO @@ -0,0 +1,46 @@ + +Development plan +---------------- +This development plan sets a specific set of milestones for future versions of glabels. + + +Goals for 2.2.x: + + - Bugfixes + + - Translations + + +Possible Goals for 2.3.x (current development branch): + + - Undo, Redo capability + + - Make text items rich. I.e. allow multiple characteristics + to exist within a single object. + + - Text effects. (follow contour, non-rectangular text boxes, + ...) + + - Ability to select/unselect individual records during a merge-print. + + - Add additional "merge" backends. Candidates include: + generic XML + freedb (CDDB) for CD labels + gnome-db + ADIF for generating QSL-cards + + - Printer calibration tool: a facility for tweaking output origin and + scale. This should really be part of the underlying print system but + currently is not, so I may want to add the hack. + + - Adjustable grid spacing. Spacing of visible grid should be user + adjustable. This grid spacing should be an integral multiple of + a finer invisible grid. There should be a "snap to grid" toggle, + that causes all posistioning and sizing performed on the canvas + to snap to the closest grid. The possible grid spacing should be + appropriate for the current units selected (e.g. .1 points, .01 mm, + 1/64 inch, 0.001 inch). + + - Allow for management of custom templates + (i.e. delete, rename, edit). + diff --git a/glabels2/autogen.sh b/glabels2/autogen.sh new file mode 100755 index 00000000..66bb0fd8 --- /dev/null +++ b/glabels2/autogen.sh @@ -0,0 +1,24 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +REQUIRED_AUTOMAKE_VERSION=1.8 + +PKG_NAME="glabels" + +(test -f $srcdir/configure.in \ + && test -f $srcdir/README \ + && test -d $srcdir/src) || { + echo -n "**Error**: Directory "\`$srcdir\'" does not look like the" + echo " top-level $PKG_NAME directory" + exit 1 +} + +which gnome-autogen.sh || { + echo "You need to install gnome-common from the GNOME CVS" + exit 1 +} +USE_GNOME2_MACROS=1 USE_COMMON_DOC_BUILD=yes . gnome-autogen.sh + diff --git a/glabels2/barcode-0.98/COPYING b/glabels2/barcode-0.98/COPYING new file mode 100644 index 00000000..a43ea212 --- /dev/null +++ b/glabels2/barcode-0.98/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/glabels2/barcode-0.98/ChangeLog b/glabels2/barcode-0.98/ChangeLog new file mode 100644 index 00000000..024706de --- /dev/null +++ b/glabels2/barcode-0.98/ChangeLog @@ -0,0 +1,460 @@ +2002-03-01 Alessandro Rubini + + * library.c (Barcode_Encode): handle bitsets separately, like + in Barcode_Print (otherwise, you might loose NO_CHECKSUM). + + * debian/changelog: moved to 0.98 (but should fix all debian/ stuff) + + * contrib/barcode-for-delphi.tar.gz: new, contributed by Michael Geddes + + * contrib/barcode-for-delphi.tar.gz.README: short info for file above + + * main.c (main): allow "-g" to set size of code in a table as well + -- suggested and initiallt implemented by Joachim Reichelt. + (main): fixed missing "Page: 1 1" in postscript for tables + (main): for tables don't use Encode_and_Print, use a local + unrolled version, so the default margin can be removed and + we avoid problems with negative xoff in the output phase + (first column may be offset, as noted by Karl Magnus Kolstoe) + + * doc/doc.barcode: documented change above. + + * README: removed refernces to systemy.it, I'm no more there + Added link to FreeBSD ports tree and GLabels + Organized as sections with titles + + * contrib/barcode-SVG.tar.gz: new contribution, by David J. Humphreys + + * contrib/barcode-SVG.tar.gz.README: short description of file above + + * contrib/grab-0.0.4.tar.gz: new program, by Tuukka Toivonen. + + * contrib/grab-0.0.4.tar.gz.README: short description of file above + +2002-03-01 Boszormenyi Zoltan + + * barcode.spec: new file + +2002-02-27 Alessandro Rubini + + * bookland/bookland.py: updated to version 0.92 by Judah Milgram + +2001-11-13 Alessandro Rubini + + * README: Added a pointer to the Windows port. + +2001-11-09 Cloyce D. Spradling + + * code128.c (Barcode_128b_verify): prototype fix (unsigned char). + + * ps.c (Barcode_ps_print): the comment for ascii codes must only + be printed if ascii is being printed (benign bug). + +2001-11-06 Christoph Pross + + * pcl.c (Barcode_pcl_print): bugfix: bars were misplaced + +2001-10-16 Nathan D. Holmes + + ====> Version 0.97 released to ftp.systemy.it and ftp.gnu.org + + * code93.c: new file (I modified something as well - Alessandro) + + * doc/doc.barcode (Supported Encodings): added docs for code93 + + * main.c: added code93 names + + * Makefile.in (LIBOBJECTS): added code93.o + + * library.c: added code93 entry points + +2001-10-16 Alessandro Rubini + + * doc/manpager: added (trivial) support for @itemize, added copyright + + * sample.c (main): accept -P to create PCL output + + * doc/doc.barcode (PCL Output): added the section, using text + provided by Andrea Scopece and turning it into texinfo. + Removed also a few extra newlines that made bad man pages + +2001-10-16 Andrea Scopece + + * barcode.h: added BARCODE_OUT_PCL and BARCODE_OUT_PCL_III + + * library.c (Barcode_Print): use BARCODE_OUT_PCL to select pcl_print() + + * Makefile.in (LIBOBJECTS): added pcl.o + + * pcl.c: new file, with PCL output support + +2001-10-16 Alessandro Rubini + + * doc/doc.barcode (Supported Encodings): added documentation for + EAN and UPC with checksum, as coded by mr. Böszörményi (below) + +2001-10-16 Boszormenyi Zoltan + + * ean.c: + + I found that barcode-0.96 does not correctly encodes UPC-E. + This was mainly because in upc_e_to_a() the switch() branches + all ended without "break;". + + Printing UPC-E did not print the leading encoding number and + the trailing UPC-A checksum. Now it does. + + Accept EAN-13 and EAN-8 with and without the checksum. + So always treat 7 and 12 digit sequences as valid EAN codes + and accept 8 and 13 digit sequences as valid EAN codes when + the last digit is the same as the calculated one. + + Accept UPC-A as above (11 or 12 digit sequences.) + + Accepts UPC-E as: + 6 digit sequence: the middle part of the code (leading '0' assumed) + 7 digit sequence: the middle part and either a leading '0' or '1', + or a trailing UPC-A checksum. In that case, leading '0' assumed. + 8 digit sequence: a leading '0' or '1', middle part, checksum + + UPC-A, UPC-E, EAN-13, and EAN-8 may all include + an additional barcode to the right of the main barcode. + + As a 7 or a 12 digit sequence may be ambiguous, please remember + that EAN is checked before UPC if you specified BARCODE_ANY. + +2001-08-20 Alessandro Rubini + + * sample.c (main): added upc-e and ean-8 samples + +2001-08-11 Boszormenyi Zoltan + + * ps.c (Barcode_ps_print): don't output "showpage" in EPS mode + +2001-08-11 Alessandro Rubini + + * README: Changed host names, added barcode-commit list. + +2000-11-29 Alessandro Rubini + + * doc/doc.barcode (The Field List): 1pt == 0.352mm, not 0.0352 + (thanks to Stephen Irven for reporting) + +2000-11-09 Alessandro Rubini + + ====> Version 0.96 released to ftp.systemy.it and ftp.gnu.org + + * doc/Makefile.in ($(TARGET).html): fixed bug introduced on Sep 08 + + * doc/doc.barcode (top): correctly deal with "makeinfo --html" + +2000-11-08 Alessandro Rubini + + * README: new network pointers added + + * codabar.c (Barcode_cbr_encode): don't print ascii text for the + checksum. + + * doc/doc.barcode (The Intermediate Representaion): new section + Documented the new encodings by Leonid. + Promoted two sections to chapters + Added Leonid in the AUTHORS section of the manpage. + + * Makefile.in: don't remove docs in distclean, as the distribution + now includes the docs + +2000-11-07 Alessandro Rubini + + * Makefile.in (clean): don't remove docs, do that only in distclean + + * doc/Makefile.in: a new life for the former Makefile (to build + with both gmake and pmake with features added on 2000-09-08) + + * configure.in: use $MAKE in checking for gmake if set + (to allow testing with BSD make) + Check if makeinfo can manage html, used for doc/Makefile.in + +2000-11-07 Leonid A. Broukhis + + * code128.c (Barcode_encode_as): fixed a bug that prevented F + symbols to be correctly encoded. + + * plessey.c: new file, for Plessey encoding. + + * msi.c: new file, for MSI encoding. + + * codabar.c: new file, for CodaBar encoding. + + * code128.c (Barcode_128raw_encode): new encoding + (Barcode_128raw_verify): checker for new encoding + + * barcode.h, library.c, main.c: added code128raw, codabar, + MSI and Plessey + +2000-11-07 Hans Schou + + * contrib/barcodeps-0.1.tgz: new file, sent to Alessandro on Oct 7 + +2000-10-10 Alessandro Rubini + + * doc/manpager: use gsub instead of gensub, even though it may + leas to problems with some input. This achieves compatibility + with the original awk, so gawk is not needed any more + +2000-10-02 Alessandro Rubini + + * ps.c (Barcode_ps_print): add a backslash in front of '(' too. + Suggested by H Y . + (Barcode_ps_print): use ps arrays to get compact (and prettier) + PostScript output. Suggested by Hans Schou . + + * main.c (get_geometry): accept "+offset+offset" to keep default size. + Suggested by Godmar Back . + +2000-09-16 Alessandro Rubini + + * ps.c (Barcode_ps_print): use "half text height" instead of + "two text heights" as minimum bar height. Suggested by + Oliver Vecernik . + +2000-09-14 Alessandro Rubini + + * barcode.h: added the standard ``extern "C"'' stuff for C++ + (bug reported by Dany Pardo ) + +2000-09-08 Andrea Ferraris + + * doc/Makefile: added support for pdf and html via makeinfo + + * doc/doc.barcode: added a missing trailing dot in an xref + +2000-08-28 Alessandro Rubini + + * i25.c (Barcode_i25_encode): fixed checksum calculation + (thanks to Hans Schou for reporting) + +2000-05-19 Alessandro Rubini + + ====> Version 0.95.1 released to ftp.prosa.it + + * code128.c (Barcode_128_make_array): use code C if encoding 2 digits + +2000-05-08 Alessandro Rubini + + * cmdline.c (commandline_errormsg): removed "?:" gcc extension + + * configure.in: added checks for unistd.h and strcasecmp, as + windows doesn't have them (thanks Marten Karl) + +2000-04-21 Alessandro Rubini + + * doc/Makefile: modified to build with both gmake and pmake + + * Makefile: modified to build with both gmake and pmake + +2000-04-20 Alessandro Rubini + + * Makefile.in (.depend): removed gmake-specific features. + Thanks to Jukka A. Ukkonen for reporting. + + * configure.in: detect gmake and avoid its features if not there + + * ps.c (Barcode_ps_print): fix: codes with (relatively) short bars + were enlarged in height instead of reduced in width (also + the enlarging was wrong). Thanks to Rob Seace for reporting. + +2000-04-09 Alessandro Rubini + + * code128.c (Barcode_128_encode): removed extra messages to stderr, + forgot in the code when I finished code128 support + + * doc/doc.barcode: bugfix: in the description of geometry, the unit + of measure is configurable + +2000-02-03 Alessandro Rubini + +====> Version 0.95 released to ftp.prosa.it and ftp.gnu.org + +2000-01-26 Alessandro Rubini + + * code128.c (Barcode_128_encode): new encoding: full-featured code128 + + * README: added reference to original ftp site + +2000-01-05 Alessandro Rubini + + * main.c (get_page_geometry): avoid using snprintf(), missing in HP/UX + + * code39.c (Barcode_39_verify): added missing parens (a syntax error, + but only apparent where islower() is not a macro). Thanks to + Alexandre Oliva for finding it out. + +2000-01-04 Alessandro Rubini + + * doc/doc.barcode (The API): removed spurious "flags" argument + from description of Barcode_Encode_and_Print(). + Thanks to Willy Wittesaele for noting the error. + +1999-12-24 Alessandro Rubini + + * main.c (get_geometry): fixed the y margin (thanks to Steve Kunath) + +====> Version 0.94 released to ftp.prosa.it and ftp.gnu.org + +1999-10-24 Alessandro Rubini + + * INSTALL: added instructions to install on a Debian GNU/Linux system + + * debian/*: edited information for proper Debian support + + * debian/rules (binary-arch): new file, from "deb-make" + + * Makefile.in (install): added "-m 0644" to install non-executables + + * code128.c (Barcode_128b_encode): fixed checksum calculation. + +====> Version 0.93 released to ftp.prosa.it and ftp.gnu.org + +1999-09-26 Alessandro Rubini + + * doc/doc.barcode: fixed the rendering of complex options (-g and -t) + Removed extra "table of contents" heading in the ps output + Changed attribution on cover page + + * main.c (get_table and others): be more specific in error msgs + (get_page_geometry): numeric specification is according to "-u" + (get_table): accept unsymmetric margin specification + (option_table): added "-u" to accept "cm", "mm", "in", "pt" + (get_page_geometry): bugfix: numeric spec was always consideder mm + + * cmdline.c (commandline): don't always print help + + * Makefile.in ($(INFO)): added missing dependency: distributed docs + formats were out of date with distributed doc source. + +1999-09-13 Alessandro Rubini + + * main.c (main): print tables: y used xmargin (Tim Withers,Jon Bakken) + +1999-09-06 Alessandro Rubini + + * Makefile.in: prevent -Wall when compiling getopt. + + * i25.c, ean.c, ps.c: switched to unsigned char, to prevent warnings + on newer gcc's (thanks Al Piszcz) + +====> Version 0.92 released to ftp.prosa.it and ftp.gnu.org + +1999-08-31 Alessandro Rubini + + * i25.c: the right guard was thinner than other bars + + * doc/doc.barcode: spelling and manpage fixes (thanks Joachim Schaaf) + +====> Version 0.91.4 released to ftp.prosa.it + +1999-08-23 Thad Floryan + + * main.c (strerror): replacement strerror selected by autoconf + +1999-08-06 Alessandro Rubini + + * changed all "ENODATA" in "EINVAL", as some system miss ENODATA + + * Makefile.in (all): removed ".depend" from all, as it needs gcc + + * i25.c (Barcode_i25_encode): fixed wrong free() in an unlinely path + + * ean.c (Barcode_ean_encode): don't use sprintf's result, as some + systems return a char pointer instead of the number of chars. + + * configure.in: new file, as autoconf support is being added + +====> Version 0.91.3 released to ftp.prosa.it + +1999-08-05 Alessandro Rubini + + * code128.c (Barcode_128c_encode): fixed malloc of textinfo (was short) + + * i25.c (Barcode_i25_encode): new encoding: interleaved 2 of 5 + + * ean.c (Barcode_ean_encode): enlarged static "text", to fit add-5 + + * code128.c (Barcode_128b_encode): new encoding: 128-B + +====> Version 0.91.2 released to ftp.prosa.it + +1999-08-04 Alessandro Rubini + + * bookland/bookland.py: upgraded to version 0.06 (Judas Milgram) + + * ean.c (Barcode_ean_encode): fixed layout of 1st/last digit in UPC-A + + * code128.c (Barcode_128c_encode): fixed checksum calculation + +====> Version 0.91.1 released to ftp.prosa.it + +1999-07-09 Alessandro Rubini + + * sample.c (main): due changes to show code128-C + + * code128.c (Barcode_128c_encode): implemented code 128-C + + * ps.c (Barcode_ps_print): Accept float position and font size + + * code39.c (Barcode_39_encode): reduced font (looked too big) + +====> Version 0.91 released to both ftp.prosa.it and ftp.gnu.org + +1999-07-08 Alessandro Rubini + + * ps.c (Barcode_ps_print): shrink all the bars by 0.15 points + (Barcode_ps_print): Use Helvetica as font, not Courier-Bold + (Barcode_ps_print): remember previous font to make shorter ps output + +1999-07-07 Alessandro Rubini + + * bookland/bookland.py: new enntry, by Judah Milgram. + + * ean.c (Barcode_isbn_verify): fixed bug with "-X" codes (thanks Judah) + +====> Version 0.90.3 released to ftp.prosa.it/pub/software + +1999-07-07 Alessandro Rubini + + * doc/doc.barcode: fixed the "BUGS" section (remove fixed stuff) + + * ean.c (Barcode_ean_encode): added '+' markers in partial and textinfo + + * ps.c (Barcode_ps_print): added support for text over bars ('+' mode) + +====> Version 0.90.2, internal checkpoint + +1999-07-06 Alessandro Rubini + + * Makefile: dirty autodetect of libpaper + + * main.c (get_page_geometry): parse a cmdline argument (mcm@glisco.it) + (main): added "--version" + (main): added diagnostic message for unencodable strings + +====> Version 0.90.1 released to ftp.prosa.it/pub/software + +1999-07-03 Alessandro Rubini + + * barcode.h: removed BARCODE_OUT_PG_* as only the library doesn't + need to hack with the page size. + + * ean.c (Barcode_ean_encode): supplemental 2 and 5 encodings (no text) + + * library.c: use unsigned char all over the place, to prevent warnings + +1999-07-01 Alessandro Rubini + + * ean.c: added EAN-8 and UPC-E support + + * Updated the address of the FSF in any source file + + * README: new file. + +====> Version 0.90 is the first public release. No Changelog up to now. diff --git a/glabels2/barcode-0.98/INSTALL b/glabels2/barcode-0.98/INSTALL new file mode 100644 index 00000000..5a6cb878 --- /dev/null +++ b/glabels2/barcode-0.98/INSTALL @@ -0,0 +1,31 @@ + +Installing on generic Unix systems +---------------------------------- + +The package includes both a library and a standalone program. +To install everything try + + ./configure && make && make install + +To uninstall, try + + make uninstall + +You may have problems compiling the package on non-GNUish systems, +because the tool currently uses both gmake and gawk features, and I have +no access to non-gnu systems. If your operating system isn't able to +compile barcode and you are willing to help porting, feel free to call me. + + +Installing on Debian/GNU systems +-------------------------------- + +The suggested installation here includes creation of a Debian package: + + debian/rules binary + +Then, just install using dpkg: + + dpkg -i ../barcode-0.98_*.deb + +(the "*" here will represent your architecture: "i386", "alpha", "sparc", ...) diff --git a/glabels2/barcode-0.98/Makefile.am b/glabels2/barcode-0.98/Makefile.am new file mode 100644 index 00000000..e7456ab9 --- /dev/null +++ b/glabels2/barcode-0.98/Makefile.am @@ -0,0 +1,73 @@ +INCLUDES = \ + $(GLABELS_CFLAGS) + + +BC_FILES = \ + library.c \ + ean.c \ + code128.c \ + code39.c \ + code93.c \ + i25.c \ + msi.c \ + plessey.c \ + codabar.c \ + ps.c \ + pcl.c \ + barcode.h + +noinst_LTLIBRARIES = libbarcode.la + +libbarcode_la_SOURCES = $(BC_FILES) + +EXTRA_DIST = \ + barcode.spec \ + ChangeLog \ + cmdline.c \ + cmdline.h \ + configure \ + configure.in.dist \ + COPYING \ + INSTALL \ + install-sh \ + main.c \ + Makefile.in.dist \ + missing \ + mkinstalldirs \ + README \ + README.glabels \ + sample.c \ + TODO \ + bookland/bookland.py \ + compat/getopt.c \ + compat/getopt.h \ + contrib/barcode-for-delphi.tar.gz \ + contrib/barcode-SVG.tar.gz.README \ + contrib/barcode-for-delphi.tar.gz.README \ + contrib/barcodeps-0.1.tgz \ + contrib/grab-0.0.4.tar.gz \ + contrib/barcodeps-0.1.tgz.README \ + contrib/grab-0.0.4.tar.gz.README \ + contrib/barcode-SVG.tar.gz \ + debian/changelog \ + debian/control \ + debian/copyright \ + debian/dirs \ + debian/info \ + debian/README.debian \ + debian/rules \ + doc/barcodedoc.txt \ + doc/barcode.ps \ + doc/infofilter \ + doc/manpager \ + doc/texi2html \ + doc/barcode.info \ + doc/mktxt \ + doc/barcode.pdf \ + doc/doc.barcode \ + doc/Makefile.in \ + doc/README + + + + diff --git a/glabels2/barcode-0.98/Makefile.in.dist b/glabels2/barcode-0.98/Makefile.in.dist new file mode 100644 index 00000000..848aa265 --- /dev/null +++ b/glabels2/barcode-0.98/Makefile.in.dist @@ -0,0 +1,141 @@ +# +# This Makefile should run fine with both pmake and gmake +# + +CC = @CC@ +CFLAGS = @CFLAGS@ @DEFS@ @NO_GETOPT@ @NO_LIBPAPER@ @NO_STRERROR@ +RANLIB = @RANLIB@ + +INSTALL = @INSTALL@ + +LDFLAGS = -L. -l$(TARGET) @LIBPAPER@ + +prefix = @prefix@ +BINDIR = $(prefix)/bin +LIBDIR = $(prefix)/lib +INCDIR = $(prefix)/include +MAN1DIR = $(prefix)/man/man1 +MAN3DIR = $(prefix)/man/man3 +INFODIR = $(prefix)/info + +# getopt may be installed or not, if not take our copy +GETOPT_O = @GETOPT_O@ + +TARGET = barcode +LIBRARY = lib$(TARGET).a +MAN1 = $(TARGET).1 +MAN3 = $(TARGET).3 +INFO = doc/$(TARGET).info +HEADER = $(TARGET).h + +LIBOBJECTS = library.o ean.o code128.o code39.o code93.o i25.o \ + msi.o plessey.o codabar.o \ + ps.o pcl.o +EXEOBJECTS = main.o cmdline.o $(GETOPT_O) +ALLSOURCES = $(LIBOBJECTS:.o=.c) $(EXEOBJECT:.o=.c) + + +#Hmm... "RM" is undefined in pmake +RM = rm + +all: $(TARGET) $(LIBRARY) $(MAN1) $(MAN3) $(INFO) sample + +$(TARGET): $(LIBRARY) $(EXEOBJECTS) + $(CC) $(CFLAGS) $(EXEOBJECTS) $(LDFLAGS) -o $(TARGET) + +sample: sample.o $(LIBRARY) + $(CC) $(CFLAGS) sample.o $(LDFLAGS) -o $@ + +# Avoid the standard CFLAGS, to avoid -Wall and -DNO_GETOPT +compat/getopt.o: compat/getopt.c + $(CC) -O -c compat/getopt.c -o $@ + +$(LIBRARY): $(LIBOBJECTS) + $(AR) r $(LIBRARY) $(LIBOBJECTS) + $(RANLIB) $(LIBRARY) + +$(MAN1) $(MAN3): doc/doc.$(TARGET) + awk -f doc/manpager doc/doc.$(TARGET) + + +# Unfortunately, pmake has no "-C". Also, "pmake -n" doesn't follow the cd. +$(INFO): doc/doc.$(TARGET) + cd doc && $(MAKE) + +install: + $(INSTALL) -d $(BINDIR) $(INCDIR) $(LIBDIR) $(MAN1DIR) \ + $(MAN3DIR) $(INFODIR) + $(INSTALL) -c $(TARGET) $(BINDIR) + $(INSTALL) -c -m 0644 $(HEADER) $(INCDIR) + $(INSTALL) -c -m 0644 $(LIBRARY) $(LIBDIR) + $(INSTALL) -c -m 0644 $(MAN1) $(MAN1DIR) + $(INSTALL) -c -m 0644 $(MAN3) $(MAN3DIR) + $(INSTALL) -c -m 0644 $(INFO) $(INFODIR) + +uninstall: + $(RM) -f $(BINDIR)/$(TARGET) + $(RM) -f $(INCDIR)/$(HEADER) + $(RM) -f $(LIBDIR)/$(LIBRARY) + $(RM) -f $(MAN1DIR)/$(MAN1) + $(RM) -f $(MAN3DIR)/$(MAN3) + $(RM) -f $(INDODIR)/$(INFO) + +#Make clean keeps the compiled documents +clean: + $(RM) -f *.o */*.o *~ */*~ $(TARGET) $(LIBRARY) + $(RM) -f $(MAN1) $(MAN3) core sample + cd doc && $(MAKE) terse + $(RM) -f .depend + +distclean: clean + if [ -f build ]; then debian/rules clean; fi + # remove the configure stuff as well + $(RM) -f Makefile config.h config.log config.status config.cache \ + doc/Makefile + +cleanest: clean + cd doc && $(MAKE) clean + +Makefile: Makefile.in configure + ./configure + +configure: configure.in + autoconf + +.depend: $(ALLSOURCES) + $(CC) $(CFLAGS) -MM $(ALLSOURCES) > $@ + +depend: .depend + +tar: + @if [ "x" = "x$(RELEASE)" ]; then \ + n=`basename \`pwd\``; cd ..; tar cvf - $$n | gzip > $$n.tar.gz; \ + echo 'you can set a numeric $$(RELEASE) to make a named tar'; \ + else \ + if [ -d ../$(TARGET)-$(RELEASE) ]; then \ + rm -rf ../$(TARGET)-$(RELEASE); \ + fi; \ + mkdir ../$(TARGET)-$(RELEASE) || exit 1; \ + cp -a . ../$(TARGET)-$(RELEASE) && cd .. && \ + tar --exclude '*/CVS*' \ + -cvzf $(TARGET)-$(RELEASE).tar.gz $(TARGET)-$(RELEASE); \ + fi + +# print the version, as I usually forget to update it when distributing +printv: + @grep -n VERSION $(HEADER) /dev/null + @grep -n set.version doc/doc.$(TARGET) /dev/null + @grep -n dpkg.-i INSTALL /dev/null + +# and this is how I make the distribution +distrib: $(INFO) distclean tar printv + + +.PHONY: all install uninstall mostlyclean clean disclean depend \ + tar printv distrib + +# Only if make is gmake, have a rule to conditionally include .depend +@GMAKEDEPEND0@ +@GMAKEDEPEND1@ +@GMAKEDEPEND2@ + diff --git a/glabels2/barcode-0.98/README b/glabels2/barcode-0.98/README new file mode 100644 index 00000000..d3ae2a7f --- /dev/null +++ b/glabels2/barcode-0.98/README @@ -0,0 +1,93 @@ + +NETWORK LINKS +============= + +This is GNU-barcode. The latest release can be downloaded from ftp.gnu.org +and mirrors: + ftp://ftp.gnu.org/pub/gnu/barcode/ + +It is also available from my own ftp/http server + ftp://ar.linux.it/pub/barcode/ + http://ar.linux.it/pub/barcode/ (same as above). + +The current source tree is available by anonymous CVS. See + http://ar.linux.it/software/#cvs + +Plesae note that ar.linux.it/pub/barcode also includes CVS snapshots, +semi-atumatically taken when I commit stuff to CVS. Note that CVS +snapshots include "CVS/" directories, so you can then "cvs update" for +further updates. + +The documentation is online at: + http://ar.linux.it/software/barcode + +The MS-Windows port is maintained at: + http://gnuwin32.sourceforge.net/packages/barcode.htm + +It as also been included in the FreeBSD ports tree in the "graphics" section. +This means /usr/ports/graphics/barcode. It's thus available from: + http://www.freebsd.org/ports/graphics.html + +GLabels, at http://snaught.com/glabels/, uses barcode internally, too. + +DESCRIPTION +=========== + +The package is meant to solve most needs in barcode creation with a +conventional printer. It can create printouts for the conventional +product tagging standards: UPC-A, UPC-E, EAN-13, EAN-8, ISBN, as well +as a few other formats. Ouput is generated as either Postscript or +Encapsulated Postscript (other back-ends may be added if needed). + +The package is released as both a library and a command-line frontend, +so that you can include barcode-generation into your application. The +program is released in the hope that is proves useful but without any +warranty, according to the GPL Licence (see ./COPYING). + +If you're specifically interested in making an ISBN (Bookland EAN) +symbol, you might try to get "bookland.py" by Judah Milgram +(http://www.cgpp.com/bookland/, whose version 0.92 is also included in +the directory "bookland" within this package, for your convenience). +While my main target is flexibility his main target is strict +adherence to the standards. Bookland is free software like the barcode +library and will probabily have its role in the GNU project. +Bookland.py is a self-documenting program, you'll enjoy browsing its +source code. + +Other contributed patches and/or software are available in the +contrib/ directory. + +Please take the "no-warranty" disclaimer seriously: even though I +spent reasonable efforts to make sure the output is useable in +production you should verify it suits your needs as a faulty bar can +cost you a bundle, and you'll be on your own. It's up to you to verify +that the symbol is valid (and, obviously, I'd like to know about any +problem you encounter). [This paragraph copied verbatim from bookland.py] + + +ACKNOWLEDGMENTS +=============== + +I would like to thank both Judah Milgram and Michele Comitini +(mcm@glisco.it) for their help with this tool, as well as Jim Westveer +for introducing me to Debian packaging. Several encodings have been +implemented by Leonid A. Broukhis (leob@mailcom.com). + + +MAILING LISTS +============= + +There is a mailing list where development is coordinated, called +barcode@lists.linux.it . To get subscribed you should + echo subscribe | mail barcode-request@lists.linux.it +or anything equivalent. + +To receive notification of CVS commit messages, please subscribe to +barcode-commit@ar.linux.it, by issuing: + echo subscribe | mail barcode-commit-request@ar.linux.it + +(if you guess, "ar" or "arcana" is my own server, while lists.linux.it +is the mail server of the italian association of gnu/linux users). + +/alessandro (rubini@gnu.org) + diff --git a/glabels2/barcode-0.98/README.glabels b/glabels2/barcode-0.98/README.glabels new file mode 100644 index 00000000..b0dc9592 --- /dev/null +++ b/glabels2/barcode-0.98/README.glabels @@ -0,0 +1,7 @@ +The following changes have been made to the stock barcode-0.98 distribution +to facilitate compilation with glabels: + + Makefile.in renamed to Makefile.in.dist + configure.in renamed to configure.in.dist + added Makefile.am, which is configured from ../configure.in + diff --git a/glabels2/barcode-0.98/TODO b/glabels2/barcode-0.98/TODO new file mode 100644 index 00000000..c91c79cf --- /dev/null +++ b/glabels2/barcode-0.98/TODO @@ -0,0 +1,23 @@ + + Possible enhancements that I'd like to add + +* verbose mode, printing position information to stderr + +* document how a new encoding standard can be added + +* add Barcode_String, which has been contributed + +* EAN128 (as agreed with Dani Pardo) + +* Postnet and associated encoding-specific bar definitions + +* Use texinfo 4 with images + +* shrink the bars to account for ink spreading + + Currently, small barcodes don't get rendered well. While + version 0.91 and later subtracts 0.15 points from the size of + the bars (I found that this makes good results for small + bars), a smart alghorithm to shrink the bars is needed to get + lighter prints at small sizes without loosing readability. + diff --git a/glabels2/barcode-0.98/barcode.h b/glabels2/barcode-0.98/barcode.h new file mode 100644 index 00000000..6b9bdf4e --- /dev/null +++ b/glabels2/barcode-0.98/barcode.h @@ -0,0 +1,119 @@ +/* + * barcode.h -- definitions for libbarcode + * + * Copyright (c) 1999 Alessandro Rubini (rubini@gnu.org) + * Copyright (c) 1999 Prosa Srl. (prosa@prosa.it) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef _BARCODE_H_ +#define _BARCODE_H_ + +#include + +#define BARCODE_VERSION "0.98" +#define BARCODE_VERSION_INT 9800 + +/* + * The object + */ +struct Barcode_Item { + int flags; /* type of encoding and decoding */ + char *ascii; /* malloced */ + char *partial; /* malloced too */ + char *textinfo; /* information about text positioning */ + char *encoding; /* code name, filled by encoding engine */ + int width, height; /* output units */ + int xoff, yoff; /* output units */ + int margin; /* output units */ + double scalef; /* requested scaling for barcode */ + int error; /* an errno-like value, in case of failure */ +}; + +/* + * The flags field + */ +#define BARCODE_DEFAULT_FLAGS 0x00000000 + +#define BARCODE_ENCODING_MASK 0x000000ff /* 256 possibilites... */ +#define BARCODE_NO_ASCII 0x00000100 /* avoid text in output */ +#define BARCODE_NO_CHECKSUM 0x00000200 /* avoid checksum in output */ + +#define BARCODE_OUTPUT_MASK 0x000ff000 /* 256 output types */ +#define BARCODE_OUT_EPS 0x00001000 +#define BARCODE_OUT_PS 0x00002000 +#define BARCODE_OUT_PCL 0x00004000 /* by Andrea Scopece */ +/* PCL_III 0x00008000 */ +#define BARCODE_OUT_PCL_III 0x0000C000 +#define BARCODE_OUT_NOHEADERS 0x00100000 /* no header nor footer */ + +enum { + BARCODE_ANY = 0, /* choose best-fit */ + BARCODE_EAN, + BARCODE_UPC, /* upc == 12-digit ean */ + BARCODE_ISBN, /* isbn numbers (still EAN13) */ + BARCODE_39, /* code 39 */ + BARCODE_128, /* code 128 (a,b,c: autoselection) */ + BARCODE_128C, /* code 128 (compact form for digits) */ + BARCODE_128B, /* code 128, full printable ascii */ + BARCODE_I25, /* interleaved 2 of 5 (only digits) */ + BARCODE_128RAW, /* Raw code 128 (by Leonid A. Broukhis) */ + BARCODE_CBR, /* Codabar (by Leonid A. Broukhis) */ + BARCODE_MSI, /* MSI (by Leonid A. Broukhis) */ + BARCODE_PLS, /* Plessey (by Leonid A. Broukhis) */ + BARCODE_93 /* code 93 (by Nathan D. Holmes) */ +}; + +#define BARCODE_DEFAULT_MARGIN 10 + +#ifdef __cplusplus +extern "C" { +#endif +/* + * Create and destroy barcode structures + */ +extern struct Barcode_Item *Barcode_Create(char *text); +extern int Barcode_Delete(struct Barcode_Item *bc); + +/* + * Encode and print + */ +extern int Barcode_Encode(struct Barcode_Item *bc, int flags); +extern int Barcode_Print(struct Barcode_Item *bc, FILE *f, int flags); + +/* + * Choose the position + */ +extern int Barcode_Position(struct Barcode_Item *bc, int wid, int hei, + int xoff, int yoff, double scalef); + +/* + * Do it all in one step + */ +extern int Barcode_Encode_and_Print(char *text, FILE *f, int wid, int hei, + int xoff, int yoff, int flags); + + +/* + * Return current version (integer and string) + */ +extern int Barcode_Version(char *versionname); + +#ifdef __cplusplus +} +#endif + +#endif /* _BARCODE_H_ */ diff --git a/glabels2/barcode-0.98/barcode.spec b/glabels2/barcode-0.98/barcode.spec new file mode 100644 index 00000000..eccb6026 --- /dev/null +++ b/glabels2/barcode-0.98/barcode.spec @@ -0,0 +1,84 @@ +%define name barcode +%define ver 0.98 +%define rel 1 +%define prefix /usr +%define sysconfdir /etc + +Summary: GNU barcode +Name: %name +Version: %ver +Release: %rel +Copyright: GPL +Group: Applications/Productivity +Source: ftp://ar.linux.it/pub/barcode/%name-%{ver}.tar.gz +BuildRoot: /var/tmp/%name-%{ver}-root +URL: http://gnu.systemy.it/software/barcode +Prefix: %prefix + +%description +This is GNU-barcode. +The package is meant to solve most needs in barcode creation with a +conventional printer. It can create printouts for the conventional +product tagging standards: UPC-A, UPC-E, EAN-13, EAN-8, ISBN, as well +as a few other formats. Ouput is generated as either Postscript or +Encapsulated Postscript (other back-ends may be added if needed). + +%package devel +Summary: GNU barcode files for development +Group: Development/Libraries + +%description devel +This is GNU-barcode. +The package is meant to solve most needs in barcode creation with a +conventional printer. It can create printouts for the conventional +product tagging standards: UPC-A, UPC-E, EAN-13, EAN-8, ISBN, as well +as a few other formats. Ouput is generated as either Postscript or +Encapsulated Postscript (other back-ends may be added if needed). + +This package contain the C header, the static library and man page +for development. + +%prep +%setup + +%ifarch alpha + ARCH_FLAGS="--host=alpha-redhat-linux" +%endif + +export -n LANG LINGUAS LC_ALL +if [ ! -f configure ]; then + CFLAGS="$RPM_OPT_FLAGS" ./autogen.sh $ARCH_FLAGS --prefix=%{prefix} --sysconfdir=%{sysconfdir} +else + CFLAGS="$RPM_OPT_FLAGS" ./configure $ARCH_FLAGS --prefix=%{prefix} --sysconfdir=%{sysconfdir} +fi + +%build +export -n LANG LINGUAS LC_ALL + +if [ "$SMP" != "" ]; then + (make "MAKE=make -k -j $SMP"; exit 0) + make +else + make +fi + +%install +[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf $RPM_BUILD_ROOT +make prefix=$RPM_BUILD_ROOT%{prefix} sysconfdir=$RPM_BUILD_ROOT%{sysconfdir} install + +%clean +[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-, root, root) + +%doc COPYING ChangeLog INSTALL README TODO doc/*.html doc/*.pdf doc/*.ps + +%attr(0755,root,root) %{prefix}/bin/barcode +%attr(0644,root,root) %{prefix}/info/barcode.info* +%attr(0644,root,root) %{prefix}/man/man1/barcode.1* + +%files devel +%attr(0644,root,root) %{prefix}/include/barcode.h +%attr(0644,root,root) %{prefix}/lib/libbarcode.a +%attr(0644,root,root) %{prefix}/man/man3/barcode.3* diff --git a/glabels2/barcode-0.98/bookland/bookland.py b/glabels2/barcode-0.98/bookland/bookland.py new file mode 100644 index 00000000..373587cb --- /dev/null +++ b/glabels2/barcode-0.98/bookland/bookland.py @@ -0,0 +1,884 @@ +#!/usr/local/bin/python + +MYNAME="bookland.py" +MYVERSION="0.92" +COPYRIGHT="(C) 1999-2001 J. Milgram" +DATE = "Jan. 2002" +MAINTAINER = "bookland-bugs@cgpp.com" + +# Copyright (C) 1999,2000 Judah Milgram +# +# bookland.py - generate Bookland EAN symbol for ISBN encoding +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. +# +# ============================================================================== +# +# usage: bookland.py [ISBN] [price-code] > output.eps +# +# ISBN - the ISBN, with or without check digit, with or without hyphens. +# default: 1-56592-197-6 ("Programming Python"). If the check digit +# is provided on the command line, it is verified. If not, it is +# calculated. It's up to you to get the hyphenation right - it's +# important, and something the program can't calculate for you. +# +# price - the five digit add-on code. Usually used to indicate the price, +# in which case the first digit indicates the currency (4=$CAN, +# 5=$US, etc.). The remaining digits indicate the price, with +# decimal point assumed to be between the digit 3 and 4. +# For example: $US 6.95 = 50695, $CAN 35.00 = 43500. Instead of a +# price code, a 5 digit add-on ranging from 90000-98999 can be +# used for internal purposes. BISG recommends just using 90000 if +# you don't want to specify a price. Add-ons ranging from 99000 to +# 99999 have been reserved for special use. +# +# An Encapsulated Postscript file (eps) is sent to standard out. This may in turn +# be converted to other formats using the pbmplus package. You may have trouble +# getting the OCRB to map correctly. If you already have the font, you can look in +# the Fontmap file to see what your system calls it, and edit the fontnames accordingly +# (see below). If you don't have it, you might find it on your DOS system. You +# need a .pfa/.pfb (Type 1) or .ttf (TrueType). Your Postscript interpreter might +# or might not be able to deal with TrueType. In any event, in an emergency, you +# might get away with Helvetica. Note that as of 1990 BISG no longer requires the +# ISBN to be printed in OCR-A. +# +# Take the "no-warranty" disclaimer seriously. Going to print with a faulty bar +# can cost you a bundle, and you'll be on your own. It's up to you to verify that +# the symbol is valid. If you need "corporate accountability", try the Book +# Industry Study Group at (212) 929-1393 or the US ISBN Agency at (908) 665-6770 +# and ask for a list of commercial vendors. Outside the US, don't know. +# +# Feedback welcome. If you discover a case where the program generates a faulty +# symbol, I definitely want to hear about it - write me at milgram@cgpp.com or +# P.O. Box 8376, Langley Park, MD 20787, USA +# +# INSTALLATION: +# +# If you have a Python interpreter on your system, you're done. Just put this file +# somewhere in your path and give it execute permission. If you haven't installed +# Python, see http://www.python.org. It has been ported to Macs, DOS, and MS-Windows. +# +# ABOUT THE BOOKLAND EAN +# +# The most difficult part of this project was finding the documents that define +# the Bookland EAN. There appears to be no single, authoritative source that +# provides all the information required. Some good sources: +# +# [1] "Machine-Readable Coding Guidelines for the U.S. Book Industry", Book +# Industry Study Group, New York, Jan., 1992. (212) 929-1393 +# [2] "UPC Symbol Specification Manual", Uniform Code Council Inc., +# Dayton, Ohio, January 1986 (May 1995 Reprint). (937) 435-3870; I found it +# at http://www.uc-council.org/d36-t.htm +# [3] "EAN Identification for Retail/Trade Items", EAN International. I found it +# in Feb. 1999 at http://www.ean.be/html/Numbering.html +# [4] "Hyphenation Instructions", web page at: +# http://www.isbn.org/standards/home/isbn/international/hyphenation-instructions.asp +# +# The starting point of the exercise is the ISBN, assigned by the national ISBN +# Agency. This is a 10 digit number, the last being a check digit. The ISBN is +# converted to a 13 digit EAN number. The first three digits of the EAN-13 indicate +# the country or region. A prefix of 978 has been assigned to books, regardless +# of country of origin (hence, "Bookland") [3]. The remaining ten digits are the +# first 9 digits of the ISBN followed by the EAN-13 check digit. +# +# It seems the EAN-13 check digit can be calculated using the same algorithm as the +# UPC Version A number. Note that the EAN-13 check digit is always between 0 and 9, +# compare with ISBN check digit which can range to 10 ("X"). See Reference [2], +# Section 2 and Appendix G for details of creation of the EAN-13 symbol. Table 2 of +# Appendix G provides a good comparison of the UPC-A and EAN-13 symbols. +# +# The 5 digit add-on (here called, "UPC5") is defined in Ref. [2] Appendix D. +# The ">" to the right of the five digit code serves to enforce the "quiet zone" to +# the right of the bar pattern. Can't remember where I read that. It's probably +# optional. According to [1], in the UK, three horizontal bars appear over price +# add-ons. Haven't implemented that here. The UPC5 encoding is based on UPC-A and +# UPC-E. +# +# According to [2], Section 3, the EAN-13 numbers and 5-digit add-ons are supposed +# to be printed in OCR-B. The ISBN itself is printed above the EAN-13 symbol. At +# one time it was to be printed in OCR-A, but as of 1990 this requirement has been +# dropped [1], and I assume this means you can use any font you like. +# +# SEE ALSO: +# +# "TinyHelp 5 - Making ISBN Barcodes", D. Byram-Wigfield. Another approach to making +# the ISBN barcode symbol. I saw it at +# http://www.cappella.demon.co.uk/index.html/ +# but haven't tried it. +# +# "XBarcode" - nice open-source X-Windows program for generating all sorts of bar codes. +# It does much more than this program, but didn't seem to do the UPC +# 5-digit add-on or do the ISBN->EAN13 calculation (as of v. 2.11). Might +# have made more sense to add this capability, but I needed a Python project. +# In any event, their license forbids distribution in modified form! +# +# HYPHENATION +# +# bookland.py includes automatic hyphenation for ISBN's in group 0 and 1 +# (English-language). This is based on my reading of Ref [4]. If in doubt, +# users can use the "-y" option to force the program to accept the hyphenation +# as input. For other ISBN groups and for ISMN's, no hyphenation is performed +# other than to ensure a hyphen is placed after the group identifier and before +# the check digit. +# +# ABOUT THE ISMN: +# +# See the ISMN Users' Manual, 3rd Edition, 1998, ISBN 3-88053-070-X, published by +# the International ISMN Agency, Staatsbibliothek Preussischer Kulturbesitz, Berlin. +# I found my copy at http://www.ismn.spk-berlin.de/download/ISMNmanual.pdf +# +# An ISMN is just like an ISBN, except: +# - first character is an "M" +# - the "M" counts as a "3" for computing the ISMN check digit (last digit) +# - the checksum weights are 3,1,3,1,3,1,3,1,3, sum to be divisible by "10". This +# means the last character is always a numerical digit, never an "X". +# - the EAN number is "979" plus the *entire* ten character ISMN, except the +# "M" is replaced by "0". Note this means the ISMN checksum is identical to the +# corresponding EAN-13 checksum (excercise left to the reader). +# +# When bookland.py detects an "M" in the first position of the ISBN, it interprets +# it as an ISMN and proceeds accordingly. The 5-digit price code symbol is suppressed. +# +# BAR WIDTH REDUCTIONS +# +# Starting Version 0.92, the widths of the individual bars can be reduced using the +# "-r" option (units are inches). This is to compensate for bleed during printing. +# I don't know when it's a good idea to actually use this; in any event consult with +# your printer first. If not input, it defaults to zero (no reduction). +# +# ABOUT PYTHON +# +# See http://www.python.org +# +# TO DO: +# +# - Generalize to more bar codes, starting with UPC-A and UPC-E. "Plain" EAN13 is +# already built in, could add command line argument to generate that instead of +# Bookland. +# - Make font sizes and placement easier to configure - not sure I have it right. +# Does human-readable 5-digit code take wider font spacing? +# - Clean up bounding box stuff. +# - Bells and whistles. +# - GUI? +# +# HISTORY: +# +# 1/2002 - v 0.92 add ISMN support (thanks to Lars-Henrik Nysten for this suggestion) +# re-wrote bar generation to preclude possibility of white hairlines +# between adjacent black modules. Thanks to Tero Lindfors for +# reporting this bug. +# new -o option to write eps to file rather than stdout +# new -x option for "check only" (verifies check digit) +# new -r option for bar width reduction (compensate for print bleed) +# new -s option to scale module (bar) height (Lars-Henrik Nysten again) +# can suppress UPC-5 price code by entering empty string. (thanks to +# Jacques Du Pasquier for this suggestion) +# re-wrote ISBN/ISMN sanity checks +# lowercase alphas ("x" for ISBN and "m" for ISMN) now ok on input +# fix "long" command line options. +# 10/2001 - v 0.91 add -z option for quiet zone ">" +# add -f option for fonts +# re-write command line parsing to use getopt +# 1/2000 - v 0.09 eliminate use of eval +# 9/99 - v 0.08 accomodate different versions of OCRB by fitting +# all strings to prescribed width. Thanks to Toby Gadd +# for reporting this problem and Peter Deutsch for +# help finding the fix. +# 7/99 -v0.05-0.07 improve error handling. +# 3/27/99 - v0.04 add "--help" and "--version". +# 3/13/99 - v0.03, do a showpage at end (it's allowed) +# fixed checksum calculations for certain cases +# 2/7/99 - v0.02, fixed LH parity pattern for EAN13. It's not the check digit! +# 2/7/99 - initial release +# ================================================================================ + +# +# barCodeSymbol - the whole printed symbol, including bar code(s) and product code(s). +# UPC, UPCA, UPC5, EAN13 - the number itself, with check digit, string representation, +# and barcode bits +# + +import re # we should get rid of regsub and regex in favor of re + # hope there's no conflict. +import string +import sys +import regsub +from regex_syntax import * +import regex +regex.set_syntax(RE_SYNTAX_AWK) +from types import * + +BooklandError = "Something wrong" + + +A="A";B="B";C="C";O="O";E="E" +UPCABITS = [{O:"0001101",E:"1110010"}, + {O:"0011001",E:"1100110"}, + {O:"0010011",E:"1101100"}, + {O:"0111101",E:"1000010"}, + {O:"0100011",E:"1011100"}, + {O:"0110001",E:"1001110"}, + {O:"0101111",E:"1010000"}, + {O:"0111011",E:"1000100"}, + {O:"0110111",E:"1001000"}, + {O:"0001011",E:"1110100"}] +UPCAPARITY = [ "OOOOOOEEEEEE" ] * 10 +UPCEBITS = [{O:"0001101",E:"0100111"}, + {O:"0011001",E:"0110011"}, + {O:"0010011",E:"0011011"}, + {O:"0111101",E:"0100001"}, + {O:"0100011",E:"0011101"}, + {O:"0110001",E:"0111001"}, + {O:"0101111",E:"0000101"}, + {O:"0111011",E:"0010001"}, + {O:"0110111",E:"0001001"}, + {O:"0001011",E:"0010111"}] +# what about UPCEPARITY? Don't need for isbn. +UPC5BITS = UPCEBITS +UPC5PARITY = ["EEOOO","EOEOO","EOOEO","EOOOE","OEEOO", + "OOEEO","OOOEE","OEOEO","OEOOE","OOEOE"] +EAN13BITS = [{A:"0001101", B:"0100111", C:"1110010"}, + {A:"0011001", B:"0110011", C:"1100110"}, + {A:"0010011", B:"0011011", C:"1101100"}, + {A:"0111101", B:"0100001", C:"1000010"}, + {A:"0100011", B:"0011101", C:"1011100"}, + {A:"0110001", B:"0111001", C:"1001110"}, + {A:"0101111", B:"0000101", C:"1010000"}, + {A:"0111011", B:"0010001", C:"1000100"}, + {A:"0110111", B:"0001001", C:"1001000"}, + {A:"0001011", B:"0010111", C:"1110100"}] +EAN13PARITY = map(lambda x: x+"CCCCCC", + ["AAAAAA","AABABB","AABBAB","AABBBA","ABAABB", + "ABBAAB","ABBBAA","ABABAB","ABABBA","ABBABA"]) + +PSFORMAT = "%.6f" +# Default fonts. +# Fonts might have a different name on your system. +# Edit if required. +ISBNFONT = "OCRB" # Doesn't have to be OCR-B +EAN13FONT = "OCRB" +UPC5FONT = "OCRB" + +class psfile: + + def __init__(self): + self.x0 = 100; self.y0 = 100 + self.lines=[] + self.bb=[self.x0,self.y0,self.x0,self.y0] + + def orbb(self,arg): + self.bb[0] = min(self.bb[0],self.x0+arg[0]) + self.bb[1] = min(self.bb[1],self.y0+arg[1]) + self.bb[2] = max(self.bb[2],self.x0+arg[2]) + self.bb[3] = max(self.bb[3],self.y0+arg[3]) + + def translate(self,dx,dy): + self.x0 = self.x0 + dx + self.y0 = self.y0 + dy + return "%d %d translate 0 0 moveto" % (dx,dy) + + def out(self,file=None): + if file: + outfid=open(file,"w") + else: + outfid=sys.stdout + for line in self.lines: + outfid.write("%s\n"%line) + outfid.close() + + def do(self,arg): + self.lines = self.lines + arg + + def setbb(self): + for i in range(len(self.lines)): + if self.lines[i]=="%%BoundingBox: TBD": + self.lines[i]= "%%BoundingBox:" + \ + " %d"%self.bb[0] + \ + " %d"%self.bb[1] + \ + " %d"%self.bb[2] + \ + " %d"%self.bb[3] + return + + def header(self,title,comments,ean13font,isbnfont,upc5font): + for i in range(len(comments)): + comments[i] = regsub.gsub("^","% ",comments[i]) + # There's a more elegant way to do the bounding box line: + return [ "%!PS-Adobe-2.0 EPSF-1.2", + "%%Creator: " + MYNAME + " " + MYVERSION + " " + DATE, + "%%Title: " + title, + "%%BoundingBox: TBD", + "%%EndComments" ] +\ + comments + \ + [ "\n% These font names might be different on your system:", + "/ean13font { /" + ean13font + " findfont 10 scalefont setfont } def", + "/isbnfont { /" + isbnfont + " findfont 8 scalefont setfont } def", + "/upc5font { /" + upc5font +" findfont 14 scalefont setfont } def\n", + "/nextModule { moduleWidth 0 rmoveto } def", + "% The following shenanigans is to deal with different implementations", + "% of same font having different char sizes and spacing.", + "% function fitstring:", + "% usage: width string font fitstring", + "% set font, scaled so that string exactly fits desired width", + "% leave string on stack", + "/fitstring { dup findfont 1 scalefont setfont % w s f", + "3 1 roll % f w s", + "dup stringwidth pop % f w s sw", + "3 2 roll exch div % f s x", + "3 2 roll findfont exch scalefont setfont", + "} def", + "/barHeight { 72 } def", + "/nextModule { moduleWidth 0 rmoveto } def", + "/topcentershow {dup stringwidth pop neg 2 div -9 rmoveto show} def", + "/toprightshow {dup stringwidth pop neg -9 rmoveto show} def", + "/bottomcentershow {dup stringwidth pop neg 2 div 0 rmoveto show} def", + "/bottomrightshow {dup stringwidth pop neg 0 rmoveto show} def", + "/W { moduleWidth mul 0 rmoveto } def", + "/B { dup moduleWidth mul 2 div 0 rmoveto", + "dup moduleWidth mul barWidthReduction sub setlinewidth", + "0 barHeight rlineto 0 barHeight neg rmoveto", + "currentpoint stroke moveto", + "moduleWidth mul 2 div 0 rmoveto } def", + "/L { dup moduleWidth mul 2 div 0 rmoveto", + "dup moduleWidth mul barWidthReduction sub setlinewidth", + "0 -5 rmoveto 0 5 rlineto", + "0 barHeight rlineto 0 barHeight neg rmoveto", + "currentpoint stroke moveto", + "moduleWidth mul 2 div 0 rmoveto } def", + self.x0,self.y0,"translate", + "0 0 moveto" ] + + def trailer(self): + return ["stroke","% showpage supposedly OK in EPS", + "showpage","\n% Good luck!"] + + +class UPC: + + # Includes UPC-A, UPC-E, EAN-13 (sorry), UPC-5 et al. + + def __init__(self,arg): + # arg is a string, either: + # - product code including checksum + # - same, with hyphens (hyphens not verified) + # - same, but with last digit (checksum) dropped, possibly leaving a + # trailing hyphen. + # If checksum is included, it will be verified. + # N.B. "integer" representation is still a string! Just has no hyphens. + + self.s=arg + self.verifyChars(self.s) + self.n = regsub.gsub("-","",self.s) # create "integer" representation + self.x = self.checkDigit(self.n) # always calculate check digit + if len(self.n) == self.ndigits: + self.verifyCheckDigit() # if check digit given, verify it + elif len(self.n) == self.ndigits-1: + self.tackonCheckDigit() # tack on check digit + else: + raise BooklandError, "UPC: wrong number of digits in \"" + self.s + "\"" + + def setbits(self,arg): # UPC (all) + self.bits="" + parityPattern=self.parityPattern() + bitchar=self.bitchar() + for p in range(len(arg)): + digit=int(arg[p]) + # maybe better to define parityPattern with a leading blank? + parity=parityPattern[p] + bit=bitchar[digit][parity] + self.bits=self.bits + bit + + def verifyChars(self,s): # UPC (all) + # Trailing hyphen allowed. + nevergood = "--|^-|[^0-9-]" + ierr=regex.search(nevergood,s) + if ierr != -1: + raise BooklandError, \ + "UPCA: in %s: illegal characters beginning with: %s" % (s,s[ierr]) + + def verifyCheckDigit(self): # UPC (all) + # first verify correct number of digits. + soll=self.checkDigit(self.n) + ist=self.s[-1:] + if ist != soll: + raise BooklandError, "For %s checksum %s is wrong, should be %s" % \ + (self.s,ist,soll) + + def xstring(self,p): # UPC (all) + return "%d" % p + + def tackonCheckDigit(self): + self.n = self.n + self.x # UPC (all) + self.s = self.s + self.x + +class UPCA(UPC): + + def __init__(self,arg): + UPC.__init__(self,arg) + self.setbits(self.n[1:]) # skip first digit + + def parityPattern(self): + return UPCAPARITY[int(self.x)] + def bitchar(self): + return UPCABITS + + def checkDigit(self,arg): # UPCA/EAN13 + weight=[1,3]*6; magic=10; sum = 0 + for i in range(12): # checksum based on first 12 digits. + sum = sum + int(arg[i]) * weight[i] + z = ( magic - (sum % magic) ) % magic + if z < 0 or z >= magic: + raise BooklandError, "UPC checkDigit: something wrong." + return self.xstring(z) + + +class ISBN: + # Includes ISMN, if the plan falls together. + def __init__(self,arg): + self.ndigits=10 # Includes check digit! + self.s=string.upper(arg) + self.n=re.sub("[ -]","",self.s) # "integer" representation + # In ISMN, I allow spaces in place of hyphens. See ISMN User's manual. + if re.match("^M( |-)?\d(( |-)?\d){7,7}(-| )?\d?$",self.s): + # ISMN + self.name="ISMN" + self.n=re.sub("^M","3",self.n) + self.weight=[3,1,3,1,3,1,3,1,3] + self.magic=10 + elif re.match("^\d-?\d(-?\d){7,7}-?(\d|X)?$",self.s): + # ISBN + self.name="ISBN" + self.weight=[10,9,8,7,6,5,4,3,2] + self.magic=11 + else: + raise BooklandError, "%s invalid (hyphenation, characters, or length)" % self.s + self.x = self.checkDigit() + if len(self.n) == self.ndigits: + self.verifyCheckDigit() # if check digit given, verify it + elif len(self.n) == self.ndigits-1: + self.tackonCheckDigit() # tack on check digit + else: + raise BooklandError, "%s failed. Please report as bug" % self.s + + + def checkDigit(self): # ISBN and ISMN; UPCA/EAN13 similar but for weights etc. + # now that we're checking regex's in init, we don't have to check the + # argument at all. (used to check length and bad characters) + sum = 0 + for i in range(9): # checksum based on first nine digits. + sum = sum + int(self.n[i]) * self.weight[i] + z = ( self.magic - (sum % self.magic) ) % self.magic + if z < 0 or z >= self.magic: + raise BooklandError, \ + "%s: checksum %d is wrong - please report as bug" % (self.s,z) + return self.xstring(z) + + def xstring(self,p): + if p == 10: + return "X" + else: + return "%d" % p + + def tackonCheckDigit(self): + if self.s[-1:] == "-": + # Already have a trailing hyphen + self.s = self.s + self.x + else: + self.s = self.s + "-" + self.x + + def verifyCheckDigit(self): # UPC A; EAN13 + # first verify correct number of digits. + soll=self.x + ist=self.s[-1:] + if ist != soll: raise BooklandError, \ + "For %s checksum %s is wrong, should be %s\n" % (self.s,ist,soll) + +class Bar: + # a run of adjacent modules of identical value. + def __init__(self,val): + self.val=val + if not self.val in "L01": + raise BooklandError, "bar bit: %s, pls report as a bug" % self.val + self.width=1 + if self.val=="1": + self.color="Black" + elif self.val=="0": + self.color="White" + elif self.val=="L": + self.color="Long Black" + def __cmp__(self,other): + if self.val==other or (self.val=="L" and other=="1"): + return 0 + else: + return 1 + def inc(self): + self.width=self.width+1 + def pslines(self): + if self.val=="L": + rval = [ "%d L " % self.width ] + elif self.val=="1": + rval = [ "%d B " % self.width ] + else: + rval = [ "%d W " % self.width ] + return rval + def __repr__(self): + return "%s bar of width %d" % (self.color,self.width) + +class barCodeSymbol: + + def __init__(self): + self.patternWidth = len(self.bits)*self.moduleWidth + # Anything else? + + def bitsComment(self): + return [ "%% Bits:\n%% %s" % self.bits ] + + def psbars(self): + # new version, try to prevent all hairlines between adjacent modules. + bars = [] + bar=Bar(self.bits[0]) + for bit in self.bits[1:]: + if bit==bar: + bar.inc() + else: + bars.append(bar) + bar=Bar(bit) + bars.append(bar) + rval = ["0 0 moveto"] + for bar in bars: + rval = rval + bar.pslines() + rval = rval + [ "stroke" ] + return rval + + def psbarsold(self): + psbits=regsub.gsub("1","I ",self.bits) + psbits=regsub.gsub("0","O ",psbits) + psbits=regsub.gsub("L","L ",psbits) + linewidth=50 + p=0; j=linewidth; m=len(psbits); psbarlines=[]; blanks="^ | $" + while p <= m: + j = min(linewidth,m-p) + psbarlines = psbarlines + [ regsub.gsub(blanks,"",psbits[p:p+j]) ] + p=p+linewidth + return [ "0 0 moveto" ] + psbarlines + [ "stroke" ] + + def psSetBarHeight(self): + return [ "/barHeight { " + PSFORMAT % self.moduleHeight + " 72 mul } def" ] + + def psSetBarWidthReduction(self): + return [ "/barWidthReduction { " + \ + PSFORMAT % self.barWidthReduction + " 72 mul } def" ] + + def psSetModuleWidth(self): + rval = [ "/moduleWidth { " + PSFORMAT % self.moduleWidth + " 72 mul } def" ] + return rval + + def psBottomRightText(self,text,font): + # this is specifically for the upc5 price code. + # this is all starting to get messy. + return [ PSFORMAT % self.patternWidth + " 72 mul dup 2 div", + PSFORMAT % self.moduleHeight + " 72 mul 2 add moveto", + "(" + text + ") /" + font + " fitstring bottomcentershow" ] + + def psTopCenterText(self,text,font): + # the text at the top center of the bar pattern (i.e. the ISBN) + return [ PSFORMAT % self.patternWidth + " 72 mul dup 2 div", + PSFORMAT % self.moduleHeight + " 72 mul 3 add moveto", + " (" + text + ") /" + font + " fitstring bottomcentershow" ] + + def psFittedText(self,width,text,font): + return [ PSFORMAT % width + " (" + text + ") " + font + " fitstring" ] + + # This is optional; serves to enforce quiet zone to right of UPC 5 add-on + def psGreaterThan(self,font): + return [ PSFORMAT % self.patternWidth + " 72 mul", + PSFORMAT % self.moduleHeight + " 72 mul 2 add moveto", + "/%s (>) show" % font ] + +class EAN13Symbol(barCodeSymbol): + + def __init__(self,arg,font=EAN13FONT,heightMultiplier=1,barWidthReduction=0): + # arg is a string with the EAN product code + self.barWidthReduction=barWidthReduction + self.ean13 = EAN13(arg) + self.moduleWidth = 0.0130 + specModuleHeight = 1.00 + self.moduleHeight = 1.00 * heightMultiplier + self.bits = self.ean13.bits + barCodeSymbol.__init__(self) + self.font=font + + def bb(self): + return [ -12, -10, self.patternWidth*72+10, self.moduleHeight*72+12 ] + + def pslines(self): + return self.bitsComment() + \ + self.psSetModuleWidth() + \ + self.psSetBarWidthReduction() + \ + self.psSetBarHeight() + \ + self.psbars() + \ + self.psLRDigitLines() + + def psLRDigitLines(self): + # 24 = 3+6*7/2 + # 70 = 3+6*7+4+6*7/2 "4" so we center on the "L" bars (the rightmost of + # the center guard bars is an "O". + # "5" in check digit is the five-module spacing recommended by [2], section 3. + return [ "% We do the left digits first and leave the font scaled", + "% as is for the 9-digit and the right-digits.", + "% EAN13 Left Digits:", + "moduleWidth 24 mul 0 moveto", + "moduleWidth 40 mul (" + self.ean13.leftDigits + ") ", + "/" + self.font + " fitstring topcentershow", + "\n% EAN13 human-readable number", + "% The \"9\" digit (only when encoding ISBN's and ISMN's, I think):", + "-5 0 moveto (" + self.ean13.n[0] + ") toprightshow", + "% EAN13 Right Digits:", + "moduleWidth 70 mul 0 moveto", + "moduleWidth 40 mul (" + self.ean13.rightDigits + ") topcentershow" ] + +class EAN13(UPCA): + + def __init__(self,arg): + self.ndigits=13 # Includes check digit! + UPCA.__init__(self,arg) + leftBits = self.bits[0:42] + rightBits = self.bits[42:] + leftGuard="L0L" + rightGuard="L0L" + center="0L0L0" + self.bits = leftGuard + leftBits + center + rightBits + rightGuard + self.leftDigits = self.n[1:7] + self.rightDigits = self.n[7:13] + + def parityPattern(self): + # N.B. parity pattern based on leftmost digit, the UCC Spec calls this + # the "13th" digit. It's not the check digit! + return EAN13PARITY[int(self.n[0])] + def bitchar(self): + return EAN13BITS + +class UPC5Symbol(barCodeSymbol): + + def __init__(self,arg,heightMultiplier=1,barWidthReduction=0): + # arg is a string with the 5 digit add-on. + self.barWidthReduction=barWidthReduction + self.upc5 = UPC5(arg) + self.moduleWidth = 0.0130 + specModuleHeight = 0.852 + self.moduleHeight = 0.852 * heightMultiplier + self.bits = self.upc5.bits + barCodeSymbol.__init__(self) + + def pslines(self): + return self.bitsComment() + \ + self.psSetModuleWidth() + \ + self.psSetBarHeight() + \ + self.psbars() + + def bb(self): + # Note quiet zone is there even if we don't print the ">". + return [ 0, 0, self.patternWidth*72+10, self.moduleHeight*72+10 ] + +UPC5Error = "Something wrong with 5-digit price code add-on." +class UPC5(UPC): + + def __init__(self,arg): + self.ndigits=5 # Includes check digit! + p=re.search("[^0-9]",arg) + if p: + badchar=arg[p.start()] + raise UPC5Error, "\"%s\" is wrong. The character \"%s\" is not allowed. Price code add-on should contain %d digits and nothing else. Or leave blank to suppress the UPC-5 code." % (arg,badchar,self.ndigits) + elif len(arg) != self.ndigits: + raise UPC5Error, \ + "\"%s\" is wrong. Price code add-on should have exactly %d digits." % (arg,self.ndigits) + UPC.__init__(self,arg) + self.setbits(self.n) + leftGuard="1011" + # no right guard for UPC 5-digit add-on + # Have to insert pesky delineators: + delineator = "01" + self.bits = leftGuard + \ + self.bits[0:7] + delineator + \ + self.bits[7:14] + delineator + \ + self.bits[14:21] + delineator + \ + self.bits[21:28] + delineator + \ + self.bits[28:35] + + def checkDigit(self,arg): # UPC5 + weight=[3,9,3,9,3]; sum = 0 + for i in range(5): + sum = sum + int(arg[i]) * weight[i] + return self.xstring(sum % 10) + + def verifyCheckDigit(self): # UPC2/5 checksum not in number + return + + def parityPattern(self): + return UPC5PARITY[int(self.x)] + def bitchar(self): + return UPC5BITS + +class bookland(barCodeSymbol): + + def __init__(self,isbn,price="",*rest): + + + # Some defaults: + ean13font=EAN13FONT + isbnfont=ISBNFONT + upc5font = UPC5FONT + zone=None + heightMultiplier=1.0 + commandLine="" + barWidthReduction=0 + + # Maybe different fonts: + if len(rest)>0: + font=rest[0] + if font: + ean13font=font + isbnfont=font + upc5font=font + if len(rest)>1: + zone=rest[1] + if len(rest)>2: + heightMultiplier=float(rest[2]) + if len(rest) > 3: + commandLine=rest[3] + if len(rest) > 4: + barWidthReduction=float(rest[4]) + + # Initial setup: + + self.ps = psfile() + self.isbn = ISBN(isbn) + + # Header, EAN13 bars, EAN13 number, and ISBN: + + if self.isbn.name=="ISMN": + self.ean13Symbol = EAN13Symbol("9790"+self.isbn.n[1:9],ean13font,heightMultiplier,barWidthReduction) + elif self.isbn.name=="ISBN": + self.ean13Symbol = EAN13Symbol("978"+self.isbn.n[:9],ean13font,heightMultiplier,barWidthReduction) + else: + raise BooklandError, "Internal error doing %s, please report as bug" % isbn + + self.ps.orbb(self.ean13Symbol.bb()) + comments = ["", + " This is free software and comes with NO WARRANTY WHATSOVER", + " Think twice before going to press with this bar code!", + "", + "Command line: %s" % commandLine, + "" ] + self.ps.lines = self.ps.header(self.isbn.s,comments,ean13font,isbnfont,upc5font) + \ + [ "ean13font" ] + \ + self.ean13Symbol.pslines() +\ + [ "isbnfont" ] + \ + self.ean13Symbol.psTopCenterText("%s %s" % (self.isbn.name,self.isbn.s),isbnfont) + + # 5-digit add-on: (optional for ISBN only) + BLANK=re.compile("^ *$") + if self.isbn.name=="ISBN" and not BLANK.match(price): + # 105 = 95 + 10; 10 = separation (min is 9) + translate=[ self.ps.translate( self.ean13Symbol.moduleWidth * 72 * 105, 0 ) ] + self.upc5Symbol = UPC5Symbol(price,heightMultiplier,barWidthReduction) + self.ps.orbb(self.upc5Symbol.bb()) + self.ps.lines = self.ps.lines + \ + translate + \ + self.upc5Symbol.pslines() + \ + [ "upc5font" ] +\ + self.upc5Symbol.psBottomRightText(price,upc5font) + if zone: self.ps.lines=self.ps.lines + self.upc5Symbol.psGreaterThan(upc5font) + else: + self.ps.lines.append("%% Skipping UPC-5 price code symbol per request") + + self.ps.lines=self.ps.lines + self.ps.trailer() + + # Can now set bounding box. + + self.ps.setbb() + +# Here we go ... + +if __name__ == '__main__': + + def printUsage(): + print "Usage: bookland [-h|--help] [-v|--version] [-x|--check] [-f|--font=] [-s|--height=] [-r|--reduction=] [-o|outfile=] [-z|--quietzone] [| ]" + print "Report bugs to " + MAINTAINER + + def printVersion(): + sys.stderr.write("%s version %s %s.\n" % (MYNAME,MYVERSION,COPYRIGHT)) + sys.stderr.write("Bugs to %s\n" % MAINTAINER) + sys.stderr.write("This is free software and comes with NO WARRANTY\n") + + import getopt + try: + opts,args = getopt.getopt(sys.argv[1:], + "xr:s:uvf:hzo:", + ["reduction=","outfile=","height=","noupc", + "check","version","help","font=","quietzone"]) + except: + printUsage() + sys.exit(0) + + # some initial defaults: + isbn = "1-56592-197-6" # Mark Lutz, "Programming Python", + # O'Reilly, Sebastopol CA, 1996 + price = "90000" + font=None + zone=None + checkonly=None + outfile=None + heightMultiplier=1 + commandLine = string.join(sys.argv) + barWidthReduction = 0 + + # parse command line: + for opt,val in opts: + if opt in ("-v","--version"): + printVersion() + sys.exit(0) + elif opt in ("-h","--help"): + printUsage() + sys.exit(0) + elif opt in ("-f","--font"): + font=val + elif opt in ("-z","--quietzone"): + zone=1 + elif opt in ("-x","--check"): + checkonly=1 + elif opt in ("-s","--height"): + heightMultiplier = float(val) + elif opt in ("-r","--reduction"): + barWidthReduction = val + elif opt in ("-o","--outfile"): + outfile=val + if len(args)==1: + isbn=args[0] + elif len(args)==2: + isbn=args[0] + price=args[1] + + # Do stuff. + + printVersion() + try: + b = bookland(isbn,price,font,zone,heightMultiplier, + commandLine,barWidthReduction) + if not checkonly: b.ps.out(outfile) + if outfile: + sys.stderr.write("Output written to %s\n" % outfile) + except BooklandError, message: + sys.stderr.write(BooklandError + ": " + message + "\n") + sys.exit(1) diff --git a/glabels2/barcode-0.98/cmdline.c b/glabels2/barcode-0.98/cmdline.c new file mode 100644 index 00000000..a69a825b --- /dev/null +++ b/glabels2/barcode-0.98/cmdline.c @@ -0,0 +1,177 @@ +/* + * cmdline.c -- parse a command line using getopt, environment and defaults + * + * Copyright (c) 1999 Alessandro Rubini (rubini@gnu.org) + * Copyright (c) 1999 Prosa Srl. (prosa@prosa.it) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + * + * Changes: + * Michele Comitini (mcm@glisco.it): better handling of numeric type args. + */ + +#include +#include +#include + +#ifdef NO_GETOPT + /* use replacement */ + #include "compat/getopt.h" +#else + #include +#endif + +#include "cmdline.h" + +/* In case of error, print help string and return error (-1) */ +int commandline_errormsg(FILE *f, struct commandline *args, + char *prgname, char *messagehead) +{ + char *buffer; + char *buffer2; + int len; + struct commandline *ptr; + + if (!messagehead) { + fprintf(f,"%s: Error in cmdline\nPossible options:\n",prgname); + } else { + fprintf(f,"%s: %s",prgname,messagehead); + } + + for (ptr = args; ptr->option; ptr++) { + if (ptr->descrip) { + len = strlen(ptr->descrip); + len += ptr->default_v ? strlen(ptr->default_v) : 6; + len += ptr->env ? strlen(ptr->env) : 6; + buffer2 = malloc(len+3); /* 3 to be safe :) */ + len += 32; + if (buffer2) { + buffer = malloc(len); + if (buffer) { + sprintf(buffer2, ptr->descrip, + ptr->default_v ? ptr->default_v : "(none)", + ptr->env ? ptr->env : "(none)"); + sprintf(buffer, " -%c %s %s", ptr->option, + ptr->type ? "" : " ", buffer2); + fprintf(f, "%s\n",buffer); + free(buffer); + } + free(buffer2); + } + } + } + return -1; +} + +/* + * Associate formats to type. + */ +struct type_fmt { + enum option_type type; + char *fmt; +}; +static struct type_fmt formats[] = { + {CMDLINE_I, "%i%s"}, /* the trailing "%s" is used for error check */ + {CMDLINE_D, "%d%s"}, + {CMDLINE_X, "%x%s"}, + {CMDLINE_O, "%o%s"}, + {CMDLINE_F, "%lf%s"}, + {CMDLINE_P, "%p%s"}, + {0, NULL} /* If we get here, it's CMDLINE_S: no sscanf buf strcpy() */ +}; + + +/* Parse one argument (default or provided) */ +static int commandline_oneopt(struct commandline *ptr, char *value) +{ + struct type_fmt *tptr; + char *trash = value ? strdup(value) : NULL; + + /* convert it, if needed */ + if ((ptr->type != CMDLINE_NONE) && ptr->result) { + for (tptr = formats; tptr->type; tptr++) + if (tptr->type == ptr->type) + break; + if (!tptr->type) /* not found: it is a string */ + *(char **)(ptr->result) = value; + else + if (sscanf(value, tptr->fmt, ptr->result, trash)!=1) { + free(trash); + return -1; + } + } + if (trash) + free(trash); + + if ((ptr->type == CMDLINE_NONE) && ptr->result) /* no type, just count */ + (*(int *)(ptr->result))++; + + /* call the function, if needed */ + if (ptr->fun) { + if (ptr->type) { + if (ptr->result) return ptr->fun(ptr->result); /* converted */ + return ptr->fun(value); /* type, but not converted */ + } + return ptr->fun(NULL); /* no type: just call it */ + } + return 0; +} + +/* The main function */ +int commandline(struct commandline *args, int argc, char **argv, + char *errorhead) +{ + struct commandline *ptr; + char *getopt_desc = (char *)calloc(512, 1); + int desc_offset = 0; + int opt, retval; + char *value; + + /* Build getopt string and process defaults values */ + for (ptr = args; ptr->option; ptr++) { + getopt_desc[desc_offset++] = ptr->option; + if (ptr->type) getopt_desc[desc_offset++] = ':'; + + value = NULL; + if (ptr->env) + value = getenv(ptr->env); + if (!value) + value = ptr->default_v; + if (value && (retval = commandline_oneopt(ptr, value))) { + /* + * if the function returns a specific (not -1) value, it already + * printed its message, so avoid the generic help + */ + if (retval == -1) + commandline_errormsg(stderr, args, argv[0], errorhead); + return retval; + } + } + + /* Run getopt and process material */ + while ((opt = getopt(argc, argv, getopt_desc)) != -1) { + for (ptr = args; ptr->option; ptr++) + if (opt == ptr->option) + break; + if (!ptr->option) /* unknown option */ + return commandline_errormsg(stderr, args, argv[0], errorhead); + if ( (retval = commandline_oneopt(ptr, optarg)) ) { /* wrong arg */ + if (retval == -1) + commandline_errormsg(stderr, args, argv[0], errorhead); + return retval; + } + } + return 0; +} diff --git a/glabels2/barcode-0.98/cmdline.h b/glabels2/barcode-0.98/cmdline.h new file mode 100644 index 00000000..69319915 --- /dev/null +++ b/glabels2/barcode-0.98/cmdline.h @@ -0,0 +1,58 @@ +/* + * cmdline.h -- generic commandline editing (uses getopt, only short) + * + * Copyright (c) 1999 Alessandro Rubini (rubini@gnu.org) + * Copyright (c) 1999 Prosa Srl. (prosa@prosa.it) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + * + */ + +/* + * The options may have different arguments of different type + */ +enum option_type { + CMDLINE_NONE=0, /* no argument after option */ + CMDLINE_I, /* integer (any base) */ + CMDLINE_D, /* decimal integer */ + CMDLINE_X, /* hex integer */ + CMDLINE_O, /* octal integer */ + CMDLINE_S, /* string */ + CMDLINE_F, /* double float */ + CMDLINE_P, /* pointer */ +}; + + +struct commandline { + int option; /* Single byte: option id */ + int type; /* Type of argument, used in sscanf */ + void *result; /* Store data here, if non null */ + int (*fun)(void *); /* Call if defined: arg is "result" or input string */ + char *env; /* Where to get runtime defaults, may be NULL */ + char *default_v; /* The compile-time default, may be NULL */ + char *descrip; /* For err msg. May have %s's for default and env */ +}; + +/* returns: 0 or -1. "optarg" is global (see getopt) */ +extern int commandline(struct commandline *args, + int argc, char **argv, char *errorhead); + +/* prints an error message based on "args" */ +extern int commandline_errormsg(FILE *f, struct commandline *args, + char *prgname, char *messagehead); + + + + diff --git a/glabels2/barcode-0.98/codabar.c b/glabels2/barcode-0.98/codabar.c new file mode 100644 index 00000000..7065b9ea --- /dev/null +++ b/glabels2/barcode-0.98/codabar.c @@ -0,0 +1,182 @@ +/* + * codabar.c -- encoding for Codabar + * + * Copyright (c) 2000 Leonid A. Broukhis (leob@mailcom.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include + +#include "barcode.h" + + +/* this is ordered in decades to simplify encoding */ +static char alphabet[] = + "0123456789" "-$:/.+ABCD"; + +#define CODE_A 16 +#define CODE_B 17 + +#define NARROW 12 +#define WIDE 14 + +/* Patterns */ +static char *patterns[] = { +"1111133","1111331","1113113","3311111","1131131", +"3111131","1311113","1311311","1331111","3113111", +"1113311","1133111","3111313","3131113","3131311", +"1131313","1133131","1313113","1113133","1113331" }; + +/* + * Check that the text can be encoded. Returns 0 or -1. + * If it's all lowecase convert to uppercase and accept it. + * If the first character is a letter (A to D), the last one must be too; + * no other character should be a letter. + */ +int Barcode_cbr_verify(unsigned char *text) +{ + int i, lower=0, upper=0; + int startpresent = 0; + + if (!strlen(text)) + return -1; + for (i=0; text[i]; i++) { + char * pos; + if (isupper(text[i])) upper++; + if (islower(text[i])) lower++; + pos = strchr(alphabet,toupper(text[i])); + if (!pos) + return -1; + if (i == 0 && pos - alphabet >= CODE_A) + startpresent = 1; + else if (pos - alphabet >= CODE_A && + (!startpresent || i != strlen(text) - 1)) + return -1; + } + if (lower && upper) + return -1; + return 0; +} + +static int add_one(char *ptr, int code) +{ + sprintf(ptr,"1%s", /* separator */ patterns[code]); + return 0; +} + +/* + * The encoding functions fills the "partial" and "textinfo" fields. + * Lowercase chars are converted to uppercase + */ +int Barcode_cbr_encode(struct Barcode_Item *bc) +{ + static char *text; + static char *partial; /* dynamic */ + static char *textinfo; /* dynamic */ + char *c, *ptr, *textptr; + int i, code, textpos, usesum, checksum = 0, startpresent; + + if (bc->partial) + free(bc->partial); + if (bc->textinfo) + free(bc->textinfo); + bc->partial = bc->textinfo = NULL; /* safe */ + + if (!bc->encoding) + bc->encoding = strdup("codabar"); + + text = bc->ascii; + if (!text) { + bc->error = EINVAL; + return -1; + } + /* the partial code is 8 * (head + text + check + tail) + margin + term. */ + partial = malloc( (strlen(text) + 3) * 8 + 2); + if (!partial) { + bc->error = errno; + return -1; + } + + /* the text information is at most "nnn:fff:c " * (strlen + check) +term */ + textinfo = malloc(10*(strlen(text) + 1) + 2); + if (!textinfo) { + bc->error = errno; + free(partial); + return -1; + } + + ptr = partial; + textptr = textinfo; + textpos = 0; + usesum = bc->flags & BARCODE_NO_CHECKSUM ? 0 : 1; + /* if no start character specified, A is used as a start character */ + if (!isalpha(text[0])) { + add_one(ptr, CODE_A); + ptr += strlen(ptr); + textpos = WIDE; + checksum = CODE_A; + startpresent = 0; + } else { + startpresent = 1; + } + for (i=0; ierror = EINVAL; /* impossible if text is verified */ + free(partial); + free(textinfo); + return -1; + } + code = c - alphabet; + add_one(ptr, code); + sprintf(textptr, "%i:12:%c ", textpos, toupper(text[i])); + textpos += code < 12 ? NARROW : WIDE; + textptr += strlen(textptr); + ptr += strlen(ptr); + checksum += code; + if (startpresent && usesum && i == strlen(text) - 2) { + /* stuff a check symbol before the stop */ + c = strchr(alphabet, toupper(text[i+1])); + if (!c) /* impossible */ + continue; + code = c - alphabet; + checksum += code; + + /* Complement to a multiple of 16 */ + checksum = (checksum + 15) / 16 * 16 - checksum; + add_one(ptr, checksum); + ptr += strlen(ptr); + } + } + if (!startpresent) { + if (usesum) { + /* if no start character specified, B is used as a stop char */ + checksum += CODE_B; + checksum = (checksum + 15) / 16 * 16 - checksum; + add_one(ptr, checksum); + ptr += strlen(ptr); + } + add_one(ptr, CODE_B); + } + bc->partial = partial; + bc->textinfo = textinfo; + + return 0; +} diff --git a/glabels2/barcode-0.98/code128.c b/glabels2/barcode-0.98/code128.c new file mode 100644 index 00000000..cebba54c --- /dev/null +++ b/glabels2/barcode-0.98/code128.c @@ -0,0 +1,607 @@ +/* + * code128.c -- encoding for code128 (A, B, C) + * + * Copyright (c) 1999,2000 Alessandro Rubini (rubini@gnu.org) + * Copyright (c) 1999 Prosa Srl. (prosa@prosa.it) + * Copyright (c) 2000 Leonid A. Broukhis (leob@mailcom.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include + +#include "barcode.h" + +static char *codeset[] = { + "212222", "222122", "222221", "121223", "121322", /* 0 - 4 */ + "131222", "122213", "122312", "132212", "221213", + "221312", "231212", "112232", "122132", "122231", /* 10 - 14 */ + "113222", "123122", "123221", "223211", "221132", + "221231", "213212", "223112", "312131", "311222", /* 20 - 24 */ + "321122", "321221", "312212", "322112", "322211", + "212123", "212321", "232121", "111323", "131123", /* 30 - 34 */ + "131321", "112313", "132113", "132311", "211313", + "231113", "231311", "112133", "112331", "132131", /* 40 - 44 */ + "113123", "113321", "133121", "313121", "211331", + "231131", "213113", "213311", "213131", "311123", /* 50 - 54 */ + "311321", "331121", "312113", "312311", "332111", + "314111", "221411", "431111", "111224", "111422", /* 60 - 64 */ + "121124", "121421", "141122", "141221", "112214", + "112412", "122114", "122411", "142112", "142211", /* 70 - 74 */ + "241211", "221114", "413111", "241112", "134111", + "111242", "121142", "121241", "114212", "124112", /* 80 - 84 */ + "124211", "411212", "421112", "421211", "212141", + "214121", "412121", "111143", "111341", "131141", /* 90 - 94 */ + "114113", "114311", "411113", "411311", "113141", + "114131", "311141", "411131", "b1a4a2", "b1a2a4", /* 100 - 104 */ + "b1a2c2", "b3c1a1b" +}; + +#define START_A 103 +#define START_B 104 +#define START_C 105 +#define STOP 106 +#define SHIFT 98 /* only A and B */ +#define CODE_A 101 /* only B and C */ +#define CODE_B 100 /* only A and C */ +#define CODE_C 99 /* only A and B */ +#define FUNC_1 102 /* all of them */ +#define FUNC_2 97 /* only A and B */ +#define FUNC_3 96 /* only A and B */ +/* FUNC_4 is CODE_A when in A and CODE_B when in B */ + +#define SYMBOL_WID 11 /* all of them are 11-bar wide */ + +/* + * code 128-b includes all printable ascii chars + */ + +int Barcode_128b_verify(unsigned char *text) +{ + if (text[0] == '\0') + return -1; + while (*text && *text>=32 && !(*text&0x80)) + text++; + if (*text) + return -1; /* a non-ascii char */ + return 0; /* ok */ +} + +int Barcode_128b_encode(struct Barcode_Item *bc) +{ + static char *text; + static char *partial; /* dynamic */ + static char *textinfo; /* dynamic */ + char *textptr; + int i, code, textpos, checksum = 0; + + if (bc->partial) + free(bc->partial); + if (bc->textinfo) + free(bc->textinfo); + bc->partial = bc->textinfo = NULL; /* safe */ + + if (!bc->encoding) + bc->encoding = strdup("code 128-B"); + + text = bc->ascii; + if (!text) { + bc->error = EINVAL; + return -1; + } + /* the partial code is 6* (head + text + check + tail) + final + term. */ + partial = malloc( (strlen(text) + 4) * 6 +2); + if (!partial) { + bc->error = errno; + return -1; + } + + /* the text information is at most "nnn:fff:c " * strlen +term */ + textinfo = malloc(10*strlen(text) + 2); + if (!textinfo) { + bc->error = errno; + free(partial); + return -1; + } + + /* up to now, it was the same code as other encodings */ + + strcpy(partial, "0"); /* the first space */ + strcat(partial, codeset[START_B]); + checksum += START_B; /* the start char is counted in the checksum */ + textptr = textinfo; + textpos = SYMBOL_WID; + + for (i=0; ierror = EINVAL; /* impossible if text is verified */ + free(partial); + free(textinfo); + return -1; + } + code = text[i]-32; + strcat(partial, codeset[code]); + checksum += code * (i+1); /* first * 1 + second * 2 + third * 3... */ + sprintf(textptr, "%i:12:%c ", textpos, text[i]); + textptr += strlen(textptr); + textpos += SYMBOL_WID; /* width of each code */ + } + /* Add the checksum, independent of BARCODE_NO_CHECKSUM */ + checksum %= 103; + strcat(partial, codeset[checksum]); + /* and the end marker */ + strcat(partial, codeset[STOP]); + + bc->partial = partial; + bc->textinfo = textinfo; + + return 0; +} + +/* + * code 128-c is only digits, but two per symbol + */ + +int Barcode_128c_verify(unsigned char *text) +{ + if (text[0] == '\0') + return -1; + /* must be an even number of digits */ + if (strlen(text)%2) + return -1; + /* and must be all digits */ + for (; *text; text++) + if (!isdigit(*text)) + return -1; + return 0; +} + +int Barcode_128c_encode(struct Barcode_Item *bc) +{ + static char *text; + static char *partial; /* dynamic */ + static char *textinfo; /* dynamic */ + char *textptr; + int i, code, textpos, checksum = 0; + + if (bc->partial) + free(bc->partial); + if (bc->textinfo) + free(bc->textinfo); + bc->partial = bc->textinfo = NULL; /* safe */ + + if (!bc->encoding) + bc->encoding = strdup("code 128-C"); + + text = bc->ascii; + if (!text) { + bc->error = EINVAL; + return -1; + } + /* the partial code is 6* (head + text + check + tail) + final + term. */ + partial = malloc( (strlen(text) + 3) * 6 +2); + if (!partial) { + bc->error = errno; + return -1; + } + + /* the text information is at most "nnn.5:fff:c " * strlen +term */ + textinfo = malloc(12*strlen(text) + 2); + if (!textinfo) { + bc->error = errno; + free(partial); + return -1; + } + + strcpy(partial, "0"); /* the first space */ + strcat(partial, codeset[START_C]); + checksum += START_C; /* the start char is counted in the checksum */ + textptr = textinfo; + textpos = SYMBOL_WID; + + for (i=0; text[i]; i+=2) { + if (!isdigit(text[i]) || !isdigit(text[i+1])) { + bc->error = EINVAL; /* impossible if text is verified */ + free(partial); + free(textinfo); + return -1; + } + code = (text[i]-'0') * 10 + text[i+1]-'0'; + strcat(partial, codeset[code]); + checksum += code * (i/2+1); /* first * 1 + second * 2 + third * 3... */ + + /* print as "%s", because we have ".5" positions */ + sprintf(textptr, "%g:9:%c %g:9:%c ", (double)textpos, text[i], + textpos + (double)SYMBOL_WID/2, text[i+1]); + textptr += strlen(textptr); + textpos += SYMBOL_WID; /* width of each code */ + } + /* Add the checksum, independent of BARCODE_NO_CHECKSUM */ + checksum %= 103; + strcat(partial, codeset[checksum]); + /* and the end marker */ + strcat(partial, codeset[STOP]); + + bc->partial = partial; + bc->textinfo = textinfo; + + return 0; +} + +/* + * generic (full-featured) code128 implementation: it selects between + * A, B, C according to the data being encoded. F1, F2, F3, F4 are expressed + * using ascii chars 0xc1, 0xc2, 0xc3, 0xc4 (0301, 0302, 0303, 0304). + * Char '\0' is expressed by 0x80 (0200). + */ + +int Barcode_128_verify(unsigned char *text) +{ + if (text[0] == '\0') + return -1; + while (*text && (*text<=0x80 || (*text >= 0xc1 && *text <= 0xc4))) + text++; + if (*text) + return -1; /* unencodable character */ + return 0; /* ok */ +} + + +/* + * These functions are extracted from Barcode_128_encode for clarity. + * It deals with choosing the symbols used to represent the text + * and returns a dynamic array of integers, terminated by -1. + * + * The algorithm used in choosing the codes comes from App 2 of + * "El Codigo Estandar EAN/UCC 128", courtesy of AECOC, Spain. + * Thanks to Dani Pardo for getting permission and giving me a copy + * of the document + */ + +#define NEED_CODE_A(c) ((c)<32 || (c)==0x80) +#define NEED_CODE_B(c) ((c)>=96 && (c)<128) + +static int Barcode_a_or_b(unsigned char *text) +{ + for ( ; *text; text++) { + if (NEED_CODE_A(*text)) + return 'A'; + if (NEED_CODE_B(*text)) + return 'B'; + } + return 0; /* any */ +} + +/* code is either 'A' or 'B', and value must be valid */ +static int Barcode_encode_as(int code, int value) +{ + + /* first check the special chars */ + if (value == 0xC1) return FUNC_1; + if (value == 0xC2) return FUNC_2; + if (value == 0xC3) return FUNC_3; + if (value == 0xC4) { /* F4 */ + if (code == 'A') return CODE_A; + return CODE_B; + } + + /* then check ascii values */ + if (value >= 0x20 && value <= 0x5F) + return value - 0x20; /* both codes */ + if (value == 0x80) return 64; /* code A */ + if (value < 0x20) return value+64; /* code A */ + if (value >= 0x60) return value - 0x20; /* code B */ + /* can't happen */ + return -1; +} + +static int *Barcode_128_make_array(struct Barcode_Item *bc, int *lptr) +{ + int len, *codes; + unsigned char *s; + int i=0, j, code, checksum; + + /* allocate twice the text length + 5, as this is the worst case */ + len = 2 * strlen(bc->ascii) + 5; + codes = malloc(len * sizeof(int)); + s = bc->ascii; + + /* choose the starting code */ + if (s[2]=='\0' && isdigit(s[0]) && isdigit(s[1])) { + code = 'C'; + } else if (isdigit(s[0])&&isdigit(s[1]) && isdigit(s[2])&&isdigit(s[3])) { + code = 'C'; + } else { + code = Barcode_a_or_b(s); + if (!code) code = 'B'; /* default */ + } + codes[i++] = START_A + code - 'A'; + + for (s = bc->ascii; *s; /* increments are in the loop */) { + switch(code) { + + case 'C': + if (s[0] == 0xC1) { /* F1 is valid */ + codes[i++] = FUNC_1; + s++; + } else if (isdigit(s[0]) && isdigit(s[1])) { + /* encode two digits */ + codes[i++] = (s[0]-'0') * 10 + s[1]-'0'; + s += 2; + } else { + /* change code */ + code = Barcode_a_or_b(s); + if (!code) code = 'B'; + codes[i++] = (code == 'A') ? CODE_A : CODE_B; + } + break; + + case 'B': + case 'A': + for (j=0; isdigit(s[j]); j++) + ; + if (j>=4) { /* if there are 4 or more digits, turn to C */ + if (j&1) { + /* odd number: encode one first */ + codes[i++] = *(s++) - ' '; + } + codes[i++] = CODE_C; + code = 'C'; + } else if (code == 'A' && NEED_CODE_B(*s)) { + /* check whether we should use SHIFT or change code */ + j = Barcode_a_or_b(s+1); + if (j == 'B') { + codes[i++] = CODE_B; + code = 'B'; + } else { + codes[i++] = SHIFT; + codes[i++] = Barcode_encode_as('B', *s); + s++; + } + } else if (code == 'B' && NEED_CODE_A(*s)) { + /* check whether we should use SHIFT or change code */ + j = Barcode_a_or_b(s+1); + if (j == 'A') { + codes[i++] = CODE_A; + code = 'A'; + } else { + codes[i++] = SHIFT; + codes[i++] = Barcode_encode_as('A', *s); + s++; + } + } else { + codes[i++] = Barcode_encode_as(code, *s); + s++; + } + break; + } + } + /* add the checksum */ + checksum = codes[0]; + for (j=1; j len) { + fprintf(stderr, "impossible: length is > allocated len\n"); + } + *lptr = i; + return codes; +} + +/* + * Encoding is tricky, in that we cannot print the ascii + * representation in an easy way. Therefore, just skip non-printable + * chars and try to fit the rest somehow. + */ +int Barcode_128_encode(struct Barcode_Item *bc) +{ + static char *text; + static char *partial; /* dynamic */ + static char *textinfo; /* dynamic */ + char *textptr; + int *codes; /* dynamic */ + int i, c, len; + double textpos, size, step; + + if (bc->partial) + free(bc->partial); + if (bc->textinfo) + free(bc->textinfo); + bc->partial = bc->textinfo = NULL; /* safe */ + + if (!bc->encoding) + bc->encoding = strdup("code 128"); + + text = bc->ascii; + if (!text) { + bc->error = EINVAL; + return -1; + } + + codes = Barcode_128_make_array(bc, &len); + if (!codes) return -1; + + /* the partial code is 6*codelen + ini + term (+margin) */ + partial = malloc( 6 * len + 4); + if (!partial) { + bc->error = errno; + free(codes); + return -1; + } + + /* the text information is at most "nnn.n:ff.f:c " * strlen +term */ + textptr = textinfo = malloc(13*strlen(text) + 2); + if (!textinfo) { + bc->error = errno; + free(partial); + free(codes); + return -1; + } + + /* up to now, it was almost the same code as other encodings */ + + strcpy(partial, "0"); /* the first space */ + for (i=0; i 12.0) size = 12.0; + + /* align the text to the left, using its natural size */ + step = (int)(10 * (size/18.0 * SYMBOL_WID) + .5) / 10.0; + textpos = SYMBOL_WID; + + for (i=0; i 0xc0) c = ' '; /* F code */ + sprintf(textptr, "%g:%g:%c ", textpos, size, c); + textptr += strlen(textptr); + textpos += step; + } + + bc->partial = partial; + bc->textinfo = textinfo; + free(codes); + return 0; +} + +/* + * A raw 128 code is given as a sequence of space separated numbers + * from 0 to 105, starting from the start code to be (Leonid) + */ + +int Barcode_128raw_verify(unsigned char *text) +{ + int n; + unsigned val; + + if (!strlen(text)) + return -1; + while (*text) { + if (sscanf(text, "%u%n", &val, &n) < 1) + return -1; + if (val > 105) + return -1; + text += n; + } + return 0; +} + +int Barcode_128raw_encode(struct Barcode_Item *bc) +{ + static char *text; + static char *partial; /* dynamic */ + static char *textinfo; /* dynamic */ + char *textptr; + int i, n, count, code, textpos, checksum = 0; + + if (bc->partial) + free(bc->partial); + if (bc->textinfo) + free(bc->textinfo); + bc->partial = bc->textinfo = NULL; /* safe */ + + if (!bc->encoding) + bc->encoding = strdup("128raw"); + + text = bc->ascii; + if (!text) { + bc->error = EINVAL; + return -1; + } + /* + * length of partial code is unknown in advance, but it is + * at most 6* (1+text/2 + check + tail) + final + terminator + */ + partial = malloc( (3+ strlen(text)/2) * 6 + 2); + if (!partial) { + bc->error = errno; + return -1; + } + + /* the text information is at most "nnn.5:fff:c " * 1+strlen/2 +term */ + textinfo = malloc(12 * (1+strlen(text)/2) + 2); + if (!textinfo) { + bc->error = errno; + free(partial); + return -1; + } + + strcpy(partial, "0"); /* the first space */ + textptr = textinfo; + textpos = 0; + + for (i=0, count = 0; i < strlen(text); count++) { + if (sscanf(text + i, "%u%n", &code, &n) < 1) { + bc->error = EINVAL; /* impossible if text is verified */ + free(partial); + free(textinfo); + return -1; + } + strcat(partial, codeset[code]); + + /* + * since the start code is part of the "raw" input, it is + * counted in the checksum by itself + */ + if (!count) checksum += code; /* the start code */ + else checksum += code * count; /* first * 1 + second * 2 ... */ + + /* + * print as "%s", because we have ".5" positions + * also, use a size of 9 like codeC above, as each symbol is + * represented by two chars + */ + sprintf(textptr, "%g:9:%c %g:9:%c ", (double)textpos, + code >= 100 ? 'A' : code/10 + '0', + textpos + (double)SYMBOL_WID/2, code%10 + '0'); + textptr += strlen(textptr); + textpos += SYMBOL_WID; /* width of each code */ + i += n; + } + /* Add the checksum, independent of BARCODE_NO_CHECKSUM */ + checksum %= 103; + strcat(partial, codeset[checksum]); + /* and the end marker */ + strcat(partial, codeset[STOP]); + + bc->partial = partial; + bc->textinfo = textinfo; + + return 0; +} + diff --git a/glabels2/barcode-0.98/code39.c b/glabels2/barcode-0.98/code39.c new file mode 100644 index 00000000..3308c950 --- /dev/null +++ b/glabels2/barcode-0.98/code39.c @@ -0,0 +1,173 @@ +/* + * code39.c -- encoding for code39 + * + * Copyright (c) 1999 Alessandro Rubini (rubini@gnu.org) + * Copyright (c) 1999 Prosa Srl. (prosa@prosa.it) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include + +#include "barcode.h" + + +/* this is ordered in decades to simplify encoding */ +static char alphabet[] = + "1234567890" "ABCDEFGHIJ" "KLMNOPQRST" "UVWXYZ-. *" "$/+%"; + +/* the checksum alphabet has a different order */ +static char checkbet[] = + "0123456789" "ABCDEFGHIJ" "KLMNOPQRST" "UVWXYZ-. $" "/+%"; + +/* The first 40 symbols repeat this bar pattern */ +static char *bars[] = { + "31113","13113","33111","11313","31311", + "13311","11133","31131","13131","11331"}; + +/* The first 4 decades use these space patterns */ +static char *spaces[] = {"1311","1131","1113","3111"}; + +/* the last four symbols are special */ +static char *specialbars[] = { + "11111","11111","11111","11111"}; + +static char *specialspaces[] = { + "3331","3313","3133","1333"}; + +static char *fillers[]= { + "0a3a1c1c1a", + "1a3a1c1c1a" +}; + + +/* + * Check that the text can be encoded. Returns 0 or -1. + * If it's all lowecase convert to uppercase and accept it + */ +int Barcode_39_verify(unsigned char *text) +{ + int i, lower=0, upper=0; + + if (text[0] == '\0') + return -1; + for (i=0; text[i]; i++) { + if (isupper(text[i])) upper++; + if (islower(text[i])) lower++; + if (!strchr(alphabet,toupper(text[i]))) + return -1; + } + if (lower && upper) + return -1; + return 0; +} + +static int add_one(char *ptr, int code) +{ + char *b, *s; + + if (code < 40) { + b = bars[code%10]; + s = spaces[code/10]; + } else { + b = specialbars[code-40]; + s = specialspaces[code-40]; + } + sprintf(ptr,"1%c%c%c%c%c%c%c%c%c", /* separator */ + b[0], s[0], b[1], s[1], b[2], s[2], + b[3], s[3], b[4]); + return 0; +} + +/* + * The encoding functions fills the "partial" and "textinfo" fields. + * Lowercase chars are converted to uppercase + */ +int Barcode_39_encode(struct Barcode_Item *bc) +{ + static char *text; + static char *partial; /* dynamic */ + static char *textinfo; /* dynamic */ + char *c, *ptr, *textptr; + int i, code, textpos, checksum = 0; + + if (bc->partial) + free(bc->partial); + if (bc->textinfo) + free(bc->textinfo); + bc->partial = bc->textinfo = NULL; /* safe */ + + if (!bc->encoding) + bc->encoding = strdup("code 39"); + + text = bc->ascii; + if (!text) { + bc->error = EINVAL; + return -1; + } + /* the partial code is 10* (head + text + check + tail) + margin + term. */ + partial = malloc( (strlen(text) + 3) * 10 +2); + if (!partial) { + bc->error = errno; + return -1; + } + + /* the text information is at most "nnn:fff:c " * strlen +term */ + textinfo = malloc(10*strlen(text) + 2); + if (!textinfo) { + bc->error = errno; + free(partial); + return -1; + } + + strcpy(partial, fillers[0]); + ptr = partial + strlen(partial); + textptr = textinfo; + textpos = 22; + + for (i=0; text[i]; i++) { + c = strchr(alphabet, toupper(text[i])); + if (!c) { + bc->error = EINVAL; /* impossible if text is verified */ + free(partial); + free(textinfo); + return -1; + } + code = c - alphabet; + add_one(ptr, code); + c = strchr(checkbet,*c); + if (c) /* the '*' is not there */ + checksum += (c-checkbet); + sprintf(textptr, "%i:12:%c ", textpos, toupper(text[i])); + + textpos += 16; /* width of each code */ + textptr += strlen(textptr); + ptr += strlen(ptr); + } + /* Add the checksum */ + if ( (bc->flags & BARCODE_NO_CHECKSUM)==0 ) { + code = (strchr(alphabet, checkbet[checksum % 43]) - alphabet); + add_one(ptr, code); + } + strcat(ptr, fillers[1]); /* end */ + bc->partial = partial; + bc->textinfo = textinfo; + + return 0; +} diff --git a/glabels2/barcode-0.98/code93.c b/glabels2/barcode-0.98/code93.c new file mode 100644 index 00000000..73f8cee3 --- /dev/null +++ b/glabels2/barcode-0.98/code93.c @@ -0,0 +1,213 @@ +/* + * code39.c -- encoding for code39 + * + * Copyright (c) 1999 Alessandro Rubini (rubini@gnu.org) + * Copyright (c) 1999 Prosa Srl. (prosa@prosa.it) + * Copyright (c) 2001 Nathan D. Holmes / FedEx Services (ndholmes@fedex.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include + +#include "barcode.h" + + +/* this is ordered in decades to simplify encoding */ +static char alphabet[] = + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%"; + +static char *codeset[] = { + "131112", "111213", "111312", "111411", "121113", /* 0 - 4 */ + "121212", "121311", "111114", "131211", "141111", /* 5 - 9 */ + "211113", "211212", "211311", "221112", "221211", /* A - E */ + "231111", "112113", "112212", "112311", "122112", /* F - J */ + "132111", "111123", "111222", "111321", "121122", /* K - O */ + "131121", "212112", "212211", "211122", "211221", /* P - T */ + "221121", "222111", "112122", "112221", "122121", /* U - Y */ + "123111", "121131", "311112", "311211", "321111", /* Z - $ */ + "112131", "113121", "211131", "121221", "312111", /* / - (%) */ + "311121", "122211", "111141" /* (/) - (terminator) */ +}; + + +/* 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111 */ +/* 00000000001111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122222222 */ +/* 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567 */ +static char shiftset[] = + "%$$$$$$$$$$$$$$$$$$$$$$$$$$%%%%% /// ///// / /%%%%%% %%%%%%++++++++++++++++++++++++++%%%%%"; +static char shiftset2[] = + "UABCDEFGHIJKLMNOPQRSTUVWXYZABCDE ABC FGHIJ L ZFGHIJV KLMNOWABCDEFGHIJLKMNOPQRSTUVWXYZPQRST"; + +#define START_STOP 47 +#define EXTEND_DOLLAR 43 +#define EXTEND_PERCENT 44 +#define EXTEND_SLASH 45 +#define EXTEND_PLUS 46 + +/* + * Check that the text can be encoded. Returns 0 or -1. + * All of ASCII-7 is accepted. + */ +int Barcode_93_verify(unsigned char *text) +{ + int i; + + if (!strlen(text)) + return -1; + for (i=0; text[i]; i++) { + + /* Test if beyond the range of 7-bit ASCII */ + if ((int)text[i] > 127) + return -1; + } + return 0; +} + +/* + * The encoding functions fills the "partial" and "textinfo" fields. + * Lowercase chars are converted to uppercase + */ +int Barcode_93_encode(struct Barcode_Item *bc) +{ + static unsigned char *text; + static char *partial; /* dynamic */ + static char *textinfo; /* dynamic */ + char *c, *textptr; + int *checksum_str; + int i, code, textpos, checksum_len=0; + int c_checksum = 0; + int k_checksum = 0; + + if (bc->partial) + free(bc->partial); + if (bc->textinfo) + free(bc->textinfo); + bc->partial = bc->textinfo = NULL; /* safe */ + + if (!bc->encoding) + bc->encoding = strdup("code 93"); + + text = bc->ascii; + if (!text) { + bc->error = EINVAL; + return -1; + } + + /* the partial code is 6 * (head + 2* text + 2* check + tail) + margin + term. */ + partial = malloc( (strlen(text) *2 + 4) * 6 +2); + if (!partial) { + bc->error = errno; + return -1; + } + + checksum_str = (int *)malloc( (strlen(text) + 3) * 2 * sizeof(int)); + if (!checksum_str) { + free(partial); + bc->error = errno; + return -1; + } + + /* the text information is at most "nnn:fff:c " * strlen +term */ + textinfo = malloc(10*strlen(text) + 2); + if (!textinfo) { + bc->error = errno; + free(partial); + free(checksum_str); + return -1; + } + + textptr = textinfo; + textpos = 22; + strcpy(partial, "0"); + strcat(partial, codeset[START_STOP]); + + for (i=0; iflags & BARCODE_NO_CHECKSUM)==0 ) + { + for(i=1; i<=checksum_len; i++) + { + c_checksum += i * (int)checksum_str[checksum_len - i]; + k_checksum += (i+1) * (int)checksum_str[checksum_len - i]; + } + + c_checksum = c_checksum % 47; + k_checksum += c_checksum; + k_checksum = k_checksum % 47; + + strcat(partial, codeset[c_checksum]); + strcat(partial, codeset[k_checksum]); + + } + strcat(partial, codeset[START_STOP]); /* end */ + + /* Encodes final 1-unit width bar to turn the start character into a stop char */ + strcat(partial, "1"); + bc->partial = partial; + bc->textinfo = textinfo; + + return 0; +} diff --git a/glabels2/barcode-0.98/compat/getopt.c b/glabels2/barcode-0.98/compat/getopt.c new file mode 100644 index 00000000..91f00b55 --- /dev/null +++ b/glabels2/barcode-0.98/compat/getopt.c @@ -0,0 +1,831 @@ +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu + before changing it! + + Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 1996 + Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in . + Ditto for AIX 3.2 and . */ +#ifndef _NO_PROTO +#define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +#include +#endif + +#if !defined (__STDC__) || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#if defined (_LIBC) || !defined (__GNU_LIBRARY__) + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +#include +#if defined (_LIBC) || defined (HAVE_UNISTD_H) +#include +#endif +#endif /* GNU C library. */ + +#ifdef VMS +#include +#if HAVE_STRING_H - 0 +#include +#endif +#endif + +#ifdef WIN32 +/* It's not Unix, really. See? Capital letters. */ +#include +#define getpid() GetCurrentProcessId() +#endif + +#ifndef _ +/* This is for other GNU distributions with internationalized messages. + When compiling libc, the _ macro is predefined. */ +#ifdef HAVE_LIBINTL_H +# include +# define _(msgid) gettext (msgid) +#else +# define _(msgid) (msgid) +#endif +#endif + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg = NULL; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns EOF, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* XXX 1003.2 says this must be 1 before any call. */ +int optind = 0; + +/* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + +static char *nextchar; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return EOF with `optind' != ARGC. */ + +static enum +{ + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +/* Value of POSIXLY_CORRECT environment variable. */ +static char *posixly_correct; + +#ifdef __GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ +#include +#define my_index strchr +#else + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +char *getenv (); + +static char * +my_index (str, chr) + const char *str; + int chr; +{ + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; +} + +/* If using GCC, we can safely declare strlen this way. + If not using GCC, it is ok not to declare it. */ +#ifdef __GNUC__ +/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. + That was relevant to code that was here before. */ +#if !defined (__STDC__) || !__STDC__ +/* gcc with -traditional declares the built-in strlen to return int, + and has done so at least since version 2.4.5. -- rms. */ +extern int strlen (const char *); +#endif /* not __STDC__ */ +#endif /* __GNUC__ */ + +#endif /* not __GNU_LIBRARY__ */ + +/* Handle permutation of arguments. */ + +/* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + +static int first_nonopt; +static int last_nonopt; + +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +static const char *nonoption_flags; +static int nonoption_flags_len; + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +#if defined (__STDC__) && __STDC__ +static void exchange (char **); +#endif + +static void +exchange (argv) + char **argv; +{ + int bottom = first_nonopt; + int middle = last_nonopt; + int top = optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + first_nonopt += (optind - last_nonopt); + last_nonopt = optind; +} + +/* Initialize the internal data when the first call is made. */ + +#if defined (__STDC__) && __STDC__ +static const char *_getopt_initialize (const char *); +#endif +static const char * +_getopt_initialize (optstring) + const char *optstring; +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + first_nonopt = last_nonopt = optind = 1; + + nextchar = NULL; + + posixly_correct = getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + + if (posixly_correct == NULL) + { + /* Bash 2.0 puts a special variable in the environment for each + command it runs, specifying which ARGV elements are the results of + file name wildcard expansion and therefore should not be + considered as options. */ + char var[100]; + sprintf (var, "_%d_GNU_nonoption_argv_flags_", getpid ()); + nonoption_flags = getenv (var); + if (nonoption_flags == NULL) + nonoption_flags_len = 0; + else + nonoption_flags_len = strlen (nonoption_flags); + } + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns `EOF'. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal (argc, argv, optstring, longopts, longind, long_only) + int argc; + char *const *argv; + const char *optstring; + const struct option *longopts; + int *longind; + int long_only; +{ + optarg = NULL; + + if (optind == 0) + { + optstring = _getopt_initialize (optstring); + optind = 1; /* Don't scan ARGV[0], the program name. */ + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. */ +#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ + || (optind < nonoption_flags_len \ + && nonoption_flags[optind] == '1')) + + if (nextchar == NULL || *nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (last_nonopt > optind) + last_nonopt = optind; + if (first_nonopt > optind) + first_nonopt = optind; + + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc && NONOPTION_P) + optind++; + last_nonopt = optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = first_nonopt; + return EOF; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (ordering == REQUIRE_ORDER) + return EOF; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[optind][1] == '-' + || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound; + int option_index; + + for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + +#ifdef lint /* Suppress `used before initialized' warning. */ + indfound = 0; +#endif + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if (nameend - nextchar == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (opterr) + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (opterr) + if (argv[optind - 1][1] == '-') + /* --option */ + fprintf (stderr, + _("%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); + else + /* +option or -option */ + fprintf (stderr, + _("%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[optind - 1][0], pfound->name); + + nextchar += strlen (nextchar); + + optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (opterr) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[optind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (opterr) + { + if (argv[optind][1] == '-') + /* --option */ + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], nextchar); + else + /* +option or -option */ + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[optind][0], nextchar); + } + nextchar = (char *) ""; + optind++; + optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (opterr) + { + if (posixly_correct) + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: illegal option -- %c\n"), + argv[0], c); + else + fprintf (stderr, _("%s: invalid option -- %c\n"), + argv[0], c); + } + optopt = c; + return '?'; + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (opterr) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } +} + +int +getopt (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* _LIBC or not __GNU_LIBRARY__. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == EOF) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/glabels2/barcode-0.98/compat/getopt.h b/glabels2/barcode-0.98/compat/getopt.h new file mode 100644 index 00000000..952f4830 --- /dev/null +++ b/glabels2/barcode-0.98/compat/getopt.h @@ -0,0 +1,129 @@ +/* Declarations for getopt. + Copyright (C) 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _GETOPT_H +#define _GETOPT_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns EOF, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ +#if defined (__STDC__) && __STDC__ + const char *name; +#else + char *name; +#endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 + +#if defined (__STDC__) && __STDC__ +#ifdef __GNU_LIBRARY__ +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int argc, char *const *argv, const char *shortopts); +#else /* not __GNU_LIBRARY__ */ +extern int getopt (); +#endif /* __GNU_LIBRARY__ */ +extern int getopt_long (int argc, char *const *argv, const char *shortopts, + const struct option *longopts, int *longind); +extern int getopt_long_only (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind, + int long_only); +#else /* not __STDC__ */ +extern int getopt (); +extern int getopt_long (); +extern int getopt_long_only (); + +extern int _getopt_internal (); +#endif /* __STDC__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* _GETOPT_H */ diff --git a/glabels2/barcode-0.98/configure b/glabels2/barcode-0.98/configure new file mode 100755 index 00000000..f0e5d457 --- /dev/null +++ b/glabels2/barcode-0.98/configure @@ -0,0 +1,5197 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.57. +# +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="barcode.h" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT RANLIB ac_ct_RANLIB INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CPP EGREP GETOPT_O NO_GETOPT NO_LIBPAPER LIBPAPER NO_STRERROR GMAKEDEPEND0 GMAKEDEPEND1 GMAKEDEPEND2 LIBOBJS LTLIBOBJS MAKEINFO REMOVEHTMLTAGS INFOTOHTML' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +_ACEOF + + cat <<_ACEOF +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.57. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_sep= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core core.* *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:$LINENO: checking for C compiler default output" >&5 +echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RANLIB=$ac_ct_RANLIB +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + +if test x$GCC = xyes; then + CFLAGS="$CFLAGS -Wall" +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +if test "${ac_cv_header_getopt_h+set}" = set; then + echo "$as_me:$LINENO: checking for getopt.h" >&5 +echo $ECHO_N "checking for getopt.h... $ECHO_C" >&6 +if test "${ac_cv_header_getopt_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_getopt_h" >&5 +echo "${ECHO_T}$ac_cv_header_getopt_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking getopt.h usability" >&5 +echo $ECHO_N "checking getopt.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking getopt.h presence" >&5 +echo $ECHO_N "checking getopt.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: getopt.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: getopt.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: getopt.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: getopt.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: getopt.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: getopt.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: getopt.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: getopt.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: getopt.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: getopt.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for getopt.h" >&5 +echo $ECHO_N "checking for getopt.h... $ECHO_C" >&6 +if test "${ac_cv_header_getopt_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_getopt_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_getopt_h" >&5 +echo "${ECHO_T}$ac_cv_header_getopt_h" >&6 + +fi +if test $ac_cv_header_getopt_h = yes; then + : +else + NO_GETOPT=-DNO_GETOPT;GETOPT_O=compat/getopt.o +fi + + +if test "${ac_cv_header_paper_h+set}" = set; then + echo "$as_me:$LINENO: checking for paper.h" >&5 +echo $ECHO_N "checking for paper.h... $ECHO_C" >&6 +if test "${ac_cv_header_paper_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_paper_h" >&5 +echo "${ECHO_T}$ac_cv_header_paper_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking paper.h usability" >&5 +echo $ECHO_N "checking paper.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking paper.h presence" >&5 +echo $ECHO_N "checking paper.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: paper.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: paper.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: paper.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: paper.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: paper.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: paper.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: paper.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: paper.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: paper.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: paper.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for paper.h" >&5 +echo $ECHO_N "checking for paper.h... $ECHO_C" >&6 +if test "${ac_cv_header_paper_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_paper_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_paper_h" >&5 +echo "${ECHO_T}$ac_cv_header_paper_h" >&6 + +fi +if test $ac_cv_header_paper_h = yes; then + LIBPAPER=-lpaper +else + NO_LIBPAPER=-DNO_LIBPAPER +fi + + + +for ac_header in unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +echo "$as_me:$LINENO: checking for strerror" >&5 +echo $ECHO_N "checking for strerror... $ECHO_C" >&6 +if test "${ac_cv_func_strerror+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char strerror (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char strerror (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_strerror) || defined (__stub___strerror) +choke me +#else +char (*f) () = strerror; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != strerror; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_strerror=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_strerror=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_strerror" >&5 +echo "${ECHO_T}$ac_cv_func_strerror" >&6 +if test $ac_cv_func_strerror = yes; then + : +else + NO_STRERROR=-DNO_STRERROR +fi + + +for ac_func in strcasecmp +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +echo "$as_me:$LINENO: checking \"for gmake\"" >&5 +echo $ECHO_N "checking \"for gmake\"... $ECHO_C" >&6 +GMAKE=no +${MAKE=make} --version 2> /dev/null | grep GNU > /dev/null && GMAKE=yes +echo "$as_me:$LINENO: result: $GMAKE" >&5 +echo "${ECHO_T}$GMAKE" >&6 +if test "$GMAKE" = "yes"; then + GMAKEDEPEND0='ifeq (.depend,$(wildcard .depend))' + GMAKEDEPEND1='include .depend' + GMAKEDEPEND2='endif' +fi + +echo "$as_me:$LINENO: checking \"if makeinfo can output html\"" >&5 +echo $ECHO_N "checking \"if makeinfo can output html\"... $ECHO_C" >&6 +MAKEINFOHTML=no +${MAKEINFO=makeinfo} --help | grep .--html > /dev/null && MAKEINFOHTML=yes +echo "$as_me:$LINENO: result: $MAKEINFOHTML" >&5 +echo "${ECHO_T}$MAKEINFOHTML" >&6 +if test "$MAKEINFOHTML" = "yes"; then + REMOVEHTMLTAGS="cat" + INFOTOHTML="$MAKEINFO --html" +else + REMOVEHTMLTAGS="sed 's/ifnottex/ifinfo/; s/ifnotinfo/iftex/'" + INFOTOHTML="perl texi2html -monolithic" +fi + + + + + + + + + + + + ac_config_files="$ac_config_files Makefile" +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then we branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +cat >confdef2opt.sed <<\_ACEOF +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +t quote +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +t quote +d +: quote +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,\[,\\&,g +s,\],\\&,g +s,\$,$$,g +p +_ACEOF +# We use echo to avoid assuming a particular line-breaking character. +# The extra dot is to prevent the shell from consuming trailing +# line-breaks from the sub-command output. A line-break within +# single-quotes doesn't work because, if this script is created in a +# platform that uses two characters for line-breaks (e.g., DOS), tr +# would break. +ac_LF_and_DOT=`echo; echo .` +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` +rm -f confdef2opt.sed + + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.57. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.57, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@GETOPT_O@,$GETOPT_O,;t t +s,@NO_GETOPT@,$NO_GETOPT,;t t +s,@NO_LIBPAPER@,$NO_LIBPAPER,;t t +s,@LIBPAPER@,$LIBPAPER,;t t +s,@NO_STRERROR@,$NO_STRERROR,;t t +s,@GMAKEDEPEND0@,$GMAKEDEPEND0,;t t +s,@GMAKEDEPEND1@,$GMAKEDEPEND1,;t t +s,@GMAKEDEPEND2@,$GMAKEDEPEND2,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + + + + + + + ac_config_files="$ac_config_files doc/Makefile" +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then we branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +cat >confdef2opt.sed <<\_ACEOF +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +t quote +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +t quote +d +: quote +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,\[,\\&,g +s,\],\\&,g +s,\$,$$,g +p +_ACEOF +# We use echo to avoid assuming a particular line-breaking character. +# The extra dot is to prevent the shell from consuming trailing +# line-breaks from the sub-command output. A line-break within +# single-quotes doesn't work because, if this script is created in a +# platform that uses two characters for line-breaks (e.g., DOS), tr +# would break. +ac_LF_and_DOT=`echo; echo .` +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` +rm -f confdef2opt.sed + + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.57. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.57, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@GETOPT_O@,$GETOPT_O,;t t +s,@NO_GETOPT@,$NO_GETOPT,;t t +s,@NO_LIBPAPER@,$NO_LIBPAPER,;t t +s,@LIBPAPER@,$LIBPAPER,;t t +s,@NO_STRERROR@,$NO_STRERROR,;t t +s,@GMAKEDEPEND0@,$GMAKEDEPEND0,;t t +s,@GMAKEDEPEND1@,$GMAKEDEPEND1,;t t +s,@GMAKEDEPEND2@,$GMAKEDEPEND2,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +s,@MAKEINFO@,$MAKEINFO,;t t +s,@REMOVEHTMLTAGS@,$REMOVEHTMLTAGS,;t t +s,@INFOTOHTML@,$INFOTOHTML,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + + diff --git a/glabels2/barcode-0.98/configure.in.dist b/glabels2/barcode-0.98/configure.in.dist new file mode 100644 index 00000000..07120b48 --- /dev/null +++ b/glabels2/barcode-0.98/configure.in.dist @@ -0,0 +1,65 @@ +dnl Process this file with autoconf to produce a configure script. + +AC_INIT(barcode.h) +AC_PREREQ(2.12) + +AC_PROG_CC +AC_PROG_RANLIB +AC_PROG_INSTALL + +dnl Add "-Wall" if this is gcc +if test x$GCC = xyes; then + CFLAGS="$CFLAGS -Wall" +fi + + +dnl Check for getopt and libpaper. If getopt is missing, use our version +AC_CHECK_HEADER(getopt.h, ,NO_GETOPT=-DNO_GETOPT;GETOPT_O=compat/getopt.o) +AC_CHECK_HEADER(paper.h, LIBPAPER=-lpaper, NO_LIBPAPER=-DNO_LIBPAPER) +AC_CHECK_HEADERS(unistd.h) + +AC_CHECK_FUNC(strerror, , NO_STRERROR=-DNO_STRERROR) +AC_CHECK_FUNCS(strcasecmp) + +dnl Check if this is gmake, but allow ovverriding using $MAKE +AC_MSG_CHECKING("for gmake") +GMAKE=no +${MAKE=make} --version 2> /dev/null | grep GNU > /dev/null && GMAKE=yes +AC_MSG_RESULT($GMAKE) +if test "$GMAKE" = "yes"; then + GMAKEDEPEND0='ifeq (.depend,$(wildcard .depend))' + GMAKEDEPEND1='include .depend' + GMAKEDEPEND2='endif' +fi + +dnl Check if we use makeinfo or the local texi2html tool +AC_MSG_CHECKING("if makeinfo can output html") +MAKEINFOHTML=no +${MAKEINFO=makeinfo} --help | grep .--html > /dev/null && MAKEINFOHTML=yes +AC_MSG_RESULT($MAKEINFOHTML) +if test "$MAKEINFOHTML" = "yes"; then + REMOVEHTMLTAGS="cat" + INFOTOHTML="$MAKEINFO --html" +else + REMOVEHTMLTAGS="sed 's/ifnottex/ifinfo/; s/ifnotinfo/iftex/'" + INFOTOHTML="perl texi2html -monolithic" +fi + + +AC_SUBST(GETOPT_O) +AC_SUBST(NO_GETOPT) +AC_SUBST(NO_LIBPAPER) +AC_SUBST(LIBPAPER) +AC_SUBST(NO_STRERROR) +AC_SUBST(GMAKEDEPEND0) +AC_SUBST(GMAKEDEPEND1) +AC_SUBST(GMAKEDEPEND2) + +AC_OUTPUT(Makefile) + +AC_SUBST(MAKEINFO) +AC_SUBST(REMOVEHTMLTAGS) +AC_SUBST(INFOTOHTML) + +AC_OUTPUT(doc/Makefile) + diff --git a/glabels2/barcode-0.98/contrib/barcode-SVG.tar.gz b/glabels2/barcode-0.98/contrib/barcode-SVG.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..69df9562ce09785778516c0fb6a73a8d2181eda5 GIT binary patch literal 2880 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 literal 0 HcmV?d00001 diff --git a/glabels2/barcode-0.98/contrib/barcode-SVG.tar.gz.README b/glabels2/barcode-0.98/contrib/barcode-SVG.tar.gz.README new file mode 100644 index 00000000..1608ebaf --- /dev/null +++ b/glabels2/barcode-0.98/contrib/barcode-SVG.tar.gz.README @@ -0,0 +1,24 @@ + +[readme written by GNU-barcode maintainer] + +This is a stripped version of what you can find at: + http://www.onefour.net/barcode/SVG/barcode097-SVG.tar.gz + +It's by David J. Humphreys, it's GPL code and the original tarball +(as per the previous URL) contains: + +-rwxr--r-- david/david 243 2002-01-02 04:18:00 Makefile +-rwxr--r-- david/david 1284 2002-01-08 00:26:42 main.c +-rwxr--r-- david/david 37796 2002-01-02 04:33:00 screen1.png +-rwxr--r-- david/david 5503 2002-01-08 00:30:00 svg.c +-rwxr--r-- david/david 2499 2002-01-02 03:37:00 test1.svg +-rwxr--r-- david/david 2499 2002-01-02 03:44:00 test2.svg +-rwxr--r-- david/david 2499 2002-01-02 03:49:00 test3.svg +-rwxr--r-- david/david 34185 2002-01-02 04:41:00 test4.png +-rwxr--r-- david/david 1834 2002-01-02 04:19:00 test4.svg +-rwxr--r-- david/david 92713 2002-01-02 04:36:00 transformation.png +-rwxr--r-- david/david 586 2002-01-02 04:11:00 transformation.svg + +Here I only included Makefile, main.c, svg.c, after converting +newlines to unix-style and changing permissions. + diff --git a/glabels2/barcode-0.98/contrib/barcode-for-delphi.tar.gz b/glabels2/barcode-0.98/contrib/barcode-for-delphi.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..cbc8e67693f6a90df86e6aafb2debb625321e861 GIT binary patch literal 19010 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 literal 0 HcmV?d00001 diff --git a/glabels2/barcode-0.98/contrib/barcode-for-delphi.tar.gz.README b/glabels2/barcode-0.98/contrib/barcode-for-delphi.tar.gz.README new file mode 100644 index 00000000..36d216d7 --- /dev/null +++ b/glabels2/barcode-0.98/contrib/barcode-for-delphi.tar.gz.README @@ -0,0 +1,10 @@ + +The barcode-for-delphi tarball includes a version of this package +ported to run under Delphi. Please note that you can't distribute the +executable because of the GPL (i.e., disitributing it would be +copyright violation, because the executable is a derived work of GNU +barcode, whose authors don't allow distributing under non-GPL terms. + +I still think it may be useful to some users. + +The code has been contributed by Michael Geddes . diff --git a/glabels2/barcode-0.98/contrib/barcodeps-0.1.tgz b/glabels2/barcode-0.98/contrib/barcodeps-0.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..1dadb1c6a6dc085cee750585295ea63d06b5e056 GIT binary patch literal 2036 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 UE&rB({{nyi7cfXlfdG&J0B5`&mH+?% literal 0 HcmV?d00001 diff --git a/glabels2/barcode-0.98/contrib/grab-0.0.4.tar.gz.README b/glabels2/barcode-0.98/contrib/grab-0.0.4.tar.gz.README new file mode 100644 index 00000000..4a048075 --- /dev/null +++ b/glabels2/barcode-0.98/contrib/grab-0.0.4.tar.gz.README @@ -0,0 +1,13 @@ + +The purpose of this program is to read a (scanned) image containing a +barcode. The image is then interpreted and the barcode is decoded. +The decoded string is outputted to stdout. + +Currently, only Code-128 is supported. + +The program is GPL'd and it's the work of Tuukka Toivonen. + +The home page for this and other programs by Tuukka is + http://www.ee.oulu.fi/~tuukkat/releases.html +while a bare ls-like listing of all packages is at + http://www.ee.oulu.fi/~tuukkat/rel/ diff --git a/glabels2/barcode-0.98/debian/README.debian b/glabels2/barcode-0.98/debian/README.debian new file mode 100644 index 00000000..7223023a --- /dev/null +++ b/glabels2/barcode-0.98/debian/README.debian @@ -0,0 +1,9 @@ +The Debian Package barcode +---------------------------- + +This Debian package is integrated in the upstream release of GNU +barcode, maintained by Alessandro Rubini (rubini@gnu.org, +rubini@prosa.it). Since I have no extended experience with Debian +packages, I'm willing to accept any fixes that seem fit, as well as a +real Debian maintainer for the Debian package. + diff --git a/glabels2/barcode-0.98/debian/changelog b/glabels2/barcode-0.98/debian/changelog new file mode 100644 index 00000000..b43e686f --- /dev/null +++ b/glabels2/barcode-0.98/debian/changelog @@ -0,0 +1,27 @@ +barcode (0.98) unstable; urgency=low + + * New upstream release + + -- Alessandro Rubini Fri, 1 Mar 2002 23:04:14 +0100 + +barcode (0.96) unstable; urgency=low + + * New upstream release + + -- Alessandro Rubini Wed, 8 Nov 2000 18:29:18 +0200 + +barcode (0.95) unstable; urgency=low + + * New upstream release + + -- Alessandro Rubini Thu, 3 Feb 2000 21:16:59 +0200 + +barcode (0.94) unstable; urgency=low + + * Initial Release. + + -- Alessandro Rubini Sun, 24 Oct 1999 01:10:23 +0200 + +Local variables: +mode: debian-changelog +End: diff --git a/glabels2/barcode-0.98/debian/control b/glabels2/barcode-0.98/debian/control new file mode 100644 index 00000000..aacbfd49 --- /dev/null +++ b/glabels2/barcode-0.98/debian/control @@ -0,0 +1,14 @@ +Source: barcode +Section: misc +Priority: optional +Maintainer: Alessandro Rubini +Standards-Version: 2.5.0 + +Package: barcode +Architecture: any +Depends: ${shlibs:Depends} +Description: Creates barcodes in .ps format + GNU barcode can create printouts for the conventional + product packagging standards: UPC-A, UPC-E, EAN-13, EAN-8, ISBN, code 39 + code 128 (b and c), and interleaved 2 of 5 . Ouput is generated as + either Postscript or Encapsulated Postscript. diff --git a/glabels2/barcode-0.98/debian/copyright b/glabels2/barcode-0.98/debian/copyright new file mode 100644 index 00000000..c193af2c --- /dev/null +++ b/glabels2/barcode-0.98/debian/copyright @@ -0,0 +1,8 @@ +This package was written by Alessandro Rubini rubini@gnu.org on Sun, 24 Oct 1999 01:10:23 +0200. + +The pristine source can be downloaded from ftp://ftp.gnu.org/pub/barcode +and GNU mirrors. Latest and greatest version (also beta) are immediately +uploaded to ftp://ftp.prosa.it/pub/software. + +Copyright: GPL (see /usr/doc/copyright/GPL) + diff --git a/glabels2/barcode-0.98/debian/dirs b/glabels2/barcode-0.98/debian/dirs new file mode 100644 index 00000000..6822e402 --- /dev/null +++ b/glabels2/barcode-0.98/debian/dirs @@ -0,0 +1,3 @@ +usr/bin +usr/include +usr/info diff --git a/glabels2/barcode-0.98/debian/info b/glabels2/barcode-0.98/debian/info new file mode 100644 index 00000000..18336bfb --- /dev/null +++ b/glabels2/barcode-0.98/debian/info @@ -0,0 +1,15 @@ +# This is a configuration files for installing a .info menu +# The Description to be placed into the directory +DESCR="Barcode library and frontend" + +# The section this info file should be placed in (Regexp) followed by +# the new section name to be created if the Regexp does not match +# (Optional. If not given the .info will be appended to the directory) +SECTION_MATCH="[cC]ommands" +SECTION_NAME="General Commands" + +# The file referred to from the Info directory +FILE=barcode.info + +# Optional. The files to be copied to /usr/info +FILES=doc/*.info diff --git a/glabels2/barcode-0.98/debian/rules b/glabels2/barcode-0.98/debian/rules new file mode 100755 index 00000000..c48c5a1c --- /dev/null +++ b/glabels2/barcode-0.98/debian/rules @@ -0,0 +1,50 @@ +#!/usr/bin/make -f +# Made with the aid of debmake, by Christoph Lameter, +# based on the sample debian/rules file for GNU hello by Ian Jackson. + +package=barcode + +build: + $(checkdir) + ./configure --prefix=/usr + $(MAKE) CFLAGS="-O2 -g -Wall" + touch build + +clean: + $(checkdir) + -rm -f build + -$(MAKE) distclean + -rm -f `find . -name "*~"` + -rm -rf debian/tmp debian/files* core debian/substvars + +binary-indep: checkroot build + $(checkdir) +# There are no architecture-independent files to be uploaded +# generated by this package. If there were any they would be +# made here. + +binary-arch: checkroot build + $(checkdir) + -rm -rf debian/tmp + install -d debian/tmp + cd debian/tmp && install -d `cat ../dirs` + $(MAKE) install prefix=`pwd`/debian/tmp/usr +# Must have debmake installed for this to work. Otherwise please copy +# /usr/bin/debstd into the debian directory and change debstd to debian/debstd + debstd ChangeLog README TODO INSTALL + dpkg-gencontrol + chown -R root.root debian/tmp + chmod -R go=rX debian/tmp + dpkg --build debian/tmp .. + +define checkdir + test -f debian/rules +endef + +binary: binary-indep binary-arch + +checkroot: + $(checkdir) + test root = "`whoami`" + +.PHONY: binary binary-arch binary-indep clean checkroot diff --git a/glabels2/barcode-0.98/doc/Makefile.in b/glabels2/barcode-0.98/doc/Makefile.in new file mode 100644 index 00000000..dae8f6b6 --- /dev/null +++ b/glabels2/barcode-0.98/doc/Makefile.in @@ -0,0 +1,135 @@ +# +# Makefile (now .in) for the documentation directory +# +# Copyright 1994,2000 rubini@gnu.org (Alessandro Rubini) +# +################# +# +# BE CAREFUL in editing: +# due to the large number of index files, and my use of a non standard +# info input file, any file $(TARGET).* is removed by "make clean" +# +# I chose to use a prefix for the input file ("doc.$(TARGET)"), to ease +# makeing clean and applying my own rules. +# +################################################################### +# +# First of all, retrieve features of makeinfo, to know if we can do images +# and --html. Also, allow MAKEINFO to be specified on the commandline to +# allow me testing with various versions. + +# NOTE: it looks like semi-old versions can do images too, so CANDOIMAGES +# is not (yet?) used + + +MAKEINFO = @MAKEINFO@ +# According to whether this makeinfo can output html, autoconf define these +REMOVEHTMLTAGS = @REMOVEHTMLTAGS@ +INFOTOHTML = @INFOTOHTML@ + +############################################## + + +TARGET = barcode +ALL = $(TARGET).ps $(TARGET).info $(TARGET)doc.txt $(TARGET).html \ + $(TARGET).pdf + +all: $(ALL) terse + +info: $(TARGET).info + +$(TARGET)doc.txt: mktxt + +mpage: all + mv $(TARGET).ps $(TARGET)1.ps + mpage -2A $(TARGET)1.ps > $(TARGET)2.ps && rm $(TARGET)1.ps + +terse: + # preserve the pdf copy + -mv -f $(TARGET).pdf PDF 2> /dev/null && \ + rm -f *~ *.dvi *.log *.aux \ + $(TARGET).*.bak $(TARGET).??? $(TARGET).texinfo && \ + mv PDF $(TARGET).pdf; + + # preserve the ps copy + -mv $(TARGET).ps PS; + -rm -f $(TARGET).??; + -mv PS $(TARGET).ps; + +clean: terse + rm -f $(ALL) $(TARGET)_toc.html + + +#################################################### + +# These rules used to be expressed as "%.texinfo: doc.%" etc. However, this +# is gmake-specific, so I turned every % to $(TARGET), thus loosing generality +# but gaining portability. I also had to drop "$^": it worked with gmake +# and not pmake, while "$<" worked with pmake and not gmake. +# with gmake and not pmake. +# ARub 2000-04-21 + +$(TARGET).texinfo: doc.$(TARGET) + @rm -f $@ 2> /dev/null + sed -f ./infofilter doc.$(TARGET) | $(REMOVEHTMLTAGS) > $@ + chmod 400 $@ + + +# This rule is somewhat a rewrite of texi2dvi. I like make more than sh :-) +# This had to be rewritten too, as "$*" is different in gmake and pmake + +$(TARGET).dvi: $(TARGET).texinfo + +# create a spurious index file to please silly sh (bash will work anyway) + touch $(TARGET).oo + +# get the index list + if test "x`ls $(TARGET).?? $(TARGET).aux`" != "x"; then \ + for i in `ls $(TARGET).?? $(TARGET).aux`; do \ + cp $$i $$i~; \ + done; \ + fi + tex $(TARGET).texinfo + +#check the file list, the file and if needed run TeX again + old="`ls $(TARGET).??~ $(TARGET).aux~ | sed 's/~//g'`"; \ + new="`ls $(TARGET).?? $(TARGET).aux`"; \ + need="n"; \ + if test "$$old" != "$$new"; then need="y"; \ + else \ + for i in `ls $(TARGET).?? $(TARGET).aux`; do \ + cmp -s $$i $$i~; if test $$? -ne 0; then need="y" break; fi; \ + done; \ + fi; \ + if test "$$need" = "y"; then \ + texindex $(TARGET).?? && tex $(TARGET).texinfo; \ + fi + + +$(TARGET).ps: $(TARGET).dvi + dvips -f $(TARGET).dvi > $@ + +$(TARGET).pdf: $(TARGET).ps + ps2pdf $(TARGET).ps > $@ + +$(TARGET).lj: $(TARGET).dvi + dvilj -e- $(TARGET).dvi > $@ + +$(TARGET).info: $(TARGET).texinfo + makeinfo $(TARGET).texinfo -o $@ + +$(TARGET).html: $(TARGET).texinfo + $(INFOTOHTML) -o $@ $< + +#$(TARGET).man: doc.$(TARGET) +# manpages are created by the toplevel Makefile + +$(TARGET)doc.txt: $(TARGET).info + awk -f ./mktxt $(TARGET).info > $@ + + + + + + + diff --git a/glabels2/barcode-0.98/doc/README b/glabels2/barcode-0.98/doc/README new file mode 100644 index 00000000..5af5490f --- /dev/null +++ b/glabels2/barcode-0.98/doc/README @@ -0,0 +1,5 @@ + +The input file is "doc.barcode". I preprocess this file to +build both a "barcode.texinfo" file and manual pages. + +The intermediat diff --git a/glabels2/barcode-0.98/doc/barcode.info b/glabels2/barcode-0.98/doc/barcode.info new file mode 100644 index 00000000..66b59d06 --- /dev/null +++ b/glabels2/barcode-0.98/doc/barcode.info @@ -0,0 +1,747 @@ +This is barcode.info, produced by makeinfo version 4.0b from +barcode.texinfo. + + This file is the User's Manual for the barcode library (version +0.98). + + +File: barcode.info, Node: Top, Next: Overview, Prev: (dir), Up: (dir) + +Barcode tools +************* + + This file documents version 0.98 of the barcode library and sample +programs (March 2002). + +* Menu: + +* Overview:: +* The Barcode Object:: +* Supported Flags:: +* The API:: +* The barcode Executable:: +* Supported Encodings:: +* PCL Output:: +* Bugs and Pending Issues:: + + +File: barcode.info, Node: Overview, Next: The Barcode Object, Prev: Top, Up: Top + +Overview +******** + + The "barcode" package is mainly a C library for creating bar-code +output files. It also includes a command line front-end and (in a +foreseeable future) a graphic frontend. + + The package is designed as a library because we think the main use +for barcode-generation tools is inside more featured applications. The +library addresses bar code printing as two distinct problems: creation +of bar information and actual conversion to an output format. To this +aim we use an intermediate representation for bar codes, which is +currently documented in the `ps.c' source file (not in this document). + + Note that the library and the accompanying material is released +according to the GPL license, not the LGPL one. A copy of the GPL is +included in the distribution tarball. + + +File: barcode.info, Node: The Barcode Object, Next: Supported Flags, Prev: Overview, Up: Top + +The Underlying Data Structure +***************************** + + Every barcode-related function acts on a data structure defined in +the `barcode.h' header, which must be included by any C source file +that uses the library. The header is installed by make install. + + The definition of the data structure is included here for reference: + + struct Barcode_Item { + int flags; /* type of encoding and other flags */ + char *ascii; /* malloced */ + char *partial; /* malloced too */ + char *textinfo; /* information about text placement */ + char *encoding; /* code name, filled by encoding engine */ + int width, height; /* output units */ + int xoff, yoff; /* output units */ + int margin; /* output units */ + double scalef; /* requested scaling for barcode */ + int error; /* an errno-like value, in case of failure */ + }; + + The exact meaning of each field and the various flags implemented are +described in the following sections. + + Even though you won't usually need to act on the contents of this +structure, some of the functions in the library receive arguments that +are directly related to one or more of these fields. + +* Menu: + +* The Field List:: +* The Intermediate Representation:: + + +File: barcode.info, Node: The Field List, Next: The Intermediate Representation, Prev: The Barcode Object, Up: The Barcode Object + +The Fields +========== + +`int flags;' + The flags are, as you may suspect, meant to specify the exact + behaviour of the library. They are often passed as an argument to + barcode functions and are discussed in the next section. + +`char *ascii;' +`char *partial;' +`char *textinfo;' +`char *encoding;' + These fields are internally managed by the library, and you are + not expected to touch them if you use the provided API. All of + them are allocated with malloc. + +`int width;' +`int height;' + They specify the width and height of the active barcode region + (i.e., excluding the white margin), in the units used to create + output data (for postscript they are points, 1/72th of an inch, + 0.352 mm). The fields can be either assigned to in the structure + or via Barcode_Position(), at your choice. If either value or + both are left to their default value of zero, the output engine + will assign default values according to the specified scaling + factor. If the specified width is bigger than needed (according to + the scaling factor), the output barcode will be centered in its + requested region. If either the width of the height are too small + for the specified scale factor, the output bar code will expand + symmetrically around the requested region. + +`int xoff;' +`int yoff;' + The fields specify offset from the coordinate origin of the output + engine (for postscript, position 0,0 is the lower left corner of + the page). The fields can be either assigned to in the structure + or via Barcode_Position(), at your choice. The offset specifies + where the white margin begins, not where the first bar will be + printed. To print real ink to the specified position you should + set margin to 0. + +`int margin;' + The white margin that will be left around the printed area of the + bar code. The same margin is applied to all sides of the printed + area. The default value for the margin is defined in `barcode.h' + as BARCODE_DEFAULT_MARGIN (10). + +`double scalef;' + The enlarge or shrink value for the bar code over its default + dimension. The width and scalef fields interact deeply in the + creation of the output, and a complete description of the issues + appears later in this section. + +`int error;' + The field is used when a barcode function fails to host an + errno-like integer value. + +Use of the width and scalef fields. +----------------------------------- + + A width unit is the width of the thinnest bar and/or space in the +chosen code; it defaults to 1 point if the output is postscript or +encapsulated postscript. + + Either or both the code width and the scale factor can be left +unspecified (i.e., zero). The library deals with defaults in the +following way: + +Both unspecified + If both the width and the scale factor are unspecified, the scale + factor will default to 1.0 and the width is calculated according + to the actual width of the bar code being printed. + +Width unspecified + If the width is not specified, it is calculated according to the + values of scalef. + +Scale factor unspecified + If the scale factor is not specified, it will be chosen so that + the generated bar code exactly fits the specified width. + +Both specified + The code will be printed inside the specified region according to + the specified scale factor. It will be aligned to the left. If, + however, the chosen width is too small for the specific bar code + and scaling factor, then the code will extend symmetrically to the + left and to the right of the chosen region. + + +File: barcode.info, Node: The Intermediate Representation, Prev: The Field List, Up: The Barcode Object + +The Intermediate Representation +=============================== + + The encoding functions print their output into the partial and +texinfo fields of the barcode data structure. Those fields, together +with position information, are then used to generate actual output. +This is an informal description of the intermediate format. + + The first char in partial tells how much extra space to add to the +left of the bars. For EAN-13, it is used to leave space to print the +first digit, other codes may have '0' for no-extra-space-needed. + + The next characters are alternating bars and spaces, as multiples of +the base dimension which is 1 unless the code is rescaled. Rescaling is +calculated as the ratio from the requested width and the calculated +width. Digits represent bar/space dimensions. Lower-case letters +represent those bars that should extend lower than the others: 'a' is +equivalent to '1', 'b' is '2' and so on up to 'i' which is equivalent to +'9'. Other letters will be used for encoding-specific meanings, as soon +as I implement them. + + The textinfo string is made up of fields %lf:%lf:%c separated by +blank space. The first integer is the x position of the character, the +second is the font size (before rescaling) and the char item is the +character to be printed. + + Both the partial and textinfo strings may include "-" or "+" as +special characters (in textinfo the char should be a stand-alone word). +They state where the text should be printed: below the bars ("-", +default) or above the bars. This is used, for example, to print the +add-5 and add-2 codes to the right of UPC or EAN codes (the add-5 +extension is mostly used in ISBN codes). + + +File: barcode.info, Node: Supported Flags, Next: The API, Prev: The Barcode Object, Up: Top + +The Flags +********* + + The following flags are supported by version 0.98 of the library: + +`BARCODE_ENCODING_MASK' + The mask is used to extract the encoding-type identifier from the + flags field. + +`BARCODE_EAN' +`BARCODE_UPC' +`BARCODE_ISBN' +`BARCODE_128B' +`BARCODE_128C' +`BARCODE_128' +`BARCODE_128RAW' +`BARCODE_39' +`BARCODE_I25' +`BARCODE_CBR' +`BARCODE_MSI' +`BARCODE_PLS' +`BARCODE_93' + The currently supported encoding types: EAN (13 digits, 8 digits, + 13 + 2 add-on and 13 + 5 add-on), UPC (UPC-A, UPC-E, UPC-A with 2 + or 5 digit add-on), ISBN (with or without the 5-digit add-on), + CODE128-B (the whole set of printable ASCII characters), CODE128-C + (two digits encoded by each barcode symbol), CODE128 (all ASCII + values), a "raw-input" pseudo-code that generates CODE128 output, + CODE39 (alphanumeric), "interleaved 2 of 5" (numeric), Codabar + (numeric plus a few symbols), MSI (numeric) and Plessey (hex + digits). *Note Supported Encodings::. + +`BARCODE_ANY' + This special encoding type (represented by a value of zero, so it + will be the default) tells the encoding procedure to look for the + first encoding type that can deal with a textual string. + Therefore, a 11-digit code will be printed as UPC (as well as + 6-digit, 11+2 and 11+5), a 12-digit (or 7-digit, or 12+2 or 12+5) + as EAN13, an ISBN code (with or without hyphens, with or without + add-5) will be encoded in its EAN13 representation, an even number + of digits is encoded using CODE128C and a generic string is + encoded using CODE128B. Since code-39 offers a much larger + representation for the same text string, code128-b is preferred + over code39 for alphanumeric strings. + +`BARCODE_NO_ASCII' + Instructs the engine not to print the ascii string on output. By + default the bar code is accompanied with an ascii version of the + text it encodes. + +`BARCODE_NO_CHECKSUM' + Instructs the engine not to add the checksum character to the + output. Not all the encoding types can drop the checksum; those + where the checksum is mandatory (like EAN and UPC) just ignore the + flag. + +`BARCODE_OUTPUT_MASK' + The mask is used to extract the output-type identifier from the + flags field. + +`BARCODE_OUT_PS' +`BARCODE_OUT_EPS' +`BARCODE_OUT_PCL' +`BARCODE_OUT_PCL_III' + The currently supported encoding types: full-page postscript and + encapsulated postscript; PCL (print command language, for HP + printers) and PCL-III (same as PCL, but uses a font not available + on older printers). + +`BARCODE_OUT_NOHEADERS' + The flag instructs the printing engine not to print the header and + footer part of the file. This makes sense for the postscript + engine but might not make sense for other engines; such other + engines will silently ignore the flag just like the PCL back-end + does. + + +File: barcode.info, Node: The API, Next: The barcode Executable, Prev: Supported Flags, Up: Top + +Functions Exported by the Library +********************************* + + The functions included in the barcode library are declared in the +header file barcode.h. They perform the following tasks: + +`struct Barcode_Item *Barcode_Create(char *text);' + The function creates a new barcode object to deal with a specified + text string. It returns NULL in case of failure and a pointer to + a barcode data structure in case of success. + +`int Barcode_Delete(struct Barcode_Item *bc);' + Destroy a barcode object. Always returns 0 (success) + +`int Barcode_Encode(struct Barcode_Item *bc, int flags);' + Encode the text included in the bc object. Valid flags are the + encoding type (other flags are ignored) and BARCODE_NO_CHECKSUM + (other flags are silently ignored); if the flag argument is zero, + bc->flags will apply. The function returns 0 on success and -1 in + case of error. After successful termination the data structure + will host the description of the bar code and its textual + representation, after a failure the error field will include the + reason of the failure. + +`int Barcode_Print(struct Barcode_Item *bc, FILE *f, int flags);' + Print the bar code described by bc to the specified file. Valid + flags are the output type, BARCODE_NO_ASCII and + BARCODE_OUT_NOHEADERS, other flags are ignored. If any of these + flags is zero, it will be inherited from bc->flags which therefore + takes precedence. The function returns 0 on success and -1 in case + of error (with bc->error set accordingly). In case of success, the + bar code is printed to the specified file, which won't be closed + after use. + +`int Barcode_Position(struct Barcode_Item *bc, int wid, int hei, int xoff, int yoff, double scalef);' + The function is a shortcut to assign values to the data structure. + +`int Barcode_Encode_and_Print(char *text, FILE *f, int wid, int hei, int xoff, int yoff, int flags);' + The function deals with the whole life of the barcode object by + calling the other functions; it uses all the specified flags. + +`int Barcode_Version(char *versionname);' + Returns the current version as an integer number of the form major + * 10000 + minor * 100 + release. Therefore, version 1.03.5 will be + returned as 10305 and version 0.53 as 5300. If the argument is + non-null, it will be used to return the version number as a + string. Note that the same information is available from two + preprocessor macros: BARCODE_VERSION (the string) and + BARCODE_VERSION_INT (the integer number). + + +File: barcode.info, Node: The barcode Executable, Next: Supported Encodings, Prev: The API, Up: Top + +The barcode frontend program +**************************** + + The barcode program is a front-end to access some features of the +library from the command line. It is able to read user supplied +strings from the command line or a data file (standard input by default) +and encode all of them. + +* Menu: + +* The Command Line:: + + +File: barcode.info, Node: The Command Line, Prev: The barcode Executable, Up: The barcode Executable + +The Command Line +================ + + barcode accepts the following options: + +`--help or -h' + Print a usage summary and exit. + +`-i filename' + Identify a file where strings to be encoded are read from. If + missing (and if -b is not used) it defaults to standard input. + Each data line of the input file will be used to create one + barcode output. + +`-o filename' + Output file. It defaults to standard output. + +`-b string' + Specify a single "barcode" string to be encoded. The option can + be used multiple times in order to encode multiple strings (this + will result in multi-page postscript output or a table of barcodes + if -t is specified). The strings must match the encoding chosen; + if it doesn't match the program will print a warning to stderr and + generate "blank" output (although not zero-length). Please note + that a string including spaces or other special characters must be + properly quoted. + +`-e encoding' + encoding is the name of the chosen encoding format being used. It + defaults to the value of the environment variable BARCODE_ENCODING + or to auto detection if the environment is also unset. + +`-g geometry' + The geometry argument is of the form "[ x ] [+ + + ]" (with no intervening spaces). Unspecified + margin values will result in no margin; unspecified size results + in default size. The specified values represent print points by + default, and can be inches, millimeters or other units according + to the -u option or the BARCODE_UNIT environment variable. The + argument is used to place the printout code on the page. Note that + an additional white margin of 10 points is added to the printout. + If the option is unspecified, BARCODE_GEOMETRY is looked up in the + environment, if missing a default size and no margin (but the + default 10 points) are used. + +`-t table-geometry' + Used to print several barcodes to a single page, this option is + meant to be used to print stickers. The argument is of the form + " x [+ + [- + [- ]]]" (with no intervening spaces); if + missing, the top and right margin will default to be the same as + the bottom and left margin. The margins are specified in print + points or in the chosen unit (see -u below). If the option is not + specified, BARCODE_TABLE is looked up in the environment, + otherwise no table is printed and each barcode will get its own + page. The size (but not the position) of a barcode item within a + table can also be selected using -g (see "geometry" above), + without struggling with external and internal margins. I still + think management of geometries in a table is suboptimal, but I + can't make it better without introducing incompatibilities. + +`-m margin(s)' + Specifies an internal margin for each sticker in the table. The + argument is of the form "," and the margin is + applied symmetrically to the sticker. If unspecified, the + environment variable BARCODE_MARGIN is used or a default internal + margin of 10 points is used. + +`-n' + "Numeric" output: don't print the ASCII form of the code, only the + bars. + +`-c' + No checksum character (for encodings that allow it, like code 39, + other codes, like UPC or EAN, ignore this option). + +`-E' + Encapsulated postscript (default is normal postscript). When the + output is generated as EPS only one barcode is encoded. + +`-P' + PCL output. Please note that the Y direction goes from top to + bottom for PCL, and the origin for an image is the top-left corner + instead of the bottom-left + +`-p pagesize' + Specify a non-default page size. The page size can be specified in + millimeters, inches or plain numbers (for example: "210x297mm", + "8.5x11in", "595x842"). A page specification as numbers will be + interpreted according to the current unit specification (see -u + below). If libpaper is available, you can also specify the page + size with its name, like "A3" or "letter" (libpaper is a standard + component of Debian GNU/Linux, but may be missing elsewhere). The + default page size is your system-wide default if libpaper is + there, A4 otherwise. + +`-u unit' + Choose the unit used in size specifications. Accepted values are + "mm", "cm", "in" and "pt". By default, the program will check + BARCODE_UNIT in the environment, and assume points otherwise (this + behaviour is compatible with 0.92 and previous versions. If -u + appears more than once, each instance will modified the behaviour + for the arguments at its right, as the command line is processes + left to right. The program internally works with points, and any + size is approximated to the nearest multiple of one point. The -u + option affect -g (geometry), -t (table) and -p (page size). + + +File: barcode.info, Node: Supported Encodings, Next: PCL Output, Prev: The barcode Executable, Up: Top + +Supported Encodings +******************* + + The program encodes text strings passed either on the command line +(with -b) or retrieved from standard input. The text representation is +interpreted according to the following rules. When auto-detection of +the encoding is enabled (i.e, no explicit encoding type is specified), +the encoding types are scanned to find one that can digest the text +string. The following list of supported types is sorted in the same +order the library uses when auto-detecting a suitable encoding for a +string. + +EAN + The EAN frontend is similar to UPC; it accepts strings of digits, + 12 or 7 characters long. Strings of 13 or 8 characters are + accepted if the provided checksum digit is correct. I expect most + users to feed input without a checksum, though. The add-2 and + add-5 extension are accepted for both the EAN-13 and the EAN-8 + encodings. The following are example of valid input strings: + "123456789012" (EAN-13), "1234567890128" (EAN-13 wih checksum), + "1234567" (EAN-8), "12345670 12345" (EAN-8 with checksum and + add-5), "123456789012 12" (EAN-13 with add-2), "123456789012 + 12345" (EAN-13 with add-5). + +UPC + The UPC frontend accepts only strings made up of digits (and, if a + supplemental encoding is used, a blank to separate it). It + accepts strings of 11 or 12 digits (UPC-A) and 6 or 7 or 8 digits + (UPC-E). + + The 12th digit of UPC-A is the checksum and is added by the + library if not specified in the input; if it is specified, it must + be the right checksum or the code is rejected as invalid. For + UPC-E, 6 digit are considered to be the middle part of the code, a + leading 0 is assumed and the checksum is added; 7 digits are + either considered the initial part (leading digit 0 or 1, checksum + missing) or the final part (checksum specified, leading 0 + assumed); 8 digits are considered to be the complete code, with + leading 0 or 1 and checksum. For both UPC-A and UPC-E, a trailing + string of 2 digits or 5 digits is accepted as well. Therefore, the + following are examples of valid strings that can be encoded as UPC: + "01234567890" (UPC-A) "012345678905" (UPC-A with checksum), + "012345" (UPC-E), "01234567890 12" (UPC-A, add-2) and "01234567890 + 12345" (UPC-A, add-5), "0123456 12" (UPC-E, add-2). Please note + that when setting BARCODE_ANY to auto-detect the encoding to be + used, 12-digit strings and 7-digit strings will always be + identified as EAN. This because I expect most user to provide + input without a checksum. If you need to specify UPC-with-checksum + as input you must explicitly set BARCODE_UPC as a flag or use -e + upc on the command line. + +ISBN + ISBN numbers are encoded as EAN-13 symbols, with an optional add-5 + trailer. The ISBN frontend of the library accepts real ISBN + numbers and deals with any hyphen and, if present, the ISBN + checksum character before encoding data. Valid representations for + ISBN strings are for example: "1-56592-292-1", "3-89721-122-X" and + "3-89721-122-X 06900". + +CODE 128-B + This encoding can represent all of the printing ASCII characters, + from the space (32) to DEL (127). The checksum digit is mandatory + in this encoding. + +CODE 128-C + The "C" variation of Code-128 uses Code-128 symbols to represent + two digits at a time (Code-128 is made up of 104 symbols whose + interpretation is controlled by the start symbol being used). Code + 128-C is thus the most compact way to represent any even number of + digits. The encoder refuses to deal with an odd number of digits + because the caller is expected to provide proper padding to an + even number of digits. (Since Code-128 includes control symbols to + switch charset, it is theoretically possible to represent the odd + digit as a Code 128-A or 128-B symbol, but this tool doesn't + currently implement this option). + +CODE 128 RAW + Code-128 output represented symbol-by-symbol in the input string. + To override part of the problems outlined below in specifying + code128 symbols, this pseudo-encoding allows the used to specify a + list of code128 symbols separated by spaces. Each symbol is + represented by a number in the range 0-105. The list should + include the leading character.The checksum and the stop character + are automatically added by the library. Most likely this + pseudo-encoding will be used with BARCODE_NO_ASCII and some + external program to supply the printed text. + +CODE 39 + The code-39 standard can encode uppercase letters, digits, the + blank space, plus, minus, dot, star, dollar, slash, percent. Any + string that is only composed of such characters is accepted by the + code-39 encoder. To avoid loosing information, the encoder refuses + to encode mixed-case strings (a lowercase string is nonetheless + accepted as a shortcut, but is encoded as uppercase). + +INTERLEAVED 2 OF 5 + This encoding can only represent an even number of digits (odd + digits are represented by bars, and even digits by the + interleaving spaces). The name stresses the fact that two of the + five items (bars or spaces) allocated to each symbol are wide, + while the rest are narrow. The checksum digit is optional (can be + disabled via BARCODE_NO_CHECKSUM). Since the number of digits, + including the checksum, must be even, a leading zero is inserted + in the string being encoded if needed (this is specifically stated + in the specs I have access to). + +CODE 128 + Automatic selection between alphabet A, B and C of the Code-128 + standard. This encoding can represent all ASCII symbols, from 0 + (NUL) to 127 (DEL), as well as four special symbols, named F1, F2, + F3, F4. The set of symbols available in this encoding is not + easily represented as input to the barcode library, so the + following convention is used. In the input string, which is a + C-language null-terminated string, the NUL char is represented by + the value 128 (0x80, 0200) and the F1-F4 characters are + represented by the values 193-196 (0xc1-0xc4, 0301-0304). The + values have been chosen to ease their representation as escape + sequences. + + Since the shell doesn't seem to interpret escape sequences on the + command line, the "-b" option cannot be easily used to designate + the strings to be encoded. As a workaround you can resort to the + command echo, either within back-ticks or used separately to + create a file that is then fed to the standard-input of barcode - + assuming your echo command processes escape sequences. The + newline character is especially though to encode (but not + impossible unless you use a csh variant. + + These problems only apply to the command-line tool; the use of + library functions doesn't give any problem. In needed, you can use + the "code 128 raw" pseudo-encoding to represent code128 symbols by + their numerical value. This encoding is used late in the + auto-selection mechanism because (almost) any input string can be + represented using code128. + +CODABAR + Codabar can encode the ten digits and a few special symbols + (minus, plus, dollar, colon, bar, dot). The characters "A", "B", + "C" and "D" are used to represent four different start/stop + characters. The input string to the barcode library can include + the start and stop characters or not include them (in which case + "A" is used as start and "B" as stop). Start and stop characters + in the input string can be either all lowercase or all uppercase + and are always printed as uppercase. + +PLESSEY + Plessey barcodes can encode all the hexadecimal digits. Alphabetic + digits in the input string must either be all lowercase or all + uppercase. The output text is always uppercase. + +MSI + MSI can only encode the decimal digits. While the standard + specifies either one or two check digits, the current + implementation in this library only generates one check digit. + +CODE 93 + The code-93 standard can natively encode 48 different characters, + including uppercase letters, digits, the blank space, plus, minus, + dot, star, dollar, slash, percent, as well as five special + characters: a start/stop delimiter and four "shift characters" + used for extended encoding. Using this "extended encoding" + method, any standard 7-bit ASCII character can be encoded, but it + takes up two symbol lengths in barcode if the character is not + natively supported (one of the 48). The encoder here fully + implements the code 93 encoding standard. Any characters natively + supported (A-Z, 0-9, ".+-/$&%") will be encoded as such - for any + other characters (such as lower case letters, brackets, + parentheses, etc.), the encoder will revert to extended encoding. + As a note, the option to exclude the checksum will eliminate the + two modulo-47 checksums (called C and K) from the barcode, but this + probably will make it unreadable by 99% of all scanning systems. + These checksums are specified to be used at the firmware level, + and their absence will be interpreted as an invalid barcode. + + +File: barcode.info, Node: PCL Output, Next: Bugs and Pending Issues, Prev: Supported Encodings, Up: Top + +PCL Output +********** + + While the default output is Postscript (possibly EPS), and Postscript +can be post-processed to almost anything, it is sometimes desirable to +create output directly usable by the specific printer at hand. PCL is +currently supported as an output format for this reason. Please note +that the Y coordinate for PCL goes from top to bottom, while for +Postscript it goes from bottom to top. Consistently, while in +Postscript you specify the bottom-left corner as origin, for PCL you +specify the top-left corner. + + Barcode output for PCL Printers (HP LaserJet and compatibles), was +developed using PCL5 Reference manuals from HP. that really refers to +these printers: + * LaserJet III, III P, III D, III Si, + + * LaserJet 4 family + + * LaserJet 5 family + + * LaserJet 6 family + + * Color LaserJet + + * DeskJet 1200 and 1600. + + + However, barcode printing uses a very small subset of PCL, probably +also LaserJet II should print it without problem, but the resulting +text may be horrible. + + The only real difference from one printer to another really depends +on which font are available in the printer, used in printing the label +associated to the bars (if requested). + + Earlier LaserJet supports only bitmaps fonts, so these are not +"scalable". (Ljet II ?), Also these fonts, when available, have a +specified direction, and not all of them are available in both Portrait +and Landscape mode. + + From LaserJet 4 series, (except 4L/5L that are entry-level printers), +Arial scalable font should be available, so it's the "default font" +used by this program. + + LaserJet III series printers (and 4L, 5L), don't feature "Arial" as a +resident font, so you should use BARCODE_OUT_PCL_III instead of +BARCODE_OUT_PCL., and font the font used will be "Univers" instead of +"Arial". + + Results on compatible printers, may depend on consistency of PCL5 +compatibility, in doubt, try BARCODE_OUT_PCL_III + + PJL commands are not used here, as it's not very compatible. + + Tested Printers: + * Hp LaserJet 4050 + + * Hp LaserJet 2100 + + * Epson N-1200 emul PCL + + * Toshiba DP2570 (copier) + PCL option + + * Epson EPL-7100 emul. HP LaserJet II: bars print fine but text is + bad. + + +File: barcode.info, Node: Bugs and Pending Issues, Prev: PCL Output, Up: Top + +Bugs and Pending Issues. +************************ + + The current management of borders/margins is far from optimal. The +"default" margin applied by the library interferes with the external +representation, but I feel it is mandatory to avoid creating barcode +output with no surrounding white space (the problem is especially +relevant for EPS output). + + EAN-128 is not (yet) supported. I plan to implement it pretty soon +and then bless the package as version 1.0. + + + +Tag Table: +Node: Top154 +Node: Overview526 +Node: The Barcode Object1404 +Node: The Field List2821 +Node: The Intermediate Representation6586 +Node: Supported Flags8359 +Node: The API11343 +Node: The barcode Executable14029 +Node: The Command Line14458 +Node: Supported Encodings19557 +Node: PCL Output28997 +Node: Bugs and Pending Issues31316 + +End Tag Table diff --git a/glabels2/barcode-0.98/doc/barcode.pdf b/glabels2/barcode-0.98/doc/barcode.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b2268f4d88df746dbb6c3602aa7d3ed82e327410 GIT binary patch literal 192464 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%0AsEDtDucP|JSd#jS#anV^@KuE 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

    ImD7Dy2pKZ~hpnmDvEW{zBbsi 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 literal 0 HcmV?d00001 diff --git a/glabels2/barcode-0.98/doc/barcode.ps b/glabels2/barcode-0.98/doc/barcode.ps new file mode 100644 index 00000000..cc6cc2c4 --- /dev/null +++ b/glabels2/barcode-0.98/doc/barcode.ps @@ -0,0 +1,2378 @@ +%!PS-Adobe-2.0 +%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software +%%Title: barcode.dvi +%%Pages: 12 +%%PageOrder: Ascend +%%BoundingBox: 0 0 596 842 +%%EndComments +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: dvips -f barcode.dvi +%DVIPSParameters: dpi=600, compressed +%DVIPSSource: TeX output 2002.08.21:2135 +%%BeginProcSet: texc.pro +%! +/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S +N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 +mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 +0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ +landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize +mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ +matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round +exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ +statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] +N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin +/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array +/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 +array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N +df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A +definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get +}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} +B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr +1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 +1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx +0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx +sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ +rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp +gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B +/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ +/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ +A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy +get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} +ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp +fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 +{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add +chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ +1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} +forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn +/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put +}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ +bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A +mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ +SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ +userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X +1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 +index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N +/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ +/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) +(LaserWriter 16/600)]{A length product length le{A length product exch 0 +exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse +end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask +grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} +imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round +exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto +fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p +delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} +B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ +p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S +rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + +%%EndProcSet +TeXDict begin 39158280 55380996 1000 600 600 (barcode.dvi) +@start +%DVIPSBitmapFont: Fa cmbxti10 14.4 8 +/Fa 8 115 df<13FCEA03FF000F13804813C05AA25AA2B5FCA31480A214006C5A6C5A6C +5AEA0FE0121271912B>46 D97 DI<923807FF80037F13F00203B512FC02 +0F80023F8091B500031380499038F8007F010701E0EBFFC049EB800149495A49485B495A +49485B5A485BA248491580180048496D5A486F5A93C8FC485BA35A91CAFCA3B5FC5BA45B +A65B17036C6CED0780170FEF3FC0003F167F6DEC01FF001F4B13806C6C021F13006C6DEB +7FFC6C9039F00FFFF86C90B612E06C5E013F4AC7FC010F14F0010049C8FC323773B540> +II<923807FF8092B512E0020714F8021F80027F80903A01FFFE03FF49D9F000 +13804901C0EB7FC0495B013F90C7123F495A495A5C5A485B4849147F18804816FF4A4913 +00485DEE0FFE4849EB7FFC923807FFF891B612E0485E94C7FC16F04BC8FCB5CAFC5BA45B +A7007F1603EF0780170F003FEE3FC0177F6C6CEC01FF4C13806C6C021F13006C01C0EB7F +FC6C9039F00FFFF86C90B612E06C6C5D6D4AC7FC010714F09026007FFEC8FC323773B540 +>I<923807FFC0037F13FC0203B6FC020F15C0023F8191B5000313F8499039F8007FFC01 +0701E0133F4901806D7E4990C76C7E49481680495A4948804818C0485BA2485BA248494A +13E05AA2485BA24D13C05A91C8FCA25FB517805BA25F19005B6017FF605E60495E5E6C6C +4A5B604C5B003F4B90C7FC6D4A5A001F4B5A6C6C4A5A6CD980035B6CD9F01F13C06C90B6 +5A6C4BC8FC013F14F0010F14C0010001F8C9FC3B3773B547>111 +D114 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fb cmsy10 10.95 1 +/Fb 1 16 df15 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fc cmb10 10.95 10 +/Fc 10 115 df97 D<13FFB5FCA512077EAFEC03FE91381FFF +C0027F13F091B57E9138FE0FFE9138F003FF4A7E02C014804A6C13C017E0A3EE7FF0A317 +F8AC17F0A3EEFFE0A217C05D02C014806E4813006E485A9138FC1FFC01FCB55A496C13E0 +D9F01F1380C7D807FCC7FC2D407EBE33>III<49B47E010F13F0013F7F90B512FE48EBC3FF480100 +13804848EB7FC04848133F001F15E05B003FEC1FF0A2485A150F16F8A212FFA290B6FCA4 +01F0C8FCA5127FA37F003F15F8A26C6C1301000F15F06D13036C6CEB07E06C9038800FC0 +6C9038F07F806C6CB512006D5B010F13F8010013C0252B7EA92A>I103 +D105 D<01FFEB7FE0B53801FFF802077F4A7F91381FC3FFDA3E03 +13800007137C6CEB780102F014C014E0A214C0A31480B3A4B5D8FE1F13FFA530297EA833 +>110 D<49B47E010F13F0013F13FC90B6FC48018113803A03FE007FC04848EB3FE0000F +15F049131F001F15F8A24848EB0FFCA2007F15FEA400FF15FFAB007F15FEA3003F15FC6D +131F001F15F8A26C6CEB3FF0000715E06C6CEB7FC03A01FF81FF806C90B51200013F13FC +010F13F001011380282B7EA92D>I<3901FE07F800FFEB0FFE91383FFF804A13C0EC7C7F +9138F8FFE03807FFF06C5B5CA2ED7FC09138803F80ED1F0092C7FCA291C8FCB3A3B6FCA5 +23297FA827>114 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fd cmbxti10 17.28 7 +/Fd 7 115 df97 +DII<963803FFC0061FB512E06060A47214C0F000 +1F61A21B80A261A21B00A296B5FCA262A260A262A260A262A260A262A260A2DCFFE05C03 +0F13FC037FEBFF1F4AB6129F020792B55A4AEBE07F023FEB000F4A487F4948486D5C4913 +F04981495B49496D91C7FC495B5B92C8FC90B55E485B5F485B4860A248495CA248605C5F +5A4A5EA2485EA24A5EA2B55DA24A5EA25FA291C85CA24DEC3F801A7F19005B94B513FFA2 +4E1400A24C5C007F614C13FC4C1403003F4B5D6D4A14076C4B5D6C6D49140F4BB55C6CD9 +C007013F495A6C9026F03FFEEBFE3FC690B5D8F81FB55A6DDAF0075C011FDAC00349C7FC +010749C75B9026007FF0EC1FF04B6571E355>II<93381FFF804BB512F8031F14 +FF037F15C04AB77E0207D9FC0313F8021FD9E0007F4A0180EB3FFEDAFFFEC76C7E494916 +8049496E13C0495B49496E13E0495B494916F05B90B5C87E1AF8485B485F5C5A5C5AA248 +5B605A5CA2485FA24A17F0A2B55EA24A17E0A2601AC091C9FC95B51280A21A005F615F49 +5F4D5B127F6D4B5B616C4C5B4D5B6C6D4A90C7FC4D5A6C6D495B6C4B5B6C6D010F13E06C +01F8013F5B6CD9FE01B5C8FC013FB612FC6D15F0010715C0010002FCC9FC020F13C04542 +71C055>111 D114 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fe cmbxti10 13.15 11 +/Fe 11 120 df97 D99 D<943801FF800403B512C05E1980A282EE000F1900A25FA260A2173FA260 +A2177FA260A217FFA260A25EEDFFC1020701F15B023F13FD91B7FC4913E00107D9003F5B +49487F49487F495A49486D5B495A485D5C4894C7FC5A4A5B5A91C75B5A163FA248485DA2 +167F127F495DA216FF12FF495DA25D181E49EDE03FA24B5C187E17C0A2007F5F5D4B1380 +003F4AEB81F85D6C6C49EB83F06C6C48B55B2707FE0FFC13CF6CB539F07FFFC06C4A6C5B +6C6CD9800F90C7FC903A0FFC0003FC3A4D75CB41>III104 D<15F8EC03FC4A7E4A7EA25CA35DA2 +5D6E5AEC03E091C8FCAEEB07F8EB1FFEEB7FFF90B57E3901FC7FC0D803F07FEA07E0D80F +C07FA2381F80FFA2485A5B007E5CA25B00FE5C485A007C5C12005B92C7FCA25B5C133F5C +A2137F5CA213FFECF00F48EC1F8014E0153F48150014C05D48147E14805D14816CEB01F8 +4A5A4A5A6CEB1FC06CEBFF806D90C7FC6D5AEB07F0214E78CC27>I108 D<913801FFC0021F13F8027F13FE91B6FC4901001380D903FC +EB3FC0D907F0130F010FEC3FE04948137F4A13FF133FA2017F4913C0A26F138017006E13 +7E02FC90C7FCECFFC015FE6F7E16E06D80826D807F6D80010180EB003F1403EC003FD803 +C0130FD80FE01303EA3FF0486C7FA200FF5DA34B5A5B49495A495C49130F6CC7485AD83F +C0EB7FC03A1FF803FF806CB548C7FC6C14F8000114E026001FFEC8FC2B3377B135>115 +DI119 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Ff cmbx12 13.14 13 +/Ff 13 117 df<923803FFE092B512FC020714FF021F81027F9038007FC0DAFFF0EB0FE0 +010301C0804990C7EA3FF84948147F4A81494814FF495AA2137F5CA2715A715A715AEF07 +8094C8FCA8EF07FCB9FCA526007FF0C7123F171FB3B3003FB5D8E00FB512F8A53D4D7ECC +44>12 D46 D85 D97 D100 DII< +EB7FC0B5FCA512037EB3A2923801FFC0030F13F8033F13FE4B7F9126C1FE077F9126C3F0 +037F9138C7C001DACF8080150002DE7F02FC81A25CA25CA35CB3A9B6D8C07FEBFFE0A53B +4C7BCB44>104 D108 +D<903A7FC001FFC0B5010F13F8033F13FE4B7F9126C1FE077F9126C3F0037F00039038C7 +C0016CD9CF8080150002DE7F02FC81A25CA25CA35CB3A9B6D8C07FEBFFE0A53B317BB044 +>110 D<913807FF80027F13F80103B6FC010F15C090261FFE017F903A7FF0003FF8D9FF +C0EB0FFC48496D7E4890C76C7E4817804980000F17C048486E13E0A2003F17F049157FA2 +007F17F8A400FF17FCAB007F17F8A36C6CEDFFF0A3001F17E06D5C000F17C06C6C4A1380 +6C17006C6D495A6C01E0EB1FFC6D6C495A903A3FFE01FFF0010FB612C0010392C7FCD900 +7F13F80207138036337DB13D>I<90390FFF8070017FEBF1F048B6FC1207380FFC01391F +E0003F4848130F491307127F90C712035A1501A27FA213E06D90C7FC13FE387FFFF0ECFF +C015F06C14FC6C14FF6C15806C15C06C15E0C615F0013F14F8010714FCEB007F14019138 +003FFE150F0078140700F81403A26C1401A37E16FC6C14036D14F87F6DEB07F001F8EB1F +E001FFEBFFC091B51280D8FC7F1400D8F81F13FCD8E00313C027337CB130>115 +D<14F8A61301A41303A21307A2130FA2131F133F137F13FF1203000F90B512F0B7FCA426 +007FF8C7FCB3A6167CAA013F14F880A290391FFE01F0010F1303903907FF87E06DEBFFC0 +6D14806D6C1300EC0FFC26467EC430>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fg cmti10 10.95 35 +/Fg 35 122 df<933807FF80043F13E09338FE00F8DB01F0133EDB07E0130E4B48131F4C +137F031F14FF4BC7FCA218FE157E1878180015FE5DA31401A25DA414030103B712F0A218 +E0903A0003F000070207140F4B14C0A3171F020F15805DA2173F1800141F5D5F177EA214 +3F92C712FE5FA34A1301027EECF81CA3160302FEECF03C4A1538A21878187013014A0101 +13F018E0933800F1C0EF7F804948EC1F0094C7FCA35C1307A2001E5B127F130F00FF5BA2 +49CAFC12FEEAF81EEA703CEA7878EA1FF0EA07C0385383BF33>12 +DI40 +D<14031580A2EC01C0EC00E0A21570A215781538153CA3151EA4151FA2150FA7151FA915 +3FA2153EA3157EA2157CA215FCA215F8A21401A215F0A2140315E0A2140715C0A2EC0F80 +A2141F15005C143EA25CA25CA2495A5C1303495A5C130F49C7FC131E5B137C5B5B485A48 +5A485A48C8FC121E5A12705A5A205A7FC325>I<387FFFFCA3B5FCA21605799521>45 +D<120FEA3FC0127FA212FFA31380EA7F00123C0A0A77891C>I<15031507150F151F151E +153E157EEC01FEEC03FC1407141FEB01FF90380FFBF8EB1FC3EB0E07130015F0A2140FA2 +15E0A2141FA215C0A2143FA21580A2147FA21500A25CA25CA21301A25CA21303A25CA213 +07A25CA2130FA25CA2131FA25CEB7FE0B612F0A215E0203D77BC2E>49 +D<15FE913803FFC091380F01F091383C00F84A137C4A7F4948133F49487F4A148049C7FC +5BEB0E0C011E15C0EB1C0EEB3C06133813781370020E133FD9F00C148013E0141C021813 +7F00011600EBC0384A13FEEC600102E05B3A00E3C003F89039FF0007F0013C495A90C748 +5A5E037FC7FC15FC4A5A4A5AEC0FC04AC8FC147E14F8EB03E0495A011FC9FC133E491418 +01F0143C48481438485A1678485A48C85A120E001E4A5AD83FE0130301FF495A397C3FF0 +1FD8780FB55AD8700391C7FCD8F0015B486C6C5A6E5AEC07C02A3F79BC2E>I<157F9138 +01FFE0913807C0F091381F007C023C133C4A133E4A131F1301495A5C1307A2495AA2163F +011F143EA2167E6E137C16F8ECE00102F013F09138F803E09138FC07C090390FFE0F00EC +FFBE6D13F86D5B7F6D7F8101037F90380F9FFFD91F0F1380D97C0713C0497E48486C13E0 +3903E0007F4848133F4848131F001F140F90C7FC003E1407A2127E127CA200FC15C05AA2 +ED0F80A2ED1F00153E007C143C157C007E5C6CEB03F0391F8007C0390FE03F802607FFFE +C7FC000113F838003FC0283F78BC2E>56 D<49B712C018F818FE903B0003FC0001FF9438 +007F804BEC3FC0A2F01FE014074B15F0180FA2140F5D181FA2021F16E05D183F19C0023F +ED7F804B14FF19004D5A027F4A5A92C7EA07F0EF1FE0EF7F804AD903FEC7FC92B512F017 +FE4AC7EA3F800101ED1FE04A6E7E17078401036F7E5CA30107825CA3010F5E4A1407A260 +011F150F5C4D5A60013F153F4A4A5A4D5A017F4A90C7FC4C5A91C7EA0FF849EC3FF0B812 +C094C8FC16F83C3E7BBD40>66 D<49B77E18F018FC903B0003FE0003FEEF00FF4BEC7F80 +F03FC00207151F19E05DA2020F16F0A25DA2141FF03FE05DA2023F16C0187F4B1580A202 +7FEDFF00604B495A4D5A02FF4A5A4D5A92C7EA3FC04CB4C7FC4990B512FC17E04ACAFCA2 +1303A25CA21307A25CA2130FA25CA2131FA25CA2133FA25CA2137FA25C497EB67EA33C3E +7BBD3E>80 D<92391FE00380ED7FFC913A01FFFE0700913907F01F8F91390FC007DF4AC6 +6CB4FC023E6D5A4A130014FC495A4948147CA2495AA2010F15785CA3011F1570A46E91C7 +FCA2808014FE90380FFFE015FC6DEBFF8016E06D806D806D6C7F141F02037FEC003FED07 +FF1501A281A282A212075A167E120EA2001E15FE5EA25E003E14015E003F14034B5A486C +5C150F6D495A6D49C8FCD8F9F0137C39F8FE01F839F03FFFF0D8E00F13C026C001FEC9FC +314279BF33>83 D<277FFFFE01B500FC90B512E0B5FCA20003902680000790C7380FFC00 +6C90C701FCEC07F049725A04035EA26350C7FCA20407150EA2040F5D1A3C041F15386216 +3B6216734F5A6D14E303014B5A6C15C303034BC8FC1683DB0703140E191E030E151C6103 +1C7F61ED380161157003F04A5A15E002014B5A15C0DA03804AC9FC60DA0700140E60140E +605C029C5D14B8D97FF85D5C715A5C4A5DA24A92CAFC5F91C7FC705A137E5F137C5F1378 +01705D53406EBD5B>87 D<147E49B47E903907C1C38090391F80EFC090383F00FF017E13 +7F4914804848133F485AA248481400120F5B001F5C157E485AA215FE007F5C90C7FCA214 +01485C5AA21403EDF0385AA21407EDE078020F1370127C021F13F0007E013F13E0003E13 +7FECF3E1261F01E313C03A0F8781E3803A03FF00FF00D800FC133E252977A72E>97 +DIIII<167C4BB4FC923807C78092380F83C0ED1F87161FED3F3FA2157EA21780EE0E004B +C7FCA414015DA414035DA30103B512F8A390260007E0C7FCA3140F5DA5141F5DA4143F92 +C8FCA45C147EA414FE5CA413015CA4495AA4495AA4495A121E127F5C12FF49C9FCA2EAFE +1EEAF83C1270EA7878EA3FE0EA0F802A5383BF1C>III<1478EB01FCA21303A314F8EB00E01400AD137C48 +B4FC38038F80EA0707000E13C0121E121CEA3C0F1238A2EA781F00701380A2EAF03F1400 +12005B137E13FE5BA212015BA212035B1438120713E0000F1378EBC070A214F0EB80E0A2 +EB81C01383148038078700EA03FEEA00F8163E79BC1C>I108 +DIII<903903E001F890390FF807FE903A1E7C1E0F80903A1C3E3C07C001 +3C137801389038E003E0EB783F017001C013F0ED80019038F07F0001E015F8147E160300 +0113FEA2C75AA20101140717F05CA20103140F17E05CA20107EC1FC0A24A1480163F010F +15005E167E5E131F4B5A6E485A4B5A90393FB80F80DA9C1FC7FCEC0FFCEC03E049C9FCA2 +137EA213FEA25BA21201A25BA21203A2387FFFE0B5FCA22D3A80A72E>I114 DII<137C48B4141C26038F80137EEA0707000E7F001E15FE +121CD83C0F5C12381501EA781F007001805BA2D8F03F1303140000005D5B017E1307A201 +FE5C5B150F1201495CA2151F0003EDC1C0491481A2153F1683EE0380A2ED7F07000102FF +13005C01F8EBDF0F00009038079F0E90397C0F0F1C90391FFC07F8903907F001F02A2979 +A731>I<017CEB01C048B4EB07F038038F80EA0707000E01C013F8121E001C1403EA3C0F +0038EC01F0A2D8781F130000705BA2EAF03F91C712E012005B017E130116C013FE5B1503 +000115805BA2ED07001203495B150EA25DA25D1578000114706D5B0000495A6D485AD97E +0FC7FCEB1FFEEB03F0252979A72A>I<017C167048B491387001FC3A038F8001F8EA0707 +000E01C015FE001E1403001CEDF000EA3C0F0038177C1507D8781F4A133C00701380A2D8 +F03F130F020049133812005B017E011F14784C137013FE5B033F14F0000192C712E05BA2 +170100034A14C049137E17031880A2EF070015FE170E00010101141E01F86D131C0000D9 +039F5BD9FC076D5A903A3E0F07C1E0903A1FFC03FFC0902703F0007FC7FC372979A73C> +I<903903F001F890390FFC07FE90393C1E0E0F9026780F1C138001F0EBB83FD801E013F8 +9039C007F07FEA0380000714E0D9000F140048151C000E4AC7FCA2001E131FA2C75BA214 +3F92C8FCA35C147EA314FE4A131CA30101143C001E1538003F491378D87F811470018314 +F000FF5D9039077801C039FE0F7C033A7C0E3C078027783C1E1EC7FC391FF80FFC3907E0 +03F029297CA72A>I<137C48B4143826038F8013FCEA0707000E7F001E1401001C15F8EA +3C0F12381503D8781F14F000701380A2D8F03F1307020013E012005B017E130F16C013FE +5B151F1201491480A2153F000315005BA25D157EA315FE5D00011301EBF8030000130790 +387C1FF8EB3FF9EB07E1EB00035DA21407000E5CEA3F80007F495AA24A5AD8FF0090C7FC +143E007C137E00705B387801F0383803E0381E0FC06CB4C8FCEA03F8263B79A72C>I +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fh cmsl10 10.95 33 +/Fh 33 122 df<007FB5FCA2B512FEA418067C961E>45 D<157015F014011407143F9038 +03FFE0137FEBFFCFEBF80F1300141F15C0A5143F1580A5147F1500A55C5CA513015CA513 +035CA513075CA5130F5CA3131F497EB612F8A31D3D78BC2D>49 DII<01061403D90780131F90390FF801FE91B512FC16F816F016E0168049EB +FE0015F890381C7FC091C8FCA3133C1338A513781370A2EC1FE0ECFFF8903873E03E9038 +FF001F01FCEB0F804914C049EB07E04914F049130390C7FC16F8A61507A21206EA3F8048 +7EA2150F00FF15F0A24914E090C7121F00FC15C000F0143F00701580ED7F0012786C14FE +4A5A6C495A390F800FE03907E03FC06CB5C7FCC613FCEB1FE0283F7ABC2D>53 +D56 DI<17E016011603831607A2160FA2161F83163FA2167F167716F7EEE7FCED +01E316C3150316831507EE03FEED0F01150E151E151C153C03387FED7800157015F05D4A +4880177F4A5AA24AC7FCA2020E81173F5C021FB6FC5CA20270C7EA3FE0171F5CA2495AA2 +494881170F49C8FCA2130EA24982013C1507A2137CD801FE4B7E2607FF80EC3FFEB500F0 +0107B512FC19F85E3E417DC044>65 D<013FB7FC18E018FC903B007FE00007FE6E489038 +01FF809438007FC05DF03FE0F01FF0A3027F16F892C8FCA54A16F04A153F19E0187F19C0 +F0FF8001014B13004A4A5A4D5AEF1FF04D5ADC03FFC7FC49B612F8EFFF8002F8C7EA3FE0 +EF0FF0EF07FC717E010715014A81711380A319C0130F5CA5011F4B13805C19005F601707 +013F4B5A4A4A5A4D5A4D5A017F913801FF8001FF020F90C7FCB812FC17F094C8FC3D3E7D +BD40>II<013FB812F8A39026007F +F0C7127F6E48140F18034B14011800A31978147F4B1570A502FF147092C7FCA3190017F0 +495D4A1301A21607161F91B6FC495DA29138FC003F160F1607160301075D5CA219E01801 +19C0010FEC07004A90C712031980A218071900011F5E5C181EA2183E183C013F167C4A15 +FC4D5A1707017F151F01FF4AB45AB9FCA2603D3E7DBD3E>69 D<011FB512FC5BA2903900 +3FF8006E5AA25DA5143F5DA5147F5DA514FF92C7FCA55B5CA513035CA513075CA5130F5C +A5131F5CA3133F497E007FB512F0A2B6FC263E7EBD21>73 D<90263FFFF093381FFFF850 +13F0629026007FF8EFF000023F4D5AA2023B933801DFC0A2DA39FCED039FA2F1073F1479 +0271040E5BEC70FE191C19381A7F02F01670DAE07F94C7FC19E0A2F001C06201016D6C49 +5A02C05FF00700A2180E6F6C14010103161C028003385BA218706F7EF0E00313070200DA +01C05BA2923907F00380A294380700075B010E902603F80E5C5FA25F190F011E6D6C5A01 +1C605FA2EEFDC0DB00FF141F013C5D013860013C92C7FC017C5C01FE027E143F2607FF80 +017C4A7EB500FC037FB512E004785E4A1338553E7CBD53>77 D<90263FFFE0023FB5FC6F +16FEA29026003FF8020313C0021F030013004A6C157C023B163C6F153814398102381678 +02787FDA707F157082153F82031F15F002F07FDAE00F5D8215078203031401010180DAC0 +015D82811780047F1303010315C04A013F5C17E0161F17F0040F1307010715F891C70007 +91C7FC17FC160317FE04015B4915FF010E6E130E188E177F18CEEF3FDE011E16FE011C6F +5AA2170FA21707133C01386F5A133C017C150113FE2607FF801400B512FC18705C483E7D +BD44>I<013FB612FEEFFFE018F8903B007FF0000FFC6E48EB01FF7113804BEC7FC0183F +19E0F01FF0A2147F5D19F8A402FFED3FF092C8FCA219E0A2F07FC05B4AEDFF8019004D5A +4D5AEF0FF80103ED3FE04A903801FF8091B648C7FC17F002FCCAFCA213075CA5130F5CA5 +131F5CA5133F5CA3137F497EB612E0A25D3D3E7DBD3E>80 D<9238FF80070207EBE00F02 +1FEBF81E91387F00FE02FCEB1F3ED903F0EB0FFE49481307494813034AEB01FC49C7FC49 +1400133E137E177C491578A57F1770A26D1500808080EB7FFEECFFE06D13FEEDFFC06D14 +F06D14FC010380010080143F02031480DA003F13C015031500EE7FE0163F161FA2160F12 +1CA31607160F003C16C0A31780003E151F1700007E5D007F153E6D5C16FC01E0495AD87D +F0495AD8FCFCEB0FC03AF87F803F8027F01FFFFEC7FCD8E00713F839C0007FC030427BBF +33>83 D85 D97 DIIIII<1478EB01FE130314FFA25B14FE130314FCEB00F0 +1400ACEB03F8EA01FF14F0A2EA001F130FA314E0A5131F14C0A5133F1480A5137F1400A5 +5B5BA4EA03FF007F13F0A2B5FC183E7DBD1A>105 D<143FEB1FFF5BA213017FA214FEA5 +130114FCA5130314F8A5130714F0A5130F14E0A5131F14C0A5133F1480A5137F1400A55B +5BA4EA03FF007F13F8A2B5FC183F7DBE1A>108 D<903907F007F8D803FFEB1FFF9139E0 +781FC09138E1E00F3B001FE38007E090380FE70002EE14F014FC14D814F85CA24A130F13 +1F4A14E0A4161F133F4A14C0A4163F137F91C71380A4167F5B491500A300015D486C4913 +80B5D8F87F13FCA32E287DA733>110 DI<903907F01F80D803 +FFEB7FE09138E1E1F09138E387F839001FE707EB0FE614EE02FC13F002D813E09138F801 +804AC7FCA25C131FA25CA4133F5CA5137F91C8FCA55B5BA31201487EB512FEA325287EA7 +24>114 D<9138FF81C0010713E390381F807F90397C003F8049131F4848130F5B000314 +07A248481400A27FA27F6D90C7FCEBFF8014FC6C13FF6C14C015F06C6C7F011F7F130790 +38007FFE1403140100381300157EA2123C153E157E007C147CA2007E147815F8007F495A +4A5A486C485A26F9E01FC7FC38E0FFFC38C01FE0222A7DA824>II118 +DI<90B539E007 +FFF05E18E0902707FE000313006D48EB01FC705A5F01014A5A5F16036E5C0100140794C7 +FC160E805E805E1678ED8070023F13F05EED81C015C191381FC38015C793C8FC15EF15EE +EC0FFCA25DA26E5AA25DA26E5A5DA24AC9FC5C140E141E141C5C121C003F5B5A485B495A +130300FE5B4848CAFCEA701EEA783CEA3FF0EA0FC0343A80A630>121 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fi cmbx12 17.28 43 +/Fi 43 122 df46 D<16F04B7E1507151F153FEC01FF1407 +147F010FB5FCB7FCA41487EBF007C7FCB3B3B3B3007FB91280A6395E74DD51>49 +D<913801FFF8021FEBFFC091B612F8010315FF010F16C0013F8290267FFC0114F89027FF +E0003F7F4890C7000F7F48486E7FD807F86E148048486E14C048486E14E048486F13F001 +FC17F8486C816D17FC6E80B56C16FE8380A219FFA283A36C5BA26C5B6C90C8FCD807FC5D +EA01F0CA14FEA34D13FCA219F85F19F04D13E0A294B512C019804C14004C5B604C5B4C5B +604C13804C90C7FC4C5A4C5A4B13F05F4B13804B90C8FC4B5AED1FF84B5A4B5A4B48143F +4A5B4A48C8FC4A5A4A48157E4A5A4A5AEC7F8092C9FC02FE16FE495A495A4948ED01FCD9 +0FC0150749B8FC5B5B90B9FC5A4818F85A5A5A5A5ABAFCA219F0A4405E78DD51>I<92B5 +FC020F14F8023F14FF49B712C04916F0010FD9C01F13FC90271FFC00077FD93FE001017F +49486D8049C86C7F484883486C6F7F14C0486D826E806E82487FA4805CA36C5E4A5E6C5B +6C5B6C495E011FC85A90C95CA294B55A614C91C7FC604C5B4C5B4C5B4C5B047F13809226 +0FFFFEC8FC020FB512F817E094C9FC17F817FF91C7003F13E0040713F8040113FE707F71 +7F7113E085717FA2717F85A285831A80A31AC0EA03FCEA0FFF487F487F487FA2B57EA31A +80A34D14005C7E4A5E5F6C495E49C8485BD81FF85F000F5ED807FE92B55A6C6C6C491480 +6C01F0010791C7FC6C9026FF803F5B6D90B65A011F16F0010716C001014BC8FCD9001F14 +F0020149C9FC426079DD51>II<01C0EE01C0D801F8160F01FF167F02F0EC07FFDAFF8090B5FC92B712 +8019006060606060606095C7FC17FC5F17E0178004FCC8FC16E09026FC3FFCC9FC91CBFC +ADED3FFE0203B512F0020F14FE023F6E7E91B712E001FDD9E00F7F9027FFFE00037F02F8 +01007F02E06EB4FC02806E138091C8FC496F13C04917E07113F0EA00F090C914F8A219FC +83A219FEA419FFA3EA03F0EA0FFC487E487E487FA2B57EA319FEA35C4D13FC6C90C8FC5B +4917F8EA3FF001804B13F06D17E0001F5E6C6C17C06D4B1380D807FC92B512006C6C4A5B +6C6C6C01075B6C01E0011F5BD97FFE90B55A6DB712C0010F93C7FC6D15FC010115F0D900 +3F1480020301F0C8FC406078DD51>III<92383FFF800203B512FC021FECFF80027F +15E049B712F849D9F0077F010F90C76C7ED91FFCEC1FFFD93FF06E7F494802037F494882 +717F484980854890C9127FA24884183FA25A80A380806E157F6E5E14FE6E7E6F4A5A6C14 +F003FC495B03FF495B6C1580DCE0075B6CDBF80F90C7FC9338FE1FFE6C9238FF7FF84D5A +6D16C06D5E6D4BC8FC6D6F7E6D16E00101826D16FC023F814A8149B87E01078349839026 +3FFE3F8190267FFC0F819026FFF003814849C6FC48496D804849131F4890C70007801601 +48486E1580003F163F49150F007F7014C0491501717E8400FF835B8484A384A21A80A27F +007F1900607F003F606D160F001F606D4C5A6C6D153F6C6D4B5A6C01F04B5A6C01FC0203 +5B6C01FF021F5B6D9027F001FFFEC7FC6D90B65A010F16F001035E010093C8FC020F14F8 +DA007F90C9FC426079DD51>I66 D<4DB5ED03C0057F02F01407 +0407B600FE140F047FDBFFC0131F4BB800F0133F030F05FC137F033F9127F8007FFE13FF +92B6C73807FF814A02F0020113C3020702C09138007FE74A91C9001FB5FC023F01FC1607 +4A01F08291B54882490280824991CB7E49498449498449498449865D49498490B5FC484A +84A2484A84A24891CD127FA25A4A1A3F5AA348491A1FA44899C7FCA25CA3B5FCB07EA380 +A27EA2F50FC0A26C7FA37E6E1A1F6C1D80A26C801D3F6C6E1A00A26C6E616D1BFE6D7F6F +4E5A7F6D6D4E5A6D6D4E5A6D6D4E5A6D6E171F6D02E04D5A6E6DEFFF806E01FC4C90C7FC +020F01FFEE07FE6E02C0ED1FF8020102F8ED7FF06E02FF913803FFE0033F02F8013F1380 +030F91B648C8FC030117F86F6C16E004071680DC007F02F8C9FC050191CAFC626677E375 +>IIII73 D76 D<94381FFFE00407B67E043F15F04BB712FE030F +EEFFC0033FD9FC0014F092B500C0010F13FC020349C7000113FF4A01F86E6C7F021F496F +13E04A01C0030F7F4A496F7F91B5C96C7F0103497013FF494970804B834949717F498749 +49717F49874B8390B586484A717FA24891CB6C7FA2481D804A84481DC0A348497214E0A3 +481DF0A34A85481DF8A5B51CFCB06C1DF8A36E96B5FCA36C1DF0A46C6D4E14E0A36C1DC0 +6E606C1D80A26C6E4D1400A26C6E4D5BA26C6E4D5BA26D6D4D5B6D636D6D4D5B6F94B5FC +6D636D6D4C5C6D6D4C91C7FC6D6E4B5B6D02E0031F5B023F6D4B13F06E01FC92B55A6E01 +FF02035C020302C0010F91C8FC020002FC90B512FC033F90B712F0030F17C0030394C9FC +DB007F15F804071580DC001F01E0CAFC666677E379>79 DI83 D<001FBEFCA64849C79126E0000F +148002E0180091C8171F498601F81A0349864986A2491B7FA2491B3F007F1DC090C9181F +A4007E1C0FA600FE1DE0481C07A5CA95C7FCB3B3B3A3021FBAFCA663617AE070>II<913803FFFE027FEBFF +F00103B612FE010F6F7E4916E090273FFE001F7FD97FE001077FD9FFF801017F486D6D7F +717E486D6E7F85717FA2717FA36C496E7FA26C5B6D5AEB1FC090C9FCA74BB6FC157F0207 +B7FC147F49B61207010F14C0013FEBFE004913F048B512C04891C7FC485B4813F85A5C48 +5B5A5CA2B55AA45FA25F806C5E806C047D7F6EEB01F96C6DD903F1EBFF806C01FED90FE1 +14FF6C9027FFC07FC01580000191B5487E6C6C4B7E011F02FC130F010302F001011400D9 +001F90CBFC49437CC14E>97 D<903807FF80B6FCA6C6FC7F7FB3A8EFFFF8040FEBFF8004 +7F14F00381B612FC038715FF038F010014C0DBBFF0011F7FDBFFC001077F93C76C7F4B02 +007F03F8824B6F7E4B6F13804B17C0851BE0A27313F0A21BF8A37313FCA41BFEAE1BFCA4 +4F13F8A31BF0A24F13E0A24F13C06F17804F1300816F4B5A6F4A5B4AB402075B4A6C6C49 +5B9126F83FE0013F13C09127F00FFC03B55A4A6CB648C7FCDAC00115F84A6C15E091C700 +1F91C8FC90C8000313E04F657BE35A>I<92380FFFF04AB67E020F15F0023F15FC91B77E +01039039FE001FFF4901F8010113804901E0010713C04901804913E0017F90C7FC49484A +13F0A2485B485B5A5C5A7113E0485B7113C048701380943800FE0095C7FC485BA4B5FCAE +7EA280A27EA2806C18FCA26C6D150119F87E6C6D15036EED07F06C18E06C6D150F6D6DEC +1FC06D01E0EC7F806D6DECFF00010701FCEB03FE6D9039FFC03FFC010091B512F0023F5D +020F1580020102FCC7FCDA000F13C03E437BC148>II<92380FFFC04AB512FC020FECFF8002 +3F15E091B712F80103D9FE037F499039F0007FFF011F01C0011F7F49496D7F4990C76C7F +49486E7F48498048844A804884485B727E5A5C48717EA35A5C721380A2B5FCA391B9FCA4 +1A0002C0CBFCA67EA380A27EA27E6E160FF11F806C183F6C7FF17F006C7F6C6D16FE6C17 +016D6C4B5A6D6D4A5A6D01E04A5A6D6DEC3FE0010301FC49B45A6D9026FFC01F90C7FC6D +6C90B55A021F15F8020715E0020092C8FC030713F041437CC14A>III<903807FF80B6FCA6C6FC7F7FB3A8EF1FFF94B512F0040714FC041F14FF4C8193267F +E07F7F922781FE001F7FDB83F86D7FDB87F07FDB8FC0814C7F039FC78015BE03BC8003FC +825DA25DA25DA45DB3B2B7D8F007B71280A651647BE35A>II<903807FF80B6FCA6C6FC7F7FB3B3B3B3 +ADB712E0A623647BE32C>108 D<902607FF80D91FFFEEFFF8B691B500F00207EBFF8004 +0702FC023F14E0041F02FF91B612F84C6F488193267FE07F6D4801037F922781FE001F90 +27E00FF0007FC6DA83F86D9026F01FC06D7F6DD987F06D4A487F6DD98FC0DBF87EC7804C +6D027C80039FC76E488203BEEEFDF003BC6E4A8003FC04FF834B5FA24B5FA24B94C8FCA4 +4B5EB3B2B7D8F007B7D8803FB612FCA67E417BC087>I<902607FF80EB1FFFB691B512F0 +040714FC041F14FF4C8193267FE07F7F922781FE001F7FC6DA83F86D7F6DD987F07F6DD9 +8FC0814C7F039FC78015BE03BC8003FC825DA25DA25DA45DB3B2B7D8F007B71280A65141 +7BC05A>I<923807FFE092B6FC020715E0021F15F8027F15FE494848C66C6C7E010701F0 +010F13E04901C001037F49496D7F4990C87F49486F7E49486F7E48496F13804819C04A81 +4819E048496F13F0A24819F8A348496F13FCA34819FEA4B518FFAD6C19FEA46C6D4B13FC +A36C19F8A26C6D4B13F0A26C19E06C6D4B13C0A26C6D4B13806C6D4B13006D6C4B5A6D6D +495B6D6D495B010701F0010F13E06D01FE017F5B010090B7C7FC023F15FC020715E00200 +92C8FC030713E048437CC151>I<902607FF80EBFFF8B6010FEBFF80047F14F00381B612 +FC038715FF038F010114C09227BFF0003F7FC6DAFFC0010F7F6D91C76C7F6D496E7F03F8 +6E7F4B6E7F4B17804B6F13C0A27313E0A27313F0A21BF885A21BFCA3851BFEAE4F13FCA4 +1BF861A21BF0611BE0611BC06F92B512801B006F5C6F4A5B6F4A5B03FF4A5B70495B04E0 +017F13C09226CFFC03B55A03C7B648C7FC03C115F803C015E0041F91C8FC040313E093CB +FCB3A3B712F0A64F5D7BC05A>I114 +D<913A3FFF8007800107B5EAF81F011FECFE7F017F91B5FC48B8FC48EBE0014890C7121F +D80FFC1407D81FF0801600485A007F167F49153FA212FF171FA27F7F7F6D92C7FC13FF14 +E014FF6C14F8EDFFC06C15FC16FF6C16C06C16F06C826C826C826C82013F1680010F16C0 +1303D9007F15E0020315F0EC001F1500041F13F81607007C150100FC81177F6C163FA217 +1F7EA26D16F0A27F173F6D16E06D157F6D16C001FEEDFF806D0203130002C0EB0FFE02FC +EB7FFC01DFB65A010F5DD8FE0315C026F8007F49C7FC48010F13E035437BC140>II<902607FFC0ED3F +FEB60207B5FCA6C6EE00076D826D82B3B3A260A360A2607F60183E6D6D147E4E7F6D6D49 +48806D6DD907F0ECFF806D01FFEB3FE06D91B55A6E1500021F5C020314F8DA003F018002 +F0C7FC51427BC05A>III<007FB600C0017FB512F8A6 +D8001F01F8C70007EBF0006D040190C7FC6D6D5D6D6D4A5A6D6D4A5A70495A6D4C5A6E7F +6E6D495A6E6D495A7049C8FC6E4A5A6E6D485A6E6D485A6E13FFEF8FF06EEC9FE06FEBFF +C06F5C6F91C9FC5F6F5B816F7F6F7F8481707F8493B57E4B805D4B80DB0FF37FDB1FE17F +04C080153F4B486C7F4B486C7F4A486D7F4A486D7F4A5A4B6D7F020F6E7F4A486D7F4A48 +6D804A5A4AC86C7F49486F7F4A6F7F0107707FEB3FFFB600F049B7FCA650407EBF55>I< +B700C00103B512FCA6D8003F01C0C8381FFE006FED07F0A26D6D5E190F6D6D5E191F6D6D +5E193F6D95C7FC6F5D6D177E6F15FEA26D6E495AA26E6D5C18036E6D5C18076E5E70130F +6E5E70131FA26E6D495AA26E6D91C8FC606E6D137E18FE6E5D17816F5C17C3A26FEBE7F0 +A26FEBF7E017FF6F5CA26F5CA26F91C9FCA36F5BA26F5BA2705AA2705AA2705AA35FA25F +163F94CAFC5E167E16FED807E05CD81FF81301487E486C495AA2B5495AA24B5A5E151F4B +5A6C4849CBFC15FEEBFC01393FF807FC391FF03FF06CB55A6C5C6C91CCFCC613FCEB1FE0 +4E5D7DBF55>I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fj cmtt10 10.95 76 +/Fj 76 126 df<00101304007C131F00FEEB3F80A26C137FA248133FB2007E1400007C7F +003C131E00101304191C75B830>34 D37 D<141E147F14FF5BEB03FEEB07FCEB0FF0EB1FE0EB3FC0 +EB7F80EBFF00485A5B12035B485A120F5BA2485AA2123F5BA2127F90C7FCA412FEAD127F +A47F123FA27F121FA26C7EA27F12076C7E7F12017F6C7EEB7F80EB3FC0EB1FE0EB0FF0EB +07FCEB03FEEB01FF7F147F141E184771BE30>40 D<127812FE7E7F6C7E6C7EEA0FF06C7E +6C7E6C7E6C7EEB7F80133F14C0131FEB0FE014F01307A2EB03F8A214FC1301A214FE1300 +A4147FAD14FEA4130114FCA2130314F8A2EB07F0A2130F14E0EB1FC0133F1480137FEBFF +00485A485A485A485AEA3FE0485A485A90C7FC5A1278184778BE30>I<14E0497E497EA6 +0038EC0380007EEC0FC0D8FF83EB3FE001C3137F9038F3F9FF267FFBFB13C06CB6128000 +0FECFE00000314F86C5C6C6C13C0011F90C7FC017F13C048B512F04880000F14FE003FEC +FF80267FFBFB13C026FFF3F913E09038C3F87F0183133FD87E03EB0FC00038EC03800000 +91C7FCA66D5A6D5A23277AAE30>I<143EA2147FAF007FB7FCA2B81280A36C1600A2C76C +C8FCAF143EA229297DAF30>II<007FB612F0A2B712F8A36C15F0A225077B9E30>I<120FEA3FC0EA7FE0A2EAFFF0A4EA +7FE0A2EA3FC0EA0F000C0C6E8B30>I<16F01501ED03F8A21507A2ED0FF0A2ED1FE0A2ED +3FC0A2ED7F80A2EDFF00A24A5AA25D1403A24A5AA24A5AA24A5AA24A5AA24A5AA24AC7FC +A2495AA25C1303A2495AA2495AA2495AA2495AA2495AA249C8FCA2485AA25B1203A2485A +A2485AA2485AA2485AA2485AA248C9FCA25AA2127CA225477BBE30>I<14FE903807FFC0 +497F013F13F8497F90B57E48EB83FF4848C6138049137F4848EB3FC04848EB1FE049130F +001F15F0491307A24848EB03F8A290C712014815FCA400FEEC00FEAD6C14016C15FCA36D +1303003F15F8A26D1307001F15F0A26D130F6C6CEB1FE0A26C6CEB3FC06C6CEB7F806D13 +FF2601FF8313006CEBFFFE6D5B6D5B010F13E06D5BD900FEC7FC273A7CB830>IIIII<000FB612804815C05AA316800180C8FCAEEB +83FF019F13C090B512F015FC8181D9FE0313809039F0007FC049133F0180EB1FE06CC712 +0F000E15F0C81207A216F81503A31218127EA2B4FC150716F048140F6C15E06C141F6DEB +3FC06D137F3A3FE001FF80261FFC0F13006CB55A6C5C6C5C6C14E06C6C1380D90FFCC7FC +25397BB730>II<127CB712FC16FEA416FC48C7EA0FF816F0ED1FE0007CEC3FC0 +C8EA7F80EDFF00A24A5A4A5A5D14075D140F5D4A5AA24A5AA24AC7FCA25C5C13015CA213 +035CA213075CA4495AA6131F5CA96D5A6DC8FC273A7CB830>I<49B4FC011F13F0017F13 +FC90B57E0003ECFF804815C048010113E03A1FF8003FF049131FD83FC0EB07F8A24848EB +03FC90C71201A56D1303003F15F86D13076C6CEB0FF06C6CEB1FE0D807FCEB7FC03A03FF +83FF806C90B512006C6C13FC011F13F0497F90B512FE48802607FE0013C0D80FF8EB3FE0 +D81FE0EB0FF04848EB07F8491303007F15FC90C712014815FE481400A66C14016C15FC6D +1303003F15F86D1307D81FF0EB1FF06D133F3A0FFF01FFE06C90B512C06C1580C6ECFE00 +6D5B011F13F0010190C7FC273A7CB830>I<49B4FC010F13E0013F13F890B57E48804880 +48010113803A0FFC007FC0D81FF0EB3FE04848131F49EB0FF048481307A290C7EA03F85A +4815FC1501A416FEA37E7E6D1303A26C6C13076C6C130F6D133FD80FFC13FF6CB6FC7E6C +14FE6C14F9013FEBE1FC010F138190380060011400ED03F8A2150716F0150F000F15E048 +6C131F486CEB3FC0157FEDFF804A1300EC07FE391FF01FFC90B55A6C5C6C5C6C1480C649 +C7FCEB3FF0273A7CB830>I<120FEA3FC0EA7FE0A2EAFFF0A4EA7FE0A2EA3FC0EA0F00C7 +FCAF120FEA3FC0EA7FE0A2EAFFF0A4EA7FE0A2EA3FC0EA0F000C276EA630>II<16F01503ED07F8151F157FEDFFF014034A13C0021F138091383F +FE00ECFFF8495B010713C0495BD93FFEC7FC495A3801FFF0485B000F13804890C8FCEA7F +FC5BEAFFE05B7FEA7FF87FEA1FFF6C7F000313E06C7F38007FFC6D7E90380FFF806D7F01 +0113F06D7FEC3FFE91381FFF80020713C06E13F01400ED7FF8151F1507ED03F01500252F +7BB230>I<1278127EB4FC13C07FEA7FF813FEEA1FFF6C13C000037F6C13F86C6C7EEB1F +FF6D7F010313E06D7F9038007FFC6E7E91380FFF806E13C0020113F080ED3FF8151F153F +EDFFF05C020713C04A138091383FFE004A5A903801FFF0495B010F13804990C7FCEB7FFC +48485A4813E0000F5B4890C8FCEA7FFE13F8EAFFE05B90C9FC127E1278252F7BB230>62 +D64 +D<147F4A7EA2497FA4497F14F7A401077F14E3A3010F7FA314C1A2011F7FA490383F80FE +A590387F007FA4498049133F90B6FCA34881A39038FC001F00038149130FA40007814913 +07A2D87FFFEB7FFFB56CB51280A46C496C130029397DB830>I<007FB512F0B612FE6F7E +82826C813A03F8001FF815076F7E1501A26F7EA615015EA24B5A1507ED1FF0ED7FE090B6 +5A5E4BC7FC6F7E16E0829039F8000FF8ED03FC6F7E1500167FA3EE3F80A6167F1700A25E +4B5A1503ED1FFC007FB6FCB75A5E16C05E6C02FCC7FC29387EB730>I<91387F803C9039 +03FFF03E49EBFC7E011F13FE49EBFFFE5B9038FFE07F48EB801F3903FE000F484813075B +48481303A2484813015B123F491300A2127F90C8FC167C16005A5AAC7E7EA2167C6D14FE +123FA27F121F6D13016C6C14FCA26C6CEB03F86D13076C6CEB0FF03901FF801F6C9038E0 +7FE06DB512C06D14806D1400010713FC6D13F09038007FC0273A7CB830>I<003FB512E0 +4814FCB67E6F7E6C816C813A03F8007FF0ED1FF8150F6F7E6F7E15016F7EA2EE7F80A216 +3F17C0161FA4EE0FE0AC161F17C0A3163F1780A2167F17005E4B5A15034B5A150F4B5AED +7FF0003FB65A485DB75A93C7FC6C14FC6C14E02B387FB730>I<007FB7FCB81280A47ED8 +03F8C7123FA8EE1F0093C7FCA4157C15FEA490B5FCA6EBF800A4157C92C8FCA5EE07C0EE +0FE0A9007FB7FCB8FCA46C16C02B387EB730>I<003FB712804816C0B8FCA27E7ED801FC +C7121FA8EE0F8093C7FCA5153E157FA490B6FCA69038FC007FA4153E92C8FCAE383FFFF8 +487FB5FCA27E6C5B2A387EB730>I<02FF13F00103EBC0F8010F13F1013F13FD4913FF90 +B6FC4813C1EC007F4848133F4848131F49130F485A491307121F5B123F491303A2127F90 +C7FC6F5A92C8FC5A5AA892B5FC4A14805CA26C7F6C6D1400ED03F8A27F003F1407A27F12 +1F6D130F120F7F6C6C131FA2D803FE133F6C6C137FECC1FF6C90B5FC7F6D13FB010F13F3 +0103EBC1F0010090C8FC293A7DB830>I<3B3FFF800FFFE0486D4813F0B56C4813F8A26C +496C13F06C496C13E0D803F8C7EAFE00B290B6FCA601F8C7FCB3A23B3FFF800FFFE0486D +4813F0B56C4813F8A26C496C13F06C496C13E02D387FB730>I<007FB6FCB71280A46C15 +00260007F0C7FCB3B3A8007FB6FCB71280A46C1500213879B730>I75 +D<383FFFF8487FB57EA26C5B6C5BD801FCC9FCB3B0EE0F80EE1FC0A9003FB7FC5AB8FCA2 +7E6C16802A387EB730>III<90383FFFE048B512FC000714FF4815804815C04815E0EB +F80001E0133FD87F80EB0FF0A290C71207A44815F8481403B3A96C1407A26C15F0A36D13 +0FA26D131F6C6CEB3FE001F813FF90B6FC6C15C06C15806C1500000114FCD8003F13E025 +3A7BB830>I<007FB512F0B612FE6F7E16E0826C813903F8003FED0FFCED03FE15016F7E +A2821780163FA6167F17005EA24B5A1503ED0FFCED3FF890B6FC5E5E16804BC7FC15F001 +F8C9FCB0387FFFC0B57EA46C5B29387EB730>I<003FB57E4814F0B612FC15FF6C816C81 +2603F8017F9138003FF0151F6F7E15071503821501A515035E1507150F4B5A153F4AB45A +90B65A5E93C7FC5D8182D9F8007FED3FE0151F150F821507A817F8EEF1FCA53A3FFF8003 +FB4801C0EBFFF8B56C7E17F06C496C13E06C49EB7FC0C9EA1F002E397FB730>82 +D<90390FF803C0D97FFF13E048B512C74814F74814FF5A381FF80F383FE001497E484813 +7F90C7123F5A48141FA2150FA37EED07C06C91C7FC7F7FEA3FF0EA1FFEEBFFF06C13FF6C +14E0000114F86C80011F13FF01031480D9003F13C014019138007FE0151FED0FF0A2ED07 +F8A2007C140312FEA56C140716F07F6DEB0FE06D131F01F8EB3FC001FF13FF91B5128016 +0000FD5CD8FC7F13F8D8F81F5BD878011380253A7BB830>I<003FB712C04816E0B8FCA4 +3AFE003F800FA8007CED07C0C791C7FCB3B1011FB5FC4980A46D91C7FC2B387EB730>I< +3B7FFFC007FFFCB56C4813FEA46C496C13FCD803F8C7EA3F80B3B16D147F00011600A36C +6C14FE6D13016D5CEC800390393FE00FF890391FF83FF06DB55A6D5C6D5C6D91C7FC9038 +007FFCEC1FF02F3980B730>III<3A3FFF01FFF84801837F02C77FA202835B6C01015B3A01FC007F806D91C7FC00 +005C6D5BEB7F01EC81FCEB3F8314C3011F5B14E7010F5B14FF6D5BA26D5BA26D5BA26D90 +C8FCA4497FA2497FA2815B81EB0FE781EB1FC381EB3F8181EB7F0081497F49800001143F +49800003141F49800007140FD87FFEEB7FFFB590B5128080A25C6C486D130029387DB730 +>II<007FB612F0A2B712F8A36C15F0A225077B7D30>95 D97 DII<913801FFE04A +7F5CA28080EC0007AAEB03FE90381FFF874913E790B6FC5A5A481303380FFC00D81FF013 +3F49131F485A150F4848130790C7FCA25AA25AA87E6C140FA27F003F141F6D133F6C7E6D +137F390FF801FF2607FE07EBFFC06CB712E06C16F06C14F76D01C713E0011F010313C0D9 +07FCC8FC2C397DB730>I<49B4FC010713E0011F13F8017F7F90B57E488048018113803A +07FC007FC04848133FD81FE0EB1FE0150F484814F0491307127F90C7FCED03F85A5AB7FC +A516F048C9FC7E7EA27F003FEC01F06DEB03F86C7E6C7E6D1307D807FEEB1FF03A03FFC0 +7FE06C90B5FC6C15C0013F14806DEBFE00010713F8010013C0252A7CA830>IIII<14E0EB03F8A2497EA36D5AA2EB00E091C8FCA9381FFFF8487F5AA27E7EEA0001B3A9 +003FB612C04815E0B7FCA27E6C15C023397AB830>I107 +D<387FFFF8B57EA47EEA0001B3B3A8007FB612F0B712F8A46C15F025387BB730>I<02FC +137E3B7FC3FF01FF80D8FFEF01877F90B500CF7F15DF92B57E6C010F13872607FE07EB03 +F801FC13FE9039F803FC01A201F013F8A301E013F0B3A23C7FFE0FFF07FF80B548018F13 +C0A46C486C01071380322881A730>II<49B4FC010F +13E0013F13F8497F90B57E0003ECFF8014013A07FC007FC04848EB3FE0D81FE0EB0FF0A2 +4848EB07F8491303007F15FC90C71201A300FEEC00FEA86C14016C15FCA26D1303003F15 +F86D13076D130F6C6CEB1FF06C6CEB3FE06D137F3A07FF01FFC06C90B512806C15006C6C +13FC6D5B010F13E0010190C7FC272A7CA830>II<49B413F8010FEBC1FC013F13F14913FD48B6FC5A481381390FFC00 +7F49131F4848130F491307485A491303127F90C7FC15015A5AA77E7E15037FA26C6C1307 +150F6C6C131F6C6C133F01FC137F3907FF01FF6C90B5FC6C14FD6C14F9013F13F1010F13 +C1903803FE0190C7FCAD92B512F84A14FCA46E14F82E3C7DA730>II<9038 +1FFC1E48B5129F000714FF5A5A5A387FF007EB800100FEC7FC4880A46C143E007F91C7FC +13E06CB4FC6C13FC6CEBFF806C14E0000114F86C6C7F01037F9038000FFF02001380007C +147F00FEEC1FC0A2150F7EA27F151F6DEB3F806D137F9039FC03FF0090B6FC5D5D00FC14 +F0D8F83F13C026780FFEC7FC222A79A830>III<3B3FFFC07FFF80 +486DB512C0B515E0A26C16C06C496C13803B01F80003F000A26D130700005DA26D130F01 +7E5CA2017F131F6D5CA2EC803F011F91C7FCA26E5A010F137EA2ECE0FE01075BA214F101 +035BA3903801FBF0A314FF6D5BA36E5A6E5A2B277EA630>I<3B3FFFC01FFFE0486D4813 +F0B515F8A26C16F06C496C13E0D807E0C7EA3F00A26D5C0003157EA56D14FE00015DEC0F +80EC1FC0EC3FE0A33A00FC7FF1F8A2147DA2ECFDF9017C5C14F8A3017E13FBA290393FF0 +7FE0A3ECE03FA2011F5C90390F800F802D277FA630>I<3A3FFF81FFFC4801C37FB580A2 +6C5D6C01815BC648C66CC7FC137FEC80FE90383F81FC90381FC3F8EB0FE3ECE7F06DB45A +6D5B7F6D5B92C8FC147E147F5C497F81903803F7E0EB07E790380FE3F0ECC1F890381F81 +FC90383F80FE90387F007E017E137F01FE6D7E48486D7E267FFF80B5FCB500C1148014E3 +A214C16C0180140029277DA630>I<3B3FFFC07FFF80486DB512C0B515E0A26C16C06C49 +6C13803B01FC0003F000A2000014076D5C137E150F017F5C7F151FD91F805BA214C0010F +49C7FCA214E00107137EA2EB03F0157C15FCEB01F85DA2EB00F9ECFDF0147D147FA26E5A +A36E5AA35DA2143F92C8FCA25C147EA2000F13FE486C5AEA3FC1EBC3F81387EB8FF0EBFF +E06C5B5C6C90C9FC6C5AEA01F02B3C7EA630>I<001FB612FC4815FE5AA316FC90C7EA0F +F8ED1FF0ED3FE0ED7FC0EDFF80003E491300C7485A4A5A4A5A4A5A4A5A4A5A4A5A4990C7 +FC495A495A495A495A495A495A4948133E4890C7127F485A485A485A485A485A48B7FCB8 +FCA46C15FE28277DA630>II125 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fk cmbx12 14.4 49 +/Fk 49 122 df<151E153E157E15FCEC01F8EC07F0EC0FE0EC1FC01580143FEC7F0014FE +1301495A5C1307495AA2495A133F5C137FA2495AA24890C7FCA25A5BA21207A2485AA312 +1F5BA3123FA25BA3127FA55B12FFB3A3127F7FA5123FA37FA2121FA37F120FA36C7EA212 +03A27F7EA26C7FA26D7EA2133F80131F6D7EA26D7E1303806D7E1300147FEC3F80141F15 +C0EC0FE0EC07F0EC01F8EC00FC157E153E151E1F7973D934>40 D<127012F8127C127E7E +EA1FC06C7E6C7E12037F6C7E6C7E7F6D7E133F806D7EA26D7E80130780A26D7EA26D7EA2 +15807FA215C0A2EC7FE0A315F0143FA315F8A2141FA315FCA5140F15FEB3A315FC141FA5 +15F8A3143FA215F0A3147F15E0A3ECFFC0A21580A25B1500A2495AA2495AA25C130F5C49 +5AA2495A5C137F49C7FC5B485A485A5B1207485A485A48C8FC127E127C5A12701F7979D9 +34>I46 +D<913803FFC0023F13FC91B6FC010315C0010F018113F0903A1FFC003FF849486D7E4948 +6D7E49486D7E48496D138048496D13C0A24817E04890C813F0A34817F8A24817FC49157F +A3007F17FEA600FF17FFB3A5007F17FEA6003F17FCA26D15FFA26C17F8A36C17F0A26C6D +4913E0A26C6D4913C06C17806E5B6C6D4913006D6C495AD91FFCEB3FF8903A0FFF81FFF0 +6D90B55A01011580D9003F01FCC7FC020313C0384F7BCD43>48 D<157815FC1403140714 +1F14FF130F0007B5FCB6FCA2147F13F0EAF800C7FCB3B3B3A6007FB712FEA52F4E76CD43 +>II<91380FFFC091B512FC0107ECFF80011F15E090 +263FF8077F9026FF800113FC4848C76C7ED803F86E7E491680D807FC8048B416C080486D +15E0A4805CA36C17C06C5B6C90C75AD801FC1680C9FC4C13005FA24C5A4B5B4B5B4B13C0 +4B5BDBFFFEC7FC91B512F816E016FCEEFF80DA000713E0030113F89238007FFE707E7013 +807013C018E07013F0A218F8A27013FCA218FEA2EA03E0EA0FF8487E487E487EB57EA318 +FCA25E18F891C7FC6C17F0495C6C4816E001F04A13C06C484A1380D80FF84A13006CB44A +5A6CD9F0075BC690B612F06D5D011F1580010302FCC7FCD9001F1380374F7ACD43>I<17 +7C17FEA2160116031607160FA2161F163F167FA216FF5D5DA25D5DED1FBFED3F3F153E15 +7C15FCEC01F815F0EC03E01407EC0FC01580EC1F005C147E147C5C1301495A495A5C495A +131F49C7FC133E5B13FC485A5B485A1207485A485A90C8FC123E127E5ABA12C0A5C96C48 +C7FCAF020FB712C0A53A4F7CCE43>III<121F7F7F +EBFF8091B81280A45A1900606060A2606060485F0180C86CC7FC007EC95A4C5A007C4B5A +5F4C5A160F4C5A484B5A4C5A94C8FC16FEC812014B5A5E4B5A150F4B5AA24B5AA24B5A15 +FFA24A90C9FCA25C5D1407A2140FA25D141FA2143FA4147F5DA314FFA55BAC6D5BA2EC3F +C06E5A395279D043>I<913807FFC0027F13FC0103B67E010F15E090261FFC0113F8903A +3FE0003FFCD97F80EB0FFE49C76C7E48488048486E1380000717C04980120F18E0177FA2 +121F7FA27F7F6E14FF02E015C014F802FE4913806C7FDBC00313009238F007FE6C02F85B +9238FE1FF86C9138FFBFF06CEDFFE017806C4BC7FC6D806D81010F15E06D81010115FC01 +0781011F81491680EBFFE748018115C048D9007F14E04848011F14F048487F4848130303 +0014F8484880161F4848020713FC1601824848157F173FA2171FA2170FA218F8A27F007F +17F06D151FA26C6CED3FE0001F17C06D157F6C6CEDFF806C6C6C010313006C01E0EB0FFE +6C01FCEBFFFC6C6CB612F06D5D010F1580010102FCC7FCD9000F13C0364F7ACD43>I<91 +380FFF8091B512F8010314FE010F6E7E4901037F90267FF8007F4948EB3FF048496D7E48 +4980486F7E484980824817805A91C714C05A7013E0A218F0B5FCA318F8A618FCA46C5DA3 +7EA25E6C7F6C5DA26C5D6C7F6C6D137B6C6D13F390387FF803011FB512E36D14C3010302 +8313F89039007FFE03EC00401500A218F05EA3D801F816E0487E486C16C0487E486D4913 +80A218005E5F4C5A91C7FC6C484A5A494A5A49495B6C48495BD803FC010F5B9027FF807F +FEC7FC6C90B55A6C6C14F06D14C0010F49C8FC010013F0364F7ACD43>I<171F4D7E4D7E +A24D7EA34C7FA24C7FA34C7FA34C7FA24C7FA34C8083047F80167E8304FE804C7E030181 +16F8830303814C7E03078116E083030F814C7E031F81168083033F8293C77E4B82157E84 +03FE824B800201835D840203834B800207835D844AB87EA24A83A3DA3F80C88092C97E4A +84A2027E8202FE844A82010185A24A820103854A82010785A24A82010F855C011F717FEB +FFFCB600F8020FB712E0A55B547BD366>65 DI<932601FFFCEC01C0047FD9FFC013030307B600F81307033F03FE131F +92B8EA803F0203DAE003EBC07F020F01FCC7383FF0FF023F01E0EC0FF94A01800203B5FC +494848C9FC4901F8824949824949824949824949824990CA7E494883A2484983485B1B7F +485B481A3FA24849181FA3485B1B0FA25AA298C7FC5CA2B5FCAE7EA280A2F307C07EA36C +7FA21B0F6C6D1980A26C1A1F6C7F1C006C6D606C6D187EA26D6C606D6D4C5A6D6D16036D +6D4C5A6D6D4C5A6D01FC4C5A6D6DEE7F806D6C6C6C4BC7FC6E01E0EC07FE020F01FEEC1F +F80203903AFFE001FFF0020091B612C0033F93C8FC030715FCDB007F14E0040101FCC9FC +525479D261>I +III73 D76 +D<93380FFFC00303B6FC031F15E092B712FC0203D9FC0013FF020F01C0010F13C0023F90 +C7000313F0DA7FFC02007F494848ED7FFE4901E0ED1FFF49496F7F49496F7F4990C96C7F +49854948707F4948707FA24849717E48864A83481B804A83481BC0A2481BE04A83A2481B +F0A348497113F8A5B51AFCAF6C1BF86E5FA46C1BF0A26E5F6C1BE0A36C6D4D13C0A26C6D +4D1380A26C1B006C6D4D5A6E5E6C626D6C4C5B6D6D4B5B6D6D4B5B6D6D4B5B6D6D4B5B6D +6D4B90C7FC6D6D4B5A6D01FF02035B023F01E0011F13F0020F01FC90B512C0020390B7C8 +FC020016FC031F15E0030392C9FCDB001F13E0565479D265>79 DI82 D<91260FFF80130791B500F85B010702FF5B011FEDC0 +3F49EDF07F9026FFFC006D5A4801E0EB0FFD4801800101B5FC4848C87E48488149150F00 +1F824981123F4981007F82A28412FF84A27FA26D82A27F7F6D93C7FC14C06C13F014FF15 +F86CECFF8016FC6CEDFFC017F06C16FC6C16FF6C17C06C836C836D826D82010F82130301 +0082021F16801400030F15C0ED007F040714E01600173F050F13F08383A200788200F882 +A3187FA27EA219E07EA26CEFFFC0A27F6D4B13806D17006D5D01FC4B5A01FF4B5A02C04A +5A02F8EC7FF0903B1FFFC003FFE0486C90B65AD8FC0393C7FC48C66C14FC48010F14F048 +D9007F90C8FC3C5479D24B>I<003FBC1280A59126C0003F9038C0007F49C71607D87FF8 +060113C001E08449197F49193F90C8171FA2007E1A0FA3007C1A07A500FC1BE0481A03A6 +C994C7FCB3B3AC91B912F0A553517BD05E>II97 DI<913801FFF8021FEB +FF8091B612F0010315FC010F9038C00FFE903A1FFE0001FFD97FFC491380D9FFF05B4817 +C048495B5C5A485BA2486F138091C7FC486F1300705A4892C8FC5BA312FFAD127F7FA27E +A2EF03E06C7F17076C6D15C07E6E140F6CEE1F806C6DEC3F006C6D147ED97FFE5C6D6CEB +03F8010F9038E01FF0010390B55A01001580023F49C7FC020113E033387CB63C>I<4DB4 +7E0407B5FCA5EE001F1707B3A4913801FFE0021F13FC91B6FC010315C7010F9038E03FE7 +4990380007F7D97FFC0101B5FC49487F4849143F484980485B83485B5A91C8FC5AA3485A +A412FFAC127FA36C7EA37EA26C7F5F6C6D5C7E6C6D5C6C6D49B5FC6D6C4914E0D93FFED9 +0FEFEBFF80903A0FFFC07FCF6D90B5128F0101ECFE0FD9003F13F8020301C049C7FC4154 +7CD24B>I<913803FFC0023F13FC49B6FC010715C04901817F903A3FFC007FF849486D7E +49486D7E4849130F48496D7E48178048497F18C0488191C7FC4817E0A248815B18F0A212 +FFA490B8FCA318E049CAFCA6127FA27F7EA218E06CEE01F06E14037E6C6DEC07E0A26C6D +EC0FC06C6D141F6C6DEC3F806D6CECFF00D91FFEEB03FE903A0FFFC03FF8010390B55A01 +0015C0021F49C7FC020113F034387CB63D>IIII<137F497E000313E0487FA2487FA76C5BA2 +6C5BC613806DC7FC90C8FCADEB3FF0B5FCA512017EB3B3A6B612E0A51B547BD325>I108 DII<913801FFE0021F13FE91B612C0010315F0010F9038807F +FC903A1FFC000FFED97FF86D6C7E49486D7F48496D7F48496D7F4A147F48834890C86C7E +A24883A248486F7EA3007F1880A400FF18C0AC007F1880A3003F18006D5DA26C5FA26C5F +6E147F6C5F6C6D4A5A6C6D495B6C6D495B6D6C495BD93FFE011F90C7FC903A0FFF807FFC +6D90B55A010015C0023F91C8FC020113E03A387CB643>I<903A3FF001FFE0B5010F13FE +033FEBFFC092B612F002F301017F913AF7F8007FFE0003D9FFE0EB1FFFC602806D7F92C7 +6C7F4A824A6E7F4A6E7FA2717FA285187F85A4721380AC1A0060A36118FFA2615F616E4A +5BA26E4A5B6E4A5B6F495B6F4990C7FC03F0EBFFFC9126FBFE075B02F8B612E06F148003 +1F01FCC8FC030313C092CBFCB1B612F8A5414D7BB54B>I<90397FE003FEB590380FFF80 +033F13E04B13F09238FE1FF89139E1F83FFC0003D9E3E013FEC6ECC07FECE78014EF1500 +14EE02FEEB3FFC5CEE1FF8EE0FF04A90C7FCA55CB3AAB612FCA52F367CB537>114 +D<903903FFF00F013FEBFE1F90B7FC120348EB003FD80FF81307D81FE0130148487F4980 +127F90C87EA24881A27FA27F01F091C7FC13FCEBFFC06C13FF15F86C14FF16C06C15F06C +816C816C81C681013F1580010F15C01300020714E0EC003F030713F015010078EC007F00 +F8153F161F7E160FA27E17E07E6D141F17C07F6DEC3F8001F8EC7F0001FEEB01FE9039FF +C00FFC6DB55AD8FC1F14E0D8F807148048C601F8C7FC2C387CB635>I<143EA6147EA414 +FEA21301A313031307A2130F131F133F13FF5A000F90B6FCB8FCA426003FFEC8FCB3A9EE +07C0AB011FEC0F8080A26DEC1F0015806DEBC03E6DEBF0FC6DEBFFF86D6C5B021F5B0203 +13802A4D7ECB34>IIII<007FB500 +F090387FFFFEA5C66C48C7000F90C7FC6D6CEC07F86D6D5C6D6D495A6D4B5A6F495A6D6D +91C8FC6D6D137E6D6D5B91387FFE014C5A6E6C485A6EEB8FE06EEBCFC06EEBFF806E91C9 +FCA26E5B6E5B6F7E6F7EA26F7F834B7F4B7F92B5FCDA01FD7F03F87F4A486C7E4A486C7E +020F7FDA1FC0804A486C7F4A486C7F02FE6D7F4A6D7F495A49486D7F01076F7E49486E7E +49486E7FEBFFF0B500FE49B612C0A542357EB447>II +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fl cmr10 10.95 83 +/Fl 83 124 df<4AB4EB0FE0021F9038E03FFC913A7F00F8FC1ED901FC90383FF03FD907 +F090397FE07F80494801FF13FF4948485BD93F805C137F0200ED7F00EF003E01FE6D91C7 +FC82ADB97EA3C648C76CC8FCB3AE486C4A7E007FD9FC3FEBFF80A339407FBF35>11 +DII<001E130F397F803FC000FF137F01C013E0A201E013F0A3007F13 +3F391E600F3000001300A401E01370491360A3000114E04913C000031301010013804813 +03000EEB070048130E0018130C0038131C003013181C1C7DBE2D>34 +D<14E0A4EB07FC90383FFF8090B512E03901F8E3F03903E0E0FCD807C0133CD80F807FD8 +1F007F003E80003C1580007C140316C00078141F00F8143F157FA47EED3F806CEC0E0092 +C7FC127F138013C0EA3FF013FEEA1FFF6C13FC6C13FF6C14C06C806C6C13F8011F7F1303 +01007FECE7FF14E102E01380157F153FED1FC0A2003E140F127FD8FF801307A5130000FC +158000F0140F1270007815005D6C141E153E6C5C6C5C3907C0E1F03903F8EFE0C6B51280 +D93FFEC7FCEB0FF8EB00E0A422497BC32D>36 D<013F1603D9FFC04B7E2601E0E0150F26 +07C070151F48486C4BC7FC023E157E48486C15FE48D90FC0EB03FC003ED90EF0EB0FF8DA +0F3F13FD007E903A070FFFF1F0007C0200EB03E0160000FC6D6C495A170F604DC8FC5F17 +3E5F17FC5F4C5A1603007CD907005B4C5A007E150F003E495C020E49C9FC003F5D6C4913 +3E260F803C5B023813FC6C6C485B3A01E0E001F03800FFC090273F0003E0133F90C70007 +ECFFC09339C001E0E0923A0F8007C070031F49487E0400143C033E90381F001C037E497F +037C133E4B150F0201027E7F4B137C4A5A020702FCEB03805D4A5A141F92C7FC143E147E +147C5CA2495A0103037CEB07005C4948147E010F033E5B4A160E49C8123F496F5B013E92 +380F803C49173801FC6F6C5A49923801E0E0496FB45A0160043FC7FC41497BC34C>II<121EEA7F8012FF13C0A213E0A3127FEA1E601200A413E013C0A3 +12011380120313005A120E5A1218123812300B1C79BE19>I<1430147014E0EB01C0EB03 +801307EB0F00131E133E133C5B13F85B12015B1203A2485AA2120F5BA2121F90C7FCA25A +A3123E127EA6127C12FCB2127C127EA6123E123FA37EA27F120FA27F1207A26C7EA21201 +7F12007F13787F133E131E7FEB07801303EB01C0EB00E014701430145A77C323>I<12C0 +7E12707E7E121E7E6C7E7F12036C7E7F12007F1378137CA27FA2133F7FA21480130FA214 +C0A3130714E0A6130314F0B214E01307A614C0130FA31480A2131F1400A25B133EA25BA2 +137813F85B12015B485A12075B48C7FC121E121C5A5A5A5A145A7BC323>II<121EEA7F80 +12FF13C0A213E0A3127FEA1E601200A413E013C0A312011380120313005A120E5A121812 +3812300B1C798919>44 DI<121EEA7F80A2EAFFC0A4EA7F80A2 +EA1E000A0A798919>IIIIII<150E151E153EA2157EA215FE +1401A21403EC077E1406140E141CA214381470A214E0EB01C0A2EB0380EB0700A2130E5B +A25B5BA25B5B1201485A90C7FC5A120E120C121C5AA25A5AB8FCA3C8EAFE00AC4A7E49B6 +FCA3283E7EBD2D>I<00061403D80780131F01F813FE90B5FC5D5D5D15C092C7FC14FCEB +3FE090C9FCACEB01FE90380FFF8090383E03E090387001F8496C7E49137E497F90C71380 +0006141FC813C0A216E0150FA316F0A3120C127F7F12FFA416E090C7121F12FC007015C0 +12780038EC3F80123C6CEC7F00001F14FE6C6C485A6C6C485A3903F80FE0C6B55A013F90 +C7FCEB07F8243F7CBC2D>II<1238 +123C123F90B612FCA316F85A16F016E00078C712010070EC03C0ED078016005D48141E15 +1C153C5DC8127015F04A5A5D14034A5A92C7FC5C141EA25CA2147C147814F8A213015C13 +03A31307A3130F5CA2131FA6133FAA6D5A0107C8FC26407BBD2D>III<121EEA7F80A2EAFFC0A4EA7F80A2EA1E00C7FCB3121EEA7F80A2EAFFC0A4EA +7F80A2EA1E000A2779A619>I<121EEA7F80A2EAFFC0A4EA7F80A2EA1E00C7FCB3121E12 +7FEAFF80A213C0A4127F121E1200A412011380A3120313005A1206120E120C121C5A1230 +A20A3979A619>I63 D<15074B7EA34B7EA34B7EA34B7EA34B7E15E7A2913801C7FC +15C3A291380381FEA34AC67EA3020E6D7EA34A6D7EA34A6D7EA34A6D7EA34A6D7EA34948 +6D7E91B6FCA249819138800001A249C87EA24982010E157FA2011E82011C153FA2013C82 +0138151FA2017882170F13FC00034C7ED80FFF4B7EB500F0010FB512F8A33D417DC044> +65 DIIIII +III<011FB512FCA3D9000713006E5A1401B3B3A6123F +EA7F80EAFFC0A44A5A1380D87F005B007C130700385C003C495A6C495A6C495A2603E07E +C7FC3800FFF8EB3FC026407CBD2F>IIIIIII82 DI<003FB91280A3903AF0007FE001018090393FC0003F48C7ED1FC0007E17 +07127C00781703A300701701A548EF00E0A5C81600B3B14B7E4B7E0107B612FEA33B3D7D +BC42>IIII89 +D<003FB712F8A391C7EA1FF013F801E0EC3FE00180EC7FC090C8FC003EEDFF80A2003C4A +1300007C4A5A12784B5A4B5AA200704A5AA24B5A4B5AA2C8485A4A90C7FCA24A5A4A5AA2 +4A5AA24A5A4A5AA24A5A4A5AA24990C8FCA2495A4948141CA2495A495AA2495A495A173C +495AA24890C8FC485A1778485A484815F8A24848140116034848140F4848143FED01FFB8 +FCA32E3E7BBD38>II<486C13C000 +03130101001380481303000EEB070048130E0018130C0038131C00301318007013380060 +1330A300E01370481360A400CFEB678039FFC07FE001E013F0A3007F133FA2003F131F01 +C013E0390F0007801C1C73BE2D>I +I96 D +II<49B4FC010F13E090383F00F8017C131E4848131F +4848137F0007ECFF80485A5B121FA24848EB7F00151C007F91C7FCA290C9FC5AAB6C7EA3 +003FEC01C07F001F140316806C6C13076C6C14000003140E6C6C131E6C6C137890383F01 +F090380FFFC0D901FEC7FC222A7DA828>II +II<167C903903F801 +FF903A1FFF078F8090397E0FDE1F9038F803F83803F001A23B07E000FC0600000F6EC7FC +49137E001F147FA8000F147E6D13FE00075C6C6C485AA23901F803E03903FE0FC026071F +FFC8FCEB03F80006CAFC120EA3120FA27F7F6CB512E015FE6C6E7E6C15E06C810003813A +0FC0001FFC48C7EA01FE003E140048157E825A82A46C5D007C153E007E157E6C5D6C6C49 +5A6C6C495AD803F0EB0FC0D800FE017FC7FC90383FFFFC010313C0293D7EA82D>III<1478EB01FEA2EB03FFA4EB01FEA2EB00781400AC147FEB7FFFA313 +017F147FB3B3A5123E127F38FF807E14FEA214FCEB81F8EA7F01387C03F0381E07C0380F +FF803801FC00185185BD1C>II +I<2701F801FE14FF00FF902707FFC00313E0913B1E07E00F03F0913B7803F03C01F80007 +903BE001F87000FC2603F9C06D487F000101805C01FBD900FF147F91C75B13FF4992C7FC +A2495CB3A6486C496CECFF80B5D8F87FD9FC3F13FEA347287DA74C>I<3901F801FE00FF +903807FFC091381E07E091387803F000079038E001F82603F9C07F0001138001FB6D7E91 +C7FC13FF5BA25BB3A6486C497EB5D8F87F13FCA32E287DA733>I<14FF010713E090381F +81F890387E007E01F8131F4848EB0F804848EB07C04848EB03E0000F15F04848EB01F8A2 +003F15FCA248C812FEA44815FFA96C15FEA36C6CEB01FCA3001F15F86C6CEB03F0A26C6C +EB07E06C6CEB0FC06C6CEB1F80D8007EEB7E0090383F81FC90380FFFF0010090C7FC282A +7EA82D>I<3901FC03FC00FF90381FFF8091387C0FE09039FDE003F03A07FFC001FC6C49 +6C7E6C90C7127F49EC3F805BEE1FC017E0A2EE0FF0A3EE07F8AAEE0FF0A4EE1FE0A2EE3F +C06D1580EE7F007F6E13FE9138C001F89039FDE007F09039FC780FC0DA3FFFC7FCEC07F8 +91C9FCAD487EB512F8A32D3A7EA733>I<02FF131C0107EBC03C90381F80F090397F0038 +7C01FC131CD803F8130E4848EB0FFC150748481303121F485A1501485AA448C7FCAA6C7E +A36C7EA2001F14036C7E15076C6C130F6C7E6C6C133DD8007E137990383F81F190380FFF +C1903801FE0190C7FCAD4B7E92B512F8A32D3A7DA730>I<3901F807E000FFEB1FF8EC78 +7CECE1FE3807F9C100031381EA01FB1401EC00FC01FF1330491300A35BB3A5487EB512FE +A31F287EA724>I<90383FC0603901FFF8E03807C03F381F000F003E1307003C1303127C +0078130112F81400A27E7E7E6D1300EA7FF8EBFFC06C13F86C13FE6C7F6C1480000114C0 +D8003F13E0010313F0EB001FEC0FF800E01303A214017E1400A27E15F07E14016C14E06C +EB03C0903880078039F3E01F0038E0FFFC38C01FE01D2A7DA824>I<131CA6133CA4137C +A213FCA2120112031207001FB512C0B6FCA2D801FCC7FCB3A215E0A912009038FE01C0A2 +EB7F03013F138090381F8700EB07FEEB01F81B397EB723>IIIIII<001FB61280A2EBE0000180140049485A001E495A121C4A5A003C +495A141F00385C4A5A147F5D4AC7FCC6485AA2495A495A130F5C495A90393FC00380A2EB +7F80EBFF005A5B484813071207491400485A48485BA248485B4848137F00FF495A90B6FC +A221277EA628>II E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fm cmbx12 20.736 11 +/Fm 11 115 df<137F3801FFC0000713F0487F487F487F487FA2B61280A96C1400A26C5B +6C5B6C5B6C5B000113C06C6CC7FC1919729836>46 D48 D<93B57E031F14FC92B7 +7E020316F0020F16FC023F16FF4A8349B5D8800314E04901F8C7003F7F4901C0020F7F49 +90C800037FD91FFC6F7F49486F6C7E137F4A7013804948827313C05A4A821BE05AA28548 +7FA38080806E5E8003C017C08103F85D03FE17806F6C5C6C6F160004F05C04FC4A5A6C6F +5D706C13FFDDE0015B6CDCF8035BDDFC0F13C06DDBFF1F5B6D93B5C7FC19FC6D17F06D5F +6D17806D17E06D836D6C16FC6E16FF020F836E17E06E83020F83023F8391B97E49840107 +01F0178049D9C07F16C0013FD9801F16E049EB00074948010116F048497F4849023F15F8 +4849140F4A6E15FC48160148496E6C14FE4A151F488391C9120348050014FF193F498385 +00FF84854983A28586A3861BFEA27FA2007F1AFC7F1A7F1BF86C7FF2FFF06C7F6E4C13E0 +6C6D4C13C06C6D5E6E4C13806C6D4C13006C6D6CED7FFE6C02E04A485A013F01FC020F13 +F06D9026FFC001B55A010791B712806D95C7FC010017FC021F16F002071680DA007F02FC +C8FC030191C9FC507378F061>56 D<93B5FC031F14F092B612FE02076F7E021F16E04A16 +F891B87E49DAF00713FF0107DA0001804901FC6D6C7F49496E7F49496E7F49496E7F90B5 +486E7F484A8048854891C86C7FA2487114805C481AC0A2487213E0A2484918F0A31BF8A2 +B5FCA27313FCA51BFEA71BFF61A27EA396B6FC7EA2806C5FA27E606C7F607E6C6E5C6CEF +1FBF6D6DEC3F3F6D6D147F6D6D14FE6D6DEB01FC6D01FE130701019039FFC01FF86D91B5 +00F014FE023F15C06E15800203ECFE00DA007F13F8030713C092C9FC4F13FCA41BF8A31B +F0D91FF093B5FCEB7FFC496C18E0487F486E17C06048801B804E1400A26260624E5B4B5C +626C91C8485B4A4B5B4A92B55A6C01F04A91C7FC02804A5B6C01E0020F5B6D6C023F13F0 +02FE91B55A90273FFFE00F5C6D90B7C8FC010716FC6D16F0010016C0023F92C9FC020714 +F09126007FFECAFC507378F061>I<92383FFFF80207B612E0027F15FC49B87E010717E0 +011F83499026F0007F13FC4948C7000F7F90B502036D7E486E6D806F6D80727F486E6E7F +8486727FA28684A26C5C72806C5C6D90C8FC6D5AEB0FF8EB03E090CAFCA70507B6FC041F +B7FC0303B8FC157F0203B9FC021FECFE0391B612800103ECF800010F14C04991C7FC017F +13FC90B512F04814C0485C4891C8FC485B5A485B5C5A5CA2B5FC5CA360A36E5DA26C5F6E +5D187E6C6D846E4A48806C6D4A4814FC6C6ED90FF0ECFFFC6C02E090263FE07F14FE0001 +9139FC03FFC06C91B6487E013F4B487E010F4B1307010303F01301D9003F0280D9003F13 +FC020101F8CBFC57507ACE5E>97 D<903801FFFCB6FCA8C67E131F7FB3ADF0FFFC050FEB +FFE0057F14FE0403B77E040F16E0043F16F84CD9007F13FE9226FDFFF001077F92B500C0 +01018094C86C13E004FC6F7F4C6F7F04E06F7F4C6F7F5E747F93C915804B7014C0A27414 +E0A21DF087A21DF8A31DFC87A41DFEAF1DFCA4631DF8A31DF098B5FC1DE0A25014C0A26F +1980501400705D705F704B5B505B704B5B04FC4B5BDBE7FE92B55A9226C3FF8001035C03 +8101E0011F49C7FC9226807FFC90B55A4B6CB712F04A010F16C04A010393C8FC4A010015 +F84A023F14C090C9000301F0C9FC5F797AF76C>I<93383FFFF00307B612C0033F15F84A +B712FE0207707E021F17E0027F8391B526FC001F7F010302C001037F4991C7487F49495C +495B4901F04A7F5B90B55A485CA2485C4891C8FCA248715B5C48715B725B4A6F5B489438 +007FC0071FC7FC96C8FC5AA25CA3B5FCAF7E80A47E80A27E806CF11F80F23FC06C6E167F +A26C6EEEFF80816C606C6E17006D6D4B5A6D6D15076D6D4B5A6D6D6C4A5A6D02E0EC7FF0 +6D02F849485A01009126FF801F5B6E91B6C7FC021F5E020716F8020116E06E6C15800307 +02FCC8FCDB003F13804A507ACE56>I<97380FFFE00607B6FCA8F00003190086B3AD9338 +3FFF800307B512F8033F14FF4AB712C0020716F0021F16FC027F9039FE007FFE91B500F0 +EB0FFF01030280010190B5FC4949C87E49498149498149498149498190B548814884484A +8192CAFC5AA2485BA25A5C5AA35A5CA4B5FCAF7EA4807EA37EA2807EA26C7F616C6E5D6C +606C80616D6D5D6D6D5D6D6D92B67E6D6D4A15FC010301FF0207EDFFFE6D02C0EB3FFE6D +6C9039FC01FFF86E90B65A020F16C002031600DA007F14FC030F14E09226007FFEC749C7 +FC5F797AF76C>I<93387FFF80030FB512FC037FECFF804AB712E0020716F8021F16FE02 +7FD9F8077F49B5D8C000804991C7003F13E04901FC020F7F49496E7F49498049496E7F49 +496E7F90B55A48727E92C914804884485B1BC048841BE0485BA27313F05AA25C5AA21BF8 +85A2B5FCA391BAFCA41BF002F8CCFCA67EA3807EA47E806CF103F0F207F86C7F1A0F6C6E +17F06C191F6F17E06C6E163F6D6DEE7FC06D6D16FF6D6D4B13806D6D4B13006D6D6CEC0F +FE6D02E0EC3FFC6D02F8ECFFF86D9126FFC00F5B023F91B65A020F178002034CC7FC0200 +16F8031F15E0030392C8FCDB000F13E04D507BCE58>I<93381FFFE00303B6FC031F15E0 +92B712FC020316FF020F17C0023FD9FC0014F091B500C0010F13FC4991C700037F4901FC +02007F010F496F13C049496F7F49496F7F4B8149496F7F90B5C96C7F4886A24849707F48 +1B80A248497014C0A2481BE0A348497113F0A3481BF8A5B51AFCAE6C1BF8A46C1BF06E94 +B5FCA36C1BE0A26C6D4C14C0A26C1B806E5E6C1B006C6E4B5BA26C6E4B5B6D6D4B5B6D6D +4B5B6D6D4B5B6D6D92B55A6D01FF02035C6D02C0010F91C7FC010002FC90B512FC6E90B7 +5A021F17E00207178002014CC8FCDA003F15F0030392C9FCDB001F13E056507BCE61> +111 D<902601FFF8EB07FEB691383FFFC094B512F00403804C14FE4C8093261FFC3F1380 +93263FE07F13C0DC7F80B5FCC66C5D011FDAFE0114E06DEBF9FC16F815FB16F016E015FF +16C07114C05E72138095381FFE0093C76C5AF001E095C8FCA25DA65DB3B3A2B812F8A843 +4E7ACD4F>114 D E +%EndDVIPSBitmapFont +end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin +%%PaperSize: A4 + +%%EndSetup +%%Page: 1 1 +1 0 bop 94 1385 a Fm(barco)5 b(de)65 b(0.98)p 94 1451 +3780 34 v 2617 1548 a Fl(A)31 b(library)d(for)i(dra)m(wing)f(bar)h(co)s +(des)3409 1656 y(Marc)m(h)h(2002)94 5367 y Fk(b)l(y)45 +b(Alessandro)h(Rubini)f(\()p Fj(rubini@gnu.org)p Fk(\))p +94 5446 3780 17 v eop +%%Page: 1 2 +1 1 bop 94 -116 a Fl(Chapter)30 b(2:)41 b(The)30 b(Underlying)e(Data)k +(Structure)2012 b(1)94 365 y Fi(Barco)t(de)54 b(to)t(ols)219 +549 y Fl(This)29 b(\014le)g(do)s(cumen)m(ts)h(v)m(ersion)g(0.98)i(of)e +(the)h(barco)s(de)f(library)e(and)i(sample)f(programs)h(\(Marc)m(h)i +(2002\).)94 815 y Fi(1)81 b(Ov)l(erview)219 999 y Fl(The)26 +b Fh(barco)s(de)32 b Fl(pac)m(k)-5 b(age)29 b(is)d(mainly)f(a)i(C)f +(library)f(for)h(creating)i(bar-co)s(de)f(output)f(\014les.)39 +b(It)27 b(also)f(includes)94 1099 y(a)31 b(command)f(line)f(fron)m +(t-end)h(and)g(\(in)f(a)i(foreseeable)g(future\))f(a)h(graphic)e(fron)m +(tend.)219 1215 y(The)k(pac)m(k)-5 b(age)35 b(is)d(designed)g(as)i(a)f +(library)e(b)s(ecause)i(w)m(e)h(think)e(the)h(main)g(use)f(for)h(barco) +s(de-generation)94 1315 y(to)s(ols)23 b(is)f(inside)f(more)i(featured)g +(applications.)37 b(The)22 b(library)f(addresses)h(bar)h(co)s(de)g +(prin)m(ting)e(as)i(t)m(w)m(o)i(distinct)94 1415 y(problems:)43 +b(creation)33 b(of)f(bar)g(information)e(and)i(actual)h(con)m(v)m +(ersion)f(to)h(an)f(output)g(format.)47 b(T)-8 b(o)32 +b(this)g(aim)94 1514 y(w)m(e)25 b(use)f(an)g(in)m(termediate)g +(represen)m(tation)g(for)g(bar)f(co)s(des,)j(whic)m(h)d(is)g(curren)m +(tly)g(do)s(cumen)m(ted)h(in)e(the)j(`)p Fj(ps.c)p Fl(')94 +1614 y(source)31 b(\014le)e(\(not)i(in)f(this)f(do)s(cumen)m(t\).)219 +1730 y(Note)24 b(that)e(the)h(library)d(and)h(the)i(accompan)m(ying)g +(material)e(is)h(released)g(according)g(to)h(the)f(GPL)h(license,)94 +1830 y(not)31 b(the)g(LGPL)f(one.)41 b(A)30 b(cop)m(y)h(of)g(the)g(GPL) +f(is)f(included)f(in)h(the)i(distribution)26 b(tarball.)94 +2096 y Fi(2)81 b(The)53 b(Underlying)h(Data)g(Structure)219 +2280 y Fl(Ev)m(ery)33 b(barco)s(de-related)g(function)f(acts)i(on)f(a)h +(data)f(structure)g(de\014ned)f(in)g(the)h(`)p Fj(barcode.h)p +Fl(')e(header,)94 2380 y(whic)m(h)j(m)m(ust)h(b)s(e)f(included)e(b)m(y) +j(an)m(y)g(C)g(source)g(\014le)f(that)h(uses)g(the)g(library)-8 +b(.)52 b(The)35 b(header)f(is)g(installed)f(b)m(y)94 +2480 y Fj(make)47 b(install)p Fl(.)219 2596 y(The)30 +b(de\014nition)e(of)i(the)h(data)g(structure)f(is)f(included)f(here)i +(for)g(reference:)334 2717 y Fj(struct)47 b(Barcode_Item)d({)525 +2820 y(int)j(flags;)428 b(/*)47 b(type)g(of)g(encoding)f(and)h(other)f +(flags)g(*/)525 2924 y(char)h(*ascii;)332 b(/*)47 b(malloced)f(*/)525 +3028 y(char)h(*partial;)236 b(/*)47 b(malloced)f(too)h(*/)525 +3132 y(char)g(*textinfo;)188 b(/*)47 b(information)e(about)h(text)h +(placement)e(*/)525 3236 y(char)i(*encoding;)188 b(/*)47 +b(code)g(name,)f(filled)g(by)i(encoding)d(engine)h(*/)525 +3339 y(int)h(width,)f(height;)g(/*)h(output)f(units)h(*/)525 +3443 y(int)g(xoff,)g(yoff;)189 b(/*)47 b(output)f(units)h(*/)525 +3547 y(int)g(margin;)380 b(/*)47 b(output)f(units)h(*/)525 +3651 y(double)f(scalef;)237 b(/*)47 b(requested)f(scaling)f(for)i +(barcode)f(*/)525 3754 y(int)h(error;)428 b(/*)47 b(an)h(errno-like)d +(value,)h(in)h(case)f(of)i(failure)d(*/)334 3858 y(};)219 +3975 y Fl(The)e(exact)i(meaning)e(of)g(eac)m(h)i(\014eld)d(and)h(the)g +(v)-5 b(arious)43 b(\015ags)g(implemen)m(ted)f(are)i(describ)s(ed)e(in) +g(the)94 4074 y(follo)m(wing)29 b(sections.)219 4191 +y(Ev)m(en)38 b(though)f(y)m(ou)h(w)m(on't)g(usually)d(need)i(to)h(act)h +(on)e(the)h(con)m(ten)m(ts)h(of)f(this)e(structure,)j(some)f(of)g(the) +94 4290 y(functions)25 b(in)f(the)i(library)d(receiv)m(e)k(argumen)m +(ts)e(that)i(are)f(directly)e(related)i(to)g(one)g(or)g(more)f(of)h +(these)g(\014elds.)94 4524 y Fk(2.1)69 b(The)44 b(Fields)94 +4715 y Fj(int)30 b(flags;)574 4815 y Fl(The)42 b(\015ags)g(are,)j(as)d +(y)m(ou)g(ma)m(y)g(susp)s(ect,)j(mean)m(t)d(to)h(sp)s(ecify)d(the)i +(exact)h(b)s(eha)m(viour)e(of)h(the)574 4914 y(library)-8 +b(.)37 b(They)22 b(are)h(often)h(passed)e(as)h(an)g(argumen)m(t)g(to)h +Fg(b)-5 b(ar)g(c)g(o)g(de)32 b Fl(functions)21 b(and)i(are)g(discussed) +574 5014 y(in)30 b(the)g(next)h(section.)94 5147 y Fj(char)f(*ascii;)94 +5247 y(char)g(*partial;)94 5347 y(char)g(*textinfo;)94 +5446 y(char)g(*encoding;)574 5546 y Fl(These)41 b(\014elds)f(are)h(in)m +(ternally)e(managed)i(b)m(y)g(the)h(library)-8 b(,)41 +b(and)g(y)m(ou)g(are)h(not)f(exp)s(ected)g(to)574 5645 +y(touc)m(h)31 b(them)g(if)e(y)m(ou)i(use)f(the)h(pro)m(vided)d(API.)j +(All)e(of)h(them)h(are)g(allo)s(cated)f(with)f Fg(mal)5 +b(lo)-5 b(c)p Fl(.)p eop +%%Page: 2 3 +2 2 bop 94 -116 a Fl(Chapter)30 b(2:)41 b(The)30 b(Underlying)e(Data)k +(Structure)2012 b(2)94 365 y Fj(int)30 b(width;)94 465 +y(int)g(height;)574 565 y Fl(They)i(sp)s(ecify)e(the)i(width)d(and)i +(heigh)m(t)h(of)g(the)f Fg(active)39 b Fl(barco)s(de)31 +b(region)g(\(i.e.,)i(excluding)d(the)574 664 y(white)21 +b(margin\),)i(in)d(the)i(units)e(used)h(to)h(create)i(output)d(data)h +(\(for)g(p)s(ostscript)e(they)i(are)g(p)s(oin)m(ts,)574 +764 y(1/72th)33 b(of)d(an)g(inc)m(h,)g(0.352)j(mm\).)40 +b(The)30 b(\014elds)f(can)i(b)s(e)f(either)g(assigned)f(to)j(in)d(the)h +(structure)574 863 y(or)37 b(via)e Fg(Bar)-5 b(c)g(o)g(de)p +1161 863 28 4 v 36 w(Position\(\))p Fl(,)39 b(at)e(y)m(our)f(c)m +(hoice.)59 b(If)35 b(either)h(v)-5 b(alue)35 b(or)h(b)s(oth)g(are)g +(left)g(to)h(their)574 963 y(default)c(v)-5 b(alue)33 +b(of)g(zero,)i(the)e(output)g(engine)g(will)d(assign)j(default)f(v)-5 +b(alues)33 b(according)g(to)h(the)574 1063 y(sp)s(eci\014ed)g(scaling)f +(factor.)55 b(If)35 b(the)g(sp)s(eci\014ed)e(width)g(is)h(bigger)g +(than)h(needed)f(\(according)h(to)574 1162 y(the)g(scaling)f(factor\),) +j(the)d(output)g(barco)s(de)h(will)c(b)s(e)j(cen)m(tered)i(in)d(its)h +(requested)g(region.)52 b(If)574 1262 y(either)27 b(the)h(width)d(of)i +(the)h(heigh)m(t)f(are)h(to)s(o)g(small)d(for)i(the)h(sp)s(eci\014ed)d +(scale)j(factor,)h(the)e(output)574 1362 y(bar)j(co)s(de)h(will)d +(expand)h(symmetrically)g(around)g(the)i(requested)f(region.)94 +1513 y Fj(int)g(xoff;)94 1612 y(int)g(yoff;)574 1738 +y Fl(The)53 b(\014elds)f(sp)s(ecify)g(o\013set)j(from)e(the)g(co)s +(ordinate)h(origin)e(of)h(the)h(output)f(engine)g(\(for)574 +1838 y(p)s(ostscript,)46 b(p)s(osition)c(0,0)i(is)f(the)g(lo)m(w)m(er)h +(left)f(corner)h(of)f(the)h(page\).)81 b(The)43 b(\014elds)f(can)i(b)s +(e)574 1937 y(either)36 b(assigned)e(to)j(in)d(the)i(structure)f(or)g +(via)g Fg(Bar)-5 b(c)g(o)g(de)p 2572 1937 V 36 w(Position\(\))p +Fl(,)39 b(at)d(y)m(our)f(c)m(hoice.)57 b(The)574 2037 +y(o\013set)24 b(sp)s(eci\014es)d(where)h(the)g(white)g(margin)f(b)s +(egins,)h(not)h(where)f(the)g(\014rst)g(bar)g(will)d(b)s(e)j(prin)m +(ted.)574 2136 y(T)-8 b(o)31 b(prin)m(t)e(real)h(ink)f(to)j(the)e(sp)s +(eci\014ed)f(p)s(osition)f(y)m(ou)j(should)d(set)j Fg(mar)-5 +b(gin)39 b Fl(to)31 b(0.)94 2288 y Fj(int)f(margin;)574 +2387 y Fl(The)36 b(white)g(margin)f(that)j(will)33 b(b)s(e)j(left)g +(around)g(the)h(prin)m(ted)e(area)i(of)g(the)f(bar)g(co)s(de.)59 +b(The)574 2487 y(same)37 b(margin)e(is)g(applied)f(to)j(all)e(sides)g +(of)h(the)g(prin)m(ted)f(area.)59 b(The)35 b(default)g(v)-5 +b(alue)36 b(for)g(the)574 2587 y(margin)30 b(is)f(de\014ned)g(in)g(`)p +Fj(barcode.h)p Fl(')g(as)h Fj(BARCODE_DEFAULT_MARGIN)25 +b Fl(\(10\).)94 2738 y Fj(double)k(scalef;)574 2837 y +Fl(The)j(enlarge)f(or)h(shrink)d(v)-5 b(alue)31 b(for)g(the)h(bar)f(co) +s(de)h(o)m(v)m(er)h(its)e(default)g(dimension.)42 b(The)31 +b Fg(width)574 2937 y Fl(and)j Fg(sc)-5 b(alef)54 b Fl(\014elds)33 +b(in)m(teract)h(deeply)f(in)g(the)h(creation)h(of)f(the)g(output,)h +(and)f(a)g(complete)h(de-)574 3037 y(scription)29 b(of)i(the)f(issues)f +(app)s(ears)h(later)g(in)f(this)g(section.)94 3188 y +Fj(int)h(error;)574 3288 y Fl(The)g(\014eld)f(is)h(used)f(when)h(a)g +Fg(b)-5 b(ar)g(c)g(o)g(de)40 b Fl(function)29 b(fails)g(to)i(host)g(an) +f Fj(errno)p Fl(-lik)m(e)f(in)m(teger)h(v)-5 b(alue.)94 +3515 y Ff(Use)42 b(of)f(the)g Fe(width)50 b Ff(and)41 +b Fe(sc)-6 b(alef)64 b Ff(\014elds.)219 3700 y Fl(A)29 +b(width)f(unit)f(is)h(the)i(width)d(of)i(the)h(thinnest)d(bar)i(and/or) +g(space)h(in)d(the)j(c)m(hosen)f(co)s(de;)h(it)f(defaults)f(to)94 +3800 y(1)j(p)s(oin)m(t)f(if)f(the)i(output)e(is)h(p)s(ostscript)f(or)h +(encapsulated)g(p)s(ostscript.)219 3926 y(Either)j(or)h(b)s(oth)g(the)g +(co)s(de)h(width)d(and)i(the)g(scale)h(factor)g(can)g(b)s(e)e(left)h +(unsp)s(eci\014ed)e(\(i.e.,)k(zero\).)53 b(The)94 4026 +y(library)28 b(deals)i(with)f(defaults)h(in)f(the)h(follo)m(wing)f(w)m +(a)m(y:)94 4178 y Fg(Both)34 b(unsp)-5 b(e)g(ci\014e)g(d)574 +4277 y Fl(If)26 b(b)s(oth)f(the)h(width)e(and)h(the)h(scale)g(factor)g +(are)g(unsp)s(eci\014ed,)f(the)h(scale)g(factor)g(will)d(default)i(to) +574 4377 y(1.0)31 b(and)e(the)h(width)e(is)g(calculated)i(according)f +(to)i(the)e(actual)h(width)e(of)i(the)g(bar)f(co)s(de)g(b)s(eing)574 +4477 y(prin)m(ted.)94 4628 y Fg(Width)34 b(unsp)-5 b(e)g(ci\014e)g(d) +574 4728 y Fl(If)30 b(the)h(width)e(is)g(not)i(sp)s(eci\014ed,)d(it)i +(is)g(calculated)g(according)g(to)i(the)e(v)-5 b(alues)30 +b(of)g Fg(sc)-5 b(alef)p Fl(.)94 4879 y Fg(Sc)g(ale)34 +b(factor)f(unsp)-5 b(e)g(ci\014e)g(d)574 4978 y Fl(If)32 +b(the)h(scale)f(factor)i(is)d(not)i(sp)s(eci\014ed,)e(it)h(will)d(b)s +(e)j(c)m(hosen)h(so)f(that)h(the)g(generated)g(bar)f(co)s(de)574 +5078 y(exactly)g(\014ts)e(the)g(sp)s(eci\014ed)f(width.)94 +5229 y Fg(Both)34 b(sp)-5 b(e)g(ci\014e)g(d)574 5329 +y Fl(The)31 b(co)s(de)g(will)d(b)s(e)i(prin)m(ted)g(inside)e(the)j(sp)s +(eci\014ed)f(region)g(according)h(to)g(the)g(sp)s(eci\014ed)f(scale)574 +5429 y(factor.)48 b(It)33 b(will)d(b)s(e)h(aligned)h(to)h(the)f(left.) +47 b(If,)33 b(ho)m(w)m(ev)m(er,)h(the)f(c)m(hosen)g(width)e(is)g(to)s +(o)i(small)e(for)574 5528 y(the)f(sp)s(eci\014c)e(bar)h(co)s(de)h(and)e +(scaling)h(factor,)h(then)f(the)h(co)s(de)g(will)c(extend)k +(symmetrically)d(to)574 5628 y(the)k(left)f(and)g(to)h(the)g(righ)m(t)f +(of)g(the)h(c)m(hosen)g(region.)p eop +%%Page: 3 4 +3 3 bop 94 -116 a Fl(Chapter)30 b(3:)41 b(The)30 b(Flags)2872 +b(3)94 365 y Fk(2.2)69 b(The)44 b(In)l(termediate)j(Represen)l(tation) +219 565 y Fl(The)23 b(enco)s(ding)g(functions)f(prin)m(t)g(their)g +(output)h(in)m(to)h(the)g Fj(partial)d Fl(and)i Fj(texinfo)f +Fl(\014elds)g(of)h(the)h(barco)s(de)94 664 y(data)g(structure.)37 +b(Those)23 b(\014elds,)g(together)h(with)d(p)s(osition)g(information,)h +(are)h(then)f(used)g(to)i(generate)g(actual)94 764 y(output.)41 +b(This)28 b(is)i(an)g(informal)e(description)h(of)h(the)h(in)m +(termediate)f(format.)219 905 y(The)38 b(\014rst)g(c)m(har)h(in)f +Fj(partial)f Fl(tells)g(ho)m(w)i(m)m(uc)m(h)g(extra)g(space)h(to)f(add) +f(to)i(the)f(left)f(of)h(the)g(bars.)65 b(F)-8 b(or)94 +1005 y(EAN-13,)33 b(it)d(is)f(used)h(to)h(lea)m(v)m(e)h(space)f(to)g +(prin)m(t)e(the)i(\014rst)f(digit,)f(other)i(co)s(des)f(ma)m(y)h(ha)m +(v)m(e)h('0')f(for)g(no-extra-)94 1104 y(space-needed.)219 +1245 y(The)23 b(next)h(c)m(haracters)i(are)e(alternating)f(bars)g(and)h +(spaces,)h(as)g(m)m(ultiples)c(of)j(the)g(base)g(dimension)d(whic)m(h) +94 1345 y(is)35 b(1)g(unless)f(the)i(co)s(de)f(is)f(rescaled.)56 +b(Rescaling)34 b(is)h(calculated)g(as)g(the)h(ratio)f(from)g(the)h +(requested)f(width)94 1445 y(and)e(the)h(calculated)f(width.)48 +b(Digits)33 b(represen)m(t)g(bar/space)h(dimensions.)47 +b(Lo)m(w)m(er-case)35 b(letters)f(represen)m(t)94 1544 +y(those)d(bars)f(that)h(should)e(extend)i(lo)m(w)m(er)f(than)h(the)f +(others:)41 b('a')32 b(is)d(equiv)-5 b(alen)m(t)30 b(to)h('1',)h('b')f +(is)e('2')i(and)f(so)h(on)94 1644 y(up)e(to)h('i')g(whic)m(h)e(is)g +(equiv)-5 b(alen)m(t)29 b(to)i('9'.)41 b(Other)29 b(letters)h(will)d(b) +s(e)i(used)g(for)g(enco)s(ding-sp)s(eci\014c)f(meanings,)h(as)94 +1743 y(so)s(on)i(as)f(I)g(implemen)m(t)f(them.)219 1885 +y(The)35 b Fj(textinfo)e Fl(string)h(is)h(made)g(up)f(of)i(\014elds)e +Fj(\045lf:\045lf:\045c)e Fl(separated)k(b)m(y)g(blank)e(space.)56 +b(The)35 b(\014rst)94 1984 y(in)m(teger)f(is)e(the)h(x)g(p)s(osition)e +(of)i(the)h(c)m(haracter,)h(the)e(second)g(is)f(the)i(fon)m(t)f(size)g +(\(b)s(efore)g(rescaling\))f(and)h(the)94 2084 y(c)m(har)e(item)f(is)g +(the)g(c)m(haracter)i(to)f(b)s(e)f(prin)m(ted.)219 2225 +y(Both)39 b(the)g Fj(partial)d Fl(and)i Fj(textinfo)f +Fl(strings)g(ma)m(y)i(include)d(\\)p Fj(-)p Fl(")j(or)g(\\)p +Fj(+)p Fl(")g(as)g(sp)s(ecial)e(c)m(haracters)j(\(in)94 +2325 y Fj(textinfo)25 b Fl(the)j(c)m(har)f(should)e(b)s(e)i(a)g +(stand-alone)g(w)m(ord\).)40 b(They)26 b(state)j(where)d(the)i(text)g +(should)d(b)s(e)h(prin)m(ted:)94 2424 y(b)s(elo)m(w)34 +b(the)g(bars)f(\(\\)p Fj(-)p Fl(",)j(default\))e(or)g(ab)s(o)m(v)m(e)h +(the)f(bars.)51 b(This)32 b(is)h(used,)i(for)e(example,)i(to)g(prin)m +(t)e(the)h(add-5)94 2524 y(and)27 b(add-2)g(co)s(des)g(to)h(the)f(righ) +m(t)f(of)i(UPC)e(or)h(EAN)g(co)s(des)g(\(the)h(add-5)f(extension)g(is)f +(mostly)g(used)g(in)g(ISBN)94 2623 y(co)s(des\).)94 2939 +y Fi(3)81 b(The)53 b(Flags)219 3213 y Fl(The)30 b(follo)m(wing)f +(\015ags)h(are)h(supp)s(orted)e(b)m(y)h(v)m(ersion)g(0.98)i(of)e(the)h +(library:)94 3387 y Fj(BARCODE_ENCODING_MASK)574 3487 +y Fl(The)f(mask)h(is)e(used)h(to)h(extract)h(the)e(enco)s(ding-t)m(yp)s +(e)g(iden)m(ti\014er)f(from)h(the)g Fg(\015ags)39 b Fl(\014eld.)94 +3653 y Fj(BARCODE_EAN)94 3753 y(BARCODE_UPC)94 3852 y(BARCODE_ISBN)94 +3952 y(BARCODE_128B)94 4051 y(BARCODE_128C)94 4151 y(BARCODE_128)94 +4251 y(BARCODE_128RAW)94 4350 y(BARCODE_39)94 4450 y(BARCODE_I25)94 +4550 y(BARCODE_CBR)94 4649 y(BARCODE_MSI)94 4749 y(BARCODE_PLS)94 +4848 y(BARCODE_93)574 4948 y Fl(The)d(curren)m(tly)f(supp)s(orted)g +(enco)s(ding)g(t)m(yp)s(es:)52 b(EAN)36 b(\(13)i(digits,)e(8)h(digits,) +f(13)h Fj(+)f Fl(2)g(add-on)574 5048 y(and)26 b(13)i +Fj(+)e Fl(5)h(add-on\),)g(UPC)f(\(UPC-A,)i(UPC-E,)e(UPC-A)h(with)e(2)i +(or)f(5)h(digit)f(add-on\),)h(ISBN)574 5147 y(\(with)e(or)f(without)g +(the)i(5-digit)e(add-on\),)i(CODE128-B)h(\(the)e(whole)g(set)g(of)g +(prin)m(table)e(ASCI)s(I)574 5247 y(c)m(haracters\),)36 +b(CODE128-C)d(\(t)m(w)m(o)i(digits)c(enco)s(ded)h(b)m(y)h(eac)m(h)h +(barco)s(de)e(sym)m(b)s(ol\),)h(CODE128)574 5347 y(\(all)41 +b(ASCI)s(I)f(v)-5 b(alues\),)44 b(a)e(\\ra)m(w-input")f(pseudo-co)s(de) +h(that)g(generates)h(CODE128)f(output,)574 5446 y(CODE39)32 +b(\(alphan)m(umeric\),)e Fj(")p Fl(in)m(terlea)m(v)m(ed)i(2)f(of)h(5)p +Fj(")f Fl(\(n)m(umeric\),)g(Co)s(dabar)f(\(n)m(umeric)g(plus)g(a)574 +5546 y(few)36 b(sym)m(b)s(ols\),)g(MSI)f(\(n)m(umeric\))g(and)g +(Plessey)g(\(hex)g(digits\).)55 b(See)36 b(Chapter)f(6)h([Supp)s(orted) +574 5645 y(Enco)s(dings],)30 b(page)h(7.)p eop +%%Page: 4 5 +4 4 bop 94 -116 a Fl(Chapter)30 b(4:)41 b(F)-8 b(unctions)30 +b(Exp)s(orted)g(b)m(y)g(the)h(Library)1871 b(4)94 365 +y Fj(BARCODE_ANY)574 465 y Fl(This)27 b(sp)s(ecial)g(enco)s(ding)g(t)m +(yp)s(e)h(\(represen)m(ted)h(b)m(y)f(a)h(v)-5 b(alue)27 +b(of)i(zero,)h(so)e(it)g(will)d(b)s(e)j(the)g(default\))574 +565 y(tells)33 b(the)g(enco)s(ding)f(pro)s(cedure)g(to)h(lo)s(ok)g(for) +g(the)g(\014rst)f(enco)s(ding)g(t)m(yp)s(e)i(that)f(can)h(deal)e(with) +574 664 y(a)44 b(textual)f(string.)77 b(Therefore,)46 +b(a)d(11-digit)f(co)s(de)h(will)e(b)s(e)h(prin)m(ted)f(as)i(UPC)g(\(as) +g(w)m(ell)f(as)574 764 y(6-digit,)48 b(11)p Fj(+)p Fl(2)e(and)e(11)p +Fj(+)p Fl(5\),)49 b(a)c(12-digit)g(\(or)g(7-digit,)i(or)e(12)p +Fj(+)p Fl(2)h(or)e(12)p Fj(+)p Fl(5\))i(as)f(EAN13,)k(an)574 +863 y(ISBN)39 b(co)s(de)f(\(with)g(or)g(without)f(h)m(yphens,)i(with)e +(or)i(without)e(add-5\))i(will)d(b)s(e)h(enco)s(ded)h(in)574 +963 y(its)e(EAN13)i(represen)m(tation,)g(an)e(ev)m(en)h(n)m(um)m(b)s +(er)e(of)i(digits)e(is)g(enco)s(ded)h(using)f(CODE128C)574 +1063 y(and)45 b(a)h(generic)f(string)f(is)h(enco)s(ded)g(using)f +(CODE128B.)j(Since)d(co)s(de-39)j(o\013ers)e(a)h(m)m(uc)m(h)574 +1162 y(larger)38 b(represen)m(tation)f(for)h(the)f(same)h(text)h +(string,)f(co)s(de128-b)h(is)e(preferred)f(o)m(v)m(er)j(co)s(de39)574 +1262 y(for)31 b(alphan)m(umeric)d(strings.)94 1411 y +Fj(BARCODE_NO_ASCII)574 1510 y Fl(Instructs)f(the)h(engine)e(not)i(to)g +(prin)m(t)e(the)i(ascii)e(string)h(on)g(output.)39 b(By)28 +b(default)e(the)i(bar)f(co)s(de)574 1610 y(is)j(accompanied)g(with)f +(an)i(ascii)e(v)m(ersion)h(of)h(the)f(text)i(it)d(enco)s(des.)94 +1759 y Fj(BARCODE_NO_CHECKSUM)574 1858 y Fl(Instructs)j(the)h(engine)f +(not)h(to)g(add)f(the)h(c)m(hec)m(ksum)g(c)m(haracter)h(to)f(the)g +(output.)47 b(Not)33 b(all)f(the)574 1958 y(enco)s(ding)23 +b(t)m(yp)s(es)g(can)h(drop)f(the)h(c)m(hec)m(ksum;)i(those)e(where)f +(the)h(c)m(hec)m(ksum)g(is)f(mandatory)g(\(lik)m(e)574 +2058 y(EAN)31 b(and)f(UPC\))g(just)g(ignore)g(the)h(\015ag.)94 +2206 y Fj(BARCODE_OUTPUT_MASK)574 2306 y Fl(The)f(mask)h(is)e(used)h +(to)h(extract)h(the)e(output-t)m(yp)s(e)h(iden)m(ti\014er)d(from)i(the) +h Fg(\015ags)38 b Fl(\014eld.)94 2455 y Fj(BARCODE_OUT_PS)94 +2554 y(BARCODE_OUT_EPS)94 2654 y(BARCODE_OUT_PCL)94 2753 +y(BARCODE_OUT_PCL_III)574 2853 y Fl(The)48 b(curren)m(tly)f(supp)s +(orted)f(enco)s(ding)g(t)m(yp)s(es:)76 b(full-page)47 +b(p)s(ostscript)f(and)h(encapsulated)574 2953 y(p)s(ostscript;)h(PCL)41 +b(\(prin)m(t)g(command)i(language,)j(for)c(HP)g(prin)m(ters\))f(and)h +(PCL-I)s(I)s(I)e(\(same)574 3052 y(as)31 b(PCL,)f(but)g(uses)g(a)g(fon) +m(t)h(not)g(a)m(v)-5 b(ailable)30 b(on)g(older)f(prin)m(ters\).)94 +3201 y Fj(BARCODE_OUT_NOHEADERS)574 3301 y Fl(The)f(\015ag)h(instructs) +d(the)j(prin)m(ting)d(engine)h(not)i(to)f(prin)m(t)f(the)h(header)g +(and)g(fo)s(oter)h(part)e(of)i(the)574 3400 y(\014le.)40 +b(This)29 b(mak)m(es)i(sense)f(for)f(the)i(p)s(ostscript)d(engine)i +(but)f(migh)m(t)h(not)h(mak)m(e)g(sense)f(for)g(other)574 +3500 y(engines;)k(suc)m(h)f(other)h(engines)e(will)e(silen)m(tly)i +(ignore)g(the)i(\015ag)f(just)g(lik)m(e)f(the)h(PCL)f(bac)m(k-end)574 +3600 y(do)s(es.)94 3881 y Fi(4)81 b(F)-13 b(unctions)52 +b(Exp)t(orted)h(b)l(y)g(the)g(Library)219 4103 y Fl(The)41 +b(functions)f(included)f(in)h(the)i(barco)s(de)f(library)e(are)j +(declared)f(in)g(the)g(header)h(\014le)e Fj(barcode.h)p +Fl(.)94 4203 y(They)30 b(p)s(erform)f(the)i(follo)m(wing)e(tasks:)94 +4352 y Fj(struct)g(Barcode_Item)e(*Barcode_Create\(char)e(*text\);)574 +4451 y Fl(The)35 b(function)e(creates)j(a)f(new)g(barco)s(de)f(ob)5 +b(ject)36 b(to)f(deal)g(with)e(a)i(sp)s(eci\014ed)e(text)j(string.)53 +b(It)574 4551 y(returns)27 b(NULL)h(in)e(case)j(of)f(failure)e(and)i(a) +g(p)s(oin)m(ter)f(to)h(a)h(barco)s(de)e(data)i(structure)e(in)g(case)i +(of)574 4651 y(success.)94 4799 y Fj(int)h(Barcode_Delete\(struct)25 +b(Barcode_Item)i(*bc\);)574 4899 y Fl(Destro)m(y)32 b(a)f(barco)s(de)f +(ob)5 b(ject.)42 b(Alw)m(a)m(ys)31 b(returns)e(0)h(\(success\))94 +5048 y Fj(int)g(Barcode_Encode\(struct)25 b(Barcode_Item)i(*bc,)i(int)g +(flags\);)574 5147 y Fl(Enco)s(de)h(the)h(text)g(included)d(in)h(the)h +Fg(b)-5 b(c)35 b Fl(ob)5 b(ject.)42 b(V)-8 b(alid)29 +b(\015ags)i(are)f(the)h(enco)s(ding)e(t)m(yp)s(e)h(\(other)574 +5247 y(\015ags)45 b(are)f(ignored\))g(and)g(BAR)m(CODE)p +1994 5247 28 4 v 33 w(NO)p 2166 5247 V 33 w(CHECKSUM)f(\(other)i +(\015ags)f(are)h(silen)m(tly)d(ig-)574 5347 y(nored\);)35 +b(if)e(the)g(\015ag)h(argumen)m(t)g(is)e(zero,)j Fj(bc->flags)c +Fl(will)g(apply)-8 b(.)49 b(The)32 b(function)g(returns)h(0)574 +5446 y(on)h(success)g(and)f(-1)i(in)d(case)j(of)f(error.)51 +b(After)34 b(successful)e(termination)h(the)h(data)g(structure)574 +5546 y(will)21 b(host)i(the)h(description)d(of)j(the)f(bar)g(co)s(de)g +(and)g(its)g(textual)g(represen)m(tation,)i(after)f(a)g(failure)574 +5645 y(the)31 b Fj(error)e Fl(\014eld)g(will)f(include)g(the)i(reason)h +(of)f(the)h(failure.)p eop +%%Page: 5 6 +5 5 bop 94 -116 a Fl(Chapter)30 b(5:)41 b(The)30 b Fg(b)-5 +b(ar)g(c)g(o)g(de)40 b Fl(fron)m(tend)30 b(program)2063 +b(5)94 365 y Fj(int)30 b(Barcode_Print\(struct)25 b(Barcode_Item)i +(*bc,)i(FILE)g(*f,)h(int)f(flags\);)574 465 y Fl(Prin)m(t)39 +b(the)g(bar)g(co)s(de)g(describ)s(ed)e(b)m(y)i Fj(bc)g +Fl(to)h(the)f(sp)s(eci\014ed)f(\014le.)66 b(V)-8 b(alid)38 +b(\015ags)h(are)h(the)f(out-)574 565 y(put)25 b(t)m(yp)s(e,)h +Fj(BARCODE_NO_ASCII)21 b Fl(and)j Fj(BARCODE_OUT_NOHEADERS)p +Fl(,)d(other)k(\015ags)g(are)h(ignored.)574 664 y(If)39 +b(an)m(y)h(of)f(these)h(\015ags)g(is)e(zero,)43 b(it)c(will)d(b)s(e)j +(inherited)e(from)i Fj(bc->flags)d Fl(whic)m(h)i(therefore)574 +764 y(tak)m(es)f(precedence.)57 b(The)35 b(function)g(returns)f(0)i(on) +f(success)h(and)f(-1)h(in)e(case)j(of)f(error)f(\(with)574 +863 y Fj(bc->error)28 b Fl(set)j(accordingly\).)40 b(In)29 +b(case)j(of)e(success,)h(the)f(bar)g(co)s(de)g(is)f(prin)m(ted)g(to)i +(the)f(sp)s(ec-)574 963 y(i\014ed)f(\014le,)h(whic)m(h)f(w)m(on't)i(b)s +(e)f(closed)g(after)h(use.)94 1115 y Fj(int)f(Barcode_Position\(struct) +24 b(Barcode_Item)j(*bc,)i(int)h(wid,)f(int)g(hei,)h(int)f(xoff,)g(int) +h(yoff,)94 1215 y(double)f(scalef\);)574 1315 y Fl(The)h(function)f(is) +h(a)h(shortcut)f(to)h(assign)f(v)-5 b(alues)29 b(to)j(the)e(data)h +(structure.)94 1467 y Fj(int)f(Barcode_Encode_and_Print)o(\(cha)o(r)24 +b(*text,)29 b(FILE)g(*f,)h(int)f(wid,)g(int)h(hei,)f(int)h(xoff,)f(int) +94 1567 y(yoff,)g(int)h(flags\);)574 1666 y Fl(The)38 +b(function)e(deals)h(with)g(the)h(whole)f(life)f(of)i(the)g(barco)s(de) +g(ob)5 b(ject)39 b(b)m(y)e(calling)g(the)h(other)574 +1766 y(functions;)30 b(it)g(uses)g(all)f(the)h(sp)s(eci\014ed)f +(\015ags.)94 1918 y Fj(int)h(Barcode_Version\(char)25 +b(*versionname\);)574 2018 y Fl(Returns)g(the)g(curren)m(t)f(v)m +(ersion)h(as)g(an)g(in)m(teger)g(n)m(um)m(b)s(er)f(of)h(the)g(form)f +(ma)5 b(jor)25 b(*)h(10000)h Fj(+)d Fl(minor)574 2118 +y(*)k(100)h Fj(+)e Fl(release.)40 b(Therefore,)28 b(v)m(ersion)f +(1.03.5)i(will)c(b)s(e)i(returned)f(as)h(10305)j(and)d(v)m(ersion)f +(0.53)574 2217 y(as)i(5300.)41 b(If)27 b(the)h(argumen)m(t)f(is)f +(non-n)m(ull,)g(it)h(will)e(b)s(e)h(used)h(to)h(return)e(the)h(v)m +(ersion)g(n)m(um)m(b)s(er)f(as)574 2317 y(a)h(string.)39 +b(Note)28 b(that)f(the)f(same)h(information)e(is)h(a)m(v)-5 +b(ailable)26 b(from)g(t)m(w)m(o)i(prepro)s(cessor)d(macros:)574 +2416 y Fj(BARCODE_VERSION)i Fl(\(the)k(string\))e(and)h +Fj(BARCODE_VERSION_INT)25 b Fl(\(the)31 b(in)m(teger)g(n)m(um)m(b)s +(er\).)94 2705 y Fi(5)81 b(The)53 b Fd(b)-8 b(ar)g(c)g(o)g(de)65 +b Fi(fron)l(tend)51 b(program)219 2938 y Fl(The)26 b +Fc(barco)s(de)g Fl(program)g(is)f(a)h(fron)m(t-end)g(to)h(access)h +(some)e(features)h(of)f(the)g(library)e(from)i(the)g(command)94 +3037 y(line.)63 b(It)38 b(is)g(able)f(to)i(read)f(user)g(supplied)d +(strings)i(from)h(the)g(command)g(line)e(or)j(a)f(data)h(\014le)e +(\(standard)94 3137 y(input)29 b(b)m(y)h(default\))g(and)g(enco)s(de)g +(all)g(of)g(them.)94 3401 y Fk(5.1)69 b(The)44 b(Command)h(Line)219 +3587 y Fc(barco)s(de)30 b Fl(accepts)i(the)e(follo)m(wing)f(options:)94 +3741 y Fj(--help)g(or)h(-h)574 3840 y Fl(Prin)m(t)g(a)h(usage)g +(summary)e(and)h(exit.)94 3993 y Fj(-i)g(filename)574 +4092 y Fl(Iden)m(tify)35 b(a)h(\014le)f(where)g(strings)f(to)j(b)s(e)e +(enco)s(ded)g(are)h(read)f(from.)56 b(If)36 b(missing)d(\(and)i(if)g +Fj(-b)g Fl(is)574 4192 y(not)29 b(used\))f(it)g(defaults)f(to)i +(standard)e(input.)38 b(Eac)m(h)29 b(data)g(line)e(of)h(the)h(input)d +(\014le)i(will)d(b)s(e)j(used)574 4292 y(to)k(create)g(one)e(barco)s +(de)g(output.)94 4444 y Fj(-o)g(filename)574 4544 y Fl(Output)g +(\014le.)40 b(It)30 b(defaults)f(to)j(standard)d(output.)94 +4696 y Fj(-b)h(string)66 b Fl(Sp)s(ecify)32 b(a)j(single)d(\\barco)s +(de")i(string)f(to)h(b)s(e)g(enco)s(ded.)50 b(The)33 +b(option)g(can)h(b)s(e)f(used)g(m)m(ultiple)574 4796 +y(times)j(in)e(order)h(to)h(enco)s(de)g(m)m(ultiple)d(strings)i(\(this) +f(will)f(result)i(in)f(m)m(ulti-page)h(p)s(ostscript)574 +4895 y(output)22 b(or)g(a)g(table)g(of)g(barco)s(des)g(if)f +Fj(-t)g Fl(is)g(sp)s(eci\014ed\).)37 b(The)21 b(strings)g(m)m(ust)h +(matc)m(h)h(the)f(enco)s(ding)574 4995 y(c)m(hosen;)29 +b(if)c(it)g(do)s(esn't)h(matc)m(h)h(the)f(program)g(will)d(prin)m(t)i +(a)h(w)m(arning)f(to)i Fj(stderr)d Fl(and)h(generate)574 +5095 y(\\blank")44 b(output)g(\(although)h(not)f(zero-length\).)84 +b(Please)44 b(note)h(that)g(a)g(string)e(including)574 +5194 y(spaces)31 b(or)g(other)f(sp)s(ecial)f(c)m(haracters)j(m)m(ust)e +(b)s(e)g(prop)s(erly)e(quoted.)94 5347 y Fj(-e)i(encoding)574 +5446 y Fc(enco)s(ding)j Fl(is)e(the)i(name)f(of)h(the)g(c)m(hosen)g +(enco)s(ding)e(format)i(b)s(eing)e(used.)46 b(It)32 b(defaults)g(to)h +(the)574 5546 y(v)-5 b(alue)41 b(of)f(the)h(en)m(vironmen)m(t)g(v)-5 +b(ariable)39 b Fj(BARCODE_ENCODING)d Fl(or)41 b(to)g(auto)h(detection)f +(if)f(the)574 5645 y(en)m(vironmen)m(t)30 b(is)g(also)g(unset.)p +eop +%%Page: 6 7 +6 6 bop 94 -116 a Fl(Chapter)30 b(6:)41 b(Supp)s(orted)29 +b(Enco)s(dings)2417 b(6)94 365 y Fj(-g)30 b(geometry)574 +465 y Fl(The)e(geometry)g(argumen)m(t)g(is)f(of)h(the)f(form)g(\\[)p +Fj(<)p Fg(width)p Fj(>)i(x)f(<)p Fg(height)p Fj(>)p Fl(])f([)p +Fj(+)h(<)p Fg(xmar)-5 b(gin)p Fj(>)28 b(+)f(<)p Fg(ymar-)574 +565 y(gin)p Fj(>)p Fl(]")42 b(\(with)f(no)h(in)m(terv)m(ening)f +(spaces\).)75 b(Unsp)s(eci\014ed)40 b(margin)h(v)-5 b(alues)41 +b(will)e(result)i(in)f(no)574 664 y(margin;)31 b(unsp)s(eci\014ed)d +(size)j(results)e(in)h(default)g(size.)42 b(The)30 b(sp)s(eci\014ed)f +(v)-5 b(alues)30 b(represen)m(t)h(prin)m(t)574 764 y(p)s(oin)m(ts)e(b)m +(y)g(default,)g(and)g(can)g(b)s(e)g(inc)m(hes,)g(millimeters)e(or)i +(other)h(units)e(according)h(to)h(the)g Fj(-u)574 863 +y Fl(option)j(or)h(the)g Fj(BARCODE_UNIT)c Fl(en)m(vironmen)m(t)j(v)-5 +b(ariable.)49 b(The)33 b(argumen)m(t)h(is)e(used)h(to)h(place)574 +963 y(the)g(prin)m(tout)f(co)s(de)h(on)f(the)h(page.)51 +b(Note)35 b(that)f(an)f(additional)f(white)g(margin)h(of)h(10)g(p)s +(oin)m(ts)574 1063 y(is)e(added)f(to)i(the)g(prin)m(tout.)45 +b(If)31 b(the)i(option)f(is)f(unsp)s(eci\014ed,)f Fj(BARCODE_GEOMETRY)e +Fl(is)j(lo)s(ok)m(ed)574 1162 y(up)h(in)f(the)h(en)m(vironmen)m(t,)h +(if)e(missing)f(a)j(default)f(size)g(and)g(no)g(margin)f(\(but)h(the)h +(default)e(10)574 1262 y(p)s(oin)m(ts\))f(are)h(used.)94 +1409 y Fj(-t)f(table-geometry)574 1508 y Fl(Used)j(to)g(prin)m(t)e(sev) +m(eral)i(barco)s(des)f(to)i(a)f(single)e(page,)j(this)d(option)h(is)g +(mean)m(t)h(to)h(b)s(e)d(used)h(to)574 1608 y(prin)m(t)e(stic)m(k)m +(ers.)43 b(The)30 b(argumen)m(t)h(is)f(of)h(the)g(form)g(\\)p +Fj(<)p Fg(c)-5 b(olumns)p Fj(>)32 b(x)e(<)p Fg(lines)p +Fj(>)h Fl([)p Fj(+)g(<)p Fg(leftmar)-5 b(gin)p Fj(>)31 +b(+)574 1707 y(<)p Fg(b)-5 b(ottommar)g(gin)p Fj(>)39 +b Fl([)p Fj(-)d(<)p Fg(rightmar)-5 b(gin)p Fj(>)38 b +Fl([)p Fj(-)e(<)p Fg(topmar)-5 b(gin)p Fj(>)p Fl(]]]")39 +b(\(with)c(no)h(in)m(terv)m(ening)f(spaces\);)574 1807 +y(if)42 b(missing,)i(the)f(top)g(and)f(righ)m(t)g(margin)g(will)e +(default)i(to)i(b)s(e)e(the)h(same)g(as)g(the)g(b)s(ottom)574 +1907 y(and)c(left)g(margin.)66 b(The)38 b(margins)g(are)i(sp)s +(eci\014ed)d(in)h(prin)m(t)g(p)s(oin)m(ts)g(or)h(in)e(the)j(c)m(hosen)f +(unit)574 2006 y(\(see)f Fj(-u)d Fl(b)s(elo)m(w\).)59 +b(If)35 b(the)i(option)f(is)f(not)i(sp)s(eci\014ed,)f +Fj(BARCODE_TABLE)d Fl(is)i(lo)s(ok)m(ed)h(up)g(in)f(the)574 +2106 y(en)m(vironmen)m(t,)d(otherwise)f(no)h(table)f(is)g(prin)m(ted)f +(and)h(eac)m(h)i(barco)s(de)f(will)c(get)33 b(its)e(o)m(wn)h(page.)574 +2206 y(The)27 b(size)g(\(but)f(not)h(the)g(p)s(osition\))e(of)j(a)f +(barco)s(de)f(item)h(within)d(a)k(table)e(can)h(also)g(b)s(e)f +(selected)574 2305 y(using)43 b Fj(-g)g Fl(\(see)i Fj(")p +Fl(geometry)p Fj(")g Fl(ab)s(o)m(v)m(e\),)k(without)43 +b(struggling)f(with)h(external)h(and)f(in)m(ternal)574 +2405 y(margins.)71 b(I)40 b(still)e(think)h(managemen)m(t)j(of)f +(geometries)g(in)f(a)h(table)f(is)g(sub)s(optimal,)g(but)g(I)574 +2504 y(can't)32 b(mak)m(e)f(it)f(b)s(etter)h(without)e(in)m(tro)s +(ducing)f(incompatibilities.)94 2651 y Fj(-m)i(margin\(s\))574 +2751 y Fl(Sp)s(eci\014es)21 b(an)g(in)m(ternal)g(margin)g(for)g(eac)m +(h)i(stic)m(k)m(er)g(in)d(the)i(table.)38 b(The)21 b(argumen)m(t)i(is)d +(of)i(the)g(form)574 2850 y(\\)p Fj(<)p Fg(xmar)-5 b(gin)p +Fj(>,<)p Fg(ymar)g(gin)p Fj(>)p Fl(")35 b(and)c(the)g(margin)g(is)g +(applied)e(symmetrically)h(to)i(the)g(stic)m(k)m(er.)45 +b(If)574 2950 y(unsp)s(eci\014ed,)28 b(the)h(en)m(vironmen)m(t)g(v)-5 +b(ariable)28 b Fj(BARCODE_MARGIN)e Fl(is)i(used)h(or)g(a)h(default)e +(in)m(ternal)574 3050 y(margin)i(of)g(10)i(p)s(oin)m(ts)d(is)g(used.)94 +3196 y Fj(-n)384 b Fl(\\Numeric")31 b(output:)40 b(don't)31 +b(prin)m(t)e(the)h(ASCI)s(I)f(form)h(of)g(the)h(co)s(de,)g(only)e(the)i +(bars.)94 3343 y Fj(-c)384 b Fl(No)35 b(c)m(hec)m(ksum)f(c)m(haracter)h +(\(for)f(enco)s(dings)e(that)j(allo)m(w)e(it,)h(lik)m(e)f(co)s(de)h +(39,)h(other)f(co)s(des,)h(lik)m(e)574 3442 y(UPC)c(or)f(EAN,)h(ignore) +f(this)f(option\).)94 3589 y Fj(-E)384 b Fl(Encapsulated)32 +b(p)s(ostscript)f(\(default)h(is)g(normal)f(p)s(ostscript\).)47 +b(When)32 b(the)h(output)f(is)f(gener-)574 3689 y(ated)h(as)e(EPS)g +(only)f(one)i(barco)s(de)f(is)f(enco)s(ded.)94 3835 y +Fj(-P)384 b Fl(PCL)35 b(output.)56 b(Please)36 b(note)g(that)g(the)f(Y) +h(direction)e(go)s(es)i(from)f(top)h(to)g(b)s(ottom)g(for)f(PCL,)574 +3935 y(and)30 b(the)h(origin)e(for)h(an)g(image)h(is)e(the)i(top-left)f +(corner)h(instead)e(of)i(the)f(b)s(ottom-left)94 4081 +y Fj(-p)g(pagesize)574 4181 y Fl(Sp)s(ecify)44 b(a)h(non-default)f +(page)i(size.)85 b(The)45 b(page)h(size)f(can)g(b)s(e)f(sp)s(eci\014ed) +g(in)g(millimeters,)574 4281 y(inc)m(hes)34 b(or)g(plain)e(n)m(um)m(b)s +(ers)g(\(for)i(example:)48 b Fj("210x297mm")p Fl(,)32 +b Fj("8.5x11in")p Fl(,)g Fj("595x842")p Fl(\).)50 b(A)574 +4380 y(page)27 b(sp)s(eci\014cation)d(as)i(n)m(um)m(b)s(ers)e(will)f(b) +s(e)i(in)m(terpreted)g(according)g(to)i(the)f(curren)m(t)f(unit)f(sp)s +(ec-)574 4480 y(i\014cation)33 b(\(see)h Fj(-u)e Fl(b)s(elo)m(w\).)49 +b(If)33 b(libpap)s(er)d(is)i(a)m(v)-5 b(ailable,)33 b(y)m(ou)h(can)f +(also)g(sp)s(ecify)f(the)h(page)h(size)574 4580 y(with)40 +b(its)g(name,)k(lik)m(e)d Fj("A3")e Fl(or)i Fj("letter")e +Fl(\(libpap)s(er)f(is)i(a)h(standard)g(comp)s(onen)m(t)g(of)g(De-)574 +4679 y(bian)d(GNU/Lin)m(ux,)k(but)d(ma)m(y)h(b)s(e)e(missing)f +(elsewhere\).)68 b(The)39 b(default)f(page)i(size)g(is)e(y)m(our)574 +4779 y(system-wide)30 b(default)g(if)f(libpap)s(er)e(is)j(there,)h(A4)g +(otherwise.)94 4925 y Fj(-u)f(unit)162 b Fl(Cho)s(ose)32 +b(the)f(unit)f(used)g(in)g(size)i(sp)s(eci\014cations.)42 +b(Accepted)32 b(v)-5 b(alues)31 b(are)g(\\mm",)i(\\cm",)f(\\in")574 +5025 y(and)37 b(\\pt".)61 b(By)37 b(default,)h(the)f(program)f(will)f +(c)m(hec)m(k)j Fj(BARCODE_UNIT)33 b Fl(in)j(the)h(en)m(vironmen)m(t,) +574 5125 y(and)c(assume)g(p)s(oin)m(ts)g(otherwise)f(\(this)h(b)s(eha)m +(viour)f(is)g(compatible)h(with)f(0.92)j(and)d(previous)574 +5224 y(v)m(ersions.)50 b(If)33 b Fj(-u)g Fl(app)s(ears)g(more)g(than)g +(once,)j(eac)m(h)e(instance)f(will)e(mo)s(di\014ed)h(the)h(b)s(eha)m +(viour)574 5324 y(for)h(the)g(argumen)m(ts)g(at)g(its)f(righ)m(t,)i(as) +f(the)g(command)f(line)f(is)h(pro)s(cesses)g(left)h(to)g(righ)m(t.)50 +b(The)574 5424 y(program)32 b(in)m(ternally)f(w)m(orks)h(with)f(p)s +(oin)m(ts,)h(and)f(an)m(y)i(size)f(is)f(appro)m(ximated)h(to)h(the)f +(nearest)574 5523 y(m)m(ultiple)c(of)j(one)f(p)s(oin)m(t.)40 +b(The)30 b Fj(-u)f Fl(option)h(a\013ect)i Fj(-g)e Fl(\(geometry\),)i +Fj(-t)e Fl(\(table\))h(and)e Fj(-p)h Fl(\(page)574 5623 +y(size\).)p eop +%%Page: 7 8 +7 7 bop 94 -116 a Fl(Chapter)30 b(6:)41 b(Supp)s(orted)29 +b(Enco)s(dings)2417 b(7)94 365 y Fi(6)81 b(Supp)t(orted)51 +b(Enco)t(dings)219 558 y Fl(The)31 b(program)h(enco)s(des)g(text)g +(strings)f(passed)g(either)g(on)h(the)g(command)g(line)e(\(with)g(-b\)) +i(or)g(retriev)m(ed)94 658 y(from)38 b(standard)f(input.)61 +b(The)37 b(text)i(represen)m(tation)f(is)f(in)m(terpreted)g(according)g +(to)i(the)f(follo)m(wing)e(rules.)94 758 y(When)42 b(auto-detection)g +(of)g(the)f(enco)s(ding)f(is)h(enabled)f(\(i.e,)k(no)e(explicit)d(enco) +s(ding)h(t)m(yp)s(e)i(is)e(sp)s(eci\014ed\),)94 857 y(the)c(enco)s +(ding)e(t)m(yp)s(es)h(are)h(scanned)f(to)h(\014nd)d(one)j(that)g(can)f +(digest)g(the)g(text)i(string.)54 b(The)35 b(follo)m(wing)e(list)94 +957 y(of)h(supp)s(orted)e(t)m(yp)s(es)h(is)g(sorted)g(in)g(the)g(same)h +(order)f(the)h(library)d(uses)i(when)f(auto-detecting)k(a)d(suitable)94 +1056 y(enco)s(ding)d(for)g(a)h(string.)94 1193 y Fh(EAN)282 +b Fl(The)36 b(EAN)h(fron)m(tend)f(is)g(similar)d(to)38 +b(UPC;)e(it)g(accepts)i(strings)d(of)i(digits,)g(12)g(or)g(7)f(c)m +(harac-)574 1293 y(ters)c(long.)41 b(Strings)30 b(of)h(13)g(or)g(8)g(c) +m(haracters)i(are)e(accepted)h(if)e(the)h(pro)m(vided)f(c)m(hec)m(ksum) +h(digit)574 1393 y(is)40 b(correct.)73 b(I)40 b(exp)s(ect)i(most)f +(users)e(to)j(feed)e(input)f(without)h(a)h(c)m(hec)m(ksum,)j(though.)71 +b(The)574 1492 y(add-2)36 b(and)g(add-5)g(extension)f(are)h(accepted)i +(for)d(b)s(oth)g(the)i(EAN-13)g(and)e(the)h(EAN-8)h(en-)574 +1592 y(co)s(dings.)42 b(The)30 b(follo)m(wing)f(are)j(example)e(of)h(v) +-5 b(alid)29 b(input)g(strings:)41 b(\\)p Fj(123456789012)p +Fl(")28 b(\(EAN-)574 1692 y(13\),)43 b(\\)p Fj(1234567890128)p +Fl(")37 b(\(EAN-13)k(wih)c(c)m(hec)m(ksum\),)43 b(\\)p +Fj(1234567)p Fl(")38 b(\(EAN-8\),)44 b(\\)p Fj(12345670)574 +1791 y(12345)p Fl(")23 b(\(EAN-8)h(with)e(c)m(hec)m(ksum)h(and)g +(add-5\),)i(\\)p Fj(123456789012)45 b(12)p Fl(")23 b(\(EAN-13)i(with)c +(add-)574 1891 y(2\),)32 b(\\)p Fj(123456789012)45 b(12345)p +Fl(")29 b(\(EAN-13)j(with)d(add-5\).)94 2028 y Fh(UPC)284 +b Fl(The)35 b(UPC)g(fron)m(tend)g(accepts)i(only)d(strings)g(made)i(up) +e(of)h(digits)f(\(and,)j(if)d(a)i(supplemen)m(tal)574 +2127 y(enco)s(ding)27 b(is)g(used,)g(a)h(blank)f(to)h(separate)g(it\).) +40 b(It)28 b(accepts)h(strings)d(of)i(11)g(or)g(12)g(digits)f(\(UPC-) +574 2227 y(A\))k(and)f(6)h(or)f(7)h(or)f(8)h(digits)e(\(UPC-E\).)574 +2345 y(The)c(12th)h(digit)e(of)h(UPC-A)g(is)f(the)h(c)m(hec)m(ksum)h +(and)e(is)g(added)h(b)m(y)g(the)g(library)d(if)i(not)i(sp)s(eci\014ed) +574 2445 y(in)k(the)h(input;)e(if)h(it)h(is)f(sp)s(eci\014ed,)f(it)h(m) +m(ust)h(b)s(e)f(the)h(righ)m(t)g(c)m(hec)m(ksum)g(or)g(the)g(co)s(de)g +(is)f(rejected)574 2545 y(as)38 b(in)m(v)-5 b(alid.)59 +b(F)-8 b(or)38 b(UPC-E,)f(6)h(digit)e(are)i(considered)e(to)i(b)s(e)e +(the)i(middle)d(part)i(of)g(the)g(co)s(de,)574 2644 y(a)i(leading)d(0)i +(is)f(assumed)g(and)g(the)h(c)m(hec)m(ksum)g(is)f(added;)k(7)d(digits)e +(are)i(either)f(considered)574 2744 y(the)30 b(initial)d(part)i +(\(leading)g(digit)f(0)i(or)g(1,)g(c)m(hec)m(ksum)g(missing\))e(or)i +(the)f(\014nal)g(part)g(\(c)m(hec)m(ksum)574 2844 y(sp)s(eci\014ed,)f +(leading)g(0)i(assumed\);)g(8)f(digits)f(are)i(considered)e(to)i(b)s(e) +e(the)i(complete)f(co)s(de,)h(with)574 2943 y(leading)k(0)i(or)f(1)g +(and)g(c)m(hec)m(ksum.)55 b(F)-8 b(or)36 b(b)s(oth)f(UPC-A)g(and)f +(UPC-E,)i(a)f(trailing)e(string)h(of)i(2)574 3043 y(digits)30 +b(or)h(5)g(digits)e(is)h(accepted)i(as)f(w)m(ell.)40 +b(Therefore,)31 b(the)g(follo)m(wing)e(are)i(examples)g(of)g(v)-5 +b(alid)574 3142 y(strings)41 b(that)h(can)f(b)s(e)g(enco)s(ded)g(as)h +(UPC:)f(\\)p Fj(01234567890)p Fl(")e(\(UPC-A\))j(\\)p +Fj(012345678905)p Fl(")574 3242 y(\(UPC-A)33 b(with)d(c)m(hec)m +(ksum\),)k(\\)p Fj(012345)p Fl(")d(\(UPC-E\),)i(\\)p +Fj(01234567890)45 b(12)p Fl(")32 b(\(UPC-A,)g(add-2\))574 +3342 y(and)21 b(\\)p Fj(01234567890)45 b(12345)p Fl(")20 +b(\(UPC-A,)i(add-5\),)h(\\)p Fj(0123456)47 b(12)p Fl(")20 +b(\(UPC-E,)i(add-2\).)38 b(Please)574 3441 y(note)24 +b(that)f(when)f(setting)h Fj(BARCODE_ANY)c Fl(to)24 b(auto-detect)h +(the)e(enco)s(ding)f(to)h(b)s(e)f(used,)i(12-digit)574 +3541 y(strings)32 b(and)h(7-digit)f(strings)g(will)e(alw)m(a)m(ys)k(b)s +(e)e(iden)m(ti\014ed)f(as)i(EAN.)h(This)d(b)s(ecause)i(I)f(exp)s(ect) +574 3641 y(most)h(user)f(to)h(pro)m(vide)f(input)e(without)i(a)g(c)m +(hec)m(ksum.)48 b(If)32 b(y)m(ou)h(need)f(to)h(sp)s(ecify)e(UPC-with-) +574 3740 y(c)m(hec)m(ksum)h(as)g(input)d(y)m(ou)i(m)m(ust)g(explicitly) +e(set)j Fj(BARCODE_UPC)c Fl(as)j(a)g(\015ag)h(or)f(use)g +Fj(-e)47 b(upc)30 b Fl(on)574 3840 y(the)h(command)f(line.)94 +3977 y Fh(ISBN)264 b Fl(ISBN)26 b(n)m(um)m(b)s(ers)e(are)i(enco)s(ded)f +(as)h(EAN-13)g(sym)m(b)s(ols,)g(with)e(an)h(optional)g(add-5)g +(trailer.)38 b(The)574 4076 y(ISBN)27 b(fron)m(tend)f(of)h(the)g +(library)e(accepts)j(real)e(ISBN)h(n)m(um)m(b)s(ers)e(and)h(deals)h +(with)e(an)m(y)i(h)m(yphen)574 4176 y(and,)h(if)f(presen)m(t,)h(the)g +(ISBN)f(c)m(hec)m(ksum)i(c)m(haracter)g(b)s(efore)e(enco)s(ding)f +(data.)41 b(V)-8 b(alid)26 b(represen-)574 4276 y(tations)j(for)e(ISBN) +h(strings)e(are)j(for)e(example:)40 b(\\)p Fj(1-56592-292-1)p +Fl(",)25 b(\\)p Fj(3-89721-122-X)p Fl(")h(and)574 4375 +y(\\)p Fj(3-89721-122-X)45 b(06900)p Fl(".)94 4512 y +Fh(co)s(de)31 b(128-B)574 4612 y Fl(This)37 b(enco)s(ding)g(can)h +(represen)m(t)g(all)f(of)h(the)h(prin)m(ting)c(ASCI)s(I)i(c)m +(haracters,)42 b(from)37 b(the)h(space)574 4711 y(\(32\))32 +b(to)g(DEL)e(\(127\).)43 b(The)30 b(c)m(hec)m(ksum)h(digit)e(is)g +(mandatory)i(in)e(this)g(enco)s(ding.)94 4848 y Fh(co)s(de)i(128-C)574 +4948 y Fl(The)h(\\C")g(v)-5 b(ariation)31 b(of)h(Co)s(de-128)h(uses)e +(Co)s(de-128)i(sym)m(b)s(ols)d(to)j(represen)m(t)f(t)m(w)m(o)h(digits)d +(at)j(a)574 5048 y(time)28 b(\(Co)s(de-128)g(is)f(made)g(up)f(of)i(104) +g(sym)m(b)s(ols)e(whose)i(in)m(terpretation)e(is)h(con)m(trolled)g(b)m +(y)g(the)574 5147 y(start)35 b(sym)m(b)s(ol)e(b)s(eing)g(used\).)52 +b(Co)s(de)34 b(128-C)h(is)e(th)m(us)h(the)h(most)f(compact)i(w)m(a)m(y) +f(to)g(represen)m(t)574 5247 y(an)m(y)41 b(ev)m(en)h(n)m(um)m(b)s(er)d +(of)i(digits.)70 b(The)40 b(enco)s(der)g(refuses)g(to)h(deal)f(with)g +(an)g(o)s(dd)g(n)m(um)m(b)s(er)f(of)574 5347 y(digits)24 +b(b)s(ecause)h(the)g(caller)f(is)g(exp)s(ected)h(to)h(pro)m(vide)e +(prop)s(er)f(padding)g(to)j(an)f(ev)m(en)g(n)m(um)m(b)s(er)f(of)574 +5446 y(digits.)38 b(\(Since)23 b(Co)s(de-128)i(includes)d(con)m(trol)j +(sym)m(b)s(ols)d(to)j(switc)m(h)f(c)m(harset,)j(it)c(is)g +(theoretically)574 5546 y(p)s(ossible)29 b(to)j(represen)m(t)f(the)h(o) +s(dd)e(digit)g(as)h(a)g(Co)s(de)g(128-A)i(or)e(128-B)i(sym)m(b)s(ol,)e +(but)f(this)g(to)s(ol)574 5645 y(do)s(esn't)h(curren)m(tly)e(implemen)m +(t)g(this)g(option\).)p eop +%%Page: 8 9 +8 8 bop 94 -116 a Fl(Chapter)30 b(6:)41 b(Supp)s(orted)29 +b(Enco)s(dings)2417 b(8)94 365 y Fh(co)s(de)31 b(128)h(ra)m(w)574 +465 y Fl(Co)s(de-128)24 b(output)d(represen)m(ted)h(sym)m(b)s(ol-b)m +(y-sym)m(b)s(ol)e(in)h(the)h(input)f(string.)36 b(T)-8 +b(o)23 b(o)m(v)m(erride)f(part)574 565 y(of)27 b(the)g(problems)d +(outlined)h(b)s(elo)m(w)g(in)g(sp)s(ecifying)f(co)s(de128)k(sym)m(b)s +(ols,)e(this)f(pseudo-enco)s(ding)574 664 y(allo)m(ws)42 +b(the)h(used)f(to)h(sp)s(ecify)e(a)i(list)e(of)i(co)s(de128)h(sym)m(b)s +(ols)d(separated)i(b)m(y)g(spaces.)77 b(Eac)m(h)574 764 +y(sym)m(b)s(ol)31 b(is)g(represen)m(ted)h(b)m(y)g(a)g(n)m(um)m(b)s(er)f +(in)g(the)h(range)g(0-105.)48 b(The)31 b(list)g(should)f(include)g(the) +574 863 y(leading)e(c)m(haracter.The)i(c)m(hec)m(ksum)g(and)e(the)h +(stop)g(c)m(haracter)h(are)f(automatically)g(added)f(b)m(y)574 +963 y(the)k(library)-8 b(.)42 b(Most)33 b(lik)m(ely)d(this)g +(pseudo-enco)s(ding)g(will)f(b)s(e)i(used)f(with)g Fj(BARCODE_NO_ASCII) +574 1063 y Fl(and)g(some)h(external)f(program)g(to)i(supply)27 +b(the)k(prin)m(ted)e(text.)94 1245 y Fh(co)s(de)37 b(39)180 +b Fl(The)36 b(co)s(de-39)h(standard)f(can)g(enco)s(de)g(upp)s(ercase)g +(letters,)i(digits,)e(the)g(blank)f(space,)k(plus,)574 +1345 y(min)m(us,)d(dot,)i(star,)f(dollar,)f(slash,)g(p)s(ercen)m(t.)57 +b(An)m(y)36 b(string)f(that)h(is)f(only)g(comp)s(osed)g(of)h(suc)m(h) +574 1445 y(c)m(haracters)j(is)e(accepted)h(b)m(y)g(the)f(co)s(de-39)i +(enco)s(der.)61 b(T)-8 b(o)38 b(a)m(v)m(oid)g(lo)s(osing)e +(information,)i(the)574 1544 y(enco)s(der)c(refuses)g(to)h(enco)s(de)f +(mixed-case)g(strings)f(\(a)i(lo)m(w)m(ercase)g(string)e(is)g +(nonetheless)h(ac-)574 1644 y(cepted)d(as)g(a)g(shortcut,)f(but)g(is)f +(enco)s(ded)h(as)h(upp)s(ercase\).)94 1826 y Fh(in)m(terlea)m(v)m(ed)g +(2)g(of)g(5)574 1926 y Fl(This)36 b(enco)s(ding)g(can)i(only)e +(represen)m(t)h(an)g(ev)m(en)h(n)m(um)m(b)s(er)e(of)h(digits)f(\(o)s +(dd)h(digits)f(are)h(repre-)574 2026 y(sen)m(ted)c(b)m(y)g(bars,)f(and) +g(ev)m(en)h(digits)e(b)m(y)i(the)f(in)m(terlea)m(ving)g(spaces\).)48 +b(The)32 b(name)g(stresses)h(the)574 2125 y(fact)i(that)g(t)m(w)m(o)g +(of)f(the)g(\014v)m(e)g(items)f(\(bars)h(or)f(spaces\))i(allo)s(cated)f +(to)g(eac)m(h)h(sym)m(b)s(ol)e(are)h(wide,)574 2225 y(while)41 +b(the)i(rest)g(are)g(narro)m(w.)78 b(The)42 b(c)m(hec)m(ksum)h(digit)f +(is)g(optional)f(\(can)j(b)s(e)e(disabled)e(via)574 2325 +y Fj(BARCODE_NO_CHECKSUM)p Fl(\).)f(Since)31 b(the)h(n)m(um)m(b)s(er)e +(of)h(digits,)g(including)d(the)j(c)m(hec)m(ksum,)i(m)m(ust)574 +2424 y(b)s(e)40 b(ev)m(en,)k(a)c(leading)f(zero)i(is)e(inserted)g(in)g +(the)i(string)e(b)s(eing)g(enco)s(ded)g(if)h(needed)f(\(this)h(is)574 +2524 y(sp)s(eci\014cally)29 b(stated)i(in)e(the)h(sp)s(ecs)g(I)g(ha)m +(v)m(e)i(access)g(to\).)94 2707 y Fh(co)s(de)f(128)136 +b Fl(Automatic)31 b(selection)g(b)s(et)m(w)m(een)g(alphab)s(et)f(A,)h +(B)g(and)f(C)h(of)g(the)g(Co)s(de-128)h(standard.)41 +b(This)574 2806 y(enco)s(ding)31 b(can)i(represen)m(t)f(all)f(ASCI)s(I) +f(sym)m(b)s(ols,)i(from)f(0)h(\(NUL\))h(to)g(127)g(\(DEL\),)g(as)g(w)m +(ell)e(as)574 2906 y(four)36 b(sp)s(ecial)e(sym)m(b)s(ols,)i(named)f +(F1,)j(F2,)g(F3,)g(F4.)58 b(The)35 b(set)h(of)g(sym)m(b)s(ols)f(a)m(v) +-5 b(ailable)35 b(in)f(this)574 3005 y(enco)s(ding)g(is)f(not)i(easily) +e(represen)m(ted)i(as)f(input)e(to)k(the)e Fg(b)-5 b(ar)g(c)g(o)g(de)44 +b Fl(library)-8 b(,)33 b(so)i(the)f(follo)m(wing)574 +3105 y(con)m(v)m(en)m(tion)24 b(is)e(used.)38 b(In)22 +b(the)g(input)f(string,)j(whic)m(h)d(is)h(a)h(C-language)g(n)m +(ull-terminated)e(string,)574 3205 y(the)26 b(NUL)g(c)m(har)f(is)g +(represen)m(ted)g(b)m(y)h(the)f(v)-5 b(alue)25 b(128)i(\(0x80,)h +(0200\))g(and)d(the)g(F1-F4)i(c)m(haracters)574 3304 +y(are)f(represen)m(ted)g(b)m(y)f(the)h(v)-5 b(alues)25 +b(193-196)k(\(0xc1-0xc4,)h(0301-0304\).)43 b(The)25 b(v)-5 +b(alues)25 b(ha)m(v)m(e)i(b)s(een)574 3404 y(c)m(hosen)k(to)h(ease)f +(their)e(represen)m(tation)i(as)f(escap)s(e)h(sequences.)574 +3545 y(Since)39 b(the)h(shell)d(do)s(esn't)j(seem)f(to)i(in)m(terpret)d +(escap)s(e)i(sequences)g(on)f(the)h(command)f(line,)574 +3645 y(the)e Fj(")p Fl(-b)p Fj(")e Fl(option)g(cannot)h(b)s(e)f(easily) +g(used)g(to)i(designate)f(the)g(strings)f(to)h(b)s(e)f(enco)s(ded.)57 +b(As)574 3744 y(a)44 b(w)m(ork)-5 b(around)42 b(y)m(ou)i(can)f(resort)h +(to)f(the)h(command)f Fj(echo)p Fl(,)i(either)e(within)d(bac)m(k-tic)m +(ks)45 b(or)574 3844 y(used)34 b(separately)g(to)g(create)i(a)e(\014le) +f(that)i(is)e(then)g(fed)h(to)h(the)f(standard-input)d(of)j +Fg(b)-5 b(ar)g(c)g(o)g(de)44 b Fl({)574 3944 y(assuming)34 +b(y)m(our)h Fj(echo)f Fl(command)h(pro)s(cesses)g(escap)s(e)h +(sequences.)56 b(The)34 b(newline)f(c)m(haracter)574 +4043 y(is)d(esp)s(ecially)f(though)h(to)h(enco)s(de)f(\(but)g(not)h +(imp)s(ossible)c(unless)h(y)m(ou)j(use)f(a)h Fj(csh)e +Fl(v)-5 b(arian)m(t.)574 4184 y(These)35 b(problems)f(only)g(apply)g +(to)i(the)f(command-line)f(to)s(ol;)j(the)f(use)e(of)i(library)c +(functions)574 4284 y(do)s(esn't)44 b(giv)m(e)f(an)m(y)h(problem.)78 +b(In)42 b(needed,)47 b(y)m(ou)c(can)h(use)f(the)h(\\)p +Fg(c)-5 b(o)g(de)46 b(128)f(r)-5 b(aw)10 b Fl(")45 b(pseudo-)574 +4384 y(enco)s(ding)33 b(to)h(represen)m(t)g(co)s(de128)h(sym)m(b)s(ols) +d(b)m(y)h(their)g(n)m(umerical)f(v)-5 b(alue.)50 b(This)31 +b(enco)s(ding)i(is)574 4483 y(used)28 b(late)h(in)e(the)h +(auto-selection)i(mec)m(hanism)d(b)s(ecause)h(\(almost\))i(an)m(y)e +(input)f(string)g(can)i(b)s(e)574 4583 y(represen)m(ted)i(using)e(co)s +(de128.)94 4765 y Fh(Co)s(dabar)138 b Fl(Co)s(dabar)33 +b(can)h(enco)s(de)g(the)g(ten)f(digits)g(and)g(a)h(few)f(sp)s(ecial)f +(sym)m(b)s(ols)g(\(min)m(us,)i(plus,)e(dollar,)574 4865 +y(colon,)k(bar,)g(dot\).)54 b(The)34 b(c)m(haracters)i(\\)p +Fj(A)p Fl(",)h(\\)p Fj(B)p Fl(",)f(\\)p Fj(C)p Fl(")f(and)g(\\)p +Fj(D)p Fl(")g(are)g(used)f(to)h(represen)m(t)g(four)574 +4965 y(di\013eren)m(t)30 b(start/stop)i(c)m(haracters.)42 +b(The)30 b(input)e(string)i(to)h(the)f(barco)s(de)h(library)d(can)i +(include)574 5064 y(the)d(start)g(and)f(stop)h(c)m(haracters)h(or)e +(not)h(include)d(them)j(\(in)e(whic)m(h)h(case)h(\\)p +Fj(A)p Fl(")g(is)f(used)g(as)g(start)574 5164 y(and)38 +b(\\)p Fj(B)p Fl(")g(as)g(stop\).)64 b(Start)38 b(and)f(stop)h(c)m +(haracters)h(in)e(the)h(input)e(string)g(can)j(b)s(e)e(either)g(all)574 +5264 y(lo)m(w)m(ercase)32 b(or)f(all)e(upp)s(ercase)g(and)h(are)h(alw)m +(a)m(ys)g(prin)m(ted)e(as)h(upp)s(ercase.)94 5446 y Fh(Plessey)192 +b Fl(Plessey)39 b(barco)s(des)f(can)h(enco)s(de)g(all)f(the)h +(hexadecimal)f(digits.)64 b(Alphab)s(etic)37 b(digits)g(in)h(the)574 +5546 y(input)25 b(string)g(m)m(ust)h(either)g(b)s(e)f(all)g(lo)m(w)m +(ercase)j(or)e(all)f(upp)s(ercase.)38 b(The)26 b(output)g(text)h(is)e +(alw)m(a)m(ys)574 5645 y(upp)s(ercase.)p eop +%%Page: 9 10 +9 9 bop 94 -116 a Fl(Chapter)30 b(7:)41 b(PCL)30 b(Output)2761 +b(9)94 365 y Fh(MSI)313 b Fl(MSI)39 b(can)g(only)e(enco)s(de)i(the)g +(decimal)e(digits.)64 b(While)38 b(the)h(standard)e(sp)s(eci\014es)h +(either)g(one)574 465 y(or)e(t)m(w)m(o)h(c)m(hec)m(k)g(digits,)e(the)h +(curren)m(t)f(implemen)m(tation)f(in)g(this)g(library)f(only)i +(generates)i(one)574 565 y(c)m(hec)m(k)32 b(digit.)94 +701 y Fh(co)s(de)f(93)180 b Fl(The)30 b(co)s(de-93)h(standard)f(can)g +(nativ)m(ely)g(enco)s(de)g(48)h(di\013eren)m(t)e(c)m(haracters,)j +(including)27 b(upp)s(er-)574 801 y(case)39 b(letters,)h(digits,)e(the) +g(blank)e(space,)k(plus,)e(min)m(us,)g(dot,)h(star,)h(dollar,)e(slash,) +h(p)s(ercen)m(t,)574 901 y(as)31 b(w)m(ell)f(as)g(\014v)m(e)h(sp)s +(ecial)e(c)m(haracters:)43 b(a)30 b(start/stop)i(delimiter)c(and)i +(four)g Fj(")p Fl(shift)f(c)m(haracters)p Fj(")574 1000 +y Fl(used)f(for)f(extended)h(enco)s(ding.)39 b(Using)27 +b(this)g Fj(")p Fl(extended)g(enco)s(ding)p Fj(")g Fl(metho)s(d,)h(an)m +(y)g(standard)574 1100 y(7-bit)34 b(ASCI)s(I)e(c)m(haracter)k(can)e(b)s +(e)f(enco)s(ded,)i(but)e(it)h(tak)m(es)h(up)e(t)m(w)m(o)i(sym)m(b)s(ol) +d(lengths)i(in)e(bar-)574 1200 y(co)s(de)k(if)f(the)g(c)m(haracter)j +(is)c(not)i(nativ)m(ely)f(supp)s(orted)f(\(one)i(of)g(the)f(48\).)58 +b(The)35 b(enco)s(der)g(here)574 1299 y(fully)24 b(implemen)m(ts)g(the) +i(co)s(de)g(93)g(enco)s(ding)f(standard.)38 b(An)m(y)26 +b(c)m(haracters)h(nativ)m(ely)e(supp)s(orted)574 1399 +y(\(A-Z,)35 b(0-9,)h Fj(")p Fl(.)p Fj(+)p Fl(-/$&\045)p +Fj(")p Fl(\))e(will)d(b)s(e)j(enco)s(ded)f(as)h(suc)m(h)g(-)g(for)f(an) +m(y)h(other)h(c)m(haracters)g(\(suc)m(h)f(as)574 1498 +y(lo)m(w)m(er)h(case)g(letters,)g(brac)m(k)m(ets,)h(paren)m(theses,)g +(etc.\),)h(the)d(enco)s(der)f(will)f(rev)m(ert)i(to)h(extended)574 +1598 y(enco)s(ding.)68 b(As)40 b(a)g(note,)j(the)d(option)f(to)h +(exclude)f(the)h(c)m(hec)m(ksum)g(will)d(eliminate)i(the)h(t)m(w)m(o) +574 1698 y(mo)s(dulo-47)f(c)m(hec)m(ksums)g(\(called)g(C)f(and)g(K\))h +(from)f(the)h(barco)s(de,)i(but)d(this)g(probably)f(will)574 +1797 y(mak)m(e)c(it)e(unreadable)e(b)m(y)i(99\045)h(of)g(all)e +(scanning)g(systems.)43 b(These)31 b(c)m(hec)m(ksums)h(are)g(sp)s +(eci\014ed)574 1897 y(to)f(b)s(e)e(used)g(at)i(the)f(\014rm)m(w)m(are)f +(lev)m(el,)h(and)f(their)g(absence)h(will)d(b)s(e)j(in)m(terpreted)f +(as)h(an)f(in)m(v)-5 b(alid)574 1997 y(barco)s(de.)94 +2266 y Fi(7)81 b(PCL)53 b(Output)219 2459 y Fl(While)28 +b(the)h(default)g(output)f(is)g(P)m(ostscript)i(\(p)s(ossibly)c(EPS\),) +j(and)g(P)m(ostscript)g(can)g(b)s(e)f(p)s(ost-pro)s(cessed)94 +2558 y(to)40 b(almost)e(an)m(ything,)i(it)e(is)f(sometimes)i(desirable) +d(to)j(create)h(output)e(directly)f(usable)g(b)m(y)i(the)f(sp)s +(eci\014c)94 2658 y(prin)m(ter)33 b(at)h(hand.)50 b(PCL)33 +b(is)g(curren)m(tly)f(supp)s(orted)g(as)i(an)g(output)f(format)h(for)g +(this)e(reason.)51 b(Please)34 b(note)94 2758 y(that)25 +b(the)f(Y)g(co)s(ordinate)g(for)f(PCL)h(go)s(es)g(from)f(top)i(to)f(b)s +(ottom,)i(while)c(for)h(P)m(ostscript)h(it)g(go)s(es)g(from)g(b)s +(ottom)94 2857 y(to)35 b(top.)51 b(Consisten)m(tly)-8 +b(,)34 b(while)d(in)i(P)m(ostscript)g(y)m(ou)h(sp)s(ecify)f(the)g(b)s +(ottom-left)i(corner)e(as)h(origin,)f(for)h(PCL)94 2957 +y(y)m(ou)d(sp)s(ecify)e(the)i(top-left)f(corner.)219 +3075 y(Barco)s(de)c(output)e(for)h(PCL)f(Prin)m(ters)g(\(HP)h(LaserJet) +g(and)g(compatibles\),)g(w)m(as)h(dev)m(elop)s(ed)e(using)f(PCL5)94 +3175 y(Reference)32 b(man)m(uals)d(from)h(HP)-8 b(.)31 +b(that)g(really)e(refers)h(to)h(these)g(prin)m(ters:)169 +3293 y Fb(\017)60 b Fl(LaserJet)31 b(I)s(I)s(I,)f(I)s(I)s(I)e(P)-8 +b(,)31 b(I)s(I)s(I)e(D,)i(I)s(I)s(I)e(Si,)169 3411 y +Fb(\017)60 b Fl(LaserJet)31 b(4)g(family)169 3529 y Fb(\017)60 +b Fl(LaserJet)31 b(5)g(family)169 3648 y Fb(\017)60 b +Fl(LaserJet)31 b(6)g(family)169 3766 y Fb(\017)60 b Fl(Color)30 +b(LaserJet)169 3884 y Fb(\017)60 b Fl(DeskJet)32 b(1200)g(and)e(1600.) +219 4021 y(Ho)m(w)m(ev)m(er,)g(barco)s(de)e(prin)m(ting)d(uses)i(a)h(v) +m(ery)g(small)e(subset)h(of)g(PCL,)g(probably)f(also)h(LaserJet)h(I)s +(I)f(should)94 4121 y(prin)m(t)i(it)h(without)g(problem,)f(but)g(the)i +(resulting)e(text)i(ma)m(y)g(b)s(e)f(horrible.)219 4239 +y(The)22 b(only)g(real)h(di\013erence)f(from)h(one)g(prin)m(ter)e(to)j +(another)f(really)f(dep)s(ends)f(on)h(whic)m(h)g(fon)m(t)h(are)h(a)m(v) +-5 b(ailable)94 4338 y(in)30 b(the)g(prin)m(ter,)f(used)h(in)f(prin)m +(ting)f(the)j(lab)s(el)d(asso)s(ciated)j(to)g(the)g(bars)f(\(if)f +(requested\).)219 4457 y(Earlier)j(LaserJet)j(supp)s(orts)d(only)h +(bitmaps)f(fon)m(ts,)k(so)e(these)g(are)h(not)f Fj(")p +Fl(scalable)p Fj(")p Fl(.)50 b(\(Ljet)35 b(I)s(I)e(?\),)i(Also)94 +4556 y(these)c(fon)m(ts,)f(when)f(a)m(v)-5 b(ailable,)29 +b(ha)m(v)m(e)i(a)f(sp)s(eci\014ed)e(direction,)h(and)g(not)h(all)f(of)g +(them)h(are)g(a)m(v)-5 b(ailable)29 b(in)g(b)s(oth)94 +4656 y(P)m(ortrait)i(and)f(Landscap)s(e)g(mo)s(de.)219 +4774 y(F)-8 b(rom)23 b(LaserJet)g(4)f(series,)i(\(except)g(4L/5L)f +(that)g(are)g(en)m(try-lev)m(el)f(prin)m(ters\),)h(Arial)e(scalable)h +(fon)m(t)h(should)94 4874 y(b)s(e)30 b(a)m(v)-5 b(ailable,)30 +b(so)h(it's)f(the)g Fj(")p Fl(default)g(fon)m(t)p Fj(")g +Fl(used)g(b)m(y)g(this)f(program.)219 4992 y(LaserJet)41 +b(I)s(I)s(I)d(series)i(prin)m(ters)e(\(and)i(4L,)g(5L\),)h(don't)f +(feature)h Fj(")p Fl(Arial)p Fj(")d Fl(as)i(a)h(residen)m(t)e(fon)m(t,) +k(so)e(y)m(ou)94 5092 y(should)27 b(use)i Fj(BARCODE_OUT_PCL_III)23 +b Fl(instead)28 b(of)h Fj(BARCODE_OUT_PCL.)p Fl(,)c(and)j(fon)m(t)h +(the)g(fon)m(t)h(used)d(will)g(b)s(e)94 5191 y Fj(")p +Fl(Univ)m(ers)p Fj(")j Fl(instead)f(of)i Fj(")p Fl(Arial)p +Fj(")p Fl(.)219 5309 y(Results)26 b(on)i(compatible)e(prin)m(ters,)h +(ma)m(y)h(dep)s(end)d(on)i(consistency)g(of)h(PCL5)f(compatibilit)m(y) +-8 b(,)26 b(in)g(doubt,)94 5409 y(try)31 b(BAR)m(CODE)p +713 5409 28 4 v 33 w(OUT)p 951 5409 V 32 w(PCL)p 1168 +5409 V 32 w(I)s(I)s(I)219 5527 y(PJL)f(commands)g(are)g(not)h(used)f +(here,)g(as)h(it's)f(not)g(v)m(ery)h(compatible.)219 +5645 y(T)-8 b(ested)31 b(Prin)m(ters:)p eop +%%Page: 10 11 +10 10 bop 94 -116 a Fl(Chapter)30 b(8:)41 b(Bugs)31 b(and)f(P)m(ending) +f(Issues.)2211 b(10)169 365 y Fb(\017)60 b Fl(Hp)30 b(LaserJet)h(4050) +169 490 y Fb(\017)60 b Fl(Hp)30 b(LaserJet)h(2100)169 +614 y Fb(\017)60 b Fl(Epson)30 b(N-1200)j(em)m(ul)c(PCL)169 +739 y Fb(\017)60 b Fl(T)-8 b(oshiba)30 b(DP2570)i(\(copier\))f +Fj(+)f Fl(PCL)g(option)169 863 y Fb(\017)60 b Fl(Epson)30 +b(EPL-7100)i(em)m(ul.)40 b(HP)30 b(LaserJet)h(I)s(I:)f(bars)g(prin)m(t) +f(\014ne)g(but)h(text)i(is)d(bad.)94 1146 y Fi(8)81 b(Bugs)52 +b(and)i(P)l(ending)f(Issues.)219 1370 y Fl(The)42 b(curren)m(t)g +(managemen)m(t)h(of)g(b)s(orders/margins)d(is)h(far)h(from)g(optimal.) +75 b(The)42 b(\\default")g(margin)94 1469 y(applied)d(b)m(y)h(the)h +(library)d(in)m(terferes)i(with)f(the)i(external)g(represen)m(tation,)i +(but)d(I)g(feel)g(it)g(is)g(mandatory)94 1569 y(to)f(a)m(v)m(oid)f +(creating)g(barco)s(de)f(output)h(with)e(no)i(surrounding)c(white)j +(space)h(\(the)g(problem)e(is)h(esp)s(ecially)94 1669 +y(relev)-5 b(an)m(t)31 b(for)f(EPS)g(output\).)219 1793 +y(EAN-128)44 b(is)d(not)h(\(y)m(et\))i(supp)s(orted.)73 +b(I)42 b(plan)e(to)j(implemen)m(t)e(it)g(prett)m(y)h(so)s(on)g(and)f +(then)h(bless)f(the)94 1893 y(pac)m(k)-5 b(age)33 b(as)d(v)m(ersion)g +(1.0.)p eop +%%Page: -1 12 +-1 11 bop 3849 -116 a Fl(i)94 365 y Fi(T)-13 b(able)55 +b(of)e(Con)l(ten)l(ts)94 697 y Fk(Barco)t(de)45 b(to)t(ols)16 +b Fa(.)k(.)g(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.) +f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g +(.)h(.)60 b Fk(1)94 955 y(1)135 b(Ov)l(erview)12 b Fa(.)21 +b(.)f(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h +(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.) +f(.)57 b Fk(1)94 1212 y(2)135 b(The)45 b(Underlying)g(Data)h(Structure) +41 b Fa(.)20 b(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)86 +b Fk(1)393 1337 y Fl(2.1)92 b(The)30 b(Fields)19 b Fg(.)14 +b(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)49 +b Fl(1)692 1436 y(Use)31 b(of)g(the)f Fg(width)39 b Fl(and)30 +b Fg(sc)-5 b(alef)50 b Fl(\014elds.)25 b Fg(.)15 b(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)56 b Fl(2)393 1536 y(2.2)92 b(The)30 b(In)m(termediate)h +(Represen)m(tation)24 b Fg(.)15 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)54 b Fl(3)94 1768 y Fk(3)135 b(The)45 b(Flags)28 +b Fa(.)20 b(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f +(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.) +f(.)g(.)73 b Fk(3)94 2026 y(4)135 b(F)-11 b(unctions)44 +b(Exp)t(orted)h(b)l(y)g(the)g(Library)37 b Fa(.)19 b(.)h(.)f(.)g(.)h(.) +f(.)h(.)f(.)h(.)f(.)g(.)81 b Fk(4)94 2283 y(5)135 b(The)45 +b Fa(b)-7 b(ar)g(c)g(o)g(de)52 b Fk(fron)l(tend)46 b(program)11 +b Fa(.)19 b(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h +(.)55 b Fk(5)393 2408 y Fl(5.1)92 b(The)30 b(Command)g(Line)24 +b Fg(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)55 b Fl(5)94 2640 y Fk(6)135 +b(Supp)t(orted)44 b(Enco)t(dings)33 b Fa(.)20 b(.)f(.)g(.)h(.)f(.)h(.)f +(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.) +78 b Fk(7)94 2897 y(7)135 b(PCL)45 b(Output)40 b Fa(.)20 +b(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f +(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)85 +b Fk(9)94 3155 y(8)135 b(Bugs)45 b(and)f(P)l(ending)h(Issues.)36 +b Fa(.)19 b(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h +(.)f(.)g(.)h(.)79 b Fk(10)p eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/glabels2/barcode-0.98/doc/barcodedoc.txt b/glabels2/barcode-0.98/doc/barcodedoc.txt new file mode 100644 index 00000000..2d242f99 --- /dev/null +++ b/glabels2/barcode-0.98/doc/barcodedoc.txt @@ -0,0 +1,734 @@ + + +This is barcode.info, produced by makeinfo version 4.0b from +barcode.texinfo. + + This file is the User's Manual for the barcode library (version +0.98). + + + + +*Node: Overview + Overview + ******** + + The "barcode" package is mainly a C library for creating bar-code +output files. It also includes a command line front-end and (in a +foreseeable future) a graphic frontend. + + The package is designed as a library because we think the main use +for barcode-generation tools is inside more featured applications. The +library addresses bar code printing as two distinct problems: creation +of bar information and actual conversion to an output format. To this +aim we use an intermediate representation for bar codes, which is +currently documented in the `ps.c' source file (not in this document). + + Note that the library and the accompanying material is released +according to the GPL license, not the LGPL one. A copy of the GPL is +included in the distribution tarball. + + + + +*Node: The Barcode Object + The Underlying Data Structure + ***************************** + + Every barcode-related function acts on a data structure defined in +the `barcode.h' header, which must be included by any C source file +that uses the library. The header is installed by make install. + + The definition of the data structure is included here for reference: + + struct Barcode_Item { + int flags; /* type of encoding and other flags */ + char *ascii; /* malloced */ + char *partial; /* malloced too */ + char *textinfo; /* information about text placement */ + char *encoding; /* code name, filled by encoding engine */ + int width, height; /* output units */ + int xoff, yoff; /* output units */ + int margin; /* output units */ + double scalef; /* requested scaling for barcode */ + int error; /* an errno-like value, in case of failure */ + }; + + The exact meaning of each field and the various flags implemented are +described in the following sections. + + Even though you won't usually need to act on the contents of this +structure, some of the functions in the library receive arguments that +are directly related to one or more of these fields. + + + + +*Node: The Field List + The Fields + ========== + +`int flags;' + The flags are, as you may suspect, meant to specify the exact + behaviour of the library. They are often passed as an argument to + barcode functions and are discussed in the next section. + +`char *ascii;' +`char *partial;' +`char *textinfo;' +`char *encoding;' + These fields are internally managed by the library, and you are + not expected to touch them if you use the provided API. All of + them are allocated with malloc. + +`int width;' +`int height;' + They specify the width and height of the active barcode region + (i.e., excluding the white margin), in the units used to create + output data (for postscript they are points, 1/72th of an inch, + 0.352 mm). The fields can be either assigned to in the structure + or via Barcode_Position(), at your choice. If either value or + both are left to their default value of zero, the output engine + will assign default values according to the specified scaling + factor. If the specified width is bigger than needed (according to + the scaling factor), the output barcode will be centered in its + requested region. If either the width of the height are too small + for the specified scale factor, the output bar code will expand + symmetrically around the requested region. + +`int xoff;' +`int yoff;' + The fields specify offset from the coordinate origin of the output + engine (for postscript, position 0,0 is the lower left corner of + the page). The fields can be either assigned to in the structure + or via Barcode_Position(), at your choice. The offset specifies + where the white margin begins, not where the first bar will be + printed. To print real ink to the specified position you should + set margin to 0. + +`int margin;' + The white margin that will be left around the printed area of the + bar code. The same margin is applied to all sides of the printed + area. The default value for the margin is defined in `barcode.h' + as BARCODE_DEFAULT_MARGIN (10). + +`double scalef;' + The enlarge or shrink value for the bar code over its default + dimension. The width and scalef fields interact deeply in the + creation of the output, and a complete description of the issues + appears later in this section. + +`int error;' + The field is used when a barcode function fails to host an + errno-like integer value. + +Use of the width and scalef fields. +----------------------------------- + + A width unit is the width of the thinnest bar and/or space in the +chosen code; it defaults to 1 point if the output is postscript or +encapsulated postscript. + + Either or both the code width and the scale factor can be left +unspecified (i.e., zero). The library deals with defaults in the +following way: + +Both unspecified + If both the width and the scale factor are unspecified, the scale + factor will default to 1.0 and the width is calculated according + to the actual width of the bar code being printed. + +Width unspecified + If the width is not specified, it is calculated according to the + values of scalef. + +Scale factor unspecified + If the scale factor is not specified, it will be chosen so that + the generated bar code exactly fits the specified width. + +Both specified + The code will be printed inside the specified region according to + the specified scale factor. It will be aligned to the left. If, + however, the chosen width is too small for the specific bar code + and scaling factor, then the code will extend symmetrically to the + left and to the right of the chosen region. + + + + +*Node: The Intermediate Representation + The Intermediate Representation + =============================== + + The encoding functions print their output into the partial and +texinfo fields of the barcode data structure. Those fields, together +with position information, are then used to generate actual output. +This is an informal description of the intermediate format. + + The first char in partial tells how much extra space to add to the +left of the bars. For EAN-13, it is used to leave space to print the +first digit, other codes may have '0' for no-extra-space-needed. + + The next characters are alternating bars and spaces, as multiples of +the base dimension which is 1 unless the code is rescaled. Rescaling is +calculated as the ratio from the requested width and the calculated +width. Digits represent bar/space dimensions. Lower-case letters +represent those bars that should extend lower than the others: 'a' is +equivalent to '1', 'b' is '2' and so on up to 'i' which is equivalent to +'9'. Other letters will be used for encoding-specific meanings, as soon +as I implement them. + + The textinfo string is made up of fields %lf:%lf:%c separated by +blank space. The first integer is the x position of the character, the +second is the font size (before rescaling) and the char item is the +character to be printed. + + Both the partial and textinfo strings may include "-" or "+" as +special characters (in textinfo the char should be a stand-alone word). +They state where the text should be printed: below the bars ("-", +default) or above the bars. This is used, for example, to print the +add-5 and add-2 codes to the right of UPC or EAN codes (the add-5 +extension is mostly used in ISBN codes). + + + + +*Node: Supported Flags + The Flags + ********* + + The following flags are supported by version 0.98 of the library: + +`BARCODE_ENCODING_MASK' + The mask is used to extract the encoding-type identifier from the + flags field. + +`BARCODE_EAN' +`BARCODE_UPC' +`BARCODE_ISBN' +`BARCODE_128B' +`BARCODE_128C' +`BARCODE_128' +`BARCODE_128RAW' +`BARCODE_39' +`BARCODE_I25' +`BARCODE_CBR' +`BARCODE_MSI' +`BARCODE_PLS' +`BARCODE_93' + The currently supported encoding types: EAN (13 digits, 8 digits, + 13 + 2 add-on and 13 + 5 add-on), UPC (UPC-A, UPC-E, UPC-A with 2 + or 5 digit add-on), ISBN (with or without the 5-digit add-on), + CODE128-B (the whole set of printable ASCII characters), CODE128-C + (two digits encoded by each barcode symbol), CODE128 (all ASCII + values), a "raw-input" pseudo-code that generates CODE128 output, + CODE39 (alphanumeric), "interleaved 2 of 5" (numeric), Codabar + (numeric plus a few symbols), MSI (numeric) and Plessey (hex + digits). *Note Supported Encodings::. + +`BARCODE_ANY' + This special encoding type (represented by a value of zero, so it + will be the default) tells the encoding procedure to look for the + first encoding type that can deal with a textual string. + Therefore, a 11-digit code will be printed as UPC (as well as + 6-digit, 11+2 and 11+5), a 12-digit (or 7-digit, or 12+2 or 12+5) + as EAN13, an ISBN code (with or without hyphens, with or without + add-5) will be encoded in its EAN13 representation, an even number + of digits is encoded using CODE128C and a generic string is + encoded using CODE128B. Since code-39 offers a much larger + representation for the same text string, code128-b is preferred + over code39 for alphanumeric strings. + +`BARCODE_NO_ASCII' + Instructs the engine not to print the ascii string on output. By + default the bar code is accompanied with an ascii version of the + text it encodes. + +`BARCODE_NO_CHECKSUM' + Instructs the engine not to add the checksum character to the + output. Not all the encoding types can drop the checksum; those + where the checksum is mandatory (like EAN and UPC) just ignore the + flag. + +`BARCODE_OUTPUT_MASK' + The mask is used to extract the output-type identifier from the + flags field. + +`BARCODE_OUT_PS' +`BARCODE_OUT_EPS' +`BARCODE_OUT_PCL' +`BARCODE_OUT_PCL_III' + The currently supported encoding types: full-page postscript and + encapsulated postscript; PCL (print command language, for HP + printers) and PCL-III (same as PCL, but uses a font not available + on older printers). + +`BARCODE_OUT_NOHEADERS' + The flag instructs the printing engine not to print the header and + footer part of the file. This makes sense for the postscript + engine but might not make sense for other engines; such other + engines will silently ignore the flag just like the PCL back-end + does. + + + + +*Node: The API + Functions Exported by the Library + ********************************* + + The functions included in the barcode library are declared in the +header file barcode.h. They perform the following tasks: + +`struct Barcode_Item *Barcode_Create(char *text);' + The function creates a new barcode object to deal with a specified + text string. It returns NULL in case of failure and a pointer to + a barcode data structure in case of success. + +`int Barcode_Delete(struct Barcode_Item *bc);' + Destroy a barcode object. Always returns 0 (success) + +`int Barcode_Encode(struct Barcode_Item *bc, int flags);' + Encode the text included in the bc object. Valid flags are the + encoding type (other flags are ignored) and BARCODE_NO_CHECKSUM + (other flags are silently ignored); if the flag argument is zero, + bc->flags will apply. The function returns 0 on success and -1 in + case of error. After successful termination the data structure + will host the description of the bar code and its textual + representation, after a failure the error field will include the + reason of the failure. + +`int Barcode_Print(struct Barcode_Item *bc, FILE *f, int flags);' + Print the bar code described by bc to the specified file. Valid + flags are the output type, BARCODE_NO_ASCII and + BARCODE_OUT_NOHEADERS, other flags are ignored. If any of these + flags is zero, it will be inherited from bc->flags which therefore + takes precedence. The function returns 0 on success and -1 in case + of error (with bc->error set accordingly). In case of success, the + bar code is printed to the specified file, which won't be closed + after use. + +`int Barcode_Position(struct Barcode_Item *bc, int wid, int hei, int xoff, int yoff, double scalef);' + The function is a shortcut to assign values to the data structure. + +`int Barcode_Encode_and_Print(char *text, FILE *f, int wid, int hei, int xoff, int yoff, int flags);' + The function deals with the whole life of the barcode object by + calling the other functions; it uses all the specified flags. + +`int Barcode_Version(char *versionname);' + Returns the current version as an integer number of the form major + * 10000 + minor * 100 + release. Therefore, version 1.03.5 will be + returned as 10305 and version 0.53 as 5300. If the argument is + non-null, it will be used to return the version number as a + string. Note that the same information is available from two + preprocessor macros: BARCODE_VERSION (the string) and + BARCODE_VERSION_INT (the integer number). + + + + +*Node: The barcode Executable + The barcode frontend program + **************************** + + The barcode program is a front-end to access some features of the +library from the command line. It is able to read user supplied +strings from the command line or a data file (standard input by default) +and encode all of them. + + + + +*Node: The Command Line + The Command Line + ================ + + barcode accepts the following options: + +`--help or -h' + Print a usage summary and exit. + +`-i filename' + Identify a file where strings to be encoded are read from. If + missing (and if -b is not used) it defaults to standard input. + Each data line of the input file will be used to create one + barcode output. + +`-o filename' + Output file. It defaults to standard output. + +`-b string' + Specify a single "barcode" string to be encoded. The option can + be used multiple times in order to encode multiple strings (this + will result in multi-page postscript output or a table of barcodes + if -t is specified). The strings must match the encoding chosen; + if it doesn't match the program will print a warning to stderr and + generate "blank" output (although not zero-length). Please note + that a string including spaces or other special characters must be + properly quoted. + +`-e encoding' + encoding is the name of the chosen encoding format being used. It + defaults to the value of the environment variable BARCODE_ENCODING + or to auto detection if the environment is also unset. + +`-g geometry' + The geometry argument is of the form "[ x ] [+ + + ]" (with no intervening spaces). Unspecified + margin values will result in no margin; unspecified size results + in default size. The specified values represent print points by + default, and can be inches, millimeters or other units according + to the -u option or the BARCODE_UNIT environment variable. The + argument is used to place the printout code on the page. Note that + an additional white margin of 10 points is added to the printout. + If the option is unspecified, BARCODE_GEOMETRY is looked up in the + environment, if missing a default size and no margin (but the + default 10 points) are used. + +`-t table-geometry' + Used to print several barcodes to a single page, this option is + meant to be used to print stickers. The argument is of the form + " x [+ + [- + [- ]]]" (with no intervening spaces); if + missing, the top and right margin will default to be the same as + the bottom and left margin. The margins are specified in print + points or in the chosen unit (see -u below). If the option is not + specified, BARCODE_TABLE is looked up in the environment, + otherwise no table is printed and each barcode will get its own + page. The size (but not the position) of a barcode item within a + table can also be selected using -g (see "geometry" above), + without struggling with external and internal margins. I still + think management of geometries in a table is suboptimal, but I + can't make it better without introducing incompatibilities. + +`-m margin(s)' + Specifies an internal margin for each sticker in the table. The + argument is of the form "," and the margin is + applied symmetrically to the sticker. If unspecified, the + environment variable BARCODE_MARGIN is used or a default internal + margin of 10 points is used. + +`-n' + "Numeric" output: don't print the ASCII form of the code, only the + bars. + +`-c' + No checksum character (for encodings that allow it, like code 39, + other codes, like UPC or EAN, ignore this option). + +`-E' + Encapsulated postscript (default is normal postscript). When the + output is generated as EPS only one barcode is encoded. + +`-P' + PCL output. Please note that the Y direction goes from top to + bottom for PCL, and the origin for an image is the top-left corner + instead of the bottom-left + +`-p pagesize' + Specify a non-default page size. The page size can be specified in + millimeters, inches or plain numbers (for example: "210x297mm", + "8.5x11in", "595x842"). A page specification as numbers will be + interpreted according to the current unit specification (see -u + below). If libpaper is available, you can also specify the page + size with its name, like "A3" or "letter" (libpaper is a standard + component of Debian GNU/Linux, but may be missing elsewhere). The + default page size is your system-wide default if libpaper is + there, A4 otherwise. + +`-u unit' + Choose the unit used in size specifications. Accepted values are + "mm", "cm", "in" and "pt". By default, the program will check + BARCODE_UNIT in the environment, and assume points otherwise (this + behaviour is compatible with 0.92 and previous versions. If -u + appears more than once, each instance will modified the behaviour + for the arguments at its right, as the command line is processes + left to right. The program internally works with points, and any + size is approximated to the nearest multiple of one point. The -u + option affect -g (geometry), -t (table) and -p (page size). + + + + +*Node: Supported Encodings + Supported Encodings + ******************* + + The program encodes text strings passed either on the command line +(with -b) or retrieved from standard input. The text representation is +interpreted according to the following rules. When auto-detection of +the encoding is enabled (i.e, no explicit encoding type is specified), +the encoding types are scanned to find one that can digest the text +string. The following list of supported types is sorted in the same +order the library uses when auto-detecting a suitable encoding for a +string. + +EAN + The EAN frontend is similar to UPC; it accepts strings of digits, + 12 or 7 characters long. Strings of 13 or 8 characters are + accepted if the provided checksum digit is correct. I expect most + users to feed input without a checksum, though. The add-2 and + add-5 extension are accepted for both the EAN-13 and the EAN-8 + encodings. The following are example of valid input strings: + "123456789012" (EAN-13), "1234567890128" (EAN-13 wih checksum), + "1234567" (EAN-8), "12345670 12345" (EAN-8 with checksum and + add-5), "123456789012 12" (EAN-13 with add-2), "123456789012 + 12345" (EAN-13 with add-5). + +UPC + The UPC frontend accepts only strings made up of digits (and, if a + supplemental encoding is used, a blank to separate it). It + accepts strings of 11 or 12 digits (UPC-A) and 6 or 7 or 8 digits + (UPC-E). + + The 12th digit of UPC-A is the checksum and is added by the + library if not specified in the input; if it is specified, it must + be the right checksum or the code is rejected as invalid. For + UPC-E, 6 digit are considered to be the middle part of the code, a + leading 0 is assumed and the checksum is added; 7 digits are + either considered the initial part (leading digit 0 or 1, checksum + missing) or the final part (checksum specified, leading 0 + assumed); 8 digits are considered to be the complete code, with + leading 0 or 1 and checksum. For both UPC-A and UPC-E, a trailing + string of 2 digits or 5 digits is accepted as well. Therefore, the + following are examples of valid strings that can be encoded as UPC: + "01234567890" (UPC-A) "012345678905" (UPC-A with checksum), + "012345" (UPC-E), "01234567890 12" (UPC-A, add-2) and "01234567890 + 12345" (UPC-A, add-5), "0123456 12" (UPC-E, add-2). Please note + that when setting BARCODE_ANY to auto-detect the encoding to be + used, 12-digit strings and 7-digit strings will always be + identified as EAN. This because I expect most user to provide + input without a checksum. If you need to specify UPC-with-checksum + as input you must explicitly set BARCODE_UPC as a flag or use -e + upc on the command line. + +ISBN + ISBN numbers are encoded as EAN-13 symbols, with an optional add-5 + trailer. The ISBN frontend of the library accepts real ISBN + numbers and deals with any hyphen and, if present, the ISBN + checksum character before encoding data. Valid representations for + ISBN strings are for example: "1-56592-292-1", "3-89721-122-X" and + "3-89721-122-X 06900". + +CODE 128-B + This encoding can represent all of the printing ASCII characters, + from the space (32) to DEL (127). The checksum digit is mandatory + in this encoding. + +CODE 128-C + The "C" variation of Code-128 uses Code-128 symbols to represent + two digits at a time (Code-128 is made up of 104 symbols whose + interpretation is controlled by the start symbol being used). Code + 128-C is thus the most compact way to represent any even number of + digits. The encoder refuses to deal with an odd number of digits + because the caller is expected to provide proper padding to an + even number of digits. (Since Code-128 includes control symbols to + switch charset, it is theoretically possible to represent the odd + digit as a Code 128-A or 128-B symbol, but this tool doesn't + currently implement this option). + +CODE 128 RAW + Code-128 output represented symbol-by-symbol in the input string. + To override part of the problems outlined below in specifying + code128 symbols, this pseudo-encoding allows the used to specify a + list of code128 symbols separated by spaces. Each symbol is + represented by a number in the range 0-105. The list should + include the leading character.The checksum and the stop character + are automatically added by the library. Most likely this + pseudo-encoding will be used with BARCODE_NO_ASCII and some + external program to supply the printed text. + +CODE 39 + The code-39 standard can encode uppercase letters, digits, the + blank space, plus, minus, dot, star, dollar, slash, percent. Any + string that is only composed of such characters is accepted by the + code-39 encoder. To avoid loosing information, the encoder refuses + to encode mixed-case strings (a lowercase string is nonetheless + accepted as a shortcut, but is encoded as uppercase). + +INTERLEAVED 2 OF 5 + This encoding can only represent an even number of digits (odd + digits are represented by bars, and even digits by the + interleaving spaces). The name stresses the fact that two of the + five items (bars or spaces) allocated to each symbol are wide, + while the rest are narrow. The checksum digit is optional (can be + disabled via BARCODE_NO_CHECKSUM). Since the number of digits, + including the checksum, must be even, a leading zero is inserted + in the string being encoded if needed (this is specifically stated + in the specs I have access to). + +CODE 128 + Automatic selection between alphabet A, B and C of the Code-128 + standard. This encoding can represent all ASCII symbols, from 0 + (NUL) to 127 (DEL), as well as four special symbols, named F1, F2, + F3, F4. The set of symbols available in this encoding is not + easily represented as input to the barcode library, so the + following convention is used. In the input string, which is a + C-language null-terminated string, the NUL char is represented by + the value 128 (0x80, 0200) and the F1-F4 characters are + represented by the values 193-196 (0xc1-0xc4, 0301-0304). The + values have been chosen to ease their representation as escape + sequences. + + Since the shell doesn't seem to interpret escape sequences on the + command line, the "-b" option cannot be easily used to designate + the strings to be encoded. As a workaround you can resort to the + command echo, either within back-ticks or used separately to + create a file that is then fed to the standard-input of barcode - + assuming your echo command processes escape sequences. The + newline character is especially though to encode (but not + impossible unless you use a csh variant. + + These problems only apply to the command-line tool; the use of + library functions doesn't give any problem. In needed, you can use + the "code 128 raw" pseudo-encoding to represent code128 symbols by + their numerical value. This encoding is used late in the + auto-selection mechanism because (almost) any input string can be + represented using code128. + +CODABAR + Codabar can encode the ten digits and a few special symbols + (minus, plus, dollar, colon, bar, dot). The characters "A", "B", + "C" and "D" are used to represent four different start/stop + characters. The input string to the barcode library can include + the start and stop characters or not include them (in which case + "A" is used as start and "B" as stop). Start and stop characters + in the input string can be either all lowercase or all uppercase + and are always printed as uppercase. + +PLESSEY + Plessey barcodes can encode all the hexadecimal digits. Alphabetic + digits in the input string must either be all lowercase or all + uppercase. The output text is always uppercase. + +MSI + MSI can only encode the decimal digits. While the standard + specifies either one or two check digits, the current + implementation in this library only generates one check digit. + +CODE 93 + The code-93 standard can natively encode 48 different characters, + including uppercase letters, digits, the blank space, plus, minus, + dot, star, dollar, slash, percent, as well as five special + characters: a start/stop delimiter and four "shift characters" + used for extended encoding. Using this "extended encoding" + method, any standard 7-bit ASCII character can be encoded, but it + takes up two symbol lengths in barcode if the character is not + natively supported (one of the 48). The encoder here fully + implements the code 93 encoding standard. Any characters natively + supported (A-Z, 0-9, ".+-/$&%") will be encoded as such - for any + other characters (such as lower case letters, brackets, + parentheses, etc.), the encoder will revert to extended encoding. + As a note, the option to exclude the checksum will eliminate the + two modulo-47 checksums (called C and K) from the barcode, but this + probably will make it unreadable by 99% of all scanning systems. + These checksums are specified to be used at the firmware level, + and their absence will be interpreted as an invalid barcode. + + + + +*Node: PCL Output + PCL Output + ********** + + While the default output is Postscript (possibly EPS), and Postscript +can be post-processed to almost anything, it is sometimes desirable to +create output directly usable by the specific printer at hand. PCL is +currently supported as an output format for this reason. Please note +that the Y coordinate for PCL goes from top to bottom, while for +Postscript it goes from bottom to top. Consistently, while in +Postscript you specify the bottom-left corner as origin, for PCL you +specify the top-left corner. + + Barcode output for PCL Printers (HP LaserJet and compatibles), was +developed using PCL5 Reference manuals from HP. that really refers to +these printers: + * LaserJet III, III P, III D, III Si, + + * LaserJet 4 family + + * LaserJet 5 family + + * LaserJet 6 family + + * Color LaserJet + + * DeskJet 1200 and 1600. + + + However, barcode printing uses a very small subset of PCL, probably +also LaserJet II should print it without problem, but the resulting +text may be horrible. + + The only real difference from one printer to another really depends +on which font are available in the printer, used in printing the label +associated to the bars (if requested). + + Earlier LaserJet supports only bitmaps fonts, so these are not +"scalable". (Ljet II ?), Also these fonts, when available, have a +specified direction, and not all of them are available in both Portrait +and Landscape mode. + + From LaserJet 4 series, (except 4L/5L that are entry-level printers), +Arial scalable font should be available, so it's the "default font" +used by this program. + + LaserJet III series printers (and 4L, 5L), don't feature "Arial" as a +resident font, so you should use BARCODE_OUT_PCL_III instead of +BARCODE_OUT_PCL., and font the font used will be "Univers" instead of +"Arial". + + Results on compatible printers, may depend on consistency of PCL5 +compatibility, in doubt, try BARCODE_OUT_PCL_III + + PJL commands are not used here, as it's not very compatible. + + Tested Printers: + * Hp LaserJet 4050 + + * Hp LaserJet 2100 + + * Epson N-1200 emul PCL + + * Toshiba DP2570 (copier) + PCL option + + * Epson EPL-7100 emul. HP LaserJet II: bars print fine but text is + bad. + + + + +*Node: Bugs and Pending Issues + Bugs and Pending Issues. + ************************ + + The current management of borders/margins is far from optimal. The +"default" margin applied by the library interferes with the external +representation, but I feel it is mandatory to avoid creating barcode +output with no surrounding white space (the problem is especially +relevant for EPS output). + + EAN-128 is not (yet) supported. I plan to implement it pretty soon +and then bless the package as version 1.0. + + + + + +Tag Table:Node: Top154 + Node: Overview526 + Node: The Barcode Object1404 +Node: The Field List2821 +Node: The Intermediate Representation6586 +Node: Supported Flags8359 +Node: The API11343 +Node: The barcode Executable14029 +Node: The Command Line14458 +Node: Supported Encodings19557 +Node: PCL Output28997 +Node: Bugs and Pending Issues31316 + + + +End Tag Table \ No newline at end of file diff --git a/glabels2/barcode-0.98/doc/doc.barcode b/glabels2/barcode-0.98/doc/doc.barcode new file mode 100644 index 00000000..7b460558 --- /dev/null +++ b/glabels2/barcode-0.98/doc/doc.barcode @@ -0,0 +1,939 @@ +\input texinfo @c -*-texinfo-*- +% +% doc.barcode - main file for the documentation +% +%%%% + +%------------------------------------------------------------------------------ +% +% NOTE FOR THE UNAWARE USER +% ========================= +% +% This file is a texinfo source. It isn't the binary file of some strange +% editor of mine. If you want ascii, you should "make barcodedoc.txt". +% +%------------------------------------------------------------------------------ + +% +% This is not a conventional info file... +% I use two extra features: +% - The '%' as a comment marker, if at beg. of line ("\%" -> "%") +% - leading blanks are allowed +% + +@comment %**start of header +@setfilename barcode.info +@settitle Barcode @value{version} +@iftex +@afourpaper +@end iftex +@comment %**end of header + +@setchapternewpage off + +@set version 0.98 +@set update-month March 2002 + +@finalout + +@ifinfo + +This file is the User's Manual for the barcode library (version +@value{version}). + +@end ifinfo + +@setchapternewpage odd +@titlepage +@c use the new format for titles +@title barcode @value{version} +@subtitle A library for drawing bar codes +@subtitle @value{update-month} + +@author by Alessandro Rubini (@code{rubini@@gnu.org}) + +@end titlepage +@setchapternewpage off +@headings single + + +@node Top, Overview, (dir), (dir) +@top Barcode tools + +This file documents version @value{version} of the barcode +library and sample programs (@value{update-month}). + +@menu +* Overview:: +* The Barcode Object:: +* Supported Flags:: +* The API:: +* The barcode Executable:: +* Supported Encodings:: +* PCL Output:: +* Bugs and Pending Issues:: +@end menu + + +%########################################################################## +%########################################################################## + +@node Overview, The Barcode Object, Top, Top +@chapter Overview + +The @dfn{barcode} package is mainly a C library for creating bar-code +output files. It also includes a command line front-end and (in a +foreseeable future) a graphic frontend. + +The package is designed as a library because we think the main use for +barcode-generation tools is inside more featured applications. The +library addresses bar code printing as two distinct problems: creation +of bar information and actual conversion to an output format. To this +aim we use an intermediate representation for bar codes, which is +currently documented in the @file{ps.c} source file (not in this +document). + +Note that the library and the accompanying material is released +according to the GPL license, not the LGPL one. A copy of the GPL is +included in the distribution tarball. + +%########################################################################## + +@node The Barcode Object, Supported Flags, Overview, Top +@chapter The Underlying Data Structure + +Every barcode-related function acts on a data structure defined in the +@file{barcode.h} header, which must be included by any C source file +that uses the library. The header is installed by @t{make install}. + +The definition of the data structure is included here for reference: + +@lisp +struct Barcode_Item @{ + int flags; /* type of encoding and other flags */ + char *ascii; /* malloced */ + char *partial; /* malloced too */ + char *textinfo; /* information about text placement */ + char *encoding; /* code name, filled by encoding engine */ + int width, height; /* output units */ + int xoff, yoff; /* output units */ + int margin; /* output units */ + double scalef; /* requested scaling for barcode */ + int error; /* an errno-like value, in case of failure */ +@}; +@end lisp + +The exact meaning of each field and the various flags implemented are +described in the following sections. + +Even though you won't usually need to act on the contents of this +structure, some of the functions in the library receive arguments that +are directly related to one or more of these fields. + +%========================================================================== + +@menu +* The Field List:: +* The Intermediate Representation:: +@end menu + +%-------------------------------------------------------------------------- +@node The Field List, The Intermediate Representation, The Barcode Object, The Barcode Object +@section The Fields + +@table @code + +@item int flags; + + The flags are, as you may suspect, meant to specify the exact + behaviour of the library. They are often passed as an argument + to @i{barcode} functions and are discussed in the next section. + +@item char *ascii; +@itemx char *partial; +@itemx char *textinfo; +@itemx char *encoding; + + These fields are internally managed by the library, and you are + not expected to touch them if you use the provided API. All + of them are allocated with @i{malloc}. + +@item int width; +@itemx int height; + + They specify the width and height of the @i{active} barcode + region (i.e., excluding the white margin), in the units used + to create output data (for postscript they are points, 1/72th + of an inch, 0.352 mm). The fields can be either assigned to + in the structure or via @i{Barcode_Position()}, at your + choice. If either value or both are left to their default + value of zero, the output engine will assign default values + according to the specified scaling factor. If the specified + width is bigger than needed (according to the scaling factor), + the output barcode will be centered in its requested + region. If either the width of the height are too small for + the specified scale factor, the output bar code will expand + symmetrically around the requested region. + +@item int xoff; +@itemx int yoff; + + The fields specify offset from the coordinate origin of the + output engine (for postscript, position 0,0 is the lower left + corner of the page). The fields can be either assigned to in + the structure or via @i{Barcode_Position()}, at your choice. + The offset specifies where the white margin begins, not where + the first bar will be printed. To print real ink to the + specified position you should set @i{margin} to 0. + +@item int margin; + + The white margin that will be left around the printed area of + the bar code. The same margin is applied to all sides of the + printed area. The default value for the margin is defined in + @file{barcode.h} as @t{BARCODE_DEFAULT_MARGIN} (10). + +@item double scalef; + + The enlarge or shrink value for the bar code over its default + dimension. The @i{width} and @i{scalef} fields interact deeply + in the creation of the output, and a complete description of + the issues appears later in this section. + +@item int error; + + The field is used when a @i{barcode} function fails to host + an @t{errno}-like integer value. + +@end table + + +@unnumberedsubsec Use of the @i{width} and @i{scalef} fields. + +A width unit is the width of the thinnest bar and/or space in the +chosen code; it defaults to 1 point if the output is postscript or +encapsulated postscript. + +Either or both the code width and the scale factor can be left +unspecified (i.e., zero). The library deals with defaults in the +following way: + +@table @i + +@item Both unspecified + + If both the width and the scale factor are unspecified, the + scale factor will default to 1.0 and the width is calculated + according to the actual width of the bar code being printed. + +@item Width unspecified + + If the width is not specified, it is calculated according to + the values of @i{scalef}. + +@item Scale factor unspecified + + If the scale factor is not specified, it will be chosen so + that the generated bar code exactly fits the specified width. + +@item Both specified + + The code will be printed inside the specified region according + to the specified scale factor. It will be aligned to the left. + If, however, the chosen width is too small for the specific + bar code and scaling factor, then the code will extend + symmetrically to the left and to the right of the chosen + region. + +@end table + +%-------------------------------------------------------------------------- +@node The Intermediate Representation, , The Field List, The Barcode Object +@section The Intermediate Representation + +The encoding functions print their output into the @t{partial} and +@t{texinfo} fields of the barcode data structure. Those fields, together +with position information, are then used to generate actual output. +This is an informal description of the intermediate format. + +The first char in @t{partial} tells how much extra space to add to the +left of the bars. For EAN-13, it is used to leave space to print the +first digit, other codes may have '0' for no-extra-space-needed. + +The next characters are alternating bars and spaces, as multiples of the +base dimension which is 1 unless the code is rescaled. Rescaling is +calculated as the ratio from the requested width and the calculated +width. Digits represent bar/space dimensions. Lower-case letters +represent those bars that should extend lower than the others: 'a' is +equivalent to '1', 'b' is '2' and so on up to 'i' which is equivalent to +'9'. Other letters will be used for encoding-specific meanings, as soon +as I implement them. + +The @t{textinfo} string is made up of fields @t{%lf:%lf:%c} separated by +blank space. The first integer is the x position of the character, +the second is the font size (before rescaling) and the char item is +the character to be printed. + +Both the @t{partial} and @t{textinfo} strings may include ``@t{-}'' or +``@t{+}'' as special characters (in @t{textinfo} the char should be a +stand-alone word). They state where the text should be printed: below +the bars (``@t{-}'', default) or above the bars. This is used, for +example, to print the add-5 and add-2 codes to the right of UPC or EAN +codes (the add-5 extension is mostly used in ISBN codes). + + + + +%========================================================================== + +@node Supported Flags, The API, The Barcode Object, Top +@chapter The Flags + +The following flags are supported by version @value{version} of the +library: + +@table @code + +@item BARCODE_ENCODING_MASK + + The mask is used to extract the encoding-type identifier from + the @i{flags} field. + +@item BARCODE_EAN +@itemx BARCODE_UPC +@itemx BARCODE_ISBN +@itemx BARCODE_128B +@itemx BARCODE_128C +@itemx BARCODE_128 +@itemx BARCODE_128RAW +@itemx BARCODE_39 +@itemx BARCODE_I25 +@itemx BARCODE_CBR +@itemx BARCODE_MSI +@itemx BARCODE_PLS +@itemx BARCODE_93 + + The currently supported encoding types: EAN (13 digits, 8 + digits, 13 + 2 add-on and 13 + 5 add-on), UPC (UPC-A, UPC-E, + UPC-A with 2 or 5 digit add-on), ISBN (with or without the + 5-digit add-on), CODE128-B (the whole set of printable + ASCII characters), CODE128-C (two digits encoded by each barcode + symbol), CODE128 (all ASCII values), a ``raw-input'' pseudo-code + that generates CODE128 output, CODE39 (alphanumeric), + "interleaved 2 of 5" (numeric), Codabar (numeric plus a few + symbols), MSI (numeric) and Plessey (hex digits). + @xref{Supported Encodings}. + +@item BARCODE_ANY + + This special encoding type (represented by a value of zero, so + it will be the default) tells the encoding procedure to look + for the first encoding type that can deal with a textual + string. Therefore, a 11-digit code will be printed as UPC (as + well as 6-digit, 11+2 and 11+5), a 12-digit (or 7-digit, or + 12+2 or 12+5) as EAN13, an ISBN code (with or without hyphens, + with or without add-5) will be encoded in its EAN13 + representation, an even number of digits is encoded using + CODE128C and a generic string is encoded using CODE128B. Since + code-39 offers a much larger representation for the same + text string, code128-b is preferred over code39 for + alphanumeric strings. + +@item BARCODE_NO_ASCII + + Instructs the engine not to print the ascii string on + output. By default the bar code is accompanied with an ascii + version of the text it encodes. + +@item BARCODE_NO_CHECKSUM + + Instructs the engine not to add the checksum character to the + output. Not all the encoding types can drop the checksum; + those where the checksum is mandatory (like EAN and UPC) + just ignore the flag. + +@item BARCODE_OUTPUT_MASK + + The mask is used to extract the output-type identifier from + the @i{flags} field. + +@item BARCODE_OUT_PS +@itemx BARCODE_OUT_EPS +@itemx BARCODE_OUT_PCL +@itemx BARCODE_OUT_PCL_III + + The currently supported encoding types: full-page postscript + and encapsulated postscript; PCL (print command language, for + HP printers) and PCL-III (same as PCL, but uses a font not + available on older printers). + +@item BARCODE_OUT_NOHEADERS + + The flag instructs the printing engine not to print the header + and footer part of the file. This makes sense for the + postscript engine but might not make sense for other engines; + such other engines will silently ignore the flag just like + the PCL back-end does. + +@end table + +%########################################################################## + +@node The API, The barcode Executable, Supported Flags, Top +@chapter Functions Exported by the Library + +%MANPAGE barcode.3 +%M .TH BARCODE 3 "October 1999" "GNU" "GNU barcode" +%M .UC 4 +%M .SH NAME +%M barcode \- a library to create and print bar codes +%M .SH SYNOPSIS +%M .B #include +%M .sp +%M .BI "struct Barcode_Item *Barcode_Create(char *" text ");" +%M .br +%M .BI "int Barcode_Delete(struct Barcode_Item *" bc ");" +%M .br +%M .BI "int Barcode_Encode(struct Barcode_Item *" bc ", int " flags ");" +%M .br +%M .BI "int Barcode_Print(struct Barcode_Item *" bc ", FILE *" f ", int " flags ");" +%M .br +%M .BI "int Barcode_Position(struct Barcode_Item *" bc ", int " wid ", int " hei ", int " xoff ", int " yoff " , double " scalef ");" +%M .br +%M .BI "int Barcode_Encode_and_Print(char *" text ", FILE *" f ", int " wid ", int " hei ", int " xoff ", int " yoff ", int " flags ");" +%M .br +%M .BI "int Barcode_Version(char *" versionname ");" +%M +%M .SH DESCRIPTION +%M +%M The barcode family of library functions is meant to ease +%M creation of bar-code printouts. +%M +%M The information below is extracted from the texinfo file, which is the +%M preferred source of information. + +The functions included in the barcode library are declared in the +header file @t{barcode.h}. They perform the following tasks: + +@table @code + +@item struct Barcode_Item *Barcode_Create(char *text); + The function creates a new barcode object to deal with a + specified text string. It returns NULL in case of failure and + a pointer to a barcode data structure in case of success. + +@item int Barcode_Delete(struct Barcode_Item *bc); + Destroy a barcode object. Always returns 0 (success) + +@item int Barcode_Encode(struct Barcode_Item *bc, int flags); + Encode the text included in the @i{bc} object. Valid flags are + the encoding type (other flags are ignored) and + BARCODE_NO_CHECKSUM (other flags are silently ignored); if the + flag argument is zero, @t{bc->flags} will apply. The function + returns 0 on success and -1 in case of error. After + successful termination the data structure will host the + description of the bar code and its textual representation, + after a failure the @t{error} field will include the reason of + the failure. + +@item int Barcode_Print(struct Barcode_Item *bc, FILE *f, int flags); + Print the bar code described by @t{bc} to the specified file. + Valid flags are the output type, @t{BARCODE_NO_ASCII} and + @t{BARCODE_OUT_NOHEADERS}, other flags are ignored. If any of + these flags is zero, it will be inherited from @t{bc->flags} + which therefore takes precedence. The function returns 0 on + success and -1 in case of error (with @t{bc->error} set + accordingly). In case of success, the bar code is printed to + the specified file, which won't be closed after use. + +@item int Barcode_Position(struct Barcode_Item *bc, int wid, int hei, int xoff, int yoff, double scalef); + The function is a shortcut to assign values to the data + structure. + +@item int Barcode_Encode_and_Print(char *text, FILE *f, int wid, int hei, int xoff, int yoff, int flags); + The function deals with the whole life of the barcode + object by calling the other functions; it uses all the specified + flags. + +@item int Barcode_Version(char *versionname); + Returns the current version as an integer number of the form + major * 10000 + minor * 100 + release. Therefore, version + 1.03.5 will be returned as 10305 and version 0.53 as 5300. If + the argument is non-null, it will be used to return the version + number as a string. Note that the same information is available from + two preprocessor macros: @t{BARCODE_VERSION} (the string) and + @t{BARCODE_VERSION_INT} (the integer number). + +@end table + +%MANPAGE END + +%########################################################################## + +@node The barcode Executable, Supported Encodings, The API, Top +@chapter The @i{barcode} frontend program + +%MANPAGE barcode.1 +%M .TH BARCODE 1 "October 2001" "GNU" "GNU barcode" +%M .UC 4 +%M .SH NAME +%M barcode \- a stand alone program to run the barcode library +%M .SH SYNOPSIS +%M .B barcode +%M [\-b - | string] [\-e encoding] [\-o - | outfile] [ +%M .I other-flags +%M ] +%M .SH DESCRIPTION +%M +%M The information below is extracted from the texinfo file, which is the +%M preferred source of information. +%M .PP +The @b{barcode} program is a front-end to access some features of the +library from the command line. It is able to read user supplied +strings from the command line or a data file (standard input by default) +and encode all of them. + +%M .SH OPTIONS +%M .PP + +@menu +* The Command Line:: +@end menu + +%-------------------------------------------------------------------------- +@node The Command Line, , The barcode Executable, The barcode Executable +@section The Command Line + + +@b{barcode} accepts the following options: + +@table @code + +@item --help or -h + Print a usage summary and exit. + +@item -i filename + Identify a file where strings to be encoded are read from. If + missing (and if @t{-b} is not used) it defaults to standard + input. Each data line of the input file will be used to create + one barcode output. + +@item -o filename + Output file. It defaults to standard output. + +@item -b string + Specify a single ``barcode'' string to be encoded. + The option can be used multiple times in order to encode + multiple strings (this will result in multi-page postscript + output or a table of barcodes if @t{-t} is specified). The + strings must match the encoding chosen; if it doesn't + match the program will print a warning to @t{stderr} and + generate ``blank'' output (although not zero-length). + Please note that a string including spaces or + other special characters must be properly quoted. + +@item -e encoding + @b{encoding} is the name of the chosen encoding format being + used. It defaults to the value of the environment variable + @t{BARCODE_ENCODING} or to auto detection if the environment is + also unset. + +@item -g geometry + The geometry argument is of the form ``[@i{} @t{x} + @i{}] [@t{+} @i{} @t{+} @i{}]'' (with + no intervening spaces). Unspecified margin values will result in + no margin; unspecified size results in default size. + The specified values represent print points by + default, and can be inches, millimeters or other units + according to the @t{-u} option or the @t{BARCODE_UNIT} + environment variable. The argument is used to place the + printout code on the page. Note that an additional white + margin of 10 points is added to the printout. If the option is + unspecified, @t{BARCODE_GEOMETRY} is looked up in the + environment, if missing a default size and no margin (but the + default 10 points) are used. + +@item -t table-geometry + Used to print several barcodes to a single page, this option + is meant to be used to print stickers. The argument is of the + form ``@i{} @t{x} @i{} [@t{+} @i{} + @t{+} @i{} [@t{-} @i{} [@t{-} + @i{}]]]'' (with no intervening spaces); if missing, + the top and right margin will default to be the same as the + bottom and left margin. The margins are specified in print + points or in the chosen unit (see @t{-u} below). If the + option is not specified, @t{BARCODE_TABLE} is looked up in the + environment, otherwise no table is printed and each barcode + will get its own page. The size (but not the position) + of a barcode item within a table can also be selected using + @t{-g} (see "geometry" above), without struggling with + external and internal margins. I still think management of + geometries in a table is suboptimal, but I can't make it + better without introducing incompatibilities. + + +@item -m margin(s) + Specifies an internal margin for each sticker in the + table. The argument is of the form + ``@i{}@t{,}@i{}'' and the margin is applied + symmetrically to the sticker. If unspecified, the environment + variable @t{BARCODE_MARGIN} is used or a default internal + margin of 10 points is used. + +@item -n + ``Numeric'' output: don't print the ASCII form of the code, + only the bars. + +@item -c + No checksum character (for encodings that allow it, like code 39, + other codes, like UPC or EAN, ignore this option). + +@item -E + Encapsulated postscript (default is normal postscript). When + the output is generated as EPS only one barcode is encoded. + +@item -P + PCL output. Please note that the Y direction goes from top + to bottom for PCL, and the origin for an image is the top-left + corner instead of the bottom-left + +@item -p pagesize + Specify a non-default page size. The page size can be specified + in millimeters, inches or plain numbers (for example: "@t{210x297mm}", + "@t{8.5x11in}", "@t{595x842}"). A page specification as numbers + will be interpreted according to the current unit specification + (see @t{-u} below). If libpaper is available, + you can also specify the page size with its name, like "@t{A3}" + or "@t{letter}" (libpaper is a standard component of Debian + GNU/Linux, but may be missing elsewhere). The default page + size is your system-wide default if libpaper is there, A4 otherwise. + +@item -u unit + Choose the unit used in size specifications. Accepted values + are ``mm'', ``cm'', ``in'' and ``pt''. By default, the program + will check @t{BARCODE_UNIT} in the environment, and assume + points otherwise (this behaviour is compatible with 0.92 and + previous versions. If @t{-u} appears more than once, each + instance will modified the behaviour for the arguments at its + right, as the command line is processes left to right. The + program internally works with points, and any size is + approximated to the nearest multiple of one point. The @t{-u} + option affect @t{-g} (geometry), @t{-t} (table) and @t{-p} + (page size). + +@end table + +%M .SH ENCODING TYPES +%M .PP + +%########################################################################## +@node Supported Encodings, PCL Output, The barcode Executable, Top +@chapter Supported Encodings + +The program encodes text strings passed either on the command line +(with -b) or retrieved from standard input. The text representation is +interpreted according to the following rules. When auto-detection +of the encoding is enabled (i.e, no explicit encoding type is specified), +the encoding types are scanned to find one that can digest the text string. +The following list of supported types is sorted in the same order +the library uses when auto-detecting a suitable encoding for a string. + +@table @var + +@item EAN + The EAN frontend is similar to UPC; it accepts strings of + digits, 12 or 7 characters long. Strings of 13 or 8 characters + are accepted if the provided checksum digit is correct. + I expect most users to feed input without a + checksum, though. The add-2 and add-5 extension are accepted for both + the EAN-13 and the EAN-8 encodings. + The following are example of valid input strings: + ``@t{123456789012}'' (EAN-13), ``@t{1234567890128}'' (EAN-13 wih + checksum), ``@t{1234567}'' (EAN-8), ``@t{12345670 12345}'' (EAN-8 + with checksum and add-5), + ``@t{123456789012 12}'' (EAN-13 with add-2), + ``@t{123456789012 12345}'' (EAN-13 with add-5). + +@item UPC + The UPC frontend accepts only strings made up of digits (and, + if a supplemental encoding is used, a blank to separate it). + It accepts strings of 11 or 12 digits (UPC-A) and 6 or 7 or 8 + digits (UPC-E). + + The 12th digit of UPC-A is the checksum and is added by the + library if not specified in the input; if it is specified, it + must be the right checksum or the code is rejected as invalid. + For UPC-E, 6 digit are considered to be the middle part of the + code, a leading 0 is assumed and the checksum is added; + 7 digits are either considered the initial part (leading digit + 0 or 1, checksum missing) or the final part (checksum specified, + leading 0 assumed); 8 digits are considered to be the complete code, + with leading 0 or 1 and checksum. + For both UPC-A and UPC-E, a trailing string of 2 digits or 5 digits + is accepted as well. Therefore, the following are examples + of valid strings that can be encoded as UPC: + ``@t{01234567890}'' (UPC-A) + ``@t{012345678905}'' (UPC-A with checksum), ``@t{012345}'' + (UPC-E), ``@t{01234567890 12}'' (UPC-A, add-2) and + ``@t{01234567890 12345}'' (UPC-A, add-5), ``@t{0123456 12}'' + (UPC-E, add-2). + Please note that when setting @t{BARCODE_ANY} to auto-detect + the encoding to be used, 12-digit strings and 7-digit strings + will always be identified as EAN. This because I expect most + user to provide input without a checksum. If you need to + specify UPC-with-checksum as input you must explicitly set + @t{BARCODE_UPC} as a flag or use @t{-e upc} on the command line. + +@item ISBN + ISBN numbers are encoded as EAN-13 symbols, with an optional + add-5 trailer. The ISBN frontend of the library accepts real + ISBN numbers and deals with any hyphen and, if present, the + ISBN checksum character before encoding data. Valid + representations for ISBN strings are for example: + ``@t{1-56592-292-1}'', ``@t{3-89721-122-X}'' and ``@t{3-89721-122-X + 06900}''. + +@item code 128-B + This encoding can represent all of the printing ASCII + characters, from the space (32) to DEL (127). The checksum + digit is mandatory in this encoding. + +@item code 128-C + The ``C'' variation of Code-128 uses Code-128 symbols to + represent two digits at a time (Code-128 is made up of 104 + symbols whose interpretation is controlled by the start symbol + being used). Code 128-C is thus the most compact way to + represent any even number of digits. The encoder refuses to + deal with an odd number of digits because the caller is + expected to provide proper padding to an even number of + digits. (Since Code-128 includes control symbols to switch + charset, it is theoretically possible to represent the odd + digit as a Code 128-A or 128-B symbol, but this tool doesn't + currently implement this option). + +@item code 128 raw + Code-128 output represented symbol-by-symbol in the input + string. To override part of the problems outlined below in + specifying code128 symbols, this pseudo-encoding allows the + used to specify a list of code128 symbols separated by + spaces. Each symbol is represented by a number in the range + 0-105. The list should include the leading character.The + checksum and the stop character are automatically added by the + library. Most likely this pseudo-encoding will be used with + @t{BARCODE_NO_ASCII} and some external program to supply the + printed text. + +@item code 39 + The code-39 standard can encode uppercase letters, digits, the + blank space, plus, minus, dot, star, dollar, slash, percent. + Any string that is only composed of such characters is + accepted by the code-39 encoder. To avoid loosing information, + the encoder refuses to encode mixed-case strings (a lowercase + string is nonetheless accepted as a shortcut, but is encoded + as uppercase). + +@item interleaved 2 of 5 + This encoding can only represent an even number of digits + (odd digits are represented by bars, and even digits by the + interleaving spaces). The name stresses the fact that two + of the five items (bars or spaces) allocated to each symbol + are wide, while the rest are narrow. The checksum digit is + optional (can be disabled via @t{BARCODE_NO_CHECKSUM}). + Since the number of digits, including the checksum, must be even, + a leading zero is inserted in the string being encoded if needed + (this is specifically stated in the specs I have access to). + +@item code 128 + Automatic selection between alphabet A, B and C of the Code-128 + standard. This encoding can represent all ASCII symbols, from + 0 (NUL) to 127 (DEL), as well as four special symbols, named + F1, F2, F3, F4. The set of symbols available in this encoding + is not easily represented as input to the @i{barcode} library, + so the following convention is used. In the input string, + which is a C-language null-terminated string, the NUL char + is represented by the value 128 (0x80, 0200) and the F1-F4 characters + are represented by the values 193-196 (0xc1-0xc4, 0301-0304). + The values have been chosen to ease their representation as + escape sequences. + + Since the shell doesn't seem to interpret escape sequences on the + command line, the "-b" option cannot be easily used to designate + the strings to be encoded. As a workaround you can resort + to the command @t{echo}, either within back-ticks or used + separately to create a file that is then fed to the standard-input + of @i{barcode} -- assuming your @t{echo} command processes escape + sequences. The newline character is especially though to encode + (but not impossible unless you use a @t{csh} variant. + + These problems only apply to the command-line tool; the use of + library functions doesn't give any problem. In needed, you can + use the ``@i{code 128 raw}'' pseudo-encoding to represent + code128 symbols by their numerical value. This encoding is + used late in the auto-selection mechanism because (almost) any + input string can be represented using code128. + +@item Codabar + Codabar can encode the ten digits and a few special symbols + (minus, plus, dollar, colon, bar, dot). The characters + ``@t{A}'', ``@t{B}'', ``@t{C}'' and ``@t{D}'' are used to + represent four different start/stop characters. The input + string to the barcode library can include the start and stop + characters or not include them (in which case ``@t{A}'' is + used as start and ``@t{B}'' as stop). Start and stop + characters in the input string can be either all lowercase or + all uppercase and are always printed as uppercase. + +@item Plessey + Plessey barcodes can encode all the hexadecimal + digits. Alphabetic digits in the input string must either be + all lowercase or all uppercase. The output text is always + uppercase. + +@item MSI + MSI can only encode the decimal digits. While the standard + specifies either one or two check digits, the current + implementation in this library only generates one check digit. + +@item code 93 + The code-93 standard can natively encode 48 different characters, + including uppercase letters, digits, the blank space, plus, minus, + dot, star, dollar, slash, percent, as well as five special + characters: a start/stop delimiter and four "shift characters" used + for extended encoding. Using this "extended encoding" method, any + standard 7-bit ASCII character can be encoded, but it takes up two + symbol lengths in barcode if the character is not natively supported + (one of the 48). + The encoder here fully implements the code 93 encoding standard. + Any characters natively supported (A-Z, 0-9, ".+-/$&%") will be + encoded as such - for any other characters (such as lower case + letters, brackets, parentheses, etc.), the encoder will revert + to extended encoding. + As a note, the option to exclude the checksum will eliminate the + two modulo-47 checksums (called C and K) from the barcode, but this + probably will make it unreadable by 99% of all scanning systems. + These checksums are specified to be used at the firmware level, + and their absence will be interpreted as an invalid barcode. + + +@end table + +%M .SH PCL OUTPUT + +%########################################################################## +@node PCL Output, Bugs and Pending Issues, Supported Encodings, Top +@chapter PCL Output + +While the default output is Postscript (possibly EPS), and Postscript +can be post-processed to almost anything, it is sometimes desirable to +create output directly usable by the specific printer at hand. +PCL is currently supported as an output format for this reason. +Please note that the Y coordinate for PCL goes from top to bottom, while +for Postscript it goes from bottom to top. Consistently, while in +Postscript you specify the bottom-left corner as origin, for PCL +you specify the top-left corner. + +Barcode output for PCL Printers (HP LaserJet and compatibles), +was developed using PCL5 Reference manuals from HP. +that really refers to these printers: +@itemize @bullet + +@item +LaserJet III, III P, III D, III Si, + +@item +LaserJet 4 family + +@item +LaserJet 5 family + +@item +LaserJet 6 family + +@item +Color LaserJet + +@item +DeskJet 1200 and 1600. + +@end itemize + +However, barcode printing uses a very small subset of PCL, probably also +LaserJet II should print it without problem, but the resulting text may +be horrible. + +The only real difference from one printer to another really depends on +which font are available in the printer, used in printing the label +associated to the bars (if requested). + +Earlier LaserJet supports only bitmaps fonts, so these are not +"scalable". (Ljet II ?), Also these fonts, when available, have a +specified direction, and not all of them are available in +both Portrait and Landscape mode. + +From LaserJet 4 series, (except 4L/5L that are entry-level printers), +Arial scalable font should be available, so it's the "default font" +used by this program. + +LaserJet III series printers (and 4L, 5L), don't feature "Arial" as a +resident font, so you should use @t{BARCODE_OUT_PCL_III} instead of +@t{BARCODE_OUT_PCL.}, and font the font used will be "Univers" instead +of "Arial". + +Results on compatible printers, may depend on consistency of +PCL5 compatibility, in doubt, try BARCODE_OUT_PCL_III + +PJL commands are not used here, as it's not very compatible. + + +Tested Printers: +@itemize @bullet +@item +Hp LaserJet 4050 +@item +Hp LaserJet 2100 +@item +Epson N-1200 emul PCL +@item +Toshiba DP2570 (copier) + PCL option +@item +Epson EPL-7100 emul. HP LaserJet II: bars print fine but text is bad. +@end itemize + + +%M .SH BUGS + +%########################################################################## +@node Bugs and Pending Issues, , PCL Output, Top +@chapter Bugs and Pending Issues. + +The current management of borders/margins is far from optimal. The +``default'' margin applied by the library interferes with the external +representation, but I feel it is mandatory to avoid creating barcode +output with no surrounding white space (the problem is especially +relevant for EPS output). + +EAN-128 is not (yet) supported. I plan to implement it pretty soon and +then bless the package as version 1.0. + +%M .SH "SEE ALSO" +%M \fBbarcode(3)\fP +%M +%M .SH AUTHORS +%M Alessandro Rubini (maintainer) +%M .PP +%M Leonid A. Broukhis (several encodings) +%M .PP +%M Andrea Scopece (PCL output) +%MANPAGE END + +@iftex +@contents +@end iftex + +@bye +@c LocalWords: barcode ifinfo titlepage iftex texinfo ascii frontend LGPL +@c LocalWords: tarball malloced textinfo scalef isbn Plessey codabar GPL Ljet +@c LocalWords: LocalWords LaserJet Univers Arial Debian libpaper pagesize +@c LocalWords: Epson MANPAGE stderr barcodes emul DeskJet xmargin ymargin +@c LocalWords: leftmargin rightmargin topmargin bottommargin unset struct +@c LocalWords: NOHEADERS yoff xoff versionname errno malloc behaviour charset diff --git a/glabels2/barcode-0.98/doc/infofilter b/glabels2/barcode-0.98/doc/infofilter new file mode 100755 index 00000000..92bc8b7d --- /dev/null +++ b/glabels2/barcode-0.98/doc/infofilter @@ -0,0 +1,16 @@ +#! /usr/bin/sed -f + + +# allow "%" as a comment char, but only at the beginning of the line +s/^%/@c / +#s/[^\\]%.*$// +s/^\\%/%/ + +#preserve blanks in @lisp blocks +/@lisp/,/@end lisp/ p +/@lisp/,/@end lisp/ d + +# remove leading blanks +s/^[ ]*// + +#s/\\t/@code/g diff --git a/glabels2/barcode-0.98/doc/manpager b/glabels2/barcode-0.98/doc/manpager new file mode 100755 index 00000000..46de5be2 --- /dev/null +++ b/glabels2/barcode-0.98/doc/manpager @@ -0,0 +1,120 @@ +#! /usr/bin/awk -f +# Copyright (c) 1998-2001 Alessandro Rubini + +BEGIN {IN=0} + +/^%MANPAGE END/ {IN=0; next} +/^%MANPAGE/ {IN=1; USELP=NEEDLP=INTABLE=0; NAME=$2; next} +IN==0 {next} + +/^%MSKIP/ {SKIP=1;next} +/^%M/ {SKIP=0} + +/^@menu/ {SKIP=1;next} +/^@end menu/ {SKIP=0;next} + +SKIP==1 {next} +/^%M$/ {next} +/^@ignore/ {next} +/^@end ign/ {next} + +#now perform all the substitutions needed + + { gsub("^%M ?",""); } + +# Use gensub for converting tags: itz Sep 30 1998 +# +# However, the gensub function is gawk-specific, and we want things +# to work with original-awk too (for portability). +# Therefore, use a normal gsub, even though it's a subobptimal solution +# as it may step in extra braces. The good solution will be piping to sed, +# or match, extract subesxpression, replace, reinsert -- bleah... +# (ARub, Oct 10 2000) +/@b\{/ { + #$0 = gensub(/@b\{([^}]+)\}/, "\\\\fB\\1\\\\fP","g"); + gsub("@b\{","\\fB"); + gsub("\}","\\fP"); +} + +/@var\{/ { + #$0 = gensub(/@var\{([^}]+)\}/, "\\\\fI\\1\\\\fP","g"); + gsub("@var\{","\\fB"); + gsub("\}","\\fP"); +} + +/@(samp|code|file)\{/ { + #$0 = gensub(/@(samp|code|file)\{([^}]+)\}/, "`\\2'","g"); + gsub("@(samp|code|file)\{",""); + gsub("\}",""); +} + + +/@xref\{.*\}\./ { + gsub(/@xref\{.*\}\./,""); +} + +/@ref\{.*\}/ { + gsub("@ref\{",""); + gsub("\}",""); +} + +/@\*/ { + gsub(/@\* */,"\n.br\n"); +} + +/@[a-z]+\{/ { + gsub("@[a-z]+\\{",""); + gsub("}",""); + } + +/^@table/ { TABLE=1; } +/^@itemize/ { TABLE=1; next} + +/^@item/ { + gsub("^@item *",""); + printf ".TP\n%s\n",$0 > NAME; + NEEDLP=0; next; + } + +/^@end table/ {TABLE=0} +/^@end itemize/ {TABLE=0} + +# discard other texinfo commands + +/^@/ {next} + +# manage comments and '%' + +/^%/ {next} + + + { + gsub("[^\\\\]%.*$",""); + gsub("\\%","%"); + } + +# remove leading blanks + +/^[ \t]/ {gsub("^[ \t]*","");} + +# put a .LP at blank lines + +/^.nf/ {USELP=0} +/^.fi/ {USELP=1} + +/^$/ {if (USELP) {NEEDLP++; next;} } + + +/./ { if (NEEDLP) { printf "\n.LP\n" > NAME; NEEDLP=0; } } + +/^.TH/ {USELP=1} + +# Escape single slashes (e.g. in documentation for `-l' command line option) + + {gsub("\\\\ ", "\\\\ ");} + + {gsub("~", "~~");} + + {print > NAME} + + diff --git a/glabels2/barcode-0.98/doc/mktxt b/glabels2/barcode-0.98/doc/mktxt new file mode 100755 index 00000000..bd3f88ba --- /dev/null +++ b/glabels2/barcode-0.98/doc/mktxt @@ -0,0 +1,38 @@ +#! /usr/bin/awk -f + +# Warning: this may use gnu-awk features + +# Program to create ascii from info; +# Missing: table of contents + +# skip + +BEGIN {NODELINE=0; NODE=0; KEEP=1; printf "\n\n"} + + +/^\037$/ { NODELINE=1; NODE=NODE+1; KEEP=1; next} + +NODE==1 { next } + +NODELINE==1 { + NODELINE=2; + sub("^.*Node: ","*Node: "); + sub(",.*$",""); + printf "\n\n\n%s",$0; +#print + next; + } + +NODELINE { NODELINE=NODELINE+1 } + +NODELINE==4 { printf "\t\t\t\t"; } +NODELINE==5 { printf "\t\t\t\t"; NODELINE=0} + + +/^\* Menu:$/ { KEEP=0 } + + + +KEEP==0 { next } + +{ print } diff --git a/glabels2/barcode-0.98/doc/texi2html b/glabels2/barcode-0.98/doc/texi2html new file mode 100755 index 00000000..2c61aa93 --- /dev/null +++ b/glabels2/barcode-0.98/doc/texi2html @@ -0,0 +1,2021 @@ +#!/usr/local/bin/perl +'di '; +'ig 00 '; +#+############################################################################## +# # +# File: texi2html # +# # +# Description: Program to transform most Texinfo documents to HTML # +# # +#-############################################################################## + +# @(#)texi2html 1.51 09/10/96 Written (mainly) by Lionel Cons, Lionel.Cons@cern.ch + +# The man page for this program is included at the end of this file and can be +# viewed using the command 'nroff -man texi2html'. +# Please read the copyright at the end of the man page. + +#+++############################################################################ +# # +# Constants # +# # +#---############################################################################ + +$DEBUG_TOC = 1; +$DEBUG_INDEX = 2; +$DEBUG_BIB = 4; +$DEBUG_GLOSS = 8; +$DEBUG_DEF = 16; +$DEBUG_HTML = 32; +$DEBUG_USER = 64; + +$BIBRE = '\[[\w\/]+\]'; # RE for a bibliography reference +$FILERE = '[\/\w.+-]+'; # RE for a file name +$VARRE = '[^\s\{\}]+'; # RE for a variable name +$NODERE = '[^@{}:\'`",]+'; # RE for a node name +$NODESRE = '[^@{}:\'`"]+'; # RE for a list of node names +$XREFRE = '[^@{}]+'; # RE for a xref (should use NODERE) + +$ERROR = "***"; # prefix for errors and warnings +$THISPROG = "texi2html 1.51"; # program name and version +$HOMEPAGE = "http://wwwcn.cern.ch/dci/texi2html/"; # program home page +$TODAY = &pretty_date; # like "20 September 1993" +$SPLITTAG = "\n"; # tag to know where to split +$PROTECTTAG = "_ThisIsProtected_"; # tag to recognize protected sections +$html2_doctype = ''; + +# +# language dependent constants +# +#$LDC_SEE = 'see'; +#$LDC_SECTION = 'section'; +#$LDC_IN = 'in'; +#$LDC_TOC = 'Table of Contents'; +#$LDC_GOTO = 'Go to the'; +#$LDC_FOOT = 'Footnotes'; +# TODO: @def* shortcuts + +# +# pre-defined indices +# +%predefined_index = ( + 'cp', 'c', + 'fn', 'f', + 'vr', 'v', + 'ky', 'k', + 'pg', 'p', + 'tp', 't', + ); + +# +# valid indices +# +%valid_index = ( + 'c', 1, + 'f', 1, + 'v', 1, + 'k', 1, + 'p', 1, + 't', 1, + ); + +# +# texinfo section names to level +# +%sec2level = ( + 'top', 0, + 'chapter', 1, + 'unnumbered', 1, + 'majorheading', 1, + 'chapheading', 1, + 'appendix', 1, + 'section', 2, + 'unnumberedsec', 2, + 'heading', 2, + 'appendixsec', 2, + 'appendixsection', 2, + 'subsection', 3, + 'unnumberedsubsec', 3, + 'subheading', 3, + 'appendixsubsec', 3, + 'subsubsection', 4, + 'unnumberedsubsubsec', 4, + 'subsubheading', 4, + 'appendixsubsubsec', 4, + ); + +# +# accent map, TeX command to ISO name +# +%accent_map = ( + '"', 'uml', + '~', 'tilde', + '^', 'circ', + '`', 'grave', + '\'', 'acute', + ); + +# +# texinfo "simple things" (@foo) to HTML ones +# +%simple_map = ( + # cf. makeinfo.c + "*", "
    ", # HTML+ + " ", " ", + "\n", "\n", + "|", "", + # spacing commands + ":", "", + "!", "!", + "?", "?", + ".", ".", + ); + +# +# texinfo "things" (@foo{}) to HTML ones +# +%things_map = ( + 'TeX', 'TeX', + 'br', '

    ', # paragraph break + 'bullet', '*', + 'copyright', '(C)', + 'dots', '...', + 'equiv', '==', + 'error', 'error-->', + 'expansion', '==>', + 'minus', '-', + 'point', '-!-', + 'print', '-|', + 'result', '=>', + 'today', $TODAY, + ); + +# +# texinfo styles (@foo{bar}) to HTML ones +# +%style_map = ( + 'asis', '', + 'b', 'B', + 'cite', 'CITE', + 'code', 'CODE', + 'ctrl', '&do_ctrl', # special case + 'dfn', 'STRONG', # DFN tag is illegal in the standard + 'dmn', '', # useless + 'emph', 'EM', + 'file', '"TT', # will put quotes, cf. &apply_style + 'i', 'I', + 'kbd', 'KBD', + 'key', 'KBD', + 'r', '', # unsupported + 'samp', '"SAMP', # will put quotes, cf. &apply_style + 'sc', '&do_sc', # special case + 'strong', 'STRONG', + 't', 'TT', + 'titlefont', '', # useless + 'var', 'VAR', + 'w', '', # unsupported + ); + +# +# texinfo format (@foo/@end foo) to HTML ones +# +%format_map = ( + 'display', 'PRE', + 'example', 'PRE', + 'format', 'PRE', + 'lisp', 'PRE', + 'quotation', 'BLOCKQUOTE', + 'smallexample', 'PRE', + 'smalllisp', 'PRE', + # lists + 'itemize', 'UL', + 'enumerate', 'OL', + # poorly supported + 'flushleft', 'PRE', + 'flushright', 'PRE', + ); + +# +# texinfo definition shortcuts to real ones +# +%def_map = ( + # basic commands + 'deffn', 0, + 'defvr', 0, + 'deftypefn', 0, + 'deftypevr', 0, + 'defcv', 0, + 'defop', 0, + 'deftp', 0, + # basic x commands + 'deffnx', 0, + 'defvrx', 0, + 'deftypefnx', 0, + 'deftypevrx', 0, + 'defcvx', 0, + 'defopx', 0, + 'deftpx', 0, + # shortcuts + 'defun', 'deffn Function', + 'defmac', 'deffn Macro', + 'defspec', 'deffn {Special Form}', + 'defvar', 'defvr Variable', + 'defopt', 'defvr {User Option}', + 'deftypefun', 'deftypefn Function', + 'deftypevar', 'deftypevr Variable', + 'defivar', 'defcv {Instance Variable}', + 'defmethod', 'defop Method', + # x shortcuts + 'defunx', 'deffnx Function', + 'defmacx', 'deffnx Macro', + 'defspecx', 'deffnx {Special Form}', + 'defvarx', 'defvrx Variable', + 'defoptx', 'defvrx {User Option}', + 'deftypefunx', 'deftypefnx Function', + 'deftypevarx', 'deftypevrx Variable', + 'defivarx', 'defcvx {Instance Variable}', + 'defmethodx', 'defopx Method', + ); + +# +# things to skip +# +%to_skip = ( + # comments + 'c', 1, + 'comment', 1, + # useless + 'contents', 1, + 'shortcontents', 1, + 'summarycontents', 1, + 'footnotestyle', 1, + 'end ifclear', 1, + 'end ifset', 1, + 'titlepage', 1, + 'end titlepage', 1, + # unsupported commands (formatting) + 'afourpaper', 1, + 'cropmarks', 1, + 'finalout', 1, + 'headings', 1, + 'need', 1, + 'page', 1, + 'setchapternewpage', 1, + 'everyheading', 1, + 'everyfooting', 1, + 'evenheading', 1, + 'evenfooting', 1, + 'oddheading', 1, + 'oddfooting', 1, + 'smallbook', 1, + 'vskip', 1, + 'filbreak', 1, + # unsupported formats + 'cartouche', 1, + 'end cartouche', 1, + 'group', 1, + 'end group', 1, + ); + +#+++############################################################################ +# # +# Argument parsing, initialisation # +# # +#---############################################################################ + +$use_bibliography = 1; +$use_acc = 0; +$debug = 0; +$doctype = ''; +$check = 0; +$expandinfo = 0; +$use_glossary = 0; +$invisible_mark = ''; +$use_iso = 0; +@include_dirs = (); +$show_menu = 0; +$number_sections = 0; +$split_node = 0; +$split_chapter = 0; +$monolithic = 0; +$verbose = 0; +$usage = <= 0 && $ARGV[0] =~ /^-/) { + $_ = shift(@ARGV); + if (/^-acc$/) { $use_acc = 1; next; } + if (/^-d(ebug)?(\d+)?$/) { $debug = $2 || shift(@ARGV); next; } + if (/^-doctype$/) { $doctype = shift(@ARGV); next; } + if (/^-c(heck)?$/) { $check = 1; next; } + if (/^-e(xpandinfo)?$/) { $expandinfo = 1; next; } + if (/^-g(lossary)?$/) { $use_glossary = 1; next; } + if (/^-i(nvisible)?$/) { $invisible_mark = shift(@ARGV); next; } + if (/^-iso$/) { $use_iso = 1; next; } + if (/^-I(.+)?$/) { push(@include_dirs, $1 || shift(@ARGV)); next; } + if (/^-m(enu)?$/) { $show_menu = 1; next; } + if (/^-mono(lithic)?$/) { $monolithic = 1; next; } + if (/^-n(umber)?$/) { $number_sections = 1; next; } + if (/^-s(plit)?_?(n(ode)?|c(hapter)?)?$/) { + if ($2 =~ /^n/) { + $split_node = 1; + } else { + $split_chapter = 1; + } + next; + } + if (/^-v(erbose)?$/) { $verbose = 1; next; } + die $usage; +} +if ($check) { + die $usage unless @ARGV > 0; + ✓ + exit; +} + +if (($split_node || $split_chapter) && $monolithic) { + warn "Can't use -monolithic with -split, -monolithic ignored.\n"; + $monolithic = 0; +} +if ($expandinfo) { + $to_skip{'ifinfo'}++; + $to_skip{'end ifinfo'}++; +} else { + $to_skip{'iftex'}++; + $to_skip{'end iftex'}++; +} +$invisible_mark = '' if $invisible_mark eq 'xbm'; +die $usage unless @ARGV == 1; +$docu = shift(@ARGV); +if ($docu =~ /.*\//) { + chop($docu_dir = $&); + $docu_name = $'; +} else { + $docu_dir = '.'; + $docu_name = $docu; +} +unshift(@include_dirs, $docu_dir); +$docu_name =~ s/\.te?x(i|info)?$//; # basename of the document + +$docu_doc = "$docu_name.html"; # document's contents +if ($monolithic) { + $docu_toc = $docu_foot = $docu_doc; +} else { + $docu_toc = "${docu_name}_toc.html"; # document's table of contents + $docu_foot = "${docu_name}_foot.html"; # document's footnotes +} + +# +# variables +# +%value = (); # hold texinfo variables +$value{'html'} = 1; # predefine html (the output format) +$value{'texi2html'} = '1.51'; # predefine texi2html (the translator) +# _foo: internal to track @foo +foreach ('_author', '_title', '_subtitle', + '_settitle', '_setfilename') { + $value{$_} = ''; # prevent -w warnings +} +%node2sec = (); # node to section name +%node2href = (); # node to HREF +%bib2href = (); # bibliography reference to HREF +%gloss2href = (); # glossary term to HREF +@sections = (); # list of sections +%tag2pro = (); # protected sections + +# +# initial indexes +# +$bib_num = 0; +$foot_num = 0; +$gloss_num = 0; +$idx_num = 0; +$sec_num = 0; +$doc_num = 0; +$html_num = 0; + +# +# can I use ISO8879 characters? (HTML+) +# +if ($use_iso) { + $things_map{'bullet'} = "•"; + $things_map{'copyright'} = "©"; + $things_map{'dots'} = "…"; + $things_map{'equiv'} = "≡"; + $things_map{'expansion'} = "→"; + $things_map{'point'} = "∗"; + $things_map{'result'} = "⇒"; +} + +# +# read texi2html extensions (if any) +# +$extensions = 'texi2html.ext'; # extensions in working directory +if (-f $extensions) { + print "# reading extensions from $extensions\n" if $verbose; + require($extensions); +} +($progdir = $0) =~ s/[^\/]+$//; +if ($progdir && ($progdir ne './')) { + $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory + if (-f $extensions) { + print "# reading extensions from $extensions\n" if $verbose; + require($extensions); + } +} + +print "# reading from $docu\n" if $verbose; + +#+++############################################################################ +# # +# Pass 1: read source, handle command, variable, simple substitution # +# # +#---############################################################################ + +@lines = (); # whole document +@toc_lines = (); # table of contents +$toplevel = 0; # top level seen in hierarchy +$curlevel = 0; # current level in TOC +$node = ''; # current node name +$in_table = 0; # am I inside a table +$table_type = ''; # type of table ('', 'f', 'v') +@tables = (); # nested table support +$in_bibliography = 0; # am I inside a bibliography +$in_glossary = 0; # am I inside a glossary +$in_top = 0; # am I inside the top node +$in_pre = 0; # am I inside a preformatted section +$in_list = 0; # am I inside a list +$in_html = 0; # am I inside an HTML section +$first_line = 1; # is it the first line +$dont_html = 0; # don't protect HTML on this line +$split_num = 0; # split index +$deferred_ref = ''; # deferred reference for indexes +@html_stack = (); # HTML elements stack +$html_element = ''; # current HTML element +&html_reset; + +# build code for simple substitutions +# the maps used (%simple_map and %things_map) MUST be aware of this +# watch out for regexps, / and escaped characters! +$subst_code = ''; +foreach (keys(%simple_map)) { + ($re = $_) =~ s/(\W)/\\$1/g; # protect regexp chars + $subst_code .= "s/\\\@$re/$simple_map{$_}/g;\n"; +} +foreach (keys(%things_map)) { + $subst_code .= "s/\\\@$_\\{\\}/$things_map{$_}/g;\n"; +} +if ($use_acc) { + # accentuated characters + foreach (keys(%accent_map)) { + if ($_ eq "`") { + $subst_code .= "s/$;3"; + } elsif ($_ eq "'") { + $subst_code .= "s/$;4"; + } else { + $subst_code .= "s/\\\@\\$_"; + } + $subst_code .= "([aeiou])/&\${1}$accent_map{$_};/gi;\n"; + } +} +eval("sub simple_substitutions { $subst_code }"); + +&init_input; +while ($_ = &next_line) { + # + # remove \input on the first lines only + # + if ($first_line) { + next if /^\\input/; + $first_line = 0; + } + # + # parse texinfo tags + # + $tag = ''; + $end_tag = ''; + if (/^\@end\s+(\w+)\b/) { + $end_tag = $1; + } elsif (/^\@(\w+)\b/) { + $tag = $1; + } + # + # handle @ifhtml / @end ifhtml + # + if ($in_html) { + if ($end_tag eq 'ifhtml') { + $in_html = 0; + } else { + $tag2pro{$in_html} .= $_; + } + next; + } elsif ($tag eq 'ifhtml') { + $in_html = $PROTECTTAG . ++$html_num; + push(@lines, $in_html); + next; + } + # + # try to skip the line + # + if ($end_tag) { + next if $to_skip{"end $end_tag"}; + } elsif ($tag) { + next if $to_skip{$tag}; + last if $tag eq 'bye'; + } + if ($in_top) { + # parsing the top node + if ($tag eq 'node' || $tag eq 'include' || $sec2level{$tag}) { + # no more in top + $in_top = 0; + } else { + # skip it + next; + } + } + # + # try to remove inlined comments + # syntax from tex-mode.el comment-start-skip + # + s/((^|[^\@])(\@\@)*)\@c(omment)? .*/$1/; + # non-@ substitutions cf. texinfmt.el + s/``/\"/g; + s/''/\"/g; + s/([\w ])---([\w ])/$1--$2/g; + # + # analyze the tag + # + if ($tag) { + # skip lines + &skip_until($tag), next if $tag eq 'ignore'; + if ($expandinfo) { + &skip_until($tag), next if $tag eq 'iftex'; + } else { + &skip_until($tag), next if $tag eq 'ifinfo'; + } + &skip_until($tag), next if $tag eq 'tex'; + # handle special tables + if ($tag eq 'table') { + $table_type = ''; + } elsif ($tag eq 'ftable') { + $tag = 'table'; + $table_type = 'f'; + } elsif ($tag eq 'vtable') { + $tag = 'table'; + $table_type = 'v'; + } + # special cases + if ($tag eq 'top' || ($tag eq 'node' && /^\@node\s+top\s*,/i)) { + $in_top = 1; + @lines = (); # ignore all lines before top (title page garbage) + next; + } elsif ($tag eq 'node') { + $in_top = 0; + warn "$ERROR Bad node line: $_" unless $_ =~ /^\@node\s$NODESRE$/o; + $_ = &protect_html($_); # if node contains '&' for instance + s/^\@node\s+//; + ($node) = split(/,/); + &normalise_node($node); + if ($split_node) { + &next_doc; + push(@lines, $SPLITTAG) if $split_num++; + push(@sections, $node); + } + next; + } elsif ($tag eq 'include') { + if (/^\@include\s+($FILERE)\s*$/o) { + $file = $1; + unless (-e $file) { + foreach $dir (@include_dirs) { + $file = "$dir/$1"; + last if -e $file; + } + } + if (-e $file) { + &open($file); + print "# including $file\n" if $verbose; + } else { + warn "$ERROR Can't find $file, skipping"; + } + } else { + warn "$ERROR Bad include line: $_"; + } + next; + } elsif ($tag eq 'ifclear') { + if (/^\@ifclear\s+($VARRE)\s*$/o) { + next unless defined($value{$1}); + &skip_until($tag); + } else { + warn "$ERROR Bad ifclear line: $_"; + } + next; + } elsif ($tag eq 'ifset') { + if (/^\@ifset\s+($VARRE)\s*$/o) { + next if defined($value{$1}); + &skip_until($tag); + } else { + warn "$ERROR Bad ifset line: $_"; + } + next; + } elsif ($tag eq 'menu') { + unless ($show_menu) { + &skip_until($tag); + next; + } + &html_push_if($tag); + push(@lines, &html_debug("\n", __LINE__)); + } elsif ($format_map{$tag}) { + $in_pre = 1 if $format_map{$tag} eq 'PRE'; + &html_push_if($format_map{$tag}); + push(@lines, &html_debug("\n", __LINE__)); + $in_list++ if $format_map{$tag} eq 'UL' || $format_map{$tag} eq 'OL' ; + push(@lines, &debug("<$format_map{$tag}>\n", __LINE__)); + next; + } elsif ($tag eq 'table') { + if (/^\@[fv]?table\s+\@(\w+)\s*$/) { + $in_table = $1; + unshift(@tables, join($;, $table_type, $in_table)); + push(@lines, &debug("

    \n", __LINE__)); + &html_push_if('DL'); + push(@lines, &html_debug("\n", __LINE__)); + } else { + warn "$ERROR Bad table line: $_"; + } + next; + } elsif ($tag eq 'synindex' || $tag eq 'syncodeindex') { + if (/^\@$tag\s+(\w)\w\s+(\w)\w\s*$/) { + eval("*${1}index = *${2}index"); + } else { + warn "$ERROR Bad syn*index line: $_"; + } + next; + } elsif ($tag eq 'sp') { + push(@lines, &debug("

    \n", __LINE__)); + next; + } elsif ($tag eq 'setref') { + &protect_html; # if setref contains '&' for instance + if (/^\@$tag\s*{($NODERE)}\s*$/) { + $setref = $1; + $setref =~ s/\s+/ /g; # normalize + $setref =~ s/ $//; + $node2sec{$setref} = $name; + $node2href{$setref} = "$docu_doc#$docid"; + } else { + warn "$ERROR Bad setref line: $_"; + } + next; + } elsif ($tag eq 'defindex' || $tag eq 'defcodeindex') { + if (/^\@$tag\s+(\w\w)\s*$/) { + $valid_index{$1} = 1; + } else { + warn "$ERROR Bad defindex line: $_"; + } + next; + } elsif (defined($def_map{$tag})) { + if ($def_map{$tag}) { + s/^\@$tag\s+//; + $tag = $def_map{$tag}; + $_ = "\@$tag $_"; + $tag =~ s/\s.*//; + } + } elsif (defined($user_sub{$tag})) { + s/^\@$tag\s+//; + $sub = $user_sub{$tag}; + print "# user $tag = $sub, arg: $_" if $debug & $DEBUG_USER; + if (defined(&$sub)) { + chop($_); + &$sub($_); + } else { + warn "$ERROR Bad user sub for $tag: $sub\n"; + } + next; + } + if (defined($def_map{$tag})) { + s/^\@$tag\s+//; + if ($tag =~ /x$/) { + # extra definition line + $tag = $`; + $is_extra = 1; + } else { + $is_extra = 0; + } + while (/\{([^\{\}]*)\}/) { + # this is a {} construct + ($before, $contents, $after) = ($`, $1, $'); + # protect spaces + $contents =~ s/\s+/$;9/g; + # restore $_ protecting {} + $_ = "$before$;7$contents$;8$after"; + } + @args = split(/\s+/, &protect_html($_)); + foreach (@args) { + s/$;9/ /g; # unprotect spaces + s/$;7/\{/g; # ... { + s/$;8/\}/g; # ... } + } + $type = shift(@args); + $type =~ s/^\{(.*)\}$/$1/; + print "# def ($tag): {$type} ", join(', ', @args), "\n" + if $debug & $DEBUG_DEF; + $type .= ':'; # it's nicer like this + $name = shift(@args); + $name =~ s/^\{(.*)\}$/$1/; + if ($is_extra) { + $_ = &debug("

    ", __LINE__); + } else { + $_ = &debug("
    \n
    ", __LINE__); + } + if ($tag eq 'deffn' || $tag eq 'defvr' || $tag eq 'deftp') { + $_ .= "$type $name"; + $_ .= " @args" if @args; + } elsif ($tag eq 'deftypefn' || $tag eq 'deftypevr' + || $tag eq 'defcv' || $tag eq 'defop') { + $ftype = $name; + $name = shift(@args); + $name =~ s/^\{(.*)\}$/$1/; + $_ .= "$type $ftype $name"; + $_ .= " @args" if @args; + } else { + warn "$ERROR Unknown definition type: $tag\n"; + $_ .= "$type $name"; + $_ .= " @args" if @args; + } + $_ .= &debug("\n
    ", __LINE__); + $name = &unprotect_html($name); + if ($tag eq 'deffn' || $tag eq 'deftypefn') { + unshift(@input_spool, "\@findex $name\n"); + } elsif ($tag eq 'defop') { + unshift(@input_spool, "\@findex $name on $ftype\n"); + } elsif ($tag eq 'defvr' || $tag eq 'deftypevr' || $tag eq 'defcv') { + unshift(@input_spool, "\@vindex $name\n"); + } else { + unshift(@input_spool, "\@tindex $name\n"); + } + $dont_html = 1; + } + } elsif ($end_tag) { + if ($format_map{$end_tag}) { + $in_pre = 0 if $format_map{$end_tag} eq 'PRE'; + $in_list-- if $format_map{$end_tag} eq 'UL' || $format_map{$end_tag} eq 'OL' ; + &html_pop_if('LI', 'P'); + &html_pop_if(); + push(@lines, &debug("\n", __LINE__)); + push(@lines, &html_debug("\n", __LINE__)); + } elsif ($end_tag eq 'table' || + $end_tag eq 'ftable' || + $end_tag eq 'vtable') { + shift(@tables); + if (@tables) { + ($table_type, $in_table) = split($;, $tables[0]); + } else { + $in_table = 0; + } + push(@lines, "
    \n"); + &html_pop_if('DD'); + &html_pop_if(); + } elsif (defined($def_map{$end_tag})) { + push(@lines, &debug("
    \n", __LINE__)); + } elsif ($end_tag eq 'menu') { + &html_pop_if(); + push(@lines, $_); # must keep it for pass 2 + } + next; + } + # + # misc things + # + # protect texi and HTML things + &protect_texi; + $_ = &protect_html($_) unless $dont_html; + $dont_html = 0; + # substitution (unsupported things) + s/^\@center\s+//g; + s/^\@exdent\s+//g; + s/\@noindent\s+//g; + s/\@refill\s+//g; + # other substitutions + &simple_substitutions; + s/\@value{($VARRE)}/$value{$1}/eg; + s/\@footnote\{/\@footnote$docu_doc\{/g; # mark footnotes, cf. pass 4 + # + # analyze the tag again + # + if ($tag) { + if (defined($sec2level{$tag}) && $sec2level{$tag} > 0) { + if (/^\@$tag\s+(.+)$/) { + $name = $1; + $name =~ s/\s+$//; + $level = $sec2level{$tag}; + $name = &update_sec_num($tag, $level) . " $name" + if $number_sections && $tag !~ /^unnumbered/; + if ($tag =~ /heading$/) { + push(@lines, &html_debug("\n", __LINE__)); + if ($html_element ne 'body') { + # We are in a nice pickle here. We are trying to get a H? heading + # even though we are not in the body level. So, we convert it to a + # nice, bold, line by itself. + $_ = &debug("\n\n

    $name

    \n\n", __LINE__); + } else { + $_ = &debug("$name\n", __LINE__); + &html_push_if('body'); + } + print "# heading, section $name, level $level\n" + if $debug & $DEBUG_TOC; + } else { + if ($split_chapter) { + unless ($toplevel) { + # first time we see a "section" + unless ($level == 1) { + warn "$ERROR The first section found is not of level 1: $_"; + warn "$ERROR I'll split on sections of level $level...\n"; + } + $toplevel = $level; + } + if ($level == $toplevel) { + &next_doc; + push(@lines, $SPLITTAG) if $split_num++; + push(@sections, $name); + } + } + $sec_num++; + $docid = "SEC$sec_num"; + $tocid = "TOC$sec_num"; + # check biblio and glossary + $in_bibliography = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*bibliography$/i); + $in_glossary = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*glossary$/i); + # check node + if ($node) { + if ($node2sec{$node}) { + warn "$ERROR Duplicate node found: $node\n"; + } else { + $node2sec{$node} = $name; + $node2href{$node} = "$docu_doc#$docid"; + print "# node $node, section $name, level $level\n" + if $debug & $DEBUG_TOC; + } + $node = ''; + } else { + print "# no node, section $name, level $level\n" + if $debug & $DEBUG_TOC; + } + # update TOC + while ($level > $curlevel) { + $curlevel++; + push(@toc_lines, "
      \n"); + } + while ($level < $curlevel) { + $curlevel--; + push(@toc_lines, "
    \n"); + } + $_ = "
  • " . &anchor($tocid, "$docu_doc#$docid", $name, 1); + push(@toc_lines, &substitute_style($_)); + # update DOC + push(@lines, &html_debug("\n", __LINE__)); + &html_reset; + $_ = "".&anchor($docid, "$docu_toc#$tocid", $name)."\n"; + $_ = &debug($_, __LINE__); + push(@lines, &html_debug("\n", __LINE__)); + } + # update DOC + foreach $line (split(/\n+/, $_)) { + push(@lines, "$line\n"); + } + next; + } else { + warn "$ERROR Bad section line: $_"; + } + } else { + # track variables + $value{$1} = $2, next if /^\@set\s+($VARRE)\s+(.*)$/o; + delete $value{$1}, next if /^\@clear\s+($VARRE)\s*$/o; + # store things + $value{'_setfilename'} = $1, next if /^\@setfilename\s+(.*)$/; + $value{'_settitle'} = $1, next if /^\@settitle\s+(.*)$/; + $value{'_author'} .= "$1\n", next if /^\@author\s+(.*)$/; + $value{'_subtitle'} .= "$1\n", next if /^\@subtitle\s+(.*)$/; + $value{'_title'} .= "$1\n", next if /^\@title\s+(.*)$/; + # index + if (/^\@(..?)index\s+/) { + unless ($valid_index{$1}) { + warn "$ERROR Undefined index command: $_"; + next; + } + $id = 'IDX' . ++$idx_num; + $index = $1 . 'index'; + $what = &substitute_style($'); + $what =~ s/\s+$//; + print "# found $index for '$what' id $id\n" + if $debug & $DEBUG_INDEX; + eval(<\n", __LINE__)); + push(@lines, &anchor($id, '', $invisible_mark, !$in_pre)); + &html_push('P'); + } elsif ($html_element eq 'DL' || + $html_element eq 'UL' || + $html_element eq 'OL' ) { + $deferred_ref .= &anchor($id, '', $invisible_mark, !$in_pre) . " "; + } + next; + } + # list item + if (/^\@itemx?\s+/) { + $what = $'; + $what =~ s/\s+$//; + if ($in_bibliography && $use_bibliography) { + if ($what =~ /^$BIBRE$/o) { + $id = 'BIB' . ++$bib_num; + $bib2href{$what} = "$docu_doc#$id"; + print "# found bibliography for '$what' id $id\n" + if $debug & $DEBUG_BIB; + $what = &anchor($id, '', $what); + } + } elsif ($in_glossary && $use_glossary) { + $id = 'GLOSS' . ++$gloss_num; + $entry = $what; + $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/; + $gloss2href{$entry} = "$docu_doc#$id"; + print "# found glossary for '$entry' id $id\n" + if $debug & $DEBUG_GLOSS; + $what = &anchor($id, '', $what); + } + &html_pop_if('P'); + if ($html_element eq 'DL' || $html_element eq 'DD') { + if ($things_map{$in_table} && !$what) { + # special case to allow @table @bullet for instance + push(@lines, &debug("
    $things_map{$in_table}\n", __LINE__)); + } else { + push(@lines, &debug("
    \@$in_table\{$what\}\n", __LINE__)); + } + push(@lines, "
    "); + &html_push('DD') unless $html_element eq 'DD'; + if ($table_type) { # add also an index + unshift(@input_spool, "\@${table_type}index $what\n"); + } + } else { + push(@lines, &debug("
  • $what\n", __LINE__)); + &html_push('LI') unless $html_element eq 'LI'; + } + push(@lines, &html_debug("\n", __LINE__)); + if ($deferred_ref) { + push(@lines, &debug("$deferred_ref\n", __LINE__)); + $deferred_ref = ''; + } + next; + } + } + } + # paragraph separator + if ($_ eq "\n") { + next if $#lines >= 0 && $lines[$#lines] eq "\n"; + if ($html_element eq 'P') { + push(@lines, "\n"); + $_ = &debug("

    \n", __LINE__); + &html_pop; + } + } elsif ($html_element eq 'body' || $html_element eq 'BLOCKQUOTE') { + push(@lines, "

    \n"); + &html_push('P'); + $_ = &debug($_, __LINE__); + } + # otherwise + push(@lines, $_); +} + +# finish TOC +$level = 0; +while ($level < $curlevel) { + $curlevel--; + push(@toc_lines, "

\n"); +} + +print "# end of pass 1\n" if $verbose; + +#+++############################################################################ +# # +# Pass 2/3: handle style, menu, index, cross-reference # +# # +#---############################################################################ + +@lines2 = (); # whole document (2nd pass) +@lines3 = (); # whole document (3rd pass) +$in_menu = 0; # am I inside a menu + +while (@lines) { + $_ = shift(@lines); + # + # special case (protected sections) + # + if (/^$PROTECTTAG/o) { + push(@lines2, $_); + next; + } + # + # menu + # + $in_menu = 1, push(@lines2, &debug("
    \n", __LINE__)), next if /^\@menu\b/; + $in_menu = 0, push(@lines2, &debug("
\n", __LINE__)), next if /^\@end\s+menu\b/; + if ($in_menu) { + if (/^\*\s+($NODERE)::/o) { + $descr = $'; + chop($descr); + &menu_entry($1, $1, $descr); + } elsif (/^\*\s+(.+):\s+([^\t,\.\n]+)[\t,\.\n]/) { + $descr = $'; + chop($descr); + &menu_entry($1, $2, $descr); + } elsif (/^\*/) { + warn "$ERROR Bad menu line: $_"; + } else { # description continued? + push(@lines2, $_); + } + next; + } + # + # printindex + # + if (/^\@printindex\s+(\w\w)\b/) { + local($index, *ary, @keys, $key, $letter, $last_letter, @refs); + if ($predefined_index{$1}) { + $index = $predefined_index{$1} . 'index'; + } else { + $index = $1 . 'index'; + } + eval("*ary = *$index"); + @keys = keys(%ary); + foreach $key (@keys) { + $_ = $key; + 1 while s/<(\w+)>\`(.*)\'<\/\1>/$2/; # remove HTML tags with quotes + 1 while s/<(\w+)>(.*)<\/\1>/$2/; # remove HTML tags + $_ = &unprotect_html($_); + &unprotect_texi; + tr/A-Z/a-z/; # lowercase + $key2alpha{$key} = $_; + print "# index $key sorted as $_\n" + if $key ne $_ && $debug & $DEBUG_INDEX; + } + $last_letter = undef; + foreach $key (sort byalpha @keys) { + $letter = substr($key2alpha{$key}, 0, 1); + $letter = substr($key2alpha{$key}, 0, 2) if $letter eq $;; + if (!defined($last_letter) || $letter ne $last_letter) { + push(@lines2, "\n") if defined($last_letter); + push(@lines2, "

" . &protect_html($letter) . "

\n"); + push(@lines2, "\n"); + $last_letter = $letter; + } + @refs = (); + foreach (split(/$;/, $ary{$key})) { + push(@refs, &anchor('', $_, $key, 0)); + } + push(@lines2, "
  • " . join(", ", @refs) . "\n"); + } + push(@lines2, "
  • \n") if defined($last_letter); + next; + } + # + # simple style substitutions + # + $_ = &substitute_style($_); + # + # xref + # + while (/\@(x|px|info|)ref{($XREFRE)(}?)/o) { + # note: Texinfo may accept other characters + ($type, $nodes, $full) = ($1, $2, $3); + ($before, $after) = ($`, $'); + if (! $full && $after) { + warn "$ERROR Bad xref (no ending } on line): $_"; + $_ = "$before$;0${type}ref\{$nodes$after"; + next; # while xref + } + if ($type eq 'x') { + $type = 'See '; + } elsif ($type eq 'px') { + $type = 'see '; + } elsif ($type eq 'info') { + $type = 'See Info'; + } else { + $type = ''; + } + unless ($full) { + $next = shift(@lines); + $next = &substitute_style($next); + chop($nodes); # remove final newline + if ($next =~ /\}/) { # split on 2 lines + $nodes .= " $`"; + $after = $'; + } else { + $nodes .= " $next"; + $next = shift(@lines); + $next = &substitute_style($next); + chop($nodes); + if ($next =~ /\}/) { # split on 3 lines + $nodes .= " $`"; + $after = $'; + } else { + warn "$ERROR Bad xref (no ending }): $_"; + $_ = "$before$;0xref\{$nodes$after"; + unshift(@lines, $next); + next; # while xref + } + } + } + $nodes =~ s/\s+/ /g; # remove useless spaces + @args = split(/\s*,\s*/, $nodes); + $node = $args[0]; # the node is always the first arg + &normalise_node($node); + $sec = $node2sec{$node}; + if (@args == 5) { # reference to another manual + $sec = $args[2] || $node; + $man = $args[4] || $args[3]; + $_ = "${before}${type}section `$sec' in \@cite{$man}$after"; + } elsif ($type =~ /Info/) { # inforef + warn "$ERROR Wrong number of arguments: $_" unless @args == 3; + ($nn, $_, $in) = @args; + $_ = "${before}${type} file `$in', node `$nn'$after"; + } elsif ($sec) { + $href = $node2href{$node}; + $_ = "${before}${type}section " . &anchor('', $href, $sec) . $after; + } else { + warn "$ERROR Undefined node ($node): $_"; + $_ = "$before$;0xref{$nodes}$after"; + } + } + # + # try to guess bibliography references or glossary terms + # + unless (/^/) { + $done .= $pre . &anchor('', $href, $what); + } else { + $done .= "$pre$what"; + } + $_ = $post; + } + $_ = $done . $_; + } + if ($use_glossary) { + $done = ''; + while (/\b\w+\b/) { + ($pre, $what, $post) = ($`, $&, $'); + $entry = $what; + $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/; + $href = $gloss2href{$entry}; + if (defined($href) && $post !~ /^[^<]*<\/A>/) { + $done .= $pre . &anchor('', $href, $what); + } else { + $done .= "$pre$what"; + } + $_ = $post; + } + $_ = $done . $_; + } + } + # otherwise + push(@lines2, $_); +} +print "# end of pass 2\n" if $verbose; + +# +# split style substitutions +# +while (@lines2) { + $_ = shift(@lines2); + # + # special case (protected sections) + # + if (/^$PROTECTTAG/o) { + push(@lines3, $_); + next; + } + # + # split style substitutions + # + $old = ''; + while ($old ne $_) { + $old = $_; + if (/\@(\w+)\{/) { + ($before, $style, $after) = ($`, $1, $'); + if (defined($style_map{$style})) { + $_ = $after; + $text = ''; + $after = ''; + $failed = 1; + while (@lines2) { + if (/\}/) { + $text .= $`; + $after = $'; + $failed = 0; + last; + } else { + $text .= $_; + $_ = shift(@lines2); + } + } + if ($failed) { + die "* Bad syntax (\@$style) after: $before\n"; + } else { + $text = &apply_style($style, $text); + $_ = "$before$text$after"; + } + } + } + } + # otherwise + push(@lines3, $_); +} +print "# end of pass 3\n" if $verbose; + +#+++############################################################################ +# # +# Pass 4: foot notes, final cleanup # +# # +#---############################################################################ + +@foot_lines = (); # footnotes +@doc_lines = (); # final document +$end_of_para = 0; # true if last line is

    + +while (@lines3) { + $_ = shift(@lines3); + # + # special case (protected sections) + # + if (/^$PROTECTTAG/o) { + push(@doc_lines, $_); + $end_of_para = 0; + next; + } + # + # footnotes + # + while (/\@footnote([^\{\s]+)\{/) { + ($before, $d, $after) = ($`, $1, $'); + $_ = $after; + $text = ''; + $after = ''; + $failed = 1; + while (@lines3) { + if (/\}/) { + $text .= $`; + $after = $'; + $failed = 0; + last; + } else { + $text .= $_; + $_ = shift(@lines3); + } + } + if ($failed) { + die "* Bad syntax (\@footnote) after: $before\n"; + } else { + $foot_num++; + $docid = "DOCF$foot_num"; + $footid = "FOOT$foot_num"; + $foot = "($foot_num)"; + push(@foot_lines, "

    " . &anchor($footid, "$d#$docid", $foot) . "

    \n"); + $text = "

    $text" unless $text =~ /^\s*

    /; + push(@foot_lines, "$text\n"); + $_ = $before . &anchor($docid, "$docu_foot#$footid", $foot) . $after; + } + } + # + # remove unnecessary

    + # + if (/^\s*

    \s*$/) { + next if $end_of_para++; + } else { + $end_of_para = 0; + } + # otherwise + push(@doc_lines, $_); +} +print "# end of pass 4\n" if $verbose; + +#+++############################################################################ +# # +# Pass 5: print things # +# # +#---############################################################################ + +$header = < +EOT + +$full_title = $value{'_title'} || $value{'_settitle'} || "Untitled Document"; +$title = $value{'_settitle'} || $full_title; +$_ = &substitute_style($full_title); +&unprotect_texi; +s/\n$//; # rmv last \n (if any) +$full_title = "

    " . join("

    \n

    ", split(/\n/, $_)) . "

    \n"; + +# +# print ToC +# +if (!$monolithic && @toc_lines) { + if (open(FILE, "> $docu_toc")) { + print "# creating $docu_toc...\n" if $verbose; + &print_toplevel_header("$title - Table of Contents"); + &print_ruler; + &print(*toc_lines, FILE); + &print_toplevel_footer; + close(FILE); + } else { + warn "$ERROR Can't write to $docu_toc: $!\n"; + } +} + +# +# print footnotes +# +if (!$monolithic && @foot_lines) { + if (open(FILE, "> $docu_foot")) { + print "# creating $docu_foot...\n" if $verbose; + &print_toplevel_header("$title - Footnotes"); + &print_ruler; + &print(*foot_lines, FILE); + &print_toplevel_footer; + close(FILE); + } else { + warn "$ERROR Can't write to $docu_foot: $!\n"; + } +} + +# +# print document +# +if ($split_chapter || $split_node) { # split + $doc_num = 0; + $last_num = scalar(@sections); + $first_doc = &doc_name(1); + $last_doc = &doc_name($last_num); + while (@sections) { + $section = shift(@sections); + &next_doc; + if (open(FILE, "> $docu_doc")) { + print "# creating $docu_doc...\n" if $verbose; + &print_header("$title - $section"); + $prev_doc = ($doc_num == 1 ? undef : &doc_name($doc_num - 1)); + $next_doc = ($doc_num == $last_num ? undef : &doc_name($doc_num + 1)); + $navigation = "Go to the "; + $navigation .= ($prev_doc ? &anchor('', $first_doc, "first") : "first"); + $navigation .= ", "; + $navigation .= ($prev_doc ? &anchor('', $prev_doc, "previous") : "previous"); + $navigation .= ", "; + $navigation .= ($next_doc ? &anchor('', $next_doc, "next") : "next"); + $navigation .= ", "; + $navigation .= ($next_doc ? &anchor('', $last_doc, "last") : "last"); + $navigation .= " section, " . &anchor('', $docu_toc, "table of contents") . ".\n"; + print FILE $navigation; + &print_ruler; + # find corresponding lines + @tmp_lines = (); + while (@doc_lines) { + $_ = shift(@doc_lines); + last if ($_ eq $SPLITTAG); + push(@tmp_lines, $_); + } + &print(*tmp_lines, FILE); + &print_ruler; + print FILE $navigation; + &print_footer; + close(FILE); + } else { + warn "$ERROR Can't write to $docu_doc: $!\n"; + } + } +} else { # not split + if (open(FILE, "> $docu_doc")) { + print "# creating $docu_doc...\n" if $verbose; + if ($monolithic || !@toc_lines) { + &print_toplevel_header($title); + } else { + &print_header($title); + print FILE $full_title; + } + if ($monolithic && @toc_lines) { + &print_ruler; + print FILE "

    Table of Contents

    \n"; + &print(*toc_lines, FILE); + } + &print_ruler; + &print(*doc_lines, FILE); + if ($monolithic && @foot_lines) { + &print_ruler; + print FILE "

    Footnotes

    \n"; + &print(*foot_lines, FILE); + } + if ($monolithic || !@toc_lines) { + &print_toplevel_footer; + } else { + &print_footer; + } + close(FILE); + } else { + warn "$ERROR Can't write to $docu_doc: $!\n"; + } +} + +print "# that's all folks\n" if $verbose; + +#+++############################################################################ +# # +# Low level functions # +# # +#---############################################################################ + +sub update_sec_num { + local($name, $level) = @_; + + $level--; # here we start at 0 + if ($name =~ /^appendix/) { + # appendix style + if (defined(@appendix_sec_num)) { + &incr_sec_num($level, @appendix_sec_num); + } else { + @appendix_sec_num = ('A', 0, 0, 0); + } + return(join('.', @appendix_sec_num[0..$level])); + } else { + # normal style + if (defined(@normal_sec_num)) { + &incr_sec_num($level, @normal_sec_num); + } else { + @normal_sec_num = (1, 0, 0, 0); + } + return(join('.', @normal_sec_num[0..$level])); + } +} + +sub incr_sec_num { + local($level, $l); + $level = shift(@_); + $_[$level]++; + foreach $l ($level+1 .. 3) { + $_[$l] = 0; + } +} + +sub check { + local($_, %seen, %context, $before, $match, $after); + + while (<>) { + if (/\@(\*|\.|\:|\@|\{|\})/) { + $seen{$&}++; + $context{$&} .= "> $_" if $verbose; + $_ = "$`XX$'"; + redo; + } + if (/\@(\w+)/) { + ($before, $match, $after) = ($`, $&, $'); + if ($before =~ /\b[\w-]+$/ && $after =~ /^[\w-.]*\b/) { # e-mail address + $seen{'e-mail address'}++; + $context{'e-mail address'} .= "> $_" if $verbose; + } else { + $seen{$match}++; + $context{$match} .= "> $_" if $verbose; + } + $match =~ s/^\@/X/; + $_ = "$before$match$after"; + redo; + } + } + + foreach (sort(keys(%seen))) { + if ($verbose) { + print "$_\n"; + print $context{$_}; + } else { + print "$_ ($seen{$_})\n"; + } + } +} + +sub open { + local($name) = @_; + + ++$fh_name; + if (open($fh_name, $name)) { + unshift(@fhs, $fh_name); + } else { + warn "$ERROR Can't read file $name: $!\n"; + } +} + +sub init_input { + @fhs = (); # hold the file handles to read + @input_spool = (); # spooled lines to read + $fh_name = 'FH000'; + &open($docu); +} + +sub next_line { + local($fh, $line); + + if (@input_spool) { + $line = shift(@input_spool); + return($line); + } + while (@fhs) { + $fh = $fhs[0]; + $line = <$fh>; + return($line) if $line; + close($fh); + shift(@fhs); + } + return(undef); +} + +# used in pass 1, use &next_line +sub skip_until { + local($tag) = @_; + local($_); + + while ($_ = &next_line) { + return if /^\@end\s+$tag\s*$/; + } + die "* Failed to find '$tag' after: " . $lines[$#lines]; +} + +# +# HTML stacking to have a better HTML output +# + +sub html_reset { + @html_stack = ('html'); + $html_element = 'body'; +} + +sub html_push { + local($what) = @_; + push(@html_stack, $html_element); + $html_element = $what; +} + +sub html_push_if { + local($what) = @_; + push(@html_stack, $html_element) + if ($html_element && $html_element ne 'P'); + $html_element = $what; +} + +sub html_pop { + $html_element = pop(@html_stack); +} + +sub html_pop_if { + local($elt); + + if (@_) { + foreach $elt (@_) { + if ($elt eq $html_element) { + $html_element = pop(@html_stack) if @html_stack; + last; + } + } + } else { + $html_element = pop(@html_stack) if @html_stack; + } +} + +sub html_debug { + local($what, $line) = @_; + return("$what") + if $debug & $DEBUG_HTML; + return($what); +} + +# to debug the output... +sub debug { + local($what, $line) = @_; + return("$what") + if $debug & $DEBUG_HTML; + return($what); +} + +sub normalise_node { + $_[0] =~ s/\s+/ /g; + $_[0] =~ s/ $//; + $_[0] =~ s/^ //; +} + +sub menu_entry { + local($entry, $node, $descr) = @_; + local($href); + + &normalise_node($node); + $href = $node2href{$node}; + if ($href) { + $descr =~ s/^\s+//; + $descr = ": $descr" if $descr; + push(@lines2, "
  • " . &anchor('', $href, $entry) . "$descr\n"); + } else { + warn "$ERROR Undefined node ($node): $_"; + } +} + +sub do_ctrl { "^$_[0]" } + +sub do_sc { "\U$_[0]\E" } + +sub apply_style { + local($texi_style, $text) = @_; + local($style); + + $style = $style_map{$texi_style}; + if (defined($style)) { # known style + if ($style =~ /^\"/) { # add quotes + $style = $'; + $text = "\`$text\'"; + } + if ($style =~ /^\&/) { # custom + $style = $'; + $text = &$style($text); + } elsif ($style) { # good style + $text = "<$style>$text"; + } else { # no style + } + } else { # unknown style + $text = undef; + } + return($text); +} + +# remove Texinfo styles +sub remove_style { + local($_) = @_; + s/\@\w+{([^\{\}]+)}/$1/g; + return($_); +} + +sub substitute_style { + local($_) = @_; + local($changed, $done, $style, $text); + + $changed = 1; + while ($changed) { + $changed = 0; + $done = ''; + while (/\@(\w+){([^\{\}]+)}/) { + $text = &apply_style($1, $2); + if ($text) { + $_ = "$`$text$'"; + $changed = 1; + } else { + $done .= "$`\@$1"; + $_ = "{$2}$'"; + } + } + $_ = $done . $_; + } + return($_); +} + +sub anchor { + local($name, $href, $text, $newline) = @_; + local($result); + + $result = "

    \n"; +} + +sub print_header { + local($_); + + # clean the title + $_ = &remove_style($_[0]); + &unprotect_texi; + # print the header + if ($doctype eq 'html2') { + print FILE $html2_doctype; + } elsif ($doctype) { + print FILE $doctype; + } + print FILE < + +$header +$_ + + +EOT +} + +sub print_toplevel_header { + local($_); + + &print_header; # pass given arg... + print FILE $full_title; + if ($value{'_subtitle'}) { + $value{'_subtitle'} =~ s/\n+$//; + foreach (split(/\n/, $value{'_subtitle'})) { + $_ = &substitute_style($_); + &unprotect_texi; + print FILE "

    $_

    \n"; + } + } + if ($value{'_author'}) { + $value{'_author'} =~ s/\n+$//; + foreach (split(/\n/, $value{'_author'})) { + $_ = &substitute_style($_); + &unprotect_texi; + s/[\w.-]+\@[\w.-]+/
    $&<\/A>/g; + print FILE "
    $_
    \n"; + } + } + print FILE "

    \n"; +} + +sub print_footer { + print FILE < + +EOT +} + +sub print_toplevel_footer { + &print_ruler; + print FILE <texi2html +translator version 1.51.

    +EOT + &print_footer; +} + +sub protect_texi { + # protect @ { } ` ' + s/\@\@/$;0/go; + s/\@\{/$;1/go; + s/\@\}/$;2/go; + s/\@\`/$;3/go; + s/\@\'/$;4/go; +} + +sub protect_html { + local($what) = @_; + # protect & < > + $what =~ s/\&/\&\#38;/g; + $what =~ s/\/\&\#62;/g; + # but recognize some HTML things + $what =~ s/\&\#60;\/A\&\#62;/<\/A>/g; # + $what =~ s/\&\#60;A ([^\&]+)\&\#62;//g; # + $what =~ s/\&\#60;IMG ([^\&]+)\&\#62;//g; # + return($what); +} + +sub unprotect_texi { + s/$;0/\@/go; + s/$;1/\{/go; + s/$;2/\}/go; + s/$;3/\`/go; + s/$;4/\'/go; +} + +sub unprotect_html { + local($what) = @_; + $what =~ s/\&\#38;/\&/g; + $what =~ s/\&\#60;/\/g; + return($what); +} + +sub byalpha { + $key2alpha{$a} cmp $key2alpha{$b}; +} + +############################################################################## + + # These next few lines are legal in both Perl and nroff. + +.00 ; # finish .ig + +'di \" finish diversion--previous line must be blank +.nr nl 0-1 \" fake up transition to first page again +.nr % 0 \" start at page 1 +'; __END__ ############# From here on it's a standard manual page ############ +.TH TEXI2HTML 1 "09/10/96" +.AT 3 +.SH NAME +texi2html \- a Texinfo to HTML converter +.SH SYNOPSIS +.B texi2html [options] file +.PP +.B texi2html -check [-verbose] files +.SH DESCRIPTION +.I Texi2html +converts the given Texinfo file to a set of HTML files. It tries to handle +most of the Texinfo commands. It creates hypertext links for cross-references, +footnotes... +.PP +It also tries to add links from a reference to its corresponding entry in the +bibliography (if any). It may also handle a glossary (see the +.B \-glossary +option). +.PP +.I Texi2html +creates several files depending on the contents of the Texinfo file and on +the chosen options (see FILES). +.PP +The HTML files created by +.I texi2html +are closer to TeX than to Info, that's why +.I texi2html +converts @iftex sections and not @ifinfo ones by default. You can reverse +this with the \-expandinfo option. +.SH OPTIONS +.TP 12 +.B \-check +Check the given file and give the list of all things that may be Texinfo commands. +This may be used to check the output of +.I texi2html +to find the Texinfo commands that have been left in the HTML file. +.TP +.B \-expandinfo +Expand @ifinfo sections, not @iftex ones. +.TP +.B \-glossary +Use the section named 'Glossary' to build a list of terms and put links in the HTML +document from each term toward its definition. +.TP +.B \-invisible \fIname\fP +Use \fIname\fP to create invisible destination anchors for index links. This is a workaround +for a known bug of many WWW browsers, including xmosaic. +.TP +.B \-I \fIdir\fP +Look also in \fIdir\fP to find included files. +.TP +.B \-menu +Show the Texinfo menus; by default they are ignored. +.TP +.B \-monolithic +Output only one file, including the table of contents and footnotes. +.TP +.B \-number +Number the sections. +.TP +.B \-split_chapter +Split the output into several HTML files (one per main section: +chapter, appendix...). +.TP +.B \-split_node +Split the output into several HTML files (one per node). +.TP +.B \-usage +Print usage instructions, listing the current available command-line options. +.TP +.B \-verbose +Give a verbose output. Can be used with the +.B \-check +option. +.PP +.SH FILES +By default +.I texi2html +creates the following files (foo being the name of the Texinfo file): +.TP 16 +.B foo_toc.html +The table of contents. +.TP +.B foo.html +The document's contents. +.TP +.B foo_foot.html +The footnotes (if any). +.PP +When used with the +.B \-split +option, it creates several files (one per chapter or node), named +.B foo_n.html +(n being the indice of the chapter or node), instead of the single +.B foo.html +file. +.PP +When used with the +.B \-monolithic +option, it creates only one file: +.B foo.html +.SH VARIABLES +.I texi2html +predefines the following variables: \fBhtml\fP, \fBtexi2html\fP. +.SH ADDITIONAL COMMANDS +.I texi2html +implements the following non-Texinfo commands: +.TP 16 +.B @ifhtml +This indicates the start of an HTML section, this section will passed through +without any modofication. +.TP +.B @end ifhtml +This indcates the end of an HTML section. +.SH VERSION +This is \fItexi2html\fP version 1.51, 09/10/96. +.PP +The latest version of \fItexi2html\fP can be found in WWW, cf. URL +http://wwwcn.cern.ch/dci/texi2html/ +.SH AUTHOR +The main author is Lionel Cons, CERN CN/DCI/UWS, Lionel.Cons@cern.ch. +Many other people around the net contributed to this program. +.SH COPYRIGHT +This program is the intellectual property of the European +Laboratory for Particle Physics (known as CERN). No guarantee whatsoever is +provided by CERN. No liability whatsoever is accepted for any loss or damage +of any kind resulting from any defect or inaccuracy in this information or +code. +.PP +CERN, 1211 Geneva 23, Switzerland +.SH "SEE ALSO" +GNU Texinfo Documentation Format, +HyperText Markup Language (HTML), +World Wide Web (WWW). +.SH BUGS +This program does not understand all Texinfo commands (yet). +.PP +TeX specific commands (normally enclosed in @iftex) will be +passed unmodified. +.ex diff --git a/glabels2/barcode-0.98/ean.c b/glabels2/barcode-0.98/ean.c new file mode 100644 index 00000000..0801a0ef --- /dev/null +++ b/glabels2/barcode-0.98/ean.c @@ -0,0 +1,774 @@ +/* + * ean.c -- encoding for ean, upc and isbn + * + * Copyright (c) 1999 Alessandro Rubini + * Copyright (c) 1999 Prosa Srl. + * Copyright (c) 2001 Boszormenyi Zoltan + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include + +#include "barcode.h" + +/* + * IMPORTANT NOTE: if you are reading this file to learn how to add a + * new encoding type, this is the wrong place as there are too many + * special cases. Please refer to code39.c instead. If you want to + * learn how UPC, EAN, ISBN work, on the other hand, I did my best to + * commend things and hope you enjoy it. + */ + +/* + * These following static arrays are used to describe the barcode. + * + * The various forms of UPC and EAN are documented as using three + * different alphabets to encode the ten digits. However, each digit + * has exactly one encoding; only, it is sometimes mirrored. Moreover, + * if you represent the width of each symbol (bar/space) instead of + * the sequence of 1's and 0's, you find that even-parity and odd-parity + * encoding are exactly the same. So, here are the digits: */ +static char *digits[] = { + "3211","2221","2122","1411","1132", + "1231","1114","1312","1213","3112"}; + +/* + * What EAN encoding does is adding a leading digit (the 13th digit). + * Such an extra digit is encoded by mirroring three of the six digits that + * appear in the left half of the UPC code. Here how mirroring works: + */ +static char *ean_mirrortab[] = { + "------","--1-11","--11-1","--111-","-1--11", + "-11--1","-111--","-1-1-1","-1-11-","-11-1-" +}; + +/* + * UPC-E (the 6-digit one), instead, encodes the check character as + * a mirroring of the symbols. This is similar, but the encoding for "0" is + * different (EAN uses no mirroring for "0" to be compatible with UPC). + * The same rule is used for UPC-5 (the supplemental digits for ISBN) + */ +static char *upc_mirrortab[] = { + "---111","--1-11","--11-1","--111-","-1--11", + "-11--1","-111--","-1-1-1","-1-11-","-11-1-" +}; + +/* + * UPC-E mirroring for encoding "1" + */ +static char *upc_mirrortab1[] = { + "111---","11-1--","11--1-","11---1","1-11--", + "1--11-","1---11","1-1-1-","1-1--1","1--1-1" +}; + +/* UPC-2 has just two digits to mirror */ +static char *upc_mirrortab2[] = { + "11","1-","-1","--" +}; + +/* + * initial, middle, final guard bars (first symbol is a a space). + * EAN-13 overwrites the first "0" with "9" to make space for the extra digit. + */ +static char *guard[] = {"0a1a","1a1a1","a1a"}; + +/* initial, final guard bars for UPC-E*/ +static char *guardE[] = {"0a1a","1a1a1a"}; + +/* initial and inter-char guard bars for supplementals (first is space) */ +static char *guardS[] = {"9112","11"}; + +/* + * These functions are shortcuts I use in the encoding engine + */ +static int ean_make_checksum(char *text, int mode) +{ + int esum = 0, osum = 0, i; + int even=1; /* last char is even */ + + if (strchr(text, ' ')) + i = strchr(text, ' ') - text; /* end of first part */ + else + i = strlen(text); /* end of all */ + + while (i-- > 0) { + if (even) esum += text[i]-'0'; + else osum += text[i]-'0'; + even = !even; + } + if (!mode) { /* standard upc/ean checksum */ + i = (3*esum + osum) % 10; + return (10-i) % 10; /* complement to 10 */ + } else { /* add-5 checksum */ + i = (3*esum + 9*osum); + return i%10; + } +} + +/* + * Check that the text can be encoded. Returns 0 or -1. + * Accept: + * 13 or 12 digits: EAN-13 w/ or w/o checksum + * or + * 8 or 7 digits: EAN-8 w/ or w/o checksum. + * For both EAN-13 and EAN-8, accept an addon of 2 or 5 digits, + * separated by ' ' + */ +int Barcode_ean_verify(unsigned char *text) +{ + int i, len0, len, addon; + unsigned char tmp[24], *spc; + + len = strlen(text); + spc = strchr(text, ' '); + if (spc) { + len0 = spc - text; + addon = len - len0 - 1; + if (addon != 2 && addon != 5) + return -1; + for (i=len0+1; i= '5' && text[10] <= '9') { + memcpy(&result[1], text+1, 5); + result[6] = text[10]; + } else { + return NULL; + } + result[7] = chksum + '0'; + + return result; +} + +/* + * UPC-A is the same as EAN, but accept + * 12 or 11 digits (UPC-A w/ or w/o checksum) + * or accept UPC-E as: + * 6 digits (w/o number system and checksum): number system '0' assumed, + * 7 digits (either w/o number system or checksum), + * 8 digits (w/ number system and checksum) + * plus the 2 or 5-digit add-on + */ +int Barcode_upc_verify(unsigned char *text) +{ + int i, len0, len, addon; + unsigned char tmp[24], *spc; + + len = strlen(text); + spc = strchr(text, ' '); + if (spc) { + len0 = spc - text; + addon = len - len0 - 1; + if (addon != 2 && addon != 5) + return -1; + for (i=len0+1; iascii) { + bc->error = EINVAL; + return -1; + } + + /* Find out whether the barcode has addon and + * the length of the barcode w/o the addon. + */ + len = strlen(bc->ascii); + spc = strchr(bc->ascii, ' '); + if (spc) { + len0 = spc - bc->ascii; + addon = strlen(spc + 1); + if (addon != 2 && addon != 5) { + bc->error = EINVAL; /* impossible, actually */ + return -1; + } + } else { + len0 = len; + addon = 0; + } + + if (!bc->encoding) { + /* ISBN already wrote what it is; if unknown, find it out */ + + /* + * Do not decide only by barcode length, it may be ambiguous. + * Anyway, either the user specified the barcode type or + * we already found a fitting one. + */ + switch(bc->flags & BARCODE_ENCODING_MASK) { + case BARCODE_EAN: + switch (len0) { + case 7: case 8: + bc->encoding = strdup("EAN-8"); + encoding = EAN8; + break; + case 12: case 13: + bc->encoding = strdup("EAN-13"); + encoding = EAN13; + break; + default: + bc->error = -EINVAL; + return -1; + } + break; + + case BARCODE_UPC: + switch (len0) { + case 6: case 7: case 8: + bc->encoding = strdup("UPC-E"); + encoding = UPCE; + break; + case 11: case 12: + bc->encoding = strdup("UPC-A"); + encoding = UPCA; + break; + default: + bc->error = -EINVAL; + return -1; + } + break; + default: + /* else, it's wrong (impossible, as the text is checked) */ + bc->error = -EINVAL; + return -1; + } + } + + /* better safe than sorry */ + if (bc->partial) free(bc->partial); bc->partial = NULL; + if (bc->textinfo) free(bc->textinfo); bc->textinfo = NULL; + + if (encoding == UPCA) { /* add the leading 0 (not printed) */ + text[0] = '0'; + strcpy(text+1, bc->ascii); + } else if (encoding == UPCE) { + strcpy(text, upc_a_to_e(upc_e_to_a(bc->ascii))); + } else { + strcpy(text, bc->ascii); + } + + /* + * build the checksum and the bars: any encoding is slightly different + */ + if (encoding == UPCA || encoding == EAN13 || encoding == ISBN) { + if (!(encoding == UPCA && len0 == 12) && + !(encoding == EAN13 && len0 == 13)) { + checksum = ean_make_checksum(text, 0); + text[12] = '0' + checksum; /* add it to the text */ + text[13] = '\0'; + } + + strcpy(partial, guard[0]); + if (encoding == EAN13 || encoding == ISBN) { /* The first digit */ + sprintf(tptr,"0:12:%c ",text[0]); + tptr += strlen(tptr); + partial[0] = '9'; /* extra space for the digit */ + } else if (encoding == UPCA) + partial[0] = '9'; /* UPC has one digit before the symbol, too */ + xpos = width_of_partial(partial); + mirror = ean_mirrortab[text[0]-'0']; + + /* left part */ + for (i=1;i<7;i++) { + ptr1 = partial + strlen(partial); /* target */ + ptr2 = digits[text[i]-'0']; /* source */ + strcpy(ptr1, ptr2); + if (mirror[i-1] == '1') { + /* mirror this */ + ptr1[0] = ptr2[3]; + ptr1[1] = ptr2[2]; + ptr1[2] = ptr2[1]; + ptr1[3] = ptr2[0]; + } + /* + * Write the ascii digit. UPC has a special case + * for the first digit, which is out of the bars + */ + if (encoding == UPCA && i==1) { + sprintf(tptr, "0:10:%c ", text[i]); + tptr += strlen(tptr); + ptr1[1] += 'a'-'1'; /* bars are long */ + ptr1[3] += 'a'-'1'; + } else { + sprintf(tptr, "%i:12:%c ", xpos, text[i]); + tptr += strlen(tptr); + } + /* count the width of the symbol */ + xpos += 7; /* width_of_partial(ptr2) */ + } + + strcat(partial, guard[1]); /* middle */ + xpos += width_of_partial(guard[1]); + + /* right part */ + for (i=7;i<13;i++) { + ptr1 = partial + strlen(partial); /* target */ + ptr2 = digits[text[i]-'0']; /* source */ + strcpy(ptr1, ptr2); + /* + * Ascii digit. Once again, UPC has a special + * case for the last digit + */ + if (encoding == UPCA && i==12) { + sprintf(tptr, "%i:10:%c ", xpos+13, text[i]); + tptr += strlen(tptr); + ptr1[0] += 'a'-'1'; /* bars are long */ + ptr1[2] += 'a'-'1'; + } else { + sprintf(tptr, "%i:12:%c ", xpos, text[i]); + tptr += strlen(tptr); + } + xpos += 7; /* width_of_partial(ptr2) */ + } + tptr[-1] = '\0'; /* overwrite last space */ + strcat(partial, guard[2]); /* end */ + xpos += width_of_partial(guard[2]); + + } else if (encoding == UPCE) { + checksum = text[7] - '0'; + + strcpy(partial, guardE[0]); + partial[0] = '9'; /* UPC-A has one digit before the symbol, too */ + xpos = width_of_partial(partial); + + /* UPC-E has the number system written before the bars. */ + sprintf(tptr, "0:10:%c ", text[0]); + tptr += strlen(tptr); + + if (text[0] == '0') + mirror = upc_mirrortab[checksum]; + else + mirror = upc_mirrortab1[checksum]; + + for (i=0;i<6;i++) { + ptr1 = partial + strlen(partial); /* target */ + ptr2 = digits[text[i+1]-'0']; /* source */ + strcpy(ptr1, ptr2); + if (mirror[i] != '1') { /* negated wrt EAN13 */ + /* mirror this */ + ptr1[0] = ptr2[3]; + ptr1[1] = ptr2[2]; + ptr1[2] = ptr2[1]; + ptr1[3] = ptr2[0]; + } + sprintf(tptr, "%i:12:%c ", xpos, text[i+1]); + tptr += strlen(tptr); + xpos += 7; /* width_of_partial(ptr2) */ + } + + sprintf(tptr, "%i:10:%c ", xpos+10, text[7]); + tptr += strlen(tptr); + ptr1[0] += 'a'-'1'; /* bars are long */ + ptr1[2] += 'a'-'1'; + + tptr[-1] = '\0'; /* overwrite last space */ + strcat(partial, guardE[1]); /* end */ + + } else { /* EAN-8 almost identical to EAN-13 but no mirroring */ + + if (len0 != 8) { + checksum = ean_make_checksum(text, 0); + text[7] = '0' + checksum; /* add it to the text */ + text[8] = '\0'; + } + + strcpy(partial, guard[0]); + xpos = width_of_partial(partial); + + /* left part */ + for (i=0;i<4;i++) { + strcpy(partial + strlen(partial), digits[text[i]-'0']); + sprintf(tptr, "%i:12:%c ", xpos, text[i]); + tptr += strlen(tptr); + xpos += 7; /* width_of_partial(digits[text[i]-'0' */ + } + strcat(partial, guard[1]); /* middle */ + xpos += width_of_partial(guard[1]); + + /* right part */ + for (i=4;i<8;i++) { + strcpy(partial + strlen(partial), digits[text[i]-'0']); + sprintf(tptr, "%i:12:%c ", xpos, text[i]); + tptr += strlen(tptr); + xpos += 7; /* width_of_partial(digits[text[i]-'0' */ + } + tptr[-1] = '\0'; /* overwrite last space */ + strcat(partial, guard[2]); /* end */ + } + + /* + * And that's it. Now, in case some add-on is specified it + * must be encoded too. Look for it. + */ + if ( (ptr1 = spc) ) { + ptr1++; + strcpy(text, ptr1); + if (strlen(ptr1)==5) { + checksum = ean_make_checksum(text, 1 /* special way */); + mirror = upc_mirrortab[checksum]+1; /* only last 5 digits */ + } else { + checksum = atoi(text)%4; + mirror = upc_mirrortab2[checksum]; + } + strcat(textinfo, " +"); strcat(partial, "+"); + tptr = textinfo + strlen(textinfo); + for (i=0; ipartial = strdup(partial); + if (!bc->partial) { + bc->error = errno; + return -1; + } + bc->textinfo = strdup(textinfo); + if (!bc->textinfo) { + bc->error = errno; + free(bc->partial); + bc->partial = NULL; + return -1; + } + if (!bc->width) + bc->width = width_of_partial(partial); + + return 0; /* success */ +} + +int Barcode_upc_encode(struct Barcode_Item *bc) +{ + return Barcode_ean_encode(bc); /* UPC is folded into EAN */ +} + +int Barcode_isbn_encode(struct Barcode_Item *bc) +{ + /* For ISBN we must normalize the string and prefix "978" */ + unsigned char *text = malloc(24); /* 13 + ' ' + 5 plus some slack */ + unsigned char *otext; + int i, j, retval; + + if (!text) { + bc->error = ENOMEM; + return -1; + } + strcpy(text, "978"); j=3; + + otext = bc->ascii; + for (i=0; otext[i]; i++) { + if (isdigit(otext[i])) + text[j++] = otext[i]; + if (j == 12) /* checksum added later */ + break; + } + text[j]='\0'; + if (strchr(otext, ' ')) + strcat(text, strchr(otext, ' ')); + bc->ascii = text; + bc->encoding = strdup("ISBN"); + retval = Barcode_ean_encode(bc); + bc->ascii = otext; /* restore ascii for the ps comments */ + free(text); + return retval; +} + diff --git a/glabels2/barcode-0.98/i25.c b/glabels2/barcode-0.98/i25.c new file mode 100644 index 00000000..72bd0358 --- /dev/null +++ b/glabels2/barcode-0.98/i25.c @@ -0,0 +1,164 @@ +/* + * i25.c -- "interleaved 2 of 5" + * + * Copyright (c) 1999,2000 Alessandro Rubini (rubini@gnu.org) + * Copyright (c) 1999 Prosa Srl. (prosa@prosa.it) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include + +#include "barcode.h" + +static char *codes[] = { + "11331", "31113", "13113", "33111", "11313", + "31311", "13311", "11133", "31131", "13131" +}; + +static char *guard[] = {"a1a1", "c1a"}; /* begin end */ + +int Barcode_i25_verify(unsigned char *text) +{ + if (!text[0]) + return -1; + while (*text && isdigit(*text)) + text++; + if (*text) + return -1; /* a non-digit char */ + return 0; /* ok */ +} + +int Barcode_i25_encode(struct Barcode_Item *bc) +{ + unsigned char *text; + unsigned char *partial; /* dynamic */ + unsigned char *textinfo; /* dynamic */ + unsigned char *textptr, *p1, *p2, *pd; + int i, len, sum[2], textpos, usesum = 0; + + if (bc->partial) + free(bc->partial); + if (bc->textinfo) + free(bc->textinfo); + bc->partial = bc->textinfo = NULL; /* safe */ + + if (!bc->encoding) + bc->encoding = strdup("interleaved 2 of 5"); + + text = bc->ascii; + if (!bc->ascii) { + bc->error = EINVAL; + return -1; + } + + if ((bc->flags & BARCODE_NO_CHECKSUM)) usesum = 0; else usesum = 1; + + /* create the real text string, padded to an even number of digits */ + text = malloc(strlen(bc->ascii) + 3); /* leading 0, checksum, term. */ + if (!text) { + bc->error = errno; + return -1; + } + /* add the leading 0 if needed */ + i = strlen(bc->ascii) + usesum; + if (i % 2) { + /* add a leading 0 */ + text[0] = '0'; + strcpy(text+1, bc->ascii); + } else { + strcpy(text, bc->ascii); + } + /* add the trailing checksum if needed, the leading 0 is ignored */ + if (usesum) { + sum[0] = sum[1] = 0; + for (i=0; text[i]; i++) + sum[i%2] += text[i]-'0'; + /* + * The "even" sum must be multiplied by three, and the * + * rightmost digit is defined as "even". The digits' position + * is already correct, whether or not we added a leading zero. + * (e.g., they are in pos. 0..4 or 1..4 of the string) + */ + i = sum[0] * 3 + sum[1]; + strcat(text, "0"); + text[strlen(text)-1] += (10 - (i%10)) % 10; + } + + /* the partial code is 5 * (text + check) + 4(head) + 3(tail) + term. */ + partial = malloc( (strlen(text) + 3) * 5 +2); /* be large... */ + if (!partial) { + bc->error = errno; + free(text); + return -1; + } + + /* the text information is at most "nnn:fff:c " * (strlen+1) +term */ + textinfo = malloc(10*(strlen(text)+1) + 2); + if (!textinfo) { + bc->error = errno; + free(partial); + free(text); + return -1; + } + + + strcpy(partial, "0"); /* the first space */ + strcat(partial, guard[0]); /* start */ + textpos = 4; /* width of initial guard */ + textptr = textinfo; + + len = strlen(text); + for (i=0; ierror = EINVAL; /* impossible if text is verified */ + free(partial); + free(textinfo); + free(text); + return -1; + } + /* interleave two digits */ + p1 = codes[text[i]-'0']; + p2 = codes[text[i+1]-'0']; + pd = partial + strlen(partial); /* destination */ + while (*p1) { + *(pd++) = *(p1++); + *(pd++) = *(p2++); + } + *pd = '\0'; + /* and print the ascii text (but don't print the checksum, if any */ + if (usesum && strlen(text+i)==2) { + /* print only one digit, discard the checksum */ + sprintf(textptr, "%i:12:%c ", textpos, text[i]); + } else { + sprintf(textptr, "%i:12:%c %i:12:%c ", textpos, text[i], + textpos+9, text[i+1]); + } + textpos += 18; /* width of two codes */ + textptr += strlen(textptr); + } + strcat(partial, guard[1]); + + bc->partial = partial; + bc->textinfo = textinfo; + free(text); + + return 0; +} + diff --git a/glabels2/barcode-0.98/install-sh b/glabels2/barcode-0.98/install-sh new file mode 100644 index 00000000..ab74c882 --- /dev/null +++ b/glabels2/barcode-0.98/install-sh @@ -0,0 +1,238 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. +# + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +tranformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/glabels2/barcode-0.98/library.c b/glabels2/barcode-0.98/library.c new file mode 100644 index 00000000..a8787020 --- /dev/null +++ b/glabels2/barcode-0.98/library.c @@ -0,0 +1,244 @@ +/* + * library.c -- external functions of libbarcode + * + * Copyright (c) 1999 Alessandro Rubini (rubini@gnu.org) + * Copyright (c) 1999 Prosa Srl. (prosa@prosa.it) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H /* sometimes (windows, for instance) it's missing */ +# include +#endif +#include + +#include "barcode.h" + +/* + * This function allocates a barcode structure and strdup()s the + * text string. It returns NULL in case of error + */ +struct Barcode_Item *Barcode_Create(char *text) +{ + struct Barcode_Item *bc; + + bc = malloc(sizeof(*bc)); + if (!bc) return NULL; + + memset(bc, 0, sizeof(*bc)); + bc->ascii = strdup(text); + bc->margin = BARCODE_DEFAULT_MARGIN; /* default margin */ + return bc; +} + + +/* + * Free a barcode structure + */ +int Barcode_Delete(struct Barcode_Item *bc) +{ + if (bc->ascii) + free(bc->ascii); + if (bc->partial) + free(bc->partial); + if (bc->textinfo) + free(bc->textinfo); + if (bc->encoding) + free(bc->encoding); + free(bc); + return 0; /* always success */ +} + + +/* + * The various supported encodings. This might be extended to support + * dynamic addition of extra encodings + */ +extern int Barcode_ean_verify(unsigned char *text); +extern int Barcode_ean_encode(struct Barcode_Item *bc); +extern int Barcode_upc_verify(unsigned char *text); +extern int Barcode_upc_encode(struct Barcode_Item *bc); +extern int Barcode_isbn_verify(unsigned char *text); +extern int Barcode_isbn_encode(struct Barcode_Item *bc); +extern int Barcode_39_verify(unsigned char *text); +extern int Barcode_39_encode(struct Barcode_Item *bc); +extern int Barcode_128b_verify(unsigned char *text); +extern int Barcode_128b_encode(struct Barcode_Item *bc); +extern int Barcode_128c_verify(unsigned char *text); +extern int Barcode_128c_encode(struct Barcode_Item *bc); +extern int Barcode_128_verify(unsigned char *text); +extern int Barcode_128_encode(struct Barcode_Item *bc); +extern int Barcode_128raw_verify(unsigned char *text); +extern int Barcode_128raw_encode(struct Barcode_Item *bc); +extern int Barcode_i25_verify(unsigned char *text); +extern int Barcode_i25_encode(struct Barcode_Item *bc); +extern int Barcode_cbr_verify(unsigned char *text); +extern int Barcode_cbr_encode(struct Barcode_Item *bc); +extern int Barcode_msi_verify(unsigned char *text); +extern int Barcode_msi_encode(struct Barcode_Item *bc); +extern int Barcode_pls_verify(unsigned char *text); +extern int Barcode_pls_encode(struct Barcode_Item *bc); +extern int Barcode_93_verify(unsigned char *text); +extern int Barcode_93_encode(struct Barcode_Item *bc); + + +struct encoding { + int type; + int (*verify)(unsigned char *text); + int (*encode)(struct Barcode_Item *bc); +}; + +struct encoding encodings[] = { + {BARCODE_EAN, Barcode_ean_verify, Barcode_ean_encode}, + {BARCODE_UPC, Barcode_upc_verify, Barcode_upc_encode}, + {BARCODE_ISBN, Barcode_isbn_verify, Barcode_isbn_encode}, + {BARCODE_128B, Barcode_128b_verify, Barcode_128b_encode}, + {BARCODE_128C, Barcode_128c_verify, Barcode_128c_encode}, + {BARCODE_128RAW, Barcode_128raw_verify, Barcode_128raw_encode}, + {BARCODE_39, Barcode_39_verify, Barcode_39_encode}, + {BARCODE_I25, Barcode_i25_verify, Barcode_i25_encode}, + {BARCODE_128, Barcode_128_verify, Barcode_128_encode}, + {BARCODE_CBR, Barcode_cbr_verify, Barcode_cbr_encode}, + {BARCODE_PLS, Barcode_pls_verify, Barcode_pls_encode}, + {BARCODE_MSI, Barcode_msi_verify, Barcode_msi_encode}, + {BARCODE_93, Barcode_93_verify, Barcode_93_encode}, + {0, NULL, NULL} +}; + +/* + * A function to encode a string into bc->partial, ready for + * postprocessing to the output file. Meaningful bits for "flags" are + * the encoding mask and the no-checksum flag. These bits + * get saved in the data structure. + */ +int Barcode_Encode(struct Barcode_Item *bc, int flags) +{ + int validbits = BARCODE_ENCODING_MASK | BARCODE_NO_CHECKSUM; + struct encoding *cptr; + + /* If any flag is cleared in "flags", inherit it from "bc->flags" */ + if (!(flags & BARCODE_ENCODING_MASK)) + flags |= bc->flags & BARCODE_ENCODING_MASK; + if (!(flags & BARCODE_NO_CHECKSUM)) + flags |= bc->flags & BARCODE_NO_CHECKSUM; + flags = bc->flags = (flags & validbits) | (bc->flags & ~validbits); + + if (!(flags & BARCODE_ENCODING_MASK)) { + /* get the first code able to handle the text */ + for (cptr = encodings; cptr->verify; cptr++) + if (cptr->verify((unsigned char *)bc->ascii)==0) + break; + if (!cptr->verify) { + bc->error = EINVAL; /* no code can handle this text */ + return -1; + } + flags |= cptr->type; /* this works */ + bc->flags |= cptr->type; + } + for (cptr = encodings; cptr->verify; cptr++) + if (cptr->type == (flags & BARCODE_ENCODING_MASK)) + break; + if (!cptr->verify) { + bc->error = EINVAL; /* invalid barcode type */ + return -1; + } + if (cptr->verify(bc->ascii) != 0) { + bc->error = EINVAL; + return -1; + } + return cptr->encode(bc); +} + + +/* + * When multiple output formats are supported, there will + * be a jumpt table like the one for the types. Now we don't need it + */ +extern int Barcode_ps_print(struct Barcode_Item *bc, FILE *f); +extern int Barcode_pcl_print(struct Barcode_Item *bc, FILE *f); + +/* + * A function to print a partially decoded string. Meaningful bits for + * "flags" are the output mask etc. These bits get saved in the data + * structure. + */ +int Barcode_Print(struct Barcode_Item *bc, FILE *f, int flags) +{ + int validbits = BARCODE_OUTPUT_MASK | BARCODE_NO_ASCII + | BARCODE_OUT_NOHEADERS; + + /* If any flag is clear in "flags", inherit it from "bc->flags" */ + if (!(flags & BARCODE_OUTPUT_MASK)) + flags |= bc->flags & BARCODE_OUTPUT_MASK; + if (!(flags & BARCODE_NO_ASCII)) + flags |= bc->flags & BARCODE_NO_ASCII; + if (!(flags & BARCODE_OUT_NOHEADERS)) + flags |= bc->flags & BARCODE_OUT_NOHEADERS; + flags = bc->flags = (flags & validbits) | (bc->flags & ~validbits); + + if (bc->flags & BARCODE_OUT_PCL) + return Barcode_pcl_print(bc, f); + return Barcode_ps_print(bc, f); +} + +/* + * Choose the position + */ +int Barcode_Position(struct Barcode_Item *bc, int wid, int hei, + int xoff, int yoff, double scalef) +{ + bc->width = wid; bc->height = hei; + bc->xoff = xoff; bc->yoff = yoff; + bc->scalef = scalef; + return 0; +} + +/* + * Do it all in one step + */ +int Barcode_Encode_and_Print(char *text, FILE *f, int wid, int hei, + int xoff, int yoff, int flags) +{ + struct Barcode_Item * bc; + + if (!(bc=Barcode_Create(text))) { + errno = -ENOMEM; + return -1; + } + if ( Barcode_Position(bc, wid, hei, xoff, yoff, 0.0) < 0 + || Barcode_Encode(bc, flags) < 0 + || Barcode_Print(bc, f, flags) < 0) { + errno = bc->error; + Barcode_Delete(bc); + return -1; + } + Barcode_Delete(bc); + return 0; +} + +/* + * Return the version + */ + +int Barcode_Version(char *vptr) +{ + if (vptr) + strcpy(vptr, BARCODE_VERSION); + return BARCODE_VERSION_INT; +} diff --git a/glabels2/barcode-0.98/main.c b/glabels2/barcode-0.98/main.c new file mode 100644 index 00000000..e07e4d3c --- /dev/null +++ b/glabels2/barcode-0.98/main.c @@ -0,0 +1,604 @@ +/* + * main.c - a commandline frontend for the barcode library + * + * Copyright (c) 1999 Michele Comitini (mcm@glisco.it) + * Copyright (c) 1999 Alessandro Rubini (rubini@gnu.org) + * Copyright (c) 1999 Prosa Srl. (prosa@prosa.it) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include + +#include "cmdline.h" +#include "barcode.h" + +#ifndef NO_LIBPAPER +#include +#endif + +/* + * Most of this file deals with command line options, by exploiting + * the cmdline.[ch] engine to offer defaults via environment variables + * and handling functions for complex options. + * + * In order to offer a friendly interface (for those who feel the + * cmdline *is* friendly, like me), we have to convert names to enums... + */ + +struct { + char *name; + int type; +} encode_tab[] = { + {"ean", BARCODE_EAN}, + {"ean13", BARCODE_EAN}, + {"ean-13", BARCODE_EAN}, + {"ean8", BARCODE_EAN}, + {"ean-8", BARCODE_EAN}, + {"upc", BARCODE_UPC}, + {"upc-a", BARCODE_UPC}, + {"upc-e", BARCODE_UPC}, + {"isbn", BARCODE_ISBN}, + {"39", BARCODE_39}, + {"code39", BARCODE_39}, + {"128c", BARCODE_128C}, + {"code128c", BARCODE_128C}, + {"128b", BARCODE_128B}, + {"code128b", BARCODE_128B}, + {"128", BARCODE_128}, + {"code128", BARCODE_128}, + {"128raw", BARCODE_128RAW}, + {"i25", BARCODE_I25}, + {"interleaved 2 of 5", BARCODE_I25}, + {"cbr", BARCODE_CBR}, + {"codabar", BARCODE_CBR}, + {"msi", BARCODE_MSI}, + {"pls", BARCODE_PLS}, + {"plessey", BARCODE_PLS}, + {"code93", BARCODE_93}, + {"93", BARCODE_93}, + + {NULL, 0} +}; + +/* + * Get encoding type from string rapresentation. + * Returns -1 on error. + */ +#ifndef HAVE_STRCASECMP /* some libs (windows, for example) have stricmp */ +# define strcasecmp stricmp +#endif + +int encode_id(char *encode_name) +{ + int i; + for (i = 0; encode_tab[i].name; i++) + if (!strcasecmp(encode_tab[i].name, encode_name)) + return encode_tab[i].type; + return -1; +} + +int list_encodes(FILE *f) /* used in the help message */ +{ + int prev = -1; + int i; + + fprintf(f, "Known encodings are (synonyms appear on the same line):"); + for (i = 0; encode_tab[i].name; i++) { + if (encode_tab[i].type != prev) + fprintf(f, "\n\t"); + else + fprintf(f, ", "); + fprintf(f, "\"%s\"", encode_tab[i].name); + prev = encode_tab[i].type; + } + fprintf(f, "\n"); + return 0; +} + + +/* + * Variables to hold cmdline arguments (or defaults) + */ + +char *ifilename, *ofilename; +int encoding_type; /* filled by get_encoding() */ +int code_width, code_height; /* "-g" for standalone codes */ +int lines, columns; /* "-t" for tables */ +int xmargin0, ymargin0; /* both for "-g" and "-t" */ +int xmargin1, ymargin1; /* same, but right and top */ +int ximargin, yimargin; /* "-m": internal margins */ +int eps, pcl, ps, noascii, nochecksum; /* boolean flags */ +int page_wid, page_hei; /* page size in points */ +char *page_name; /* name of the media */ +double unit = 1.0; /* unit specification */ + +char *prgname; /* used to print error msgs, initialized to argv[0] by main */ + +/* + * Functions to handle command line arguments + */ + +struct encode_item { + char *string; + struct encode_item *next; +} *list_head, *list_tail; + +/* each "-b" option adds a string to the input pool allocating its space */ +int get_input_string(void *arg) +{ + struct encode_item *item = malloc(sizeof(*item)); + if (!item) { + fprintf(stderr, "%s: malloc: %s\n", prgname, strerror(errno)); + return -2; + } + item->string = strdup(arg); + if (!list_head) { + list_head = list_tail = item; + } else { + list_tail->next = item; + list_tail = item; + } + item->next = NULL; + return 0; +} + +/* and this function extracts strings from the pool */ +unsigned char *retrieve_input_string(FILE *ifile) +{ + char *string; + static char fileline[128]; + + struct encode_item *item = list_head; + if (list_tail) { /* this means at least one "-b" was specified */ + if (!item) + return NULL; /* the list is empty */ + string = item->string; + list_head = item->next; + free(item); + return string; + } + + /* else, read from the file */ + if (!fgets(fileline, 128, ifile)) + return NULL; + if (fileline[strlen(fileline)-1]=='\n') + fileline[strlen(fileline)-1]= '\0'; + return strdup(fileline); +} + +/* accept a unit specification */ +int get_unit(void *arg) +{ + static struct { + char *str; + double unit; + } *ptr, unittab[] = { + {"pt", 1.0}, + {"in", 72.0}, + {"cm", 72.0/2.54}, + {"mm", 72.0/25.4}, + {NULL, 0.0} + }; + + for (ptr = unittab; ptr->str && strcmp((char *)arg, ptr->str); ptr++) + ; + unit = ptr->unit; + if (ptr->str) return 0; + + fprintf(stderr, "%s: incorrect unit \"%s\" (use one of", + prgname, (char *)arg); + for (ptr = unittab; ptr->str; ptr++) + fprintf(stderr, " \"%s\"", ptr->str); + fprintf(stderr, ")\n"); + return -2; +} + +/* convert an encoding name to an encoding integer code */ +int get_encoding(void *arg) +{ + encoding_type = encode_id((char *)arg); + if (encoding_type >=0) return 0; + fprintf(stderr, "%s: wrong encoding \"%s\"\n", prgname, + (char *)arg); + return -2; /* error, no help */ +} + +/* convert a geometry specification */ +int get_geometry(void *arg) +{ + double w = 0.0, h = 0.0; + double x = 0.0, y = 0.0; + int n; + + if (((char *)arg)[0]=='+') { + n = sscanf((char *)arg, "+%lf+%lf%s", &x, &y, (char *)arg); + } else { + n = sscanf((char *)arg, "%lfx%lf+%lf+%lf%s", &w, &h, &x, &y, + (char *)arg); + } + if (n!=4 && n!=2) { + fprintf(stderr, "%s: wrong geometry \"%s\"\n", prgname, (char *)arg); + return -2; + } + /* convert to points */ + code_width = w * unit; + code_height = h * unit; + xmargin0 = x * unit; + ymargin0 = y * unit; + return 0; +} + +/* convert a geometry specification */ +int get_table(void *arg) +{ + double x0 = 0.0, y0 = 0.0, x1 = 0.0, y1 = 0.0; + int n; + + n = sscanf((char *)arg, "%dx%d+%lf+%lf-%lf-%lf", + &columns, &lines, &x0, &y0, &x1, &y1); + + if (n==1 || n==3) { /* error: 2, 4, 5, 6 are fine */ + fprintf(stderr, "%s: wrong table specification \"%s\"\n", prgname, + (char *)arg); + return -2; + } + if (n < 6) y1 = y0; /* symmetric by default */ + if (n < 5) x1 = x0; + + /* convert and return */ + xmargin0 = x0 * unit; + ymargin0 = y0 * unit; + xmargin1 = x1 * unit; + ymargin1 = y1 * unit; + return 0; +} + +/* convert an internal margin specification */ +int get_margin(void *arg) +{ + char separator; + double x,y; + int n; + + /* accept one number or two, separated by any char */ + n = sscanf((char *)arg, "%lf%c%lf", &x, &separator, &y); + + if (n==1) { + n=3; y = x; + } + if (n==3) { + ximargin = x * unit; + yimargin = y * unit; + return 0; + } + fprintf(stderr, "%s: wrong margin specification \"%s\"\n", prgname, + (char *)arg); + return -2; + return 0; +} + +/* convert a page geometry specification */ +int get_page_geometry(void *arg) +{ + int n; + double dpw, dph; /* page width, height in mm or inches */ + static char tmpstr[20]; + page_name = arg; /* if undecipherable, we won't run the program :) */ + /* + * try to decode a "mm" string (eg. "210mmx297mm" or "210x297mm") + */ + n = sscanf((char *)arg, "%lfmmx%lf", &dpw, &dph); + if (n != 2 && strlen(arg)<20) { + n = sscanf((char *)arg, "%lfx%lf%s", &dpw, &dph, tmpstr); + if (n == 3 && !strcmp(tmpstr, "mm")) { + /* Ok, convert to points: 1in is 25.4mm, 1in is also 72p */ + page_wid = (int)(dpw / 25.4 * 72.0 + 0.5); + page_hei = (int)(dph / 25.4 * 72.0 + 0.5); + return 0; + } + } + + /* + * try to decode an "in" string (eg. "8.5inx11in" or "8.5x11in") + */ + n = sscanf((char *)arg, "%lfinx%lf", &dpw, &dph); + if (n != 2 && strlen(arg)<20) { + n = sscanf((char *)arg, "%lfx%lf%s", &dpw, &dph, tmpstr); + if (n == 3 && !strcmp(tmpstr, "in")) { + page_wid = (int)(dpw * 72.0 + 0.5); /* round to points */ + page_hei = (int)(dph * 72.0 + 0.5); + return 0; + } + } + + /* + * try to decode a numeric specification + */ + n = sscanf((char *)arg, "%lfx%lf", &dpw, &dph); + if (n == 2) { + page_wid = dpw * unit; + page_hei = dph * unit; + if (unit != 1.0) { /* rebuild the page name */ + page_name = malloc(32); /* big, to avoid snprintf, missing on HP */ + if (page_name) + sprintf(page_name, "%dx%d\n", page_wid, page_hei); + } + return 0; + } + +#ifndef NO_LIBPAPER + /* + * try to use libpaper, since it is available + */ + { + const struct paper* paptr; + + paperinit(); + paptr = paperinfo(arg); + if (!paptr) { /* unknown name */ + paperdone(); + return -1; + } + page_wid = (int)(paperpswidth(paptr) + 0.5); + page_hei = (int)(paperpsheight(paptr) + 0.5); + paperdone(); + return 0; + } +#endif + /* If we got here, the argument is undecipherable: fail */ + fprintf(stderr, "%s: wrong page size specification \"%s\"\n", prgname, + (char *)arg); + return -2; +} + +/* + * The table of possible arguments + */ +struct commandline option_table[] = { + {'i', CMDLINE_S, &ifilename, NULL, NULL, NULL, + "input file (strings to encode), default is stdin"}, + {'o', CMDLINE_S, &ofilename, NULL, NULL, NULL, + "output file, default is stdout"}, + {'b', CMDLINE_S, NULL, get_input_string, NULL, NULL, + "string to encode (use input file if missing)"}, + {'e', CMDLINE_S, NULL, get_encoding, "BARCODE_ENCODING", NULL, + "encoding type (default is best fit for first string)"}, + {'u', CMDLINE_S, NULL, get_unit, "BARCODE_UNIT", NULL, + "unit (\"mm\", \"in\", ...) used to decode -g, -t, -p"}, + {'g', CMDLINE_S, NULL, get_geometry, "BARCODE_GEOMETRY", NULL, + "geometry on the page: [x][++]"}, + {'t', CMDLINE_S, NULL, get_table, "BARCODE_TABLE", NULL, + "table geometry: x[++]"}, + {'m', CMDLINE_S, NULL, get_margin, "BARCODE_MARGIN", "10", + "internal margin for each item in a table: [,]"}, + {'n', CMDLINE_NONE, &noascii, NULL, NULL, NULL, + "\"numeric\": avoid printing text along with the bars"}, + {'c', CMDLINE_NONE, &nochecksum, NULL, NULL, NULL, + "no Checksum character, if the chosen encoding allows it"}, + {'E', CMDLINE_NONE, &eps, NULL, NULL, NULL, + "print one code as eps file (default: multi-page ps)"}, + {'P', CMDLINE_NONE, &pcl, NULL, NULL, NULL, + "create PCL output instead of postscript"}, + {'p', CMDLINE_S, NULL, get_page_geometry, NULL, NULL, + "page size (refer to the man page)"}, + {0,} +}; + +#ifdef NO_STRERROR +/* + * A strerror replacement (thanks to Thad Floryan ) + */ +char *strerror(int error) +{ + static char msg[16]; + if (error >= 0 && error < sys_nerr) + return sys_errlist[error]; + sprintf(msg, "Error %d", error); + return msg; +} +#endif + +/* + * The main function + */ +int main(int argc, char **argv) +{ + struct Barcode_Item * bc; + FILE *ifile = stdin; + FILE *ofile = stdout; + char *line; + int flags=0; /* for the library */ + int page, retval; + + prgname = argv[0]; + + /* First of all, accept "--help" and "-h" as a special case */ + if (argc == 2 && (!strcmp(argv[1],"--help") || !strcmp(argv[1],"-h"))) { + commandline_errormsg(stderr, option_table, argv[0], "Options:\n"); + fprintf(stderr,"\n"); + list_encodes(stderr); + exit(1); + } + /* Also, accept "--version" as a special case */ + if (argc == 2 && (!strcmp(argv[1],"--version"))) { + printf("barcode frontend (GNU barcode) " BARCODE_VERSION "\n"); + exit(0); + } + + /* Otherwise, parse the commandline */ + retval = commandline(option_table, argc, argv, "Use: %s [options]\n"); + if (retval) { + if (retval == -1) /* help printed, complete it */ + list_encodes(stderr); + else /* no help printed, suggest it */ + fprintf(stderr, "%s: try \"%s --help\"\n", prgname, prgname); + exit(1); + } + + /* If no paper size has been specified, use the default, if any */ + if (!page_name) { + page_wid = 595; page_hei = 842; + page_name = "A4"; /* I live in Europe :) */ +#ifndef NO_LIBPAPER + get_page_geometry(systempapername()); /* or the system default */ +#endif + } + + /* FIXME: print warnings for incompatible options */ + + /* open the input stream if specified */ + if (ifilename) + ifile = fopen(ifilename,"r"); + if (!ifile) { + fprintf(stderr, "%s: %s: %s\n", argv[0], ifilename, + strerror(errno)); + exit(1); + } + + /* open the output stream if specified */ + if (ofilename) + ofile = fopen(ofilename,"w"); + if (!ofile) { + fprintf(stderr, "%s: %s: %s\n", argv[0], ofilename, + strerror(errno)); + exit(1); + } + + if (encoding_type < 0) { /* unknown type specified */ + fprintf(stderr,"%s: Unknown endoding. Try \"%s --help\"\n", + argv[0], argv[0]); + exit(1); + } + flags |= encoding_type; + if (pcl) { + flags |= BARCODE_OUT_PCL; + } else { + ps = !eps; /* a shortcut */ + if (eps) + flags |= BARCODE_OUT_EPS; /* print headers too */ + else + flags |= BARCODE_OUT_PS | BARCODE_OUT_NOHEADERS; + } + if (noascii) + flags |= BARCODE_NO_ASCII; + if (nochecksum) + flags |= BARCODE_NO_CHECKSUM; + + /* the table is not available in eps mode */ + if (eps && (lines>1 || columns>1)) { + fprintf(stderr, "%s: can't print tables in EPS format\n",argv[0]); + exit(1); + } + + if (ps) { /* The header is independent of single/table mode */ + /* Headers. Don't let the library do it, we may need multi-page */ + fprintf(ofile, "%%!PS-Adobe-2.0\n"); + /* It would be nice to know the bounding box. Leave it alone */ + fprintf(ofile, "%%%%Creator: \"barcode\", " + "libbarcode sample frontend\n"); + if (page_name) + fprintf(ofile, "%%%%DocumentPaperSizes: %s\n", page_name); + fprintf(ofile, "%%%%EndComments\n"); + fprintf(ofile, "%%%%EndProlog\n\n"); + } + + /* + * Here we are, ready to work. Handle the one-per-page case first, + * as it is shorter. + */ + if (!lines && !columns) { + page = 0; + while ( (line = retrieve_input_string(ifile)) ) { + page++; + if (ps) { + fprintf(ofile, "%%%%Page: %i %i\n\n",page,page); + } + if (Barcode_Encode_and_Print(line, ofile, code_width, code_height, + xmargin0, ymargin0, flags) < 0) { + fprintf(stderr, "%s: can't encode \"%s\"\n", argv[0], line); + } + if (eps) break; /* if output is eps, do it once only */ + if (ps) fprintf(ofile, "showpage\n"); + if (pcl) fprintf(ofile, "\f"); + } + /* no more lines, print footers */ + if (ps) { + fprintf(ofile, "%%%%Trailer\n\n"); + } + } else { + + /* table mode, the header has been already printed */ + + int xstep = (page_wid - xmargin0 - xmargin1)/columns; + int ystep = (page_hei - ymargin0 - ymargin1)/lines; + int x = columns, y = -1; /* position in the table, start off-page */ + + if (!ximargin) ximargin = BARCODE_DEFAULT_MARGIN; + if (!yimargin) yimargin = BARCODE_DEFAULT_MARGIN; + /* Assign default size unless -g did it (Joachim Reichelt) */ + if ( !code_width && !code_height) { + code_width = xstep - 2*ximargin; + code_height = ystep - 2*yimargin; + } + + page=0; + while ( (line = retrieve_input_string(ifile)) ) { + x++; /* fit x and y */ + if (x >= columns) { + x=0; y--; + if (y<0) { + y = lines-1; page++; + /* flush page */ + if (ps && page > 1) fprintf(ofile, "showpage\n"); + if (pcl && page > 1) fprintf(ofile, "\f"); + /* new page */ + if (ps) fprintf(ofile, "%%%%Page: %i %i\n\n",page,page); + } + } + + /* + * Create a barcode item. This allows to set the margin to 0, as + * we have [xy]imargin to use. But don't use Encode_and_Print(), + * unroll it here instead + */ + bc = Barcode_Create(line); + if (!bc) { + fprintf(stderr, "%s: Barcode_Create(): %s\n", argv[0], + strerror(errno)); + exit(1); + } + bc->margin = 0; + if ( (Barcode_Position(bc, code_width, code_height, + xmargin0 + ximargin + x * xstep, + ymargin0 + yimargin + y * ystep, 0.0) < 0) + || (Barcode_Encode(bc, flags) < 0) + || (Barcode_Print(bc, ofile, flags) < 0) ) { + fprintf(stderr, "%s: can't encode \"%s\": %s\n", argv[0], + line, strerror(bc->error)); + } + Barcode_Delete(bc); + } + if (ps) fprintf(ofile, "showpage\n\n%%%%Trailer\n\n"); + if (pcl) fprintf(ofile, "\f"); + } + return 0; +} + + + diff --git a/glabels2/barcode-0.98/missing b/glabels2/barcode-0.98/missing new file mode 100755 index 00000000..d46f79f6 --- /dev/null +++ b/glabels2/barcode-0.98/missing @@ -0,0 +1,198 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. +# Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc. +# Franc,ois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.in; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +case "$1" in + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + yacc create \`y.tab.[ch]', if possible, from existing .[ch]" + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing - GNU libit 0.0" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acinclude.m4' or \`$configure_ac'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`$configure_ac'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acconfig.h' or \`$configure_ac'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' $configure_ac` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`$configure_ac'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequirements for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 diff --git a/glabels2/barcode-0.98/mkinstalldirs b/glabels2/barcode-0.98/mkinstalldirs new file mode 100755 index 00000000..6b3b5fc5 --- /dev/null +++ b/glabels2/barcode-0.98/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id$ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/glabels2/barcode-0.98/msi.c b/glabels2/barcode-0.98/msi.c new file mode 100644 index 00000000..77a373b2 --- /dev/null +++ b/glabels2/barcode-0.98/msi.c @@ -0,0 +1,155 @@ +/* + * msi.c -- encoding for MSI-Plessey + * + * Copyright (c) 2000 Leonid A. Broukhis (leob@mailcom.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include + +#include "barcode.h" + + +/* Patterns */ +static char *patterns[] = { "13", "31" }; + +static char *fillers[] = { "031", "131" }; + +static int width = 16 /* each character uses 4 patterns */, + startpos = 6 /* length of the first filler */; + +/* + * Check that the text can be encoded. Returns 0 or -1. + */ +int Barcode_msi_verify(unsigned char *text) +{ + int i; + + if (!strlen(text)) + return -1; + for (i=0; text[i]; i++) { + if (!isdigit(text[i])) + return -1; + } + return 0; +} + +static int add_one(char *ptr, int code) +{ + sprintf(ptr, "%s%s%s%s", + patterns[(code >> 3) & 1], + patterns[(code >> 2) & 1], + patterns[(code >> 1) & 1], + patterns[code & 1]); + return 0; +} + +/* + * The encoding functions fills the "partial" and "textinfo" fields. + * Lowercase chars are converted to uppercase + */ +int Barcode_msi_encode(struct Barcode_Item *bc) +{ + static char *text; + static char *partial; /* dynamic */ + static char *textinfo; /* dynamic */ + char *ptr, *textptr; + int i, code, textpos, usesum, checksum = 0; + + if (bc->partial) + free(bc->partial); + if (bc->textinfo) + free(bc->textinfo); + bc->partial = bc->textinfo = NULL; /* safe */ + + if (!bc->encoding) + bc->encoding = strdup("msi"); + + if ((bc->flags & BARCODE_NO_CHECKSUM)) + usesum = 0; + else + usesum = 1; + + text = bc->ascii; + + /* the partial code is head + 8 * (text + check) + tail + margin + term. */ + partial = malloc( 3 + 8 * (strlen(text) + 1) + 3 + 2 ); + if (!partial) { + bc->error = errno; + return -1; + } + + /* the text information is at most "nnn:fff:c " * strlen +term */ + textinfo = malloc(10*strlen(text) + 2); + if (!textinfo) { + bc->error = errno; + free(partial); + return -1; + } + + strcpy(partial, fillers[0]); + ptr = partial + strlen(partial); + textptr = textinfo; + textpos = startpos; + + for (i=0; ipartial = partial; + bc->textinfo = textinfo; + + return 0; +} diff --git a/glabels2/barcode-0.98/pcl.c b/glabels2/barcode-0.98/pcl.c new file mode 100644 index 00000000..d5ec097a --- /dev/null +++ b/glabels2/barcode-0.98/pcl.c @@ -0,0 +1,200 @@ +/* + * pcl.c -- printing the "partial" bar encoding in PCL format + * + * Copyright (c) 1999 Alessandro Rubini (rubini@gnu.org) + * Copyright (c) 1999 Prosa Srl. (prosa@prosa.it) + * Copyright (c) 2001 Andrea Scopece (a.scopece@tin.it) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include + +#include "barcode.h" + +#define SHRINK_AMOUNT 0.15 /* shrink the bars to account for ink spreading */ + + +/* + * How do the "partial" and "textinfo" strings work? See file "ps.c" + */ + + +int Barcode_pcl_print(struct Barcode_Item *bc, FILE *f) +{ + int i, j, k, barlen; + double f1, f2, fsav=0; + int mode = '-'; /* text below bars */ + double scalef=1, xpos, x0, y0, yr; + unsigned char *ptr; + unsigned char c; + + char font_id[6]; /* default font, should be "scalable" */ + /* 0 Line printer, use on older LJet II, isn't scalable */ + /* 4148 Univers, use on LJet III series, and Lj 4L, 5L */ + /* 16602 Arial, default LJ family 4, 5, 6, Color, Djet */ + + if (!bc->partial || !bc->textinfo) { + bc->error = EINVAL; + return -1; + } + + /* + * Maybe this first part can be made common to several printing back-ends, + * we'll see how that works when other ouput engines are added + */ + + /* First, calculate barlen */ + barlen = bc->partial[0] - '0'; + for (ptr = bc->partial+1; *ptr; ptr++) + if (isdigit(*ptr)) + barlen += (*ptr - '0'); + else if (islower(*ptr)) + barlen += (*ptr - 'a'+1); + + /* The scale factor depends on bar length */ + if (!bc->scalef) { + if (!bc->width) bc->width = barlen; /* default */ + scalef = bc->scalef = (double)bc->width / (double)barlen; + } + + /* The width defaults to "just enough" */ + if (!bc->width) bc->width = barlen * scalef +1; + + /* But it can be too small, in this case enlarge and center the area */ + if (bc->width < barlen * scalef) { + int wid = barlen * scalef + 1; + bc->xoff -= (wid - bc->width)/2 ; + bc->width = wid; + /* Can't extend too far on the left */ + if (bc->xoff < 0) { + bc->width += -bc->xoff; + bc->xoff = 0; + } + } + + /* The height defaults to 80 points (rescaled) */ + if (!bc->height) bc->height = 80 * scalef; + +#if 0 + /* If too small (5 + text), enlarge and center */ + i = 5 + 10 * ((bc->flags & BARCODE_NO_ASCII)==0); + if (bc->height < i * scalef ) { + int hei = i * scalef; + bc->yoff -= (hei-bc->height)/2; + bc->height = hei; + if (bc->yoff < 0) { + bc->height += -bc->yoff; + bc->yoff = 0; + } + } +#else + /* If too small (5 + text), reduce the scale factor and center */ + i = 5 + 10 * ((bc->flags & BARCODE_NO_ASCII)==0); + if (bc->height < i * scalef ) { + double scaleg = ((double)bc->height) / i; + int wid = bc->width * scaleg / scalef; + bc->xoff += (bc->width - wid)/2; + bc->width = wid; + scalef = scaleg; + } +#endif + + /* + * deal with PCL output + */ + + xpos = bc->margin + (bc->partial[0]-'0') * scalef; + for (ptr = bc->partial+1, i=1; *ptr; ptr++, i++) { + /* special cases: '+' and '-' */ + if (*ptr == '+' || *ptr == '-') { + mode = *ptr; /* don't count it */ i++; continue; + } + + /* j is the width of this bar/space */ + if (isdigit (*ptr)) j = *ptr-'0'; + else j = *ptr-'a'+1; + if (i%2) { /* bar */ + x0 = bc->xoff + xpos; + y0 = bc->yoff + bc->margin; + yr = bc->height; + if (!(bc->flags & BARCODE_NO_ASCII)) { /* leave space for text */ + if (mode == '-') { + /* text below bars: 10 points or five points */ + yr -= (isdigit(*ptr) ? 10 : 5) * scalef; + } else { /* '+' */ + /* text above bars: 10 or 0 from bottom, and 10 from top */ + y0 += (isdigit(*ptr) ? 10 : 0) * scalef; + yr -= (isdigit(*ptr) ? 20 : 10) * scalef; + } + } + + fprintf(f,"%c&a%.0fH", 27, x0 * 10.0); + fprintf(f,"%c&a%.0fV", 27, y0 * 10.0); + fprintf(f,"%c*c%.0fH", 27, ((j*scalef)-SHRINK_AMOUNT) * 10.0); + fprintf(f,"%c*c%.0fV", 27, yr * 10.0); + fprintf(f,"%c*c0P\n", 27); + } + xpos += j * scalef; + } + + /* the text */ + + mode = '-'; /* reinstantiate default */ + if (!(bc->flags & BARCODE_NO_ASCII)) { + k=0; /* k is the "previous font size" */ + for (ptr = bc->textinfo; ptr; ptr = strchr(ptr, ' ')) { + while (*ptr == ' ') ptr++; + if (!*ptr) break; + if (*ptr == '+' || *ptr == '-') { + mode = *ptr; continue; + } + if (sscanf(ptr, "%lf:%lf:%c", &f1, &f2, &c) != 3) { + fprintf(stderr, "barcode: impossible data: %s\n", ptr); + continue; + } + + /* select a Scalable Font */ + + if (fsav != f2) + { + if ((bc->flags & BARCODE_OUT_PCL_III) == BARCODE_OUT_PCL_III) + { strcpy(font_id, "4148"); /* font Univers */ + } + else + { strcpy(font_id, "16602"); /* font Arial */ + } + + fprintf(f,"%c(8U%c(s1p%5.2fv0s0b%sT", 27, 27, f2 * scalef, font_id); + } + fsav = f2; + + fprintf(f,"%c&a%.0fH", 27, (bc->xoff + f1 * scalef + bc->margin) * 10.0); + fprintf(f,"%c&a%.0fV", 27, + mode != '-' + ? ((double)bc->yoff + bc->margin + 8*scalef) * 10.0 + : ((double)bc->yoff + bc->margin + bc->height ) * 10.0); + + fprintf(f, "%c", c); + } + + } + + return 0; +} diff --git a/glabels2/barcode-0.98/plessey.c b/glabels2/barcode-0.98/plessey.c new file mode 100644 index 00000000..ec471005 --- /dev/null +++ b/glabels2/barcode-0.98/plessey.c @@ -0,0 +1,164 @@ +/* + * plessey.c -- encoding for Plessey + * + * Copyright (c) 2000 Leonid A. Broukhis (leob@mailcom.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include + +#include "barcode.h" + +static char * patterns[] = { "13", "31" }; + +/* this is ordered in decades to simplify encoding */ +static char alphabet[] = + "0123456789" "ABCDEF"; + +/* stop sequence may be 231311313 (barcodemill.com) */ +static char *fillers[] = { "031311331", "331311313" }; + +static int width = 16, startpos = 16; + +/* + * Check that the text can be encoded. Returns 0 or -1. + * If it's all lowecase convert to uppercase and accept it + */ +int Barcode_pls_verify(unsigned char *text) +{ + int i, upper = 0, lower = 0; + + if (!strlen(text)) + return -1; + for (i=0; text[i]; i++) { + if (!strchr(alphabet,toupper(text[i]))) + return -1; + if (isupper(text[i])) upper++; + if (islower(text[i])) lower++; + } + if (upper && lower) + return -1; + return 0; +} + +static int add_one(char *ptr, int code) +{ + sprintf(ptr, "%s%s%s%s", + patterns[code & 1], + patterns[(code >> 1) & 1], + patterns[(code >> 2) & 1], + patterns[(code >> 3) & 1] + ); + return 0; +} + +/* + * The encoding functions fills the "partial" and "textinfo" fields. + * Lowercase chars are converted to uppercase + */ +int Barcode_pls_encode(struct Barcode_Item *bc) +{ + static char *text; + static char *partial; /* dynamic */ + static char *textinfo; /* dynamic */ + char *c, *ptr, *textptr; + unsigned char *checkptr; + int i, code, textpos; + static char check[9] = {1,1,1,1,0,1,0,0,1}; + if (bc->partial) + free(bc->partial); + if (bc->textinfo) + free(bc->textinfo); + bc->partial = bc->textinfo = NULL; /* safe */ + + if (!bc->encoding) + bc->encoding = strdup("plessey"); + + text = bc->ascii; + if (!text) { + bc->error = EINVAL; + return -1; + } + /* the partial code is 8 * (head + text + check + tail) + margin + term. */ + partial = malloc( (strlen(text) + 4) * 8 + 3); + checkptr = calloc (1, strlen(text) * 4 + 8); + + if (!partial || !checkptr) { + if (partial) free(partial); + if (checkptr) free(checkptr); + bc->error = errno; + return -1; + } + + /* the text information is at most "nnn:fff:c " * strlen +term */ + textinfo = malloc(10*strlen(text) + 2); + if (!textinfo) { + bc->error = errno; + free(partial); + return -1; + } + + strcpy(partial, fillers[0]); + ptr = partial + strlen(partial); + textptr = textinfo; + textpos = startpos; + + for (i=0; ierror = EINVAL; /* impossible if text is verified */ + free(partial); + free(textinfo); + return -1; + } + code = c - alphabet; + add_one(ptr, code); + sprintf(textptr, "%i:12:%c ", textpos, toupper(text[i])); + + textpos += width; /* width of each code */ + textptr += strlen(textptr); + ptr += strlen(ptr); + checkptr[4*i] = code & 1; + checkptr[4*i+1] = (code >> 1) & 1; + checkptr[4*i+2] = (code >> 2) & 1; + checkptr[4*i+3] = (code >> 3) & 1; + } + /* The CRC checksum is required */ + for (i=0; i < 4*strlen(text); i++) { + int j; + if (checkptr[i]) + for (j = 0; j < 9; j++) + checkptr[i+j] ^= check[j]; + } + for (i = 0; i < 8; i++) { + sprintf(ptr, patterns[checkptr[strlen(text) * 4 + i]]); + ptr += 2; + } + fprintf(stderr, "CRC: "); + for (i = 0; i < 8; i++) { + fputc('0' + checkptr[strlen(text) * 4 + i], stderr); + } + fputc('\n', stderr); + strcpy(ptr, fillers[1]); + bc->partial = partial; + bc->textinfo = textinfo; + + return 0; +} diff --git a/glabels2/barcode-0.98/ps.c b/glabels2/barcode-0.98/ps.c new file mode 100644 index 00000000..35917517 --- /dev/null +++ b/glabels2/barcode-0.98/ps.c @@ -0,0 +1,272 @@ +/* + * ps.c -- printing the "partial" bar encoding + * + * Copyright (c) 1999 Alessandro Rubini (rubini@gnu.org) + * Copyright (c) 1999 Prosa Srl. (prosa@prosa.it) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include + +#include "barcode.h" + +#define SHRINK_AMOUNT 0.15 /* shrink the bars to account for ink spreading */ + + +/* + * How do the "partial" and "textinfo" strings work? + * + * The first char in "partial" tells how much extra space to add to the + * left of the bars. For EAN-13, it is used to leave space to print the + * first digit, other codes may have '0' for no-extra-space-needed. + * + * The next characters are alternating bars and spaces, as multiples + * of the base dimension which is 1 unless the code is + * rescaled. Rescaling is calculated as the ratio from the requested + * width and the calculated width. Digits represent bar/space + * dimensions. Lower-case letters represent those bars that should + * extend lower than the others: 'a' is equivalent to '1', 'b' is '2' and + * so on. + * + * The "textinfo" string is made up of fields "%lf:%lf:%c" separated by + * blank space. The first integer is the x position of the character, + * the second is the font size (before rescaling) and the char item is + * the charcter to be printed. + * + * Both the "partial" and "textinfo" strings may include "-" or "+" as + * special characters (in "textinfo" the char should be a standalone + * word). They state where the text should be printed: below the bars + * ("-", default) or above the bars. This is used, for example, to + * print the add-5 and add-2 codes to the right of UPC or EAN codes + * (the add-5 extension is mostly used in ISBN codes. + */ + + +int Barcode_ps_print(struct Barcode_Item *bc, FILE *f) +{ + int i, j, k, barlen, printable=1; + double f1, f2, fsav=0; + int mode = '-'; /* text below bars */ + double scalef=1, xpos, x0, y0, yr; + unsigned char *ptr; + unsigned char c; + + if (!bc->partial || !bc->textinfo) { + bc->error = EINVAL; + return -1; + } + + + /* + * Maybe this first part can be made common to several printing back-ends, + * we'll see how that works when other ouput engines are added + */ + + /* First, calculate barlen */ + barlen = bc->partial[0] - '0'; + for (ptr = bc->partial+1; *ptr; ptr++) + if (isdigit(*ptr)) + barlen += (*ptr - '0'); + else if (islower(*ptr)) + barlen += (*ptr - 'a'+1); + + /* The scale factor depends on bar length */ + if (!bc->scalef) { + if (!bc->width) bc->width = barlen; /* default */ + scalef = bc->scalef = (double)bc->width / (double)barlen; + } + + /* The width defaults to "just enough" */ + if (!bc->width) bc->width = barlen * scalef +1; + + /* But it can be too small, in this case enlarge and center the area */ + if (bc->width < barlen * scalef) { + int wid = barlen * scalef + 1; + bc->xoff -= (wid - bc->width)/2 ; + bc->width = wid; + /* Can't extend too far on the left */ + if (bc->xoff < 0) { + bc->width += -bc->xoff; + bc->xoff = 0; + } + } + + /* The height defaults to 80 points (rescaled) */ + if (!bc->height) bc->height = 80 * scalef; + +#if 0 + /* If too small (5 + text), enlarge and center */ + i = 5 + 10 * ((bc->flags & BARCODE_NO_ASCII)==0); + if (bc->height < i * scalef ) { + int hei = i * scalef; + bc->yoff -= (hei-bc->height)/2; + bc->height = hei; + if (bc->yoff < 0) { + bc->height += -bc->yoff; + bc->yoff = 0; + } + } +#else + /* If too small (5 + text), reduce the scale factor and center */ + i = 5 + 10 * ((bc->flags & BARCODE_NO_ASCII)==0); + if (bc->height < i * scalef ) { + double scaleg = ((double)bc->height) / i; + int wid = bc->width * scaleg / scalef; + bc->xoff += (bc->width - wid)/2; + bc->width = wid; + scalef = scaleg; + } +#endif + + /* + * Ok, then deal with actual ps (eps) output + */ + + if (!(bc->flags & BARCODE_OUT_NOHEADERS)) { /* spit a header first */ + if (bc->flags & BARCODE_OUT_EPS) + fprintf(f, "%%!PS-Adobe-2.0 EPSF-1.2\n"); + else + fprintf(f, "%%!PS-Adobe-2.0\n"); + fprintf(f, "%%%%Creator: libbarcode\n"); + if (bc->flags & BARCODE_OUT_EPS) { + fprintf(f, "%%%%BoundingBox: %i %i %i %i\n", + bc->xoff, + bc->yoff, + bc->xoff + bc->width + 2* bc->margin, + bc->yoff + bc->height + 2* bc->margin); + } + fprintf(f, "%%%%EndComments\n"); + if (bc->flags & BARCODE_OUT_PS) { + fprintf(f, "%%%%EndProlog\n\n"); + fprintf(f, "%%%%Page: 1 1\n\n"); + } + } + + /* Print some informative comments */ + for (i=0; bc->ascii[i]; i++) + if (bc->ascii[i] < ' ') + printable = 0; + + fprintf(f,"%% Printing barcode for \"%s\", scaled %5.2f", + printable ? bc->ascii : "", scalef); + if (bc->encoding) + fprintf(f,", encoded using \"%s\"",bc->encoding); + fprintf(f, "\n"); + fprintf(f,"%% The space/bar succession is represented " + "by the following widths (space first):\n" + "%% "); + for (i=0; ipartial); i++) { + unsigned char c = bc->partial[i]; + if (isdigit(c)) putc(c, f); + if (islower(c)) putc(c-'a'+'1', f); + if (isupper(c)) putc(c-'A'+'1', f); + } + /* open array for "forall" */ + fprintf(f, "\n[\n%% height xpos ypos width" + " height xpos ypos width\n"); + + xpos = bc->margin + (bc->partial[0]-'0') * scalef; + for (ptr = bc->partial+1, i=1; *ptr; ptr++, i++) { + /* special cases: '+' and '-' */ + if (*ptr == '+' || *ptr == '-') { + mode = *ptr; /* don't count it */ i++; continue; + } + /* j is the width of this bar/space */ + if (isdigit (*ptr)) j = *ptr-'0'; + else j = *ptr-'a'+1; + if (i%2) { /* bar */ + x0 = bc->xoff + xpos + (j*scalef)/2; + y0 = bc->yoff + bc->margin; + yr = bc->height; + if (!(bc->flags & BARCODE_NO_ASCII)) { /* leave space for text */ + if (mode == '-') { + /* text below bars: 10 points or five points */ + y0 += (isdigit(*ptr) ? 10 : 5) * scalef; + yr -= (isdigit(*ptr) ? 10 : 5) * scalef; + } else { /* '+' */ + /* text above bars: 10 or 0 from bottom, and 10 from top */ + y0 += (isdigit(*ptr) ? 10 : 0) * scalef; + yr -= (isdigit(*ptr) ? 20 : 10) * scalef; + } + } + /* Define an array and then use "forall" (Hans Schou) */ + fprintf(f," [%5.2f %6.2f %6.2f %5.2f]%s", + yr, x0, y0, (j * scalef) - SHRINK_AMOUNT, + i%4 == 1 ? " " : "\n"); + } + xpos += j * scalef; + } + fprintf(f,"\n]\t{ {} forall setlinewidth moveto 0 exch rlineto stroke} " + "bind forall\n"); + + /* Then, the text */ + + mode = '-'; /* reinstantiate default */ + if (!(bc->flags & BARCODE_NO_ASCII)) { + fprintf(f, "[\n%% char xpos ypos fontsize\n"); + k=0; /* k is the "previous font size" */ + for (ptr = bc->textinfo; ptr; ptr = strchr(ptr, ' ')) { + while (*ptr == ' ') ptr++; + if (!*ptr) break; + if (*ptr == '+' || *ptr == '-') { + mode = *ptr; continue; + } + if (sscanf(ptr, "%lf:%lf:%c", &f1, &f2, &c) != 3) { + fprintf(stderr, "barcode: impossible data: %s\n", ptr); + continue; + } + + fprintf(f, " [("); + /* Both the backslash and the two parens are special */ + if (c=='\\' || c==')' || c=='(') + fprintf(f, "\\%c) ", c); + else + fprintf(f, "%c) ", c); + fprintf(f, "%6.2f %6.2f %5.2f]\n", + bc->xoff + f1 * scalef + bc->margin, + mode == '-' + ? (double)bc->yoff + bc->margin + : (double)bc->yoff + bc->margin+bc->height - 8*scalef, + fsav == f2 ? 0.0 : f2 * scalef); + fsav = f2; + } + fprintf(f,"] { {} forall dup 0.00 ne {\n\t" + "/Helvetica findfont exch scalefont setfont\n" + " } {pop} ifelse\n" + " moveto show} bind forall\n"); + + + } + + fprintf(f,"%% End barcode for \"%s\"\n\n", + printable ? bc->ascii : ""); + + if (!(bc->flags & BARCODE_OUT_NOHEADERS)) { + if (bc->flags & BARCODE_OUT_PS) { + fprintf(f,"showpage\n"); + fprintf(f, "%%%%Trailer\n\n"); + } + } + return 0; +} + + + + diff --git a/glabels2/barcode-0.98/sample.c b/glabels2/barcode-0.98/sample.c new file mode 100644 index 00000000..46e62058 --- /dev/null +++ b/glabels2/barcode-0.98/sample.c @@ -0,0 +1,98 @@ +#include +#include + +#include "barcode.h" + +int main(int argc, char **argv) +{ + int ps = 1, pcl = 0, oflags; + if (argc == 2 && !strcmp(argv[1],"-P")) { + ps = 0; pcl = 1; argc=1; + } + if (argc>2) { + fprintf(stderr, "%s: use \"%s\" for postscript or \"%s -P\" for PCL\n", + argv[0], argv[0], argv[0]); + exit(1); + } + if (pcl) { + oflags = BARCODE_OUT_PCL; + } else { + oflags = BARCODE_OUT_PS | BARCODE_OUT_NOHEADERS; + printf("%%!PS-Adobe-2.0\n"); + printf("%%%%Creator: barcode sample program\n"); + printf("%%%%EndComments\n"); + printf("%%%%EndProlog\n\n"); + printf("%%%%Page: 1 1\n\n"); + } + /* Print a few barcodes in several places in the page */ + + /* default size, bottom left */ + Barcode_Encode_and_Print("800894002700",stdout, 0, 0, 40, 40, + BARCODE_EAN | oflags); + + /* smaller */ + Barcode_Encode_and_Print("800894002700",stdout, 70, 50, 160, 55, + BARCODE_EAN | oflags); + + /* smallest */ + Barcode_Encode_and_Print("800894002700",stdout, 40, 30, 270, 70, + BARCODE_EAN | oflags); + + /* A bigger all-0 */ + Barcode_Encode_and_Print("000000000000",stdout, 170, 0, 40, 160, + BARCODE_EAN | oflags); + + /* Still bigger all-0 (but UPC, this time) */ + Barcode_Encode_and_Print("00000000000",stdout, 250, 0, 270, 160, + BARCODE_UPC | oflags); + + /* A few code-39 ones */ + Barcode_Encode_and_Print("silly code",stdout, 0, 0, 40, 320, + BARCODE_39 | oflags); + Barcode_Encode_and_Print("SAMPLE CODES",stdout, 100, 30, 400, 80, + BARCODE_39 | oflags); + + /* ISBN with add-5 */ + Barcode_Encode_and_Print("1-56592-292-1 90000",stdout, 0, 0, 40, 430, + BARCODE_ISBN | oflags); + + /* UPC with add-2 */ + Barcode_Encode_and_Print("07447084452 07",stdout, 0, 0, 300, 410, + BARCODE_UPC | oflags); + + /* code 128-C */ + Barcode_Encode_and_Print("12345678900123456789",stdout, 0, 0, 40, 530, + BARCODE_128C | oflags); + + /* and my data as code-128B autodetected */ + Barcode_Encode_and_Print("RBNLSN68T11E897W",stdout, 0, 60, 240, 510, + oflags); + /* same as code-39, forced */ + Barcode_Encode_and_Print("RBNLSN68T11E897W",stdout, 0, 60, 240, 590, + BARCODE_NO_CHECKSUM | BARCODE_39 | oflags); + + /* one interleaved 2 of 5 */ + Barcode_Encode_and_Print("0123456789",stdout, 0, 0, 40, 620, + BARCODE_I25 | oflags); + + /* upc-e and ean-8 (autotected based on code size) */ + Barcode_Encode_and_Print("012345",stdout, 0, 0, 50, 720, oflags); + Barcode_Encode_and_Print("0123456",stdout, 0, 0, 160, 720, oflags); + + + + if (pcl) { + printf("\f"); + } else { + printf("\nshowpage\n"); + printf("%%%%Trailer\n\n"); + } + return 0; +} + + + + + + + diff --git a/glabels2/configure.in b/glabels2/configure.in new file mode 100644 index 00000000..cd042c30 --- /dev/null +++ b/glabels2/configure.in @@ -0,0 +1,215 @@ +dnl Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.52) + +AC_INIT(glabels, 2.pre2svn, http://sourceforge.net/tracker/?func=add&group_id=46122&atid=445116) +AC_CONFIG_SRCDIR(src/glabels.c) +AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION) + +AM_MAINTAINER_MODE +AM_CONFIG_HEADER(config.h) + +AC_PROG_INTLTOOL([0.21]) + +AM_PROG_LIBTOOL + +AC_ISC_POSIX +AC_PROG_CC +AM_PROG_CC_STDC +AC_HEADER_STDC + +GNOME_COMPILE_WARNINGS + +AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal) + +GTK_DOC_CHECK(1.0) + +dnl --------------------------------------------------------------------------- +dnl - LIBGLABELS API versioning +dnl --------------------------------------------------------------------------- +dnl From the libtool manual: +dnl 1. Start with version information of `0:0:0' for each libtool library. +dnl 2. Update the version information only immediately before a public release. +dnl More frequent updates are unnecessary, and only guarantee that the current +dnl interface number gets larger faster. +dnl 3. If the library source code has changed at all since the last update, then increment +dnl revision (`c:r:a' becomes `c:r+1:a'). +dnl 4. If any interfaces have been added, removed, or changed since the last update, +dnl increment current, and set revision to 0. +dnl 5. If any interfaces have been added since the last public release, then increment age. +dnl 6. If any interfaces have been removed since the last public release, then set age +dnl to 0. +LIBGLABELS_C=5 +LIBGLABELS_R=0 +LIBGLABELS_A=0 + +LIBGLABELS_VERSION_INFO=${LIBGLABELS_C}:${LIBGLABELS_R}:${LIBGLABELS_A} +AC_SUBST(LIBGLABELS_VERSION_INFO) + + +dnl --------------------------------------------------------------------------- +dnl - Library dependencies +dnl --------------------------------------------------------------------------- +GLIB_REQUIRED=2.12.0 +GTK_REQUIRED=2.10.0 +LIBGNOME_REQUIRED=2.16.0 +LIBGNOMEUI_REQUIRED=2.16.0 +LIBXML_REQUIRED=2.6.0 +LIBGLADE_REQUIRED=2.6.0 +LIBEBOOK_REQUIRED=1.8.0 + +dnl Make above strings available for packaging files (e.g. rpm spec files) +AC_SUBST(GLIB_REQUIRED) +AC_SUBST(GTK_REQUIRED) +AC_SUBST(LIBGNOME_REQUIRED) +AC_SUBST(LIBGNOMEUI_REQUIRED) +AC_SUBST(LIBXML_REQUIRED) +AC_SUBST(LIBGLADE_REQUIRED) +AC_SUBST(LIBEBOOK_REQUIRED) + + +dnl --------------------------------------------------------------------------- +dnl - Check for evolution data server +dnl --------------------------------------------------------------------------- +AC_ARG_WITH(libebook, + [AC_HELP_STRING([--without-libebook], + [build without Evolution Data Server support])]) +have_libebook=no +if test "x$with_libebook" != xno; then + PKG_CHECK_MODULES(LIBEBOOK, libebook-1.2 >= $LIBEBOOK_REQUIRED, + [have_libebook=yes], [have_libebook=no]) +fi + +if test "x$have_libebook" = "xyes"; then + AC_DEFINE(HAVE_LIBEBOOK,1,[Define to 1 for EDS support]) + OPTIONAL_MODULES="$OPTIONAL_MODULES libebook-1.2 >= $LIBEBOOK_REQUIRED" +fi + + +dnl --------------------------------------------------------------------------- +dnl - GLABELS prerequisites +dnl --------------------------------------------------------------------------- +PKG_CHECK_MODULES(GLABELS, \ +glib-2.0 >= $GLIB_REQUIRED \ +gtk+-2.0 >= $GTK_REQUIRED \ +libgnome-2.0 >= $LIBGNOME_REQUIRED \ +libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED \ +libxml-2.0 >= $LIBXML_REQUIRED \ +libglade-2.0 >= $LIBGLADE_REQUIRED \ +$OPTIONAL_MODULES \ +) + +AC_SUBST(GLABELS_CFLAGS) +AC_SUBST(GLABELS_LIBS) + + +dnl --------------------------------------------------------------------------- +dnl - LIBGLABELS more modest prerequisites +dnl --------------------------------------------------------------------------- +PKG_CHECK_MODULES(LIBGLABELS, \ +glib-2.0 >= $GLIB_REQUIRED \ +libxml-2.0 >= $LIBXML_REQUIRED \ +) + +AC_SUBST(LIBGLABELS_CFLAGS) +AC_SUBST(LIBGLABELS_LIBS) + + +dnl --------------------------------------------------------------------------- +dnl - Enable deprecation testing +dnl --------------------------------------------------------------------------- +AC_ARG_ENABLE(deprecations, + [AC_HELP_STRING([--enable-deprecations], + [warn about deprecated usages [default=no]])],, + [enable_deprecations=no]) + +if test "x$enable_deprecations" = "xyes"; then + DISABLE_DEPRECATED_CFLAGS="\ +-DG_DISABLE_DEPRECATED \ +-DGDK_DISABLE_DEPRECATED \ +-DGTK_DISABLE_DEPRECATED \ +-DGDK_PIXBUF_DISABLE_DEPRECATED \ +-DGNOME_DISABLE_DEPRECATED \ +-DLIBGLADE_DISABLE_DEPRECATED" + AC_SUBST(DISABLE_DEPRECATED_CFLAGS) +fi + + +dnl --------------------------------------------------------------------------- +dnl - Is freedesktop mime dbase available? +dnl --------------------------------------------------------------------------- +AC_PATH_PROG(UPDATE_MIME_DATABASE, update-mime-database, no) +AM_CONDITIONAL(HAVE_NEW_MIME, test x$UPDATE_MIME_DATABASE != xno) + +AC_PATH_PROG(UPDATE_DESKTOP_DATABASE, update-desktop-database, no) +AM_CONDITIONAL(HAVE_NEWER_MIME, test x$UPDATE_DESKTOP_DATABASE != xno) + +AC_ARG_ENABLE(update-mimedb, AC_HELP_STRING([--disable-update-mimedb], + [disable the update-mime-database after install [default=no]]),, + enable_update_mimedb=yes) +AM_CONDITIONAL(ENABLE_UPDATE_MIMEDB, test x$enable_update_mimedb = xyes) + +AC_ARG_ENABLE(update-desktopdb, AC_HELP_STRING([--disable-update-desktopdb], + [disable the update-desktop-database after install [default=no]]),, + enable_update_desktopdb=yes) +AM_CONDITIONAL(ENABLE_UPDATE_DESKTOPDB, test x$enable_update_desktopdb = xyes) + + +dnl --------------------------------------------------------------------------- +dnl - Supported languages +dnl --------------------------------------------------------------------------- +GETTEXT_PACKAGE=glabels +AC_SUBST(GETTEXT_PACKAGE) +AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Gettext package]) + +dnl Add the languages here. +ALL_LINGUAS="fr de ja pt_BR es ru zh_TW.Big5 pl cs it eo" +AM_GLIB_GNU_GETTEXT + + +dnl --------------------------------------------------------------------------- +dnl - Makefiles, etc. +dnl --------------------------------------------------------------------------- +AC_OUTPUT([ +Makefile +barcode-0.98/Makefile +iec16022-0.2.1/Makefile +libglabels/Makefile +libglabels/libglabels.pc +src/Makefile +src/pixmaps/Makefile +src/stock-pixmaps/Makefile +src/mygal/Makefile +data/Makefile +data/templates/Makefile +data/pixmaps/Makefile +data/mime/Makefile +data/glade/Makefile +data/desktop/Makefile +data/dtd/Makefile +data/man/Makefile +po/Makefile.in +help/Makefile +help/C/Makefile +docs/Makefile +docs/libglabels/Makefile +glabels.spec +]) + + +dnl --------------------------------------------------------------------------- +dnl - Print configuration information +dnl --------------------------------------------------------------------------- +echo " +Configuration: + + Package: ${PACKAGE}-${VERSION}: + Installation prefix ${prefix} + Source code location: ${srcdir} + Compiler: ${CC} + Evolution Data Server support: ${have_libebook} + +" + +cat ${srcdir}/MESSAGE-OF-DOOM + diff --git a/glabels2/data/Makefile.am b/glabels2/data/Makefile.am new file mode 100644 index 00000000..6b00c464 --- /dev/null +++ b/glabels2/data/Makefile.am @@ -0,0 +1,5 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = desktop dtd glade man mime pixmaps templates + + diff --git a/glabels2/data/desktop/Makefile.am b/glabels2/data/desktop/Makefile.am new file mode 100644 index 00000000..ce2a21fc --- /dev/null +++ b/glabels2/data/desktop/Makefile.am @@ -0,0 +1,13 @@ +## Process this file with automake to produce Makefile.in + +@INTLTOOL_DESKTOP_RULE@ + +DESKTOP_IN_FILES = glabels.desktop.in +DESKTOP_FILES =$(DESKTOP_IN_FILES:.desktop.in=.desktop) + +desktopdir = $(datadir)/applications +desktop_DATA = $(DESKTOP_FILES) + +EXTRA_DIST = $(DESKTOP_IN_FILES) + +CLEANFILES = $(DESKTOP_FILES) diff --git a/glabels2/data/desktop/glabels.desktop.in b/glabels2/data/desktop/glabels.desktop.in new file mode 100644 index 00000000..be70f928 --- /dev/null +++ b/glabels2/data/desktop/glabels.desktop.in @@ -0,0 +1,11 @@ +[Desktop Entry] +Encoding=UTF-8 +_Name=gLabels Label Designer +_Comment=Create labels, business cards and media covers +Exec=glabels %F +Icon=glabels.png +Terminal=false +Type=Application +Categories=GNOME;Application;Office; +StartupNotify=true +MimeType=application/x-glabels; diff --git a/glabels2/data/dtd/Makefile.am b/glabels2/data/dtd/Makefile.am new file mode 100644 index 00000000..0dce23d6 --- /dev/null +++ b/glabels2/data/dtd/Makefile.am @@ -0,0 +1,9 @@ +## Process this file with automake to produce Makefile.in + +dtddir = $(datadir)/glabels/dtd + +dtd_DATA = \ + glabels-2.2.dtd + +EXTRA_DIST = $(dtd_DATA) + diff --git a/glabels2/data/dtd/glabels-2.2.dtd b/glabels2/data/dtd/glabels-2.2.dtd new file mode 100644 index 00000000..183df8b6 --- /dev/null +++ b/glabels2/data/dtd/glabels-2.2.dtd @@ -0,0 +1,380 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/glabels2/data/glade/Makefile.am b/glabels2/data/glade/Makefile.am new file mode 100644 index 00000000..4747c88f --- /dev/null +++ b/glabels2/data/glade/Makefile.am @@ -0,0 +1,18 @@ +## Process this file with automake to produce Makefile.in + +gladedir = $(datadir)/glabels/glade/ + +glade_DATA = \ + object-editor.glade \ + prefs-dialog.glade \ + template-designer.glade \ + merge-properties-dialog.glade \ + property-bar.glade \ + print-custom-widget.glade \ + wdgt-media-select.glade \ + wdgt-rotate-label.glade \ + new-label-dialog.glade + +EXTRA_DIST = $(glade_DATA) + + diff --git a/glabels2/data/glade/merge-properties-dialog.glade b/glabels2/data/glade/merge-properties-dialog.glade new file mode 100644 index 00000000..b62dcedf --- /dev/null +++ b/glabels2/data/glade/merge-properties-dialog.glade @@ -0,0 +1,375 @@ + + + + + + + True + dialog1 + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + True + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + True + -6 + + + + + + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + True + -5 + + + + + 0 + False + True + GTK_PACK_END + + + + + + True + False + 6 + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + 12 + True + 2 + 2 + False + 6 + 6 + + + + True + Format: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + False + True + + + 1 + 2 + 0 + 1 + fill + + + + + + True + False + 0 + + + + + + + 1 + 2 + 1 + 2 + fill + fill + + + + + + True + Location: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + + + + + True + <b>Source</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + True + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + False + 6 + + + + 6 + 500 + 350 + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + False + False + False + + + + + 0 + True + True + + + + + + 6 + True + False + 12 + + + + True + True + Select all + True + GTK_RELIEF_NORMAL + True + + + 0 + False + False + + + + + + True + True + Unselect all + True + GTK_RELIEF_NORMAL + True + + + 0 + False + False + + + + + 0 + False + True + + + + + + + + + + True + <b>Record selection/preview</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + + diff --git a/glabels2/data/glade/new-label-dialog.glade b/glabels2/data/glade/new-label-dialog.glade new file mode 100644 index 00000000..b282a365 --- /dev/null +++ b/glabels2/data/glade/new-label-dialog.glade @@ -0,0 +1,158 @@ + + + + + + + True + window1 + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + False + + + + 12 + True + False + 12 + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + False + 0 + + + + + + + + + + + + True + <b>Media type</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + True + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + False + 0 + + + + + + + + + + + + True + <b>Label orientation</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + True + + + + + + + diff --git a/glabels2/data/glade/object-editor.glade b/glabels2/data/glade/object-editor.glade new file mode 100644 index 00000000..8ab922df --- /dev/null +++ b/glabels2/data/glade/object-editor.glade @@ -0,0 +1,3469 @@ + + + + + + + + 6 + True + dialog1 + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + False + True + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + True + -7 + + + + + 0 + False + True + GTK_PACK_END + + + + + + 6 + True + False + 12 + + + + True + False + 12 + + + + True + 0.5 + 0.5 + 0 + 0 + + + 0 + False + True + + + + + + True + <span weight="bold" size="larger">Xxx object properties</span> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 0 + False + False + + + + + + True + True + True + True + GTK_POS_TOP + True + False + + + + 12 + True + False + 6 + + + + True + False + 0 + + + + True + True + GTK_POLICY_ALWAYS + GTK_POLICY_ALWAYS + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + 232 + True + True + True + False + True + GTK_JUSTIFY_LEFT + GTK_WRAP_NONE + True + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + True + False + 12 + + + + True + Key: + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + True + + + 0 + True + True + + + + + + True + True + Insert merge field + True + GTK_RELIEF_NORMAL + True + + + 0 + False + False + + + + + 0 + False + False + + + + + False + False + + + + + + True + Text + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 12 + + + + True + False + 12 + + + + True + Family: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + True + + + 0 + True + True + + + + + 0 + False + False + + + + + + True + False + 12 + + + + True + Size: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 12 + + + + True + True + 0.00999999977648 + 0 + True + GTK_UPDATE_ALWAYS + False + False + 1 1 100 1 10 10 + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + False + False + + + + + + True + False + 12 + + + + True + Style: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 12 + + + + True + True + GTK_RELIEF_NORMAL + True + False + False + + + + True + gtk-bold + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + False + False + + + + True + gtk-italic + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + False + False + + + + + + True + False + 12 + + + + True + Color: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.140000000596 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 6 + + + + True + False + 6 + + + + True + True + + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + False + 12 + + + + True + gl_object_editor_construct_color_combo + 2 + 0 + Sun, 16 Nov 2003 06:52:23 GMT + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + True + False + 6 + + + + True + True + Key: + True + GTK_RELIEF_NORMAL + True + False + False + True + text_color_radio + + + 0 + False + False + + + + + + True + False + 12 + + + + True + False + True + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + False + False + + + + + + True + False + 12 + + + + True + Alignment: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 12 + + + + True + True + GTK_RELIEF_NORMAL + True + False + False + + + + True + gtk-justify-left + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + False + False + + + + True + gtk-justify-center + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + False + False + + + + True + gtk-justify-right + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + False + False + + + + + + True + False + 12 + + + + True + Line Spacing: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 12 + + + + True + True + 0.00999999977648 + 2 + False + GTK_UPDATE_ALWAYS + False + False + 1 0 5 0.01 0.1 0.1 + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + False + False + + + + + + True + True + Allow merge to automatically shrink text + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + False + False + + + + + + True + Style + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 12 + + + + True + False + 12 + + + + True + Width: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 12 + + + + True + True + 0.00999999977648 + 2 + True + GTK_UPDATE_ALWAYS + False + False + 1 0.25 4 0.25 1 1 + + + 0 + False + False + + + + + + True + points + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + False + False + + + + + + True + False + 12 + + + + True + Color: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.140000000596 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 6 + + + + True + False + 6 + + + + True + True + + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + False + 12 + + + + True + gl_object_editor_construct_color_combo + 1 + 0 + Sun, 16 Nov 2003 06:52:23 GMT + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + True + False + 6 + + + + True + True + Key: + True + GTK_RELIEF_NORMAL + True + False + False + True + line_color_radio + + + 0 + False + False + + + + + + True + False + 12 + + + + True + False + True + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + False + False + + + + + False + True + + + + + + True + Line + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 0 + + + + True + False + 12 + + + + True + Color: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.140000000596 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 6 + + + + True + False + 6 + + + + True + True + + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + False + 12 + + + + True + gl_object_editor_construct_color_combo + 0 + 0 + Sun, 16 Nov 2003 06:52:23 GMT + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + True + False + 6 + + + + True + True + Key: + True + GTK_RELIEF_NORMAL + True + False + False + True + fill_color_radio + + + 0 + False + False + + + + + + True + False + 12 + + + + True + False + True + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + False + False + + + + + False + True + + + + + + True + Fill + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 12 + + + + True + False + 12 + + + + True + True + File: + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + Select A File + GTK_FILE_CHOOSER_ACTION_OPEN + True + True + False + -1 + + + 0 + True + True + + + + + 0 + False + False + + + + + + True + False + 12 + + + + True + False + True + Key: + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + False + True + + + 0 + True + True + + + + + 0 + False + False + + + + + False + True + + + + + + True + Image + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 12 + + + + True + False + 12 + + + + True + True + Literal: + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + True + True + True + 0 + + True + * + False + + + 0 + True + True + + + + + 0 + False + False + + + + + + True + False + 12 + + + + True + True + Key: + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + False + True + + + 0 + True + True + + + + + 0 + False + False + + + + + + True + False + 12 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + 2 + 2 + False + 6 + 6 + + + + True + format: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + 00000000000 00000 + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 0 + 1 + fill + + + + + + + True + digits: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + False + 0 + + + + True + True + 1 + 0 + True + GTK_UPDATE_ALWAYS + False + False + 1 1 100 1 10 10 + + + 0 + False + False + + + + + 1 + 2 + 1 + 2 + fill + fill + + + + + 0 + True + True + + + + + 0 + False + False + + + + + False + True + + + + + + True + Data + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 12 + + + + True + False + 12 + + + + True + Style: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + True + + + 0 + True + True + + + + + 0 + False + False + + + + + + True + True + Text + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + True + Checksum + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + False + 12 + + + + True + Color: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.140000000596 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 6 + + + + True + False + 6 + + + + True + True + + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + False + 12 + + + + True + gl_object_editor_construct_color_combo + 1 + 0 + Sun, 16 Nov 2003 06:52:23 GMT + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + True + False + 6 + + + + True + True + Key: + True + GTK_RELIEF_NORMAL + True + False + False + True + bc_color_radio + + + 0 + False + False + + + + + + True + False + 12 + + + + True + False + True + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + False + False + + + + + True + True + + + + + + True + Style + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 12 + + + + True + 3 + 3 + False + 12 + 12 + + + + True + Width: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + Height: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + False + 12 + + + + True + True + 0.00999999977648 + 2 + True + GTK_UPDATE_ALWAYS + True + False + 1 0 100 0.01 10 10 + + + 0 + False + True + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 1 + 2 + 1 + 2 + fill + fill + + + + + + True + False + 12 + + + + True + True + Reset image size + True + GTK_RELIEF_NORMAL + True + + + 0 + False + False + + + + + 0 + 2 + 2 + 3 + fill + + + + + + + True + False + 12 + + + + True + True + 0.00999999977648 + 2 + True + GTK_UPDATE_ALWAYS + True + False + 1 0 100 0.01 10 10 + + + 0 + False + True + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 1 + 2 + 0 + 1 + fill + fill + + + + + + True + gl_object_editor_construct_chain_button + 0 + 0 + Sat, 07 Feb 2004 02:56:47 GMT + + + 2 + 3 + 0 + 2 + + fill + + + + + 0 + True + True + + + + + False + True + + + + + + True + Size + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 12 + + + + True + 2 + 2 + False + 12 + 12 + + + + True + Length: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + Angle: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + False + 12 + + + + True + True + 0.00999999977648 + 2 + True + GTK_UPDATE_ALWAYS + True + False + 1 0 100 0.01 10 10 + + + 0 + False + True + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 1 + 2 + 0 + 1 + fill + + + + + + True + False + 12 + + + + True + True + 0.00999999977648 + 1 + True + GTK_UPDATE_ALWAYS + True + False + 0 -180 180 0.1 5 5 + + + 0 + False + True + + + + + + True + degrees + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 1 + 2 + 1 + 2 + fill + fill + + + + + 0 + True + True + + + + + False + True + + + + + + True + Size + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 12 + + + + True + 2 + 3 + False + 12 + 12 + + + + 50 + True + X: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + Y: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 0 + 1 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 1 + 2 + fill + + + + + + + True + True + 0.00999999977648 + 2 + True + GTK_UPDATE_ALWAYS + True + False + 0 0 100 0.01 10 10 + + + 1 + 2 + 0 + 1 + + + + + + + + True + True + 0.00999999977648 + 2 + True + GTK_UPDATE_ALWAYS + True + False + 0 0 100 0.01 10 10 + + + 1 + 2 + 1 + 2 + + + + + + + 0 + True + True + + + + + False + True + + + + + + True + Position + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 12 + + + + True + True + Enable shadow + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + False + 12 + + + + True + False + 12 + + + + True + X Offset: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 12 + + + + True + True + 0.00999999977648 + 2 + True + GTK_UPDATE_ALWAYS + True + False + 0 0 100 0.00999999977648 10 10 + + + 0 + False + True + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + True + False + 12 + + + + True + Y Offset: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 12 + + + + True + True + 0.00999999977648 + 2 + True + GTK_UPDATE_ALWAYS + True + False + 0 0 100 0.00999999977648 10 10 + + + 0 + False + True + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + True + False + 12 + + + + True + Color: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.140000000596 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 6 + + + + True + False + 6 + + + + True + True + + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + False + 12 + + + + True + gl_object_editor_construct_color_combo + 3 + 0 + Sun, 16 Nov 2003 06:52:23 GMT + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + True + False + 6 + + + + True + True + Key: + True + GTK_RELIEF_NORMAL + True + False + False + True + shadow_color_radio + + + 0 + False + False + + + + + + True + False + 12 + + + + True + False + True + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + True + False + 12 + + + + True + Opacity: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 12 + + + + True + True + 1 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 0 100 1 10 10 + + + 0 + False + True + + + + + + True + % + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + False + False + + + + + False + True + + + + + + True + Shadow + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + True + False + 0 + + + + + + + False + True + + + + + + True + label48 + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + + diff --git a/glabels2/data/glade/prefs-dialog.glade b/glabels2/data/glade/prefs-dialog.glade new file mode 100644 index 00000000..24562d8a --- /dev/null +++ b/glabels2/data/glade/prefs-dialog.glade @@ -0,0 +1,1308 @@ + + + + + + + True + gLabels Preferences + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + True + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + True + -7 + + + + + 0 + False + True + GTK_PACK_END + + + + + + True + True + True + True + GTK_POS_TOP + False + False + + + + 12 + True + False + 12 + + + + True + Select locale specific behavior. + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + False + 0 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + 6 + True + False + 6 + + + + True + True + Points + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + True + Inches + True + GTK_RELIEF_NORMAL + True + False + False + True + units_points_radio + + + 0 + False + False + + + + + + True + True + Millimeters + True + GTK_RELIEF_NORMAL + True + False + False + True + units_points_radio + + + 0 + False + False + + + + + 0 + True + True + + + + + + + + True + <span weight="bold">Units</span> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + False + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + False + 0 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + 6 + True + False + 6 + + + + True + True + US Letter + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + True + ISO A4 + True + GTK_RELIEF_NORMAL + True + False + False + True + page_size_us_letter_radio + + + 0 + False + False + + + + + 0 + True + True + + + + + + + + True + <span weight="bold">Default page size</span> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + False + + + + + False + True + + + + + + True + Locale + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 12 + + + + True + Select default properties for new objects. + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + False + 0 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + 4 + 2 + False + 12 + 12 + + + + True + Font: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + Color: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + Alignment: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + 90 + True + Line Spacing: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 3 + 4 + fill + + + + + + + True + False + 12 + + + + True + False + True + + + 0 + True + True + + + + + + True + True + 1 + 0 + True + GTK_UPDATE_ALWAYS + False + False + 1 1 100 1 10 10 + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + False + False + + + + True + gtk-bold + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + False + False + + + + True + gtk-italic + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + 1 + 2 + 0 + 1 + fill + + + + + + True + False + 12 + + + + True + gl_object_editor_construct_color_combo + 2 + 0 + Sun, 23 Nov 2003 15:42:02 GMT + + + 0 + False + False + + + + + 1 + 2 + 1 + 2 + fill + fill + + + + + + True + False + 12 + + + + True + True + GTK_RELIEF_NORMAL + True + False + False + + + + True + gtk-justify-left + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + False + False + + + + True + gtk-justify-center + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + False + False + + + + True + gtk-justify-right + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + 1 + 2 + 2 + 3 + fill + fill + + + + + + True + False + 40 + + + + True + True + 0.00999999977648 + 2 + False + GTK_UPDATE_ALWAYS + False + False + 1 0 5 0.01 0.1 0.1 + + + 0 + False + False + + + + + 1 + 2 + 3 + 4 + fill + fill + + + + + 0 + True + True + + + + + + + + True + <span weight="bold">Text</span> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + False + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + False + 0 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + 2 + 2 + False + 12 + 12 + + + + 90 + True + Width: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + Color: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + False + 12 + + + + True + True + 0.00999999977648 + 2 + True + GTK_UPDATE_ALWAYS + False + False + 1 0.25 4 0.25 1 1 + + + 0 + False + False + + + + + + True + points + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 1 + 2 + 0 + 1 + fill + + + + + + True + False + 12 + + + + True + gl_object_editor_construct_color_combo + 1 + 0 + Sun, 23 Nov 2003 15:42:41 GMT + + + 0 + False + False + + + + + 1 + 2 + 1 + 2 + fill + fill + + + + + 0 + True + True + + + + + + + + True + <span weight="bold">Line</span> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + False + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + False + 0 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + 1 + 2 + False + 12 + 12 + + + + 90 + True + Color: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + False + 12 + + + + True + gl_object_editor_construct_color_combo + 0 + 0 + Sun, 23 Nov 2003 15:43:12 GMT + + + 0 + False + False + + + + + 1 + 2 + 0 + 1 + fill + + + + + 0 + True + True + + + + + + + + True + <span weight="bold">Fill</span> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + False + + + + + False + True + + + + + + True + Object defaults + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + 0 + True + True + + + + + + + diff --git a/glabels2/data/glade/print-custom-widget.glade b/glabels2/data/glade/print-custom-widget.glade new file mode 100644 index 00000000..f5063abc --- /dev/null +++ b/glabels2/data/glade/print-custom-widget.glade @@ -0,0 +1,287 @@ + + + + + + + True + window1 + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + False + + + + 12 + True + False + 12 + + + + True + False + 0 + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + False + 0 + + + + + + + + + + + + True + <b>Print control (Simple)</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + True + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + False + 0 + + + + + + + + + + + + True + <b>Print control (Merge)</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + True + + + + + 0 + False + False + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + False + 0 + + + + True + True + print outlines (to test printer alignment) + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + True + print in reverse (i.e. a mirror image) + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + True + print crop marks + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + + + + + True + <b>Options</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + True + + + + + + + diff --git a/glabels2/data/glade/property-bar.glade b/glabels2/data/glade/property-bar.glade new file mode 100644 index 00000000..6ba9b341 --- /dev/null +++ b/glabels2/data/glade/property-bar.glade @@ -0,0 +1,375 @@ + + + + + + + True + window1 + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + + + + True + GTK_ORIENTATION_HORIZONTAL + GTK_TOOLBAR_ICONS + True + False + + + + True + True + True + False + + + + True + Font family + True + False + + + + True + False + False + + + + + + + False + False + + + + + + True + True + True + False + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 6 + 0 + + + + True + Font size + True + 1 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 1 250 1 10 10 + + + + + + + False + False + + + + + + True + True + True + True + + + False + False + + + + + + True + Bold + + True + gtk-bold + True + True + False + False + + + False + True + + + + + + True + Italic + + True + gtk-italic + True + True + False + False + + + False + True + + + + + + True + True + True + True + + + False + False + + + + + + True + Left align + + True + gtk-justify-left + True + True + False + False + + + False + True + + + + + + True + Center align + + True + gtk-justify-center + True + True + False + False + text_align_left_radio + + + False + True + + + + + + True + Right align + + True + gtk-justify-right + True + True + False + False + text_align_left_radio + + + False + True + + + + + + True + True + True + True + + + False + False + + + + + + True + True + True + False + + + + True + Text Color + True + False + + + + True + Text color + gl_ui_property_bar_construct_color_combo + 0 + 0 + Sun, 01 May 2005 15:21:11 GMT + + + + + + + False + False + + + + + + True + True + True + False + + + + True + Fill color + True + False + + + + True + Fill color + gl_ui_property_bar_construct_color_combo + 1 + 0 + Sun, 01 May 2005 15:21:18 GMT + + + + + + + False + False + + + + + + True + True + True + False + + + + True + Line color + True + False + + + + True + Line color + gl_ui_property_bar_construct_color_combo + 2 + 0 + Sun, 01 May 2005 15:21:24 GMT + + + + + + + False + False + + + + + + True + True + True + True + + + False + False + + + + + + True + True + True + False + + + + True + Line width + True + 1 + 2 + False + GTK_UPDATE_ALWAYS + False + False + 1 0.25 4 0.25 1 1 + + + + + False + False + + + + + + + diff --git a/glabels2/data/glade/template-designer.glade b/glabels2/data/glade/template-designer.glade new file mode 100644 index 00000000..d21d3898 --- /dev/null +++ b/glabels2/data/glade/template-designer.glade @@ -0,0 +1,3445 @@ + + + + + + + + True + window1 + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + False + + + + 6 + True + True + True + True + GTK_POS_TOP + False + False + + + + True + Welcome to the gLabels Template Designer. + +This dialog will assist you in the creation of a custom gLabels template. + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + False + True + + + + + + True + start_page + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 18 + True + False + 24 + + + + True + Please enter the following identifying information about the template stationery. + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + 6 + 2 + False + 12 + 12 + + + + True + Brand/Manufacturer: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + Part #: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + False + 12 + + + + True + True + True + True + 0 + + True + * + False + + + 0 + False + False + + + + + + True + (e.g., 8163A) + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 1 + 2 + 1 + 2 + fill + fill + + + + + + True + False + 12 + + + + True + True + True + True + 0 + + True + * + False + + + 0 + False + False + + + + + + True + (e.g., Avery, Acme, ...) + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 1 + 2 + 0 + 1 + fill + fill + + + + + + True + Description: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 4 + 5 + fill + + + + + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 4 + 5 + + + + + + + True + (e.g., "Mailing Labels," "Business Cards," ...) + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 5 + 6 + fill + + + + + + + True + False + 6 + + + + True + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + True + + + + + 1 + 2 + 2 + 3 + fill + + + + + + 0 + True + True + + + + + False + True + + + + + + True + name_page + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 18 + True + False + 24 + + + + True + Please select the page size of the template stationery. + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + 3 + 2 + False + 12 + 12 + + + + True + Page size: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + Width: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + Height: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + False + 0 + + + + True + False + True + + + 0 + False + False + + + + + + + + + 1 + 2 + 0 + 1 + fill + + + + + + True + False + 12 + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 0 100 1 10 10 + + + 0 + False + False + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 1 + 2 + 1 + 2 + fill + fill + + + + + + True + False + 12 + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 0 100 1 10 10 + + + 0 + False + False + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 1 + 2 + 2 + 3 + fill + fill + + + + + 0 + False + False + + + + + False + True + + + + + + True + pg_size_page + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 18 + True + False + 24 + + + + True + Please select the basic shape of the labels or cards. + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 6 + + + + True + True + Rectangular or square (can have rounded corners) + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + True + Round + True + GTK_RELIEF_NORMAL + True + False + False + True + shape_rect_radio + + + 0 + False + False + + + + + + True + True + CD/DVD (including credit card CDs) + True + GTK_RELIEF_NORMAL + True + False + False + True + shape_rect_radio + + + 0 + False + False + + + + + 0 + True + True + + + + + False + True + + + + + + True + shape_page + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 18 + True + False + 24 + + + + True + Please enter the following size parameters of a single label or card in your template. + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 12 + + + + True + 6 + 3 + False + 12 + 12 + + + + True + 1. Width: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + 2. Height: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + 3. Round (radius of corner): + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + 4. Horiz. waste (overprint allowed): + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 3 + 4 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 0 + 1 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 1 + 2 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 2 + 3 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 3 + 4 + fill + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 0 + 1 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 1 + 2 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 2 + 3 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 3 + 4 + + + + + + + True + 6. Margin + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 5 + 6 + fill + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 5 + 6 + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 5 + 6 + fill + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 4 + 5 + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 4 + 5 + fill + + + + + + + True + 5. Vert. waste (overprint allowed): + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 4 + 5 + fill + + + + + + 0 + False + False + + + + + + True + 1 + 0 + 0 + 0 + + + 0 + True + True + + + + + 0 + False + False + + + + + False + True + + + + + + True + rect_size_page + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 18 + True + False + 24 + + + + True + Please enter the following size parameters of a single label in your template. + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 12 + + + + True + 3 + 3 + False + 12 + 12 + + + + True + 1. Radius: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + 2. Waste (overprint allowed): + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 0 + 1 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 1 + 2 + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 0 + 1 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 1 + 2 + fill + + + + + + + True + 3. Margin + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 2 + 3 + fill + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 2 + 3 + + + + + + 0 + False + False + + + + + + True + 1 + 0 + 0 + 0 + + + 0 + True + True + + + + + 0 + False + False + + + + + False + True + + + + + + True + round_size_page + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 18 + True + False + 24 + + + + True + Please enter the following size parameters of a single label in your template. + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 12 + + + + True + 6 + 3 + False + 12 + 12 + + + + True + 1. Outer radius: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + 2. Inner radius: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + 3. Clipping width: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + 4. Clipping height: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 3 + 4 + fill + + + + + + + True + 5. Waste (overprint allowed): + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 4 + 5 + fill + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 0 + 1 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 1 + 2 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 2 + 3 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 3 + 4 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 4 + 5 + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 0 + 1 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 1 + 2 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 2 + 3 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 3 + 4 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 4 + 5 + fill + + + + + + + True + 6. Margin + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 5 + 6 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 5 + 6 + fill + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 5 + 6 + + + + + + 0 + False + False + + + + + + True + 1 + 0 + 0 + 0 + + + 0 + True + True + + + + + 0 + False + False + + + + + False + True + + + + + + True + cd_size_page + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 18 + True + False + 24 + + + + True + How many layouts will your template contain? + +A layout is a set of labels or cards that can be arranged in a simple grid. +Most templates only need one layout, as in the first example. +The second example illustrates when two layouts are needed. + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 12 + + + + True + False + 0 + + + + True + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Templates needing only +one layout. + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 0 + True + True + + + + + + True + False + 0 + + + + True + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Templates needing +two layouts. + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + False + False + + + + + + True + False + 12 + + + + True + Number of layouts: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + True + 0.10000000149 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 1 2 1 1 1 + + + 0 + False + False + + + + + 0 + False + False + + + + + False + True + + + + + + True + nlayouts_page + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 18 + True + False + 12 + + + + True + Please enter the following layout information. + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 18 + + + + True + 7 + 4 + False + 6 + 12 + + + + True + Layout #1 + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 0 + 1 + fill + + + + + + + True + Layout #2 + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 0 + 1 + fill + + + + + + + True + Number across (nx): + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + Number down (ny): + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + Distance from left edge (x0): + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 3 + 4 + fill + + + + + + + True + Distance from top edge (y0): + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 4 + 5 + fill + + + + + + + True + Horizontal pitch (dx): + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 5 + 6 + fill + + + + + + + True + Vertical pitch (dy): + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 6 + 7 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 3 + 4 + 3 + 4 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 3 + 4 + 4 + 5 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 3 + 4 + 5 + 6 + fill + + + + + + + True + inches + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 3 + 4 + 6 + 7 + fill + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 1 100 1 10 10 + + + 1 + 2 + 1 + 2 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 1 100 1 10 10 + + + 1 + 2 + 2 + 3 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 1 100 1 10 10 + + + 2 + 3 + 1 + 2 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 1 100 1 10 10 + + + 2 + 3 + 2 + 3 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 3 + 4 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 2 + 3 + 3 + 4 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 4 + 5 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 2 + 3 + 4 + 5 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 5 + 6 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 2 + 3 + 5 + 6 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 1 + 2 + 6 + 7 + + + + + + + True + True + 0.00999999977648 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 0 0 100 1 10 10 + + + 2 + 3 + 6 + 7 + + + + + + 0 + False + False + + + + + + True + False + 0 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + True + True + + + + + + True + False + 6 + + + + True + gl_template_designer_construct_mini_preview + 175 + 200 + Mon, 29 Dec 2003 21:27:10 GMT + + + 0 + True + True + + + + + + 6 + True + True + Print test sheet + True + GTK_RELIEF_NORMAL + True + + + 0 + False + False + + + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + False + False + + + + + False + True + + + + + + True + layout_page + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + True + Congratulations! + +You have completed the gLabels Template Designer. +If you wish to accept and save your design, click "Apply." + +Otherwise, you may click "Cancel" to abandon your design +or "Back" to continue editing this design. + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + False + True + + + + + + True + finish_page + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + + diff --git a/glabels2/data/glade/wdgt-media-select.glade b/glabels2/data/glade/wdgt-media-select.glade new file mode 100644 index 00000000..b4dc6c7c --- /dev/null +++ b/glabels2/data/glade/wdgt-media-select.glade @@ -0,0 +1,352 @@ + + + + + + + True + window1 + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + False + + + + True + False + 0 + + + + 12 + True + True + True + True + GTK_POS_TOP + False + False + + + + True + False + 0 + + + + 12 + 480 + 320 + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + False + False + False + True + False + False + False + + + + + 0 + True + True + + + + + False + True + + + + + + True + Recent templates + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + True + False + 0 + + + + 12 + True + False + 12 + + + + True + False + 6 + + + + True + Brand: + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + True + + + 0 + False + True + + + + + 0 + False + False + + + + + + True + False + 6 + + + + True + Page size: + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + True + + + 0 + False + True + + + + + 0 + False + True + + + + + + True + False + 6 + + + + True + Category: + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + True + + + 0 + False + True + + + + + 0 + False + True + + + + + 0 + False + True + + + + + + 12 + 480 + 320 + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + False + False + False + True + False + False + False + + + + + 0 + True + True + + + + + False + True + + + + + + True + Search all templates + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + 0 + True + True + + + + + + + diff --git a/glabels2/data/glade/wdgt-rotate-label.glade b/glabels2/data/glade/wdgt-rotate-label.glade new file mode 100644 index 00000000..89e24a03 --- /dev/null +++ b/glabels2/data/glade/wdgt-rotate-label.glade @@ -0,0 +1,62 @@ + + + + + + + True + window1 + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + False + + + + 12 + True + False + 6 + + + + True + True + Rotate + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + + + 0 + True + True + + + + + + + diff --git a/glabels2/data/man/Makefile.am b/glabels2/data/man/Makefile.am new file mode 100644 index 00000000..34051904 --- /dev/null +++ b/glabels2/data/man/Makefile.am @@ -0,0 +1,6 @@ +## Process this file with automake to produce Makefile.in + +man_MANS = glabels.1 + +EXTRA_DIST = $(man_MANS) + diff --git a/glabels2/data/man/glabels.1 b/glabels2/data/man/glabels.1 new file mode 100644 index 00000000..489b2a42 --- /dev/null +++ b/glabels2/data/man/glabels.1 @@ -0,0 +1,67 @@ +.TH glabels 1 "Jun 28, 2004" +.SH NAME +glabels \- Label and business card creation program for GNOME +.SH SYNOPSIS +.B glabels +.RI [OPTIONS] +.RI [label-filename...] +.sp +.B glabels-batch +.RI [OPTIONS] +.RI [label-filename...] +.SH DESCRIPTION +.B glabels +is a lightweight program for creating labels and business cards for +the GNOME desktop environment. It is designed to work with various +laser/ink-jet peel-off label and business card sheets that you'll find at most +office supply stores. +.B glabels +is pre-configured with templates for many of these products. +It also provides an interactive template designer for creating new +templates according to user specifications. +.PP +For full documentation see the \fBgLabels\fR online help. + +.PP +.B glabels-batch +is a command line utility to print labels previously prepared with +.B glabels. +.SH OPTIONS +.TP +\fB\-?\fR, \fB\-\-help\fR +Display a summary of available command-line options. +.TP +\fB\-\-usage\fR +Display a short usage summary. +.TP +\fB\-v\fR, \fB\-\-version\fR +Print program version information. +.PP +.B Options specific to glabels-batch +.TP +\fB\-o\fR \fIfilename\fR, \fB\-\-output\fR=\fIfilename\fR +Set output filename to \fIfilename\fR. (default="output.ps") +.TP +\fB\-s\fR \fIn\fR, \fB\-\-sheets\fR=\fIn\fR +Set number of sheets to \fIn\fR. (default=1) +.TP +\fB\-c\fR \fIn\fR, \fB\-\-copies\fR=\fIn\fR +Set number of copies to \fIn\fR. (default=1) +.TP +\fB\-f\fR \fIn\fR, \fB\-\-first\fR=\fIn\fR +Set label on first sheet to start printing from to \fIn\fR. (default=1) +.TP +\fB\-l\fR, \fB\-\-outline\fR +Print outlines around labels. This is useful for testing printer alignment +or printing proof sheets. +.TP +\fB\-r\fR, \fB\-\-reverse\fR +Print mirror image of labels. This is useful for clear labels intended to be +seen from the back through glass. + +.SH FILES +The $HOME/.glabels directory contains all user-defined templates. +.SH SEE ALSO +The gLabels homepage at . +.SH AUTHOR +Jim Evins diff --git a/glabels2/data/mime/Makefile.am b/glabels2/data/mime/Makefile.am new file mode 100644 index 00000000..027c1022 --- /dev/null +++ b/glabels2/data/mime/Makefile.am @@ -0,0 +1,53 @@ +## Process this file with automake to produce Makefile.in + +keys_in_files=glabels.keys.in +keys_files = $(keys_in_files:.keys.in=.keys) +@INTLTOOL_KEYS_RULE@ + +xml_in_files=glabels.xml.in +xml_files = $(xml_in_files:.xml.in=.xml) +@INTLTOOL_XML_RULE@ + +mimedir = $(datadir)/mime-info +mime_DATA = $(keys_files) glabels.mime + +appdir = $(datadir)/application-registry +app_DATA = glabels.applications + +newmimedir = $(datadir)/mime/packages +newmime_DATA = $(xml_files) + +EXTRA_DIST = \ + $(keys_in_files) \ + $(mime_DATA) \ + $(app_DATA) \ + $(xml_in_files) \ + $(newmime_DATA) + +CLEANFILES = $(keys_files) $(xml_files) + + +install-data-hook: +if ENABLE_UPDATE_MIMEDB +if HAVE_NEW_MIME + $(UPDATE_MIME_DATABASE) "$(DESTDIR)$(datadir)/mime" +endif +endif +if ENABLE_UPDATE_DESKTOPDB +if HAVE_NEWER_MIME + $(UPDATE_DESKTOP_DATABASE) +endif +endif + +uninstall-hook: +if ENABLE_UPDATE_MIMEDB +if HAVE_NEW_MIME + $(UPDATE_MIME_DATABASE) "$(DESTDIR)$(datadir)/mime" +endif +endif +if ENABLE_UPDATE_DESKTOPDB +if HAVE_NEWER_MIME + $(UPDATE_DESKTOP_DATABASE) +endif +endif + diff --git a/glabels2/data/mime/glabels.applications b/glabels2/data/mime/glabels.applications new file mode 100644 index 00000000..1391018e --- /dev/null +++ b/glabels2/data/mime/glabels.applications @@ -0,0 +1,9 @@ +glabels + command=glabels + name=gLabels + can_open_multiple_files=true + expects_uris=false + requires_terminal=false + mime_types=application/x-glabels + uses_gnomevfs=false + diff --git a/glabels2/data/mime/glabels.keys.in b/glabels2/data/mime/glabels.keys.in new file mode 100644 index 00000000..596c96c7 --- /dev/null +++ b/glabels2/data/mime/glabels.keys.in @@ -0,0 +1,9 @@ +application/x-glabels: + open=glabels %f + _description=gLabels Project File + icon_filename=glabels-application-x-glabels.png + default_action_type=application + category=Documents + short_list_application_ids_for_novice_user_level=glabels + short_list_application_ids_for_intermediate_user_level=glabels + short_list_application_ids_for_advanced_user_level=glabels diff --git a/glabels2/data/mime/glabels.mime b/glabels2/data/mime/glabels.mime new file mode 100644 index 00000000..ab2f8cd3 --- /dev/null +++ b/glabels2/data/mime/glabels.mime @@ -0,0 +1,2 @@ +application/x-glabels + ext: glabels diff --git a/glabels2/data/mime/glabels.xml.in b/glabels2/data/mime/glabels.xml.in new file mode 100644 index 00000000..70f0e2f3 --- /dev/null +++ b/glabels2/data/mime/glabels.xml.in @@ -0,0 +1,8 @@ + + + + <_comment>gLabels Project File + + + + diff --git a/glabels2/data/pixmaps/Makefile.am b/glabels2/data/pixmaps/Makefile.am new file mode 100644 index 00000000..4cebb802 --- /dev/null +++ b/glabels2/data/pixmaps/Makefile.am @@ -0,0 +1,26 @@ +## Process this file with automake to produce Makefile.in + +glabels_pixmapsdir = $(datadir)/pixmaps/glabels + +glabels_pixmaps_DATA = \ + glabels-splash.png \ + glabels-about-logo.png \ + ex-rect-size.png \ + ex-round-size.png \ + ex-cd-size.png \ + ex-1layout.png \ + ex-2layouts.png + +glabels_app_icondir = $(datadir)/pixmaps + +glabels_app_icon_DATA = \ + glabels.png + +glabels_mime_icondir = $(datadir)/pixmaps + +glabels_mime_icon_DATA = \ + glabels-application-x-glabels.png + +EXTRA_DIST = $(glabels_pixmaps_DATA) \ + $(glabels_app_icon_DATA) \ + $(glabels_mime_icon_DATA) diff --git a/glabels2/data/pixmaps/ex-1layout.png b/glabels2/data/pixmaps/ex-1layout.png new file mode 100644 index 0000000000000000000000000000000000000000..3045c5f231a11ae86e2d076d8e762a7ca2914618 GIT binary patch literal 1567 zcmV+)2H^RLP)1c~ z2F5lvRuiIX3W+oZ7rV_C9^+wjwn&tCvx+TQI{IUu9~cdHtnXZXKDk$au8xAuP=N2` zjZZIILj1=kegXJ7$d`zA$16oq0N@LNC4g@Lz9Z&j5Wj$*c)OKZQ~&&7 zU-S`pn{y+5lG0t#{sTZ2z;Adve_;13EQ7&-&d<+DRaG(!gPxwAXt7w3>$*fl6zU=Uj$IQ?21G>(oZrR%kG8MVo;FkD_<(&_0bJw85$+VAo4 zkxoxf>GJY2mVRvO*S?-(WfsSAP^nZZbA|(0}O{l zj7B3gn@tw|X0wUWXoTT#$fECuBvuBvy}iZV-JN%rJ9ZRB!QI^*Zf|c{^!<>;N*Tv- z@bK^u`syz%nx^65;UTfBL`kfa>2|xgxw%Os*3Hcgy4`Lfu_7myq9~C*N$X~fe!q`K zqmf9gMx%j#zn@5~NY4t1=_x*!ZWggD3kL@WiNrcMIDlnYiNunrFlDCGDGG%`BC!gE z0;bbxBC#TkSaD4`??)&u-7GSn&l8)v6-B{(K2Ic8#bOaelt_Px z2*qNNJq{pKVd|7hB`lZAL}D$MOO#5bL}E!|rHrO&n9XL1#G1`!?Dxw&B(YMaUazCq z>m?Ga*XyBPuO|{K2y35wN5xNrOV?{hhE_M&woR(4Mn2vksHz%z3C*^C$%vIQs;c7T zuVN$KP0g-K&@6owOYmf{XL8R z{rx?v)hcSW8jJq6tet$M|8=UA)k(hAZ@MnPWx3gy=(WX*ey;WR1^ziitk zUDwGljMw)E!{WLw8HPc+u188LBDpHu8B|rpcszc6g)8jUqGegHua1q!a=atMpAT>yRASuTk z8L2@ku&}E&NTnQi%6K(M4-XI7W96y_DG^2bB(0k@qz35+Prjq#r@^J`wIf5T8>9xQ zz=G5u71)p(qyh_4gVbmKjf$TJm#){244q@GA}dG*7CM~{E-o%$nr19|rfK5h;sTvc zClW2wl!t3jGa z@|aj@A~i^bOc7{x!@exKiwp59SYmww@CASh;4}PB-V{8a`xRu&Rsj40;8y^Jl{VnnG&fuy1Hq;1L3sZ0zajqQTIW|@ z3GG+V16JOB*LS~0qoEuhAHV+J*RNj*0D8S%q#uq!msYkMBUT{4aztpq{sp2{ZDY__ R>8Ahy002ovPDHLkV1ne**HHif literal 0 HcmV?d00001 diff --git a/glabels2/data/pixmaps/ex-2layouts.png b/glabels2/data/pixmaps/ex-2layouts.png new file mode 100644 index 0000000000000000000000000000000000000000..1bb5931ac2ec6d60075bb44d514d58fef7e60fcf GIT binary patch literal 1610 zcmV-Q2DSN#P)8#64SWS@1RuaR z5EVr)VxL>Q2wwKGh!Y&f+Jl;%&7VnESykQIzYmCEu&aK4^X=+XSM_%cd<^sOnN#Cp z|IQ%)`;lG%e)aMp#?D78!!Q8gGk^_%uK>P5vKdG(;1{)J1r`&)p8%o&44-Q`1-SJJ ztFdALeh2UgWGpXm>*eWE$jfXtL%ZEZx7&r|I9MzeSg+TJMx#h160j@_`FtKXH#aa% zQ$-0Mae>`Qb(W^uU%rHR=Q7T%m(&rf-|wSbE~8j1A{L9GUa!M(9IRF=FvhT2t>8Eg z>h(Heu^5WQBFg15`u)DlG6?Jp!u#@}#*cY?d}P2%7judmtT<0IE` zqG0!j=U)J_0RF&#Gajvass4_#juX}E=n-o+n<10QAeBmCJRZZcEUx1%%ffg(MkNzHaoT?;zW4Y;jZhlWHQM{qmj@V@{-YL#FEJ*b6r zraCYhjaWLJmfGfzs1)iWy>ua3!&}FR>Lq+BtW+v^cz8f6l@e{@O;V{89v&W0sZ^x4 zOXx+&Sp9wvqV7*!{C0&gxgr{b{n-?O==PEQLEL^Znw4cbxtsW zo1;wfO;T=Sb-P^@3I%Be{ER}OfNr;|r7uD*+-rr7;~*Z7tElA_@pv4L<7nyYoKUb< z$PKr#7K;TUk%*MeKOz!|V6j+e>FeAOF^J5+v$!vX>-AdMZ15$9VPL&pYw3%S3%9YN z(WthSaK;#-(WsWb2)S?@E0IWGv)QPq5IvwQmc`bbr`uX2#x9hshG)TIJmmH@@r2#aU?>E(A8=c_xJb8W`~S1+~41$TCFN+KMb7QS|I@B zayewPSu~qXsl^;hnSOC@vJ=Xa)w1bpSuTw-+ucIEOXti3ny}iYF zJU*tGXU5|(Zf|eVYPF=aM+BRnI@)zzmQJUcZQE?S-3px*+wGRww$0M%w9*GD7^4x3 z7g4>Ae*DWcO$>*_=SR4BXN!*GJU==%91dv~7$Q8oyVvWnQmMpD(`2@7v-y0^o}Qkb zN3!j9%buQ|*nB=`wrw-hG+C)sV!d8Z)d}|s(1^u_s9s*?nEUp<6XfiM{j~ZEfWHB_ z`}gk>yWrL<$cXBt#8^RwjKznjUSW+fA{0Z$B9uVJB9uVJB9x#c(eGG-JgX$U5vUQ1 z5&^@7mK$-p5&=OsNVyQz%l8qB5&^@Dva`XDL_pAp#f3_}lojpAelC?lsn*L6MD_CR zQb>t_=Z!DM3R@ze$o_K``_Ogbi?PC(2*?7y|6DfOjYWxo;Xu2wC=oCmXg3xm0)_+a z#-c>PaG>2-ln59Ov>S^O0mFfIV^JbtIMBWy>yQX|d3mY4uOKA?p7PC35wwq3VN3)R zxjB03H%YY{ixL5e15#JZ{Z0gg54#)oeG0w&MpQ5DBUV@w0a=JHgMd$q(3A*x{`g`n zN(3YT+Ch4>UZNVR)SjmX5xsnUn1T`k!;R82LU$q{XvE^KK}0X#AOE66!0@8&?9h=2 z2pX}tYY@>Zkilyzvm5*fUJJticq$4d`gw#B{rI3nKO#_&u?Qu2+K&~sy+p@CdU-R} z1%S^0OaL*wJu5Jmjqhh8r)W3~a{ z6M)|UM1J_UQ-)#p%l``b<|4h|{R@&bb@Bjb+07*qo IM6N<$f>vJvIRF3v literal 0 HcmV?d00001 diff --git a/glabels2/data/pixmaps/ex-cd-size.png b/glabels2/data/pixmaps/ex-cd-size.png new file mode 100644 index 0000000000000000000000000000000000000000..68261f0367506c6374d30fc53b9c3bd6ab50fc74 GIT binary patch literal 32300 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ⅈyeKQ2K&!SX0$&5pHgo|wG@eKlneipVdWiDT+7m8vJMzKG6 z+8{PUkVJU+n<~pihbxXu`Vaw_L4V7Q7d%D2x`g21U{xTDap=6$lQQ$amX?;n-aC&V zwQk1i)RZ@%0&{b7`z^%9#^NA*n=_^cLRU!&(xh)-(~0Oz zjdkGHI9Yf6ctXqsSM2F*D+VZabKq&k33|TZmP0J18M35>MG5TUlA` z{O$q4#j@;SgJRNCbp(Nw`qutF(^nzl05E^g{jpj#njSpBqPr$`XFXHU&BE%hWh=tU zt;o}0+7f^iO@4wp(Gr?+2W=9{12{NZP_gDew?KkEUeC4Qa1kR+VBi(R^;owEozjO) zc?dK!a-;&1d+2!tndGFTF#h{xgCKFFI^2_czzNCeewZYgs~$74BxR9S16Rs#0$Q@E z?^3!aYhq7@+lqF!`s&3w+2MwynEv~SJ74G-!$Pqbg$!ZITpiMXHt3b=GuCKLK~+K9 z)Jt(U<3Bx5Ego?EWf7V%90Z%-K;1RY8*mb9^Og1vE!|r;7zB8?qJAa$>j#LnK>Enh zp>fr_%S(Cs})8{UJY zr52W~iV7hzTfdY+#lV@E7|bkXyG9x*M#!rwCh9zbcJMmQLPptJCJefFyrvz>%{$H zU<(f+9ma(lmIF>E_%>L`e+qAarA5XoYIt_rl17_cp%9r1Z0X|&83D*mz&rn^DMq(y zu551JgFR=6+d5Dqv%f#rn3A9eoFIkI-VRPI1|lXVMg~^lg|#MBbfTdehX=^oHG0Ht zB;%KmHZMA4s>usE_*sUpHOkuB<4JgGrfSxt5i* z0PWz{m|+J&o*OYc;}NZgWF!m}-DqHZlahiD7z~{ahA0}kAHpop_vL|m;P%&hZL`m~ zgHY-PdOd>t6!j(N=5DQe(z^0v|NfCRJ{47B>KQK*DhE#z6B9#^pr@_0v=W~B#!CmB z(j!?5v?cnLWM#O}c}UW3;WX}126{nM2&JS1jhhr|;gSLjhEV~O0i^8k(w0F^hqEi5 zg$&}$Mv>U98hsE_%F4+J8F=u??Fx+6phpLw+!nR(E@E`YkKNzTyb`mMiv$Ti4CCoZX;+f95EX$ zF&x~B$0s4-x_^JnYUHi5ib}}aw~PRKMhrP6AecKJ00EYO5@@VJ&~S50N{E3r74u10 zU_0+FQjMJ%K8xATg|S4UtSView{{E0Zc^~i%w%)R_=YIDrR3!1l4OigM+Tm)nr8Gs=V{v#vX#zkff1 z+YKa~3@s?9LEC~CKtL710{!ll?df;*OzCutAduXNh~k;PPD@f?DE{O{WZ5yQe2%Bo zc*YhnMok`7C}m%vHdd~zVfbbFdl8dCaC)R|f_G!tFyi}sy*m-TSd2{L(*;~m*CFl2 z?S=c{!v{7jTw)tqm7nD7Z9~8-OyTX07C-`OpPXcXboZCu-XcB;KMCJW6gGTfWPGkn zzfP_!)-GJwexxWVARG8RlT2MwkaSLtCS_Bu|(`4@=*hIw3~6Xhvx|$0un6>$9s&ToI;(^&n&Lm~{T;CzfiaaMy3XNYYRJiBYPvfi zh+J<)9+5{%Y?mhHMzt6cQ0xC{;@9G!)`7F}5EL5t6OaqUYqn z8{Bz5`+Ap*>DH?O4)#~CU+0u5wjZN8JQhCf1iPFXm${ZU_6U1rt z>3Tw_bR!~w8dq7>lF3wb_E~#R&kAqyeFFntQBLvekgW=WYXp3_qq7qS8nSsw>}8M9 zFfoToS=aUFiHSP5VL`o!B}l3t**?y-`DOI}eiuPlzD%?(U*8ZvHD6M1MrEqYIoT~f zJ)&&#GhX5s$?ruv(-IT0kmad*k<9xrK?CmTCvn?fd_CX3O?``eR$1v98jaoRgJnyo z0F3Y$Q|}R+{Z7YE%R^tQIP42BD4 z;X2&uM<+(#%p$}Hv0f#8kPOmmzk%(Ln`cy7Q+V$J45%=W21dN@0K|Rw{=H>u5QYJW zBwwKc`^a!4sf>V4Sy+4g=Iz_e@6?1F0k7<0-z#Jf=IM(OMm~!jD#AF(cw!Q2o|400 zO1lxN=>C|P^;nBuR@I)-_1GX=v#R{c(-sx@*g)yhNs{a$%=4N}QB9T7eWKWAI_7S- z2}w&&zE!)fTN~x>Ew4rm(}FyEthFq^N|#`VKl#ueN`D9sg{=dGrsiNcP)DcUdv_6R z5^7+wo#@z(18l&giD{hP2&|ro=nwi)mjn4FCV^|>lNzJiLbsT4T1h3Vp6O>621k_a z_kJiWd_sAE;on7ql=#az8VBVuiaSPZ^X_Hekm5>GF}Jen`pG9DaP?}Us)|a!sK-87 zhcbs?WXd=b(kI8+(VS4 za%1>~<|7xmHuY#*jbx-CNfX|Lc(7S&^-Up0?K9&a59`4RhiR|d&$+W;VnYzhaSTkP zf|3z(NyJLD&H(Ts5sHnUpC3DDW9QgNfWzj>ux;sc<1!Jp>;WdwbYjIgsl8S5zUS;* zz$Fb;$(vtT#xQH}o18aChM*GpoFWoSIdCZkto-8???Xz zNq-BFO1Tw`7{%|nq@TQZst=dT9^8EM#LLc??Hh z|LoA7GjU=;j|(w$xok&Fi4V(@)%=2{%~Pxv=n355%1fH=*C3<#Ajwd_tLqXCg=TRz zb7$wRuR?WVWfQr@`mjwC$y35h(gNf#L!KKZ7o%j3gqwGdGw>hQ>E&h{eV_&NcY(!b zUpf`j;X}$zSF5I|PN>Jpz@DN5wIF#9BWj3EX+dnvqx&zS@P%wQwc!bxd9>!EEmIL%KX zyA_O44;;te(!wIO^VFr>q{-_8Ox$TVMS=OyUSrbav)wH$EDVPP1@q5g3EkE6UJ(_; zy^30ztoUtTtUkyMX~@e02P7s6%co0w_?VObj+elL2Oe*#DB!dewM|^YCtW1_2}9o? z+MzWcFw9O#R>2^E>GijLQfni{bb=<0UqCU-oBo^w;>04a};LI&so6fsK=N0#B@i=8l#R+xN%+Y%nu zK0N&Dz<+SuO3k1^9?zq;f`QzD`o`9z-I}90gWuuYb0i4OH+Q;Y8M}=?xfKpMzRS#H zfy*$ry86|5vkhX*U0{&2UcE{(CG-w>7A(^vFl3zpEEq+1f(eZ#i+*%>3Uw_2s3PbY zRXrL`OvsyD68Zb*M9PkSUCF%FFxGAX6zV1%U5BeM1qw;#!xiwx8?LWaSLYD8ZH4OpkAXa=D9oYc2J}4!HUOEsu5&$wvQY^+7ut4duEwUr=O5j$?)Y`=u z!1QXp?STM{rJC8<@jDMm`yC1aqRxhE1^R=9-dyqh-~UdrQRB11Wv0)%H0Vh`j ze_RT0gQOKb5C_E-J=nI@)#BaR(^L2^A%cQ}A+G+%dvnj(U0N zQ2?kk7+E0f{w31aB`3Kg_fAVtL?jV9TckNXP|L&@UAx=6yBvK>KMbzG9>bV1D^dl# z@VYK!(`aG*7CQ(nz$wKu|JhW4n|d^GbaG-1K1-j*ZY2!Va3RCFN@U=w>K*WMh1s-Y zFE|Ad{RX!O9GWLRFS$nO{9qKV!4tBsh7dEi-e!Hyw%3YLv%3 zPw9K4zOBr<$HFSzte8aQK&@!zNct_4%*O2!jBCWev~p0yRu4}mujo>j^*~0Sag$Hd z4uh~2z!jeQPoG}Gsg=GsbzNS4;=H&1lMdZTVI~NDen9Eo5qSboCL$&V+#TGPiHYlJ z>FGyr;sCe%?e>WyLFmE9c6XMHjMi=z@!>IFZdS_$El%!_@+Nm^f7aZnE&cZOt0hNk zVzB8mNUuZuJM;eQG1I_wWDrsw#heB2p4m**G3aSzYrX*gqT0ye6`!;!{Vx#hdk3t2 zX&yiJ(}%>Te^c=E7A#p$1CCiTs|QmqR-Pv1e;=H6qOE zF2DOt@B`I*_m)s-<3bD^7E4&aSfky5e`|(;WlHb* zAn+*!Q&D#+rr~m;FAMq`y?`S?+x6sZLvps8rE}2phS{sw`5_KjyE!J!k(&A%4b+;( z;>eK}FhjTo=WMPlqgAa~$S02xLyW>$`uH4L0aMb;w|TdG{2>7?9C+>r5kmnO(-X}# zjfI57FVKtqQ_pGld!Ul{K>Vee0zZf*@}}!zV*%Ax!AlUjh{W3adVAZ!Z>o&Mzc?BQ z+-l4pdu%{&=jZD5l8GpT59oYEBnB?=U}9g*dcfJSu3~{>Mo8Y;?*j3MWKhy02&lMc8#bGZ`8boY z`1O&C6Vs-Ea%-CFUGek%OtN3~vLQkPw9)3*ryJmxkOa|eg5j~aMJM(OSR@S{BO?)e z2;_>PW@2Q)_XH^l?mIt2*^TN-UZ#Y*G|4M^6nGK8yxD?d2=?vi{%F}l)pz@in3$OQ zKEA#%ELleP^I3U$d7Q%?$)n@rzr*q(a4*eZuSMY-Wq?OP;Wyge9s=p3t$xW(a^x?N zA}PN^O)r*!!{Ft38C%ayBO%2J-f6E;-s{>gXsD@Ch|TXW2_R2yfYz@AiS3>^zJk=} zmoHt4jHbILI2ZTO*ccyyu|?gpuyF%+k5n}jnLBONsb9|dS>(%?*b``tKHMCx0hBNH z@4Mg7u{b!8B(}39>SzH8OoKb1{!2b!>G)R zBt%A;*_$MU%!(wdQb@UZ$Vv*?dy^1KX2>i_QnE)Y#ymcnn_i>uQ+k-3@wmIpkiw!Rd#%DSAvG~p@DskVvAF+kujP1h~nVE@|=2mHY@u>H_QCGhd_W#xxe|l`< zsq}=O{6w|v@PxJAW?+tFjb%7qoZ0gwwlv4Y#oIq5NMFnN59UOQuI}!KD7%ks&aM2Q z>3lyoI97LAM+_@ELnB?_OE~w*b6y!CqF@Uszjn%RYO;Jug?3qk$LY|r9?Fe)E#Y~1 za!6e3wSoHl4Hz^}58a?OFefm}3tw(Q3}tR{@qy z4L_xiSReW8gclHA$e5%*D4dI7z`{G`yFvJ%M0W<-h_b=$TV;`NOb5XuJnE3V%Kj-a zrb7(Y;(OT@i1sAj>V=zy#P&&NkL+K(Qj2#j|h$B|3n9NOhjZi zF9RbZ71Q%W9joJe-6!7J7-|1V&9Vwp8vWhbT3Gko^rg#yc=nJyLRMIqm`p#{;Yb&{ zQ2P{Tg67$?xr^ovgtydl&U|Be@QS96PK9YwZ0tQk^D>r8E7N>99oJms#}-62}R!0b3&{%iIeESfh3!n<9I8A@fb2T0AV8==Ohm| zw{F?yGoe`MVY<4y{(w=Ph(GS^wfgg0q5HLK`InzOd4hn3Ri!;;8~^?ufK^{9<#{5Svf*R|C9vY-LLQ<~Zz8}C~NWde-;vy>z{ z3M&|0fK4kQ4B(6R#6D}D?&_l_&u#yHfx0rheyfx;Mcw8u&BPt+KdE%34p5Q^?hu?` z`%`H~LF2qvsL_a=640f}Gu+3hA-WEM7E+QOCV#|hq4(-YhNj{VG>41`Zc%x2Z|Aq^ z=|9OD=~XyjFXtHMl%b|$g^J^L+q-w3uoImi){=;&~d#t`Oph=L!+ z#B6~%7rgjI$Zp0H1GWZqvG!&&{v5g?S$kE7)t2TK6RU{%st!p3Uxt+ILdK#QmgU^v z_H!9bSh}gvPC7aR3M;JP4!fz`!j>A}{G6wsRjmU!g7{%)URxftzov8s{q&ny;d2^q z!g*9epGmP;#!oHzKw7p9f)%OT8?xXAVqj-jf}hxFGE( zl40^2t31eaiHnHv$J-xgFVy+&T@!d4yOO%fI)f9eL6mMjc}v-n$cDUM6mD@3ipn zuG-HN5vg-x!F=onVjyr7t zCxIL+CG6%1cTiEV$Zw~Lx!rD}yM)yDdz(mC)} zSHb5?$;jA%ccxWPQ_1UgXcvF{WbQ>C3qAcS0D@DcQp&5?gu`tGxbAR@)oWII$RKnr zAA62YWMoVF*;WVwN1g(8uDrO-d&anN#rvPk+TfMZ;mxD7*V@^BJ-QIMv7NozO055l z1FxK{T5s){NSp^pNVVJ^%>GO-i_pHZDG1ut8Fp$Kz%0sSQed(646#fbgi?Jc@-Wbd z!vm}OG0XKFSAvhq)~+lDQZ(CGRtc*3(C8N}gM)*YC#-Lnm(g>Z-u^`sk+l1%EI)7W zKoQ0L2MqS43P&mlSAq56qHn366VoCpEz3TdS|3O_Nq0Q9VtDKNdf=pmxTkWqVSF=( z+%=WBAd9peI15OxkO09iOb!VdL7$p$!jqq^>K2R0o-w6hCN=2t8<$lgh!bS~o=(?*g6oqe-AR_dkF{D4#h@fiai_do?FGCq2?Kk7Rep zbu95|A9UeoQr63TzqqjQFrJ5{m|lRvjL+6Z5kZpgfA!>=h?MeKM;>ULDWofPC;#lc zz0u2k{|8JHZm@=|2_?6iI7rpEwVg$4@p>ZBSDS)_ZCBO7fe&W~dF6|*&PTO$N=x6J zA8XJ5N}c>tQ~gZ)P*>?Co$P*N&SsGxg;SewlD&b&{R*G(S)y_0k28ma9ZVMPn)1U?6r2gowrMTo&I+d9exN~Ue&S9-*RUR}D7aSxSJ{x4seXQ}Vc>jq24bwE0NolSce`i2* zo0mI%!|fuGfYcJXm@+c;fKrh#MPMI*h~W+j*h0smwz1D9dOGE=Q0D^q?`8ab9D`TK z-ZDELwlk}9CVw|sx{RldrzP)N*(w) zi5Ep0p%7&DkmqdsnS&Mcmz3|%iZ#TFrdO z?-((hl)RF0xhZr{usaG$X{SCuOJVV+26|@-+d)g|<{KO28=w8&oWf{qbg&<5>oq#Q zsmaL}ggpKBc_08NMKJIvHNhz%MZU)zY^A>_N%;Kh=ni} zQ@=tIU}TWp2?!cz0%gTwM3{IPI5|Im2e#_k(7Ca(K~23|ym%|veVv?W4NI@he<2pB z9AWr4qk9#|AYM&1lO@dUl1_d1NnY4%-w6q25@}kvJ#7~61V5{C^#H|cDJm+O8ChR} z_L>g?zVz(u{EgpxXO_D5hAFu;udg@DrGZPRk&$<*D36{n^M)-pg00Ow9?n6+} zL{hkX`6zZdh~$Dx=Iio8^dslK)I0$|9DR!Qa7Q{eI`ycy$Ic&2JCfIUd2mN_0?~g) z(3e*3=Low8)&3z8Oj7e4bZry(i1FayU_rD0#4j@@x3sqt;Vpc(-XW6~{R@r%wq2ZF zix)j)dfLw3PhE{ZNEf7;e(eXRv{Q7WP50{}lR`^d>w&&04;VXW+Mf6>7eCog(gpnl zF(ea25hR2)vO?2NNBY@uV)z+;9nfS$x}b^w<6}Y5UI^`aZvBqaYQvB83ZSVx7V8LL z#wI{;z{Ve^IpTbp>#n|WMWpnrq}{8-N)#lKn#ITw95|7w4On)04n1i!c&EUzEbtXV z1f*cfcJ*IX{w`sj-;3_Qc#&EuyD3Xb4g$`AEwiY@n{iO#T(9)re9*eUlC+&(suupve>YVWHLnJe4h?Y=Im;)~=MKFFrHE(99nM zltn6X=uX+)cpW-{sn2MM`u7Ramvq?^7hAVpLKqtL^G9GXGyyHZf}-U$klOv;7k2I6 z;UJ;ZuENg#IAozs)5o%_37JQ;Hq}d_Kr)Qp3A9;v8!HO+gcbC=M{gnM`tr3Atvee7n^%oaORF$ zImqnsMj`8#af@l}_>&KOq_409>T$A^7*PH1+bH8g3112}N7+wB=T9cv7u$#B>nN&> zw@y5{5@@gbkUa$`=r$69b(I~asR-$$t?lT4Solqbt6t1Tagi>7^s_U*mk})^Gwl}V z_c@J&8IJwet_5l8ulyKLvCHLh4^wIyKch^uW){+(Ai$|hkLu-PL>SLOaNseyB8AKr$LehBi6nc1w zl$dFQyxlKGa-Lj%;Bq%GFi>ql)Yev@p(lM*e$%no>w8le^()}|zk#vnOVjPz^}~$- zU>s82EvA$RBm%WH|BIdKesBg+zrwnC62A3wwW{ZwKq!MeSKPQlOwdT{K`yR4FlFXc zQK_g#$@xZR&^%ZBQh6j>B!e{v;FF9OY%s!8%Qg~_2Bx752P{TufmMABV}7h=+3%dio<^5x}Q>6U`? zqc7Z8{xiaE=;7wZMFMpFSV%|*!c@~2SCgX+`eKdka5I3UB-nm>ozgqim8o-p@~g9Q zz}=>X?QPSFfeSz76R6dMqJFm<)-~lBS6^%dS9xvU;Le^r|77g6L)&H_|s>Y#AAJGv7{jw8*2 z!hY{mKC8132(q5Fs$j9X2?mhzeE5X$C7O)uOTy{yZYApZzCQO0o74VyirefM$fz7mkA{*NDZAr7 zWbiLu(RwP?UG`i!<`J<^z};~4#+kX0xS>F$^7{2wjHLo&&PZW-5kdtJ}`vINIk`0e!o2o-|XSR2i+w?;JW3JR-Dm>R4cx8hYGcps>}Pc|nTCI>ozHYM!qrKP3mc9<#P zK!o{RMJDgKjkRdReC=75>peO4eTK;pot1PpU$nuUMQdWdkNb*I#nCY1m(snxy#t6x zqXfoG)nR`gUb>5rz_fRE7XJF>c;k*}Ir8&~2o3vprm$hqGv?!_7f&Y88xFipdpxbA z#Yl?`el0R9V!Cf3_NHVd`@PgD^lN+mIfgV{Z0+c#|A1sr4S7N z7#)s#89nW_0y~_>ptA%=EigU(OPN!e&iTehgG)xhBzX?s!jUVQ5A1be6hOH+qLsX#sAm^%7k}f5`FO(WU7NCugA#)TND) zf|i)_8GK}q590M8l2om&tp$v&*@c`uS+_XbOK`x@ZuO9S5HBL~_o-iPu20C1-%!py zH0)<^U*94Oe}lpw85>0_j zu)Hi@O;&Qt=$$I^S#nZQRyMnjX0z-^jiYD;_>9O%A-5+Uf1T8c}8D#UEw@;L;;xf~Op`5arCld{B_gDHFXu z#!5DlN%#-6NGvDaX(c5K$6ukr_wIeTP-?Fg^WxH@#@Snx>1MEwvWQr=V@rq^-b68( z9v`IqSu1k=$I0Yj?jy~gg!9Cm;&m5i`a5kB_*j0ms7kA8AO5?@b$fHjCPpRop%W7x z91AxhFTxO-6&JQKFo@5!6LYJraXh8W5)wqPeqa}d(_dSO*6}=%r1??o+3srI8(43C z>`j>&x53t<=ebXM@&*J58;^~T|AN1ln}k-UB_-+?C|M}I3nh=!bQ2$14vPg`oUepr zSonF*usq>H<0ZrgqVtIMcCJQlp8TO6jm(VgL2M*bmXPMrpVroQVKijP1)UAz^a7<7 zV!pf)G+BB{8t~Z?UeM>{(?*W=D~x>M5Y@lx@9$R zvGSw*WpRwA76Wa`>NmaODJ}zAGAo@~)3s~D#zVC?pX`(II7oU9uNw|y`_7-BEDu(> z?q(BxrF3T2)l>e?FLN+5AZdjD2;rE107j0HBqu8i(V4@oOyv7KRuDbcz1XlKSl5sy?6wz9U+TrYZ)0sY88p4l-X@zJbFJveEK4~u+vAJ<#p!&q)So^X6 z1{33XnbHojq)6RQcv7Mkjj;&>xvaoYjZF?nT~&zRg4A7I@+t$dtdMt>{ry*d#g~$+ z?fQI7vlwQPe|_2{W}v3aqz{#J5$1nb*7^;&cq7eCVx|mD&*w77sIj5H-*=asW&O42 zn0ul>wof8Cf`41}jVPdhbDQEEVNXw7Nt6&jfdLL=rrS7!_f}vdFYOKk)fYYfN6w+^ znZN;tV&6NrIopsDj=hMTgTs8-qtZCH5pom0>;?JFHJxelAH&a8%DXt#-X&egerJX{ z?9S-e!vlT_hy`_we~}Y`=`+NEO09s(O-v_y(T^ic1-(lE1qFq1CYgMb{lo0zONqr^ zUvlebEk7RU-?5d7ux!Jpa?ZlTK>2`#1AT9ZJ*0ZO6_HdD?+V^mFzp zkqnjB&pK4GMEw#+b{WjEya&^gKBCVQ&`MNK&<@5}f&Efft**F<9fA|zAWw~HsWMBT z)K{@0h#eOK0PQ+nQ5K^TjON*IqZ(OVeNyL~^X0&Mw0E@fj~l#g1qfS-!=<&Mk{`H1 zPsz^r9vQj(2W~DhP+SGWw|pvQ`i`Z}QPYDBE;T;yrw==oo6}15rk`cCgcNGlti84M zHKE~}rY;25W$t>57+m4`yRgWYt0EnyrEKFoQ)`y>d%Tc(Y!_pC4E%E`SYD9)R5FZH zF8<~1;pqTf7Gl%V&t$!gI5g%jw~e^yf@s{_?tcH0nMCVtA7UlSwu;rRzCvi@o~fjY z`EErB=hvAT=WdD%Pal-;DK6B?d#s&wYUrqq^-8^~GrUj1;o;#yteJS0P&TH2%S7zi z0u)QJyBlk7+U6Q7`H^WC&qG0V_6oD}`0T6&k43Uw^0TX(CVBK0#hpnNRUm~Pr9a(^ zooHl9+;-eoxiWXPy<$~~5JHIE?&4bgepnF8+sOKC5r zmB71!la1L%vA`hnKenNdPlI;{i7i;a5sGYx4I23rcRXEE@vYM92>RFRSH3Cb-a3Ju z4^Ev-gnE;pE-<6Me>f;({!_VgTfz?!0RdWoaT28qoiC6Lz9iz?bCUI}`67CMJ&dU!ap4vP*kmuB?@< z6`@nCdta;T+nd%^uiPg@lqhzu*dH@M(uCrxiS)j@TXJCh4w!c8>NMPo(!oE|pFKs;<#b<##Ux#;_;VA6EJE_wQK|3Yav043q{7{jwmkanXR4{9GuG z*(ZO?&%ubez3xV)m=A@s#pSs5TObMDfV8tk5$ZXpsjgn^r=f2U#6+=ACgRdN(*hAC zXe1k@l5AW@@P?<~Dy;fxNYnT(;jV(;?=T})m&i~uIW=xCD@iqs!*1c17)KaFNNguy z)D@GHtI#t|@46Y85u5G5f6%N;meNo1Cil;v$``Es1hsBNkikviB%HkN zv!-0<%rryCd>A#InF&kL+0W0b77Vv5dq@C?UhA)m{2=pOeSBi#H~gyUY=z}0P0CoV zYovA)$O4Qq6+zqV?FJq&9{Gb8%*5%GNrvgi8j?vlv5c_Q$HC=Z3=t!v4X-VU&@Myv z>A<|ejG>w;i;Cs7;fjyBg zPB?V=g90s=p%8?i6JNOae!Qy)UScrx{V0`J4meyntEClGS0|4*_Schg4v<`t2&~`B!?i>8e|x@o616M%(u)8)I`(WIs5kU_>vsKmvIcy6|kA_x}{fm`B!K={~p z^OSP`Bad5lYquUGHO~EA*_NRl^rdmjpFE*wuII>ez=fcMAr{B{{BDxNr!s!HjSGk| zYnohmtF=SvcJCfu_~cw@mRGn7bGto9KsLQ1!9l1440ilSMc6Dyarp2yP6OBNd)&UQYiv}v!l(S} z*xH1=0V~s)eD&Kwjmw^YTtwMIIvftgS5#DJ{deipj?(4Im&5&I6Lh807rcY2tlwmT zru%iHc=;ce!Mi6X!V$$6d20}Qo)$vu^C4#z4NX1p<`+O=o!{rP=&=Y+-HP=-u)M+W zzMBw2;<)(zvH0TmyyL3>*RUT7IzjacW!bgYcei|ylT|LTJS4w%hOKmSglsdh`y;vj zM7WWGK+H>zsmL0g1qKzKN;|S>*+5nKS1PxEJ`XNb-ux?x0Kc=x3L%0R6hC;-zw8$$ zF>(#Ap94UrU6&g581vMuMrr4pf5@j*#dkY2Kp6T7)vQ0nss)WSO~l5huIL}pKGv%v zFFa7Gk$WiMZeX6hoX_^%YmMZ_D;Jcb4RbLI?PZOQ4t=meX5iI(!sZe4bvl;^jdLny z(OFH-&AGCKy8~mBCBOpn$`zlQ{r?lyEG!gHr$6k)%RF6%l+BLbdD3Bo*$C`8!GFbX1e?JTNS^e z94%L+RIVFydkV-;_DbKZ`f77t!{0XFxDAC4-X_aG`yly6&PtKm(2;n{!e$UJLoCAP z4IpRDYWk0NG%QA>9prE-uTo+tncX<;6hZ{|9ipioLa~l7#pDs9Ol41~%FUGcG_EUN8KPSemRP6hYQa@lnrjq5> z5r63ZCHCVgbM{V+fPQD4^y7qs$%W!=2GlPzOHK%2+A; zziwIJ_buYW;)#(N5VE8uC0%&%z6YuK>nnAeF`N|*=1stqF*QrWNrEF*L*-sX!oQ9a zt(TIR?T;TluaPKsF5BA(`5rc&?^p#(&C>d#RKp|XH~6GZ*ZicEwxeaI*B#$+1-$qo z#8ry*Nru=#c5_M<^(Sf@#Ms#su=Jjy1^A;b^tS527RT$O zXEK-|Jq4UWfj9&k1b`8P7-92xJ^dVcqZoeovFf^DnYl1YAzj}Zehju#eo_d5pgeLU zvu8I41BJ!Q?Sc0wA3pTg*y80)aq|x;L54!km-4^=!v76obpRp1i@pof49frFkJpkS@b6;ilUH!pHzkgRl z0|{f(6z}MM+*mxKC<}HQ!|FbjQE*5K{hs$hLyh-dksy=g*MFWKs69j3+Nxl~9T81! zQMaq1nJzYFi^P>(9+M<5AKH}hDH=W|yHlCidB8K%Vh%(THp}*cVQ>Lr?xSi5EHu)4 zYK1uo-yj*uhTN?H%gl2M9Ymsjw$Sf|BwmDMyal<<=v2;uw=Mk(wHcpFAZlMwwll$j zfwuTL2aJq*5`5q0;t(bTmJjPCLF)Q6lji&zNP!8WkcdBm!ZuLDNW1PunZ&`PyY7c= zxjeLIc3kWARNHGsFLHn3ZV4x9iOW0svZ-FYAT3SPlryQS`lT6P94o$PD(1$0ibG<1 zmjgA!+si>* zY#NJdPc8FIjJbmYDwI=t4~|k3sgoyJtCO%&zvHW;)wq+Hd1(;P|FCZK>1R#?#BfJz zr6VZXgxf!~D(US+7J@2N=S2Jz!p5QKtUVFp+eU#jLn39b67fi!vR?G)(9BK1a3JC1 zK)}|W^&p?ctX`31m(O)sk;KIVl@b$ojgHgCMo~>J`D<@WRiWY`r3X+&r@ZLPSyD4h z^j4vd-?}rfPV$wNC?P?B9!wNHKEwX~m&Y5YMn>+ULMJM4Sa4G6iv#VAQ9WW9rw@4S zq#M_+y#Z>>45HzAtM>;c9Qr$N+_(WL`ssY*Cl63w{PTtn{&Us!T+I-EI^{!=NbmsN zv>O}CE&Q?^8s}$|AM*EV_&h=F#EF`J9?Yl;ivR6+HSEiGLW_yjN;p})FtZLTXE!pg zV(UIwU&4w7BNB`T7|8(Nap6Rc+rX9USFb80ow_NCj+_Wo9fBlbTde0CQmjINaE_0T zJ_FFK1xUL`Bga*C>i$gzlyh%@_U?vU?y@JQj7g&QJR@=?TPm!KtxOPbWgG&SE^lX~=ff>CGzI`*fF#;U484U$ zM2}FB#H^J%F=12$?x|pdw+1dgAUs@WV8UC0B}AavL1F}_6)~g`SNebzl0|^@GVN|R zZip0TaHW8ZMPkS%>Zwd<XhXsD_)kafF9zV=+^nNNJixkRqXE!;C@!PpJV8kU}p!=Qt2dqDd>Em3 z9AEhBVygj|&Zz+{8iZAQ>G$qE2_T#Xj>S*7h-y8+kp))|5RRlhjEvxMpT8vn|d1Of?lDeoP^6qdg7L&QtmEu zG{C45P7FW3WM1abU5JZjK6NGFHPHlo!+Rf!y#ZI>1v2y)_Rjf!xGrhu3^GPql=QUt z`S=uY8!!mg8`m+p(TR!suY$3j^pL?gs{>l`5{kG} z)x>D442XfVF4UbuM8R7G@^P@7jzdQ>HFDg*7Nv#glx_#~FwoLb zI+UAdGa6*}TEny%8WwhZ@D?`cRSX(n27Z4PJ0LD8J-H7f_EKJ~35)A&Ezxa>!`IqH zfO{-$=mufC&O;(X>ArUwOukwkxrj^pz@HJl64QNASwytwm2sgW}j(Qo_8~ zKIg6MsbBjZJrrg3AK7^1E%Wfnekf4Vx#@x+?Z|FX;^N^k5Wpq2v_ywM)${-Pk+B{h llLM5n>A|0)vf0<=pPDE6H&E&?VXiw#U0M4~fs)nT{|6Hd${qj! literal 0 HcmV?d00001 diff --git a/glabels2/data/pixmaps/ex-rect-size.png b/glabels2/data/pixmaps/ex-rect-size.png new file mode 100644 index 0000000000000000000000000000000000000000..2710472f1e1776090d6d03e7c62a7572ae3db054 GIT binary patch literal 4972 zcmaJ_c{o(z+dh`an#mGl%}&a`$0%bN%UBaa7+V-y4B5#tvPG6Cd&m-o#=fL1p_I@> zV;4pCW$eDw_kGvzukZSeNxBoW05PE?NiI&k3p->0yn{291HY2{4kh9rYzPPwJ(?!oKs1n;2 zzh7ImU1vwWI6GTgLsW;|mb-_C&Iy@C72dd}QA)w2MAl_2;RqIqGr??38$LO=;Z+OX zt;kai6mLsQx=>M6G)EV4|C)Ys(67Nv0Yxw3(}laTY|^!zM=LWuUlztwx8}T4$^%xv zf6iJU$p~LTq%V5CuhWcYJl$Mx+t{8HMfokXKJ9H)3)#1sX$`2-;ex-_mJk;=)eUzs z;Hjvn7*9w@;7N^FlftYM5zj=7&Xy5m%bG6jxDS5ySux)eaTlNh-^<+S4)sfIp(Ma*7T#=H!uHj?n~kj z_|AO!^6UEgbf!pS#x%Obl@)hAU0psv?%|SwxVU(6TpZQP`nquWD8fKZ{Mt1!A)(md zkdR+qdKyQ^#}%ceu?pVP22~bs{4O}TxRl-RZVud-u6nY*Nm$*Zj1)u^M@N&l`Yyx~ zk6*?j?%(GvEi1bWh)YUlw<+Ix;O$+$yX#MIy}KlJ6cK-k_bj9k()I6tz-?u$Vr**a zI;qpy0dsDg0>GUuxX?a6PwA;B$e3JyupA717k#@1WDc5VJV-X_wt%m8us^a zp6dK&#`oI$FfS?b8t<@)dS}YW?d|Qw>1+vdV#8JQ4AulJvOwLChK44byI8yinIV`U zY?!;)Aw0I402F_>u)EtGeBbLv>5&qrm7U#aN5;GvD`i!nG&*jHT<{!cFy zFCh?!IrqzESZ+q@n!{kPeny+NK*{1Ynt11-EHVI@ry}I7nZl)9Od{c5D0&M6=9ZSa z5{=k~#W!9Pa0W1p2(DkrdlN99S&hIucUWVu3v}*&(?_3mHrCc&0-k1O{yJPt7m5@l zLx+2(NKb&V<5yGTZt|Yt*$GG&WFU7?k=s)k8Mf?sivKfO9$%uI6q}vuB#oYwQ_35b zo~ayht09-MP5qtN)LrL>P7c*%rz5K^ST>oTpFfI{y5JZde&!BTeZZmnSVXW+R~@x{ zN5z6?p=rH<))+QP3(uDxi)Gas$J+TOe{=*0*rW@I9`L@gC~%1GmFGvTyaR{sd1#t+ zz%0~6%TwV6(GY8BBOuf5h-&$Wc5N7_1X(N74K|Fr-K$4oSdBOH@eP~+loA2 zK4GV)VuD~VQa!%4zSQ&TlKKG8NGGv9n1$I^QuQy_nu5#LZi_KYfUqC{(nqwZhsW0 z|GQvsN0^>Y86F;n94ms^a&~rhb9cWT5~5o8REaYiSuOy)8gXk!;uMX@6uHwpwz8i) zO!E4j8@gLBeSWdL)6&xe-`Z(@@Av&J4!6~ypMB#rY_!ZUJd7DDc41|8b>!Q(Xt3Oa z;AHI#8tYpNg<6R=@{q{L@T}EXjsdGLhHxZ`yYqU`M%L;$N&gQt2?8=@j35lzBx)cWX4K$7#|EOeg5rN6%(g~F1@^(^ z;k;)pLffW2dsqp~>F%hJpW@XZ{VaNsCp0$C`5d(lIdFJZKH8%}I_Wh&lpc$$ydx6H z_!pyU^sY(@gi1{XUkOH7r3P|}l7l{)Hj4FC;`%r+a0`P`NYWMnzk-M-6D4fpBmrv) zHvfQttE#H^*2|<6wM!t3@f3M^d3^jo)-ZRCF#!PsQ|<3!3VBTqIi#^rTvgRjK)0v0 zwKY4mU-&kqJpz%i3LSj=R*n$+*`>j1cxm7^UcUIlT;zyb%!KC>oeOIpSYh^3L0qNq zwQL~*wv!`S`?tSJMn*tYN?xbHiH`c7M-%z7#}AL6hg)uhSVncpwJWDp;|fTpoTx zMwVjJB!fHhLCAfboLqUBK2cP3wWs%x)G;@$C}aul8H0K6j=xec@A&K{ zEaNzafmRuS!H=9P$$qVdV7|?)BFD|nu7O5hPft>j)#X!P|?v_sF^q^TA-eMrQ{C z>g2OrP+FIV2DiZX1-T`-HFL2N(#zlo=Dsdq)xscGEL9mS#Cz2l&tqyVmsb?qZI~L3yVC>;>ZL0mzvrjIvYA2f?1j73}znStj zO*t931gk+b#wJx(98Q}R#ThEKS#p-P`gwIwDAW%4z*q7f-%kkeMtN&TM}9DrKI=r~ zcG7gna|JXM(8!e)VR_+dpw@`~sU6SAeRS3Q=ff}95(avDV?#p*ZuL+l(;07xXupRK zX@Ic3@wQ_HfMgax?x@sOfGKp=uvb!TO^r`3RY~ieZ7*}o zrSj%i=CgTQ)X>1pmgwB0%Um@+_;|DgadAmLxh3R2i18z?Azc{*ylBmbYhq$iU|9}0 zMUS|_U0p>|)g97U2UNhy3L0~s8=Ia+va+)BM7$Vx7XqAQa`amlSSrwl@L``)d6>WoacFbSoH(=1z-0d zInuRdmYys3eL$FSRmcv2^m9FzeB?X16w ziK!`h!^B^xTV7UHTusdl!ktSm(;QPp?`lWTQ2XzzP?9>a15lGsH?D&uwP&!_PoAEY zwRA+z_JJ4FViIh0^i-NX+KRnIOEZ(igmpUnC-%PRW%U#3LIFV@4;9}~_Cak~c6z>I z2r674V99(B)G;WChzIepVTRQFlGXwh{|s*$ZWjB&q{aKn@F`ZJETN%P_}M@}nK=<{ zeN(-LX;+}nGnpM(ZdA~B<$fp`&n8ghX&yWq)ws!hGn@J0QfpI~8Qn_nDwrWCkN#1hWW zjyKddgv3J+e`PC!g`TV+F?B_|9C)b`Kor;I!192y$39rc-P^z4q<_(=^kW7eR<1+Y|5H4)n%jV|v82M33P9>nf|lLr_a z7~oj7+5Gt8Rtjz%Gx-B$wM*!tYVWWoNZK?rjm(tq21titn}mLKQ^&UjvW(ezuLd-@ zK9j3lvjV5hslXWs0CGlF(=o`jxgc+!s6P}(Tn;}wbfu@Kr#x-b>Te+|JAG_!aQXb? zV8gtAe%|p_UkHr-TKJ)JFYo(}Nj#mF>z81ErhJuGjOYk)`YF>xF?CAr_0CuWznf zNki-BEWzL!$;->jfh~nxV%&J z!^=mN)u#J5h4GKTzOGZf@dKw>mL=5^dN3FNczk?(@SNPs-MuoqjbU!q!(P_4_Xi4R znQcxa+lA!zglTg)m567{*xUcimWUwx`5P!Z-T^*kU&4ajqI@D zT-IwACpW^8NaUHTpI`lIOJ$|_WM`NvSw6F=SeTlcT8CB12%o$>E109-tE-Q-OKxdt z#lDK!-#Y3cT;jQTAW2$g1gBcq*@0$tadWe!xP%0~XpZPg^}xTwhvwQZ&!rc13rD@A z*t|dk{CQwtV5j%Uqqd__V|ZT*<`b{J6aP29Y)+UeY-ozHudn#E=BSTb;`@mi%fBW8 z+U*f&0U)x0-%REXb#aKo-`~HV;)Ift4e?RG^BFD-KQX8<=fqCCYyS5y4(xP&(L1X& zu{3cC+?zLs?>95fO>JJT8f5^w+}zwIu+Wr>RB?(loZE+}kL+|^&CN=_H0hq;xkd90 zXPhBT)W;t|2VXO!FU)E<8IUP4ahL&&@IIDEinRZ0sgE6%B>n#l3x_a=kM62W&wK8G P=VAat3kk2eZ6Ez#4FiW5 literal 0 HcmV?d00001 diff --git a/glabels2/data/pixmaps/ex-round-size.png b/glabels2/data/pixmaps/ex-round-size.png new file mode 100644 index 0000000000000000000000000000000000000000..c45d6c3b509388b6225af33bb5b743f052ef24d6 GIT binary patch literal 16682 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 AWB>pF literal 0 HcmV?d00001 diff --git a/glabels2/data/pixmaps/glabels-about-logo.png b/glabels2/data/pixmaps/glabels-about-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9997c67ed0e712f554786e21cbf6b651ae6b17a7 GIT binary patch literal 7734 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 literal 0 HcmV?d00001 diff --git a/glabels2/data/pixmaps/glabels-application-x-glabels.png b/glabels2/data/pixmaps/glabels-application-x-glabels.png new file mode 100644 index 0000000000000000000000000000000000000000..59c749f372d2cf7bc21f01dba15f4d79658165d9 GIT binary patch literal 2573 zcmV+o3i9=dP)8`G5}RoRVpJPhC+OB&j@i(S9EkV zQ>IK|)22;SR#pNu0LegXBoa~TI6^0oot;e}5a7_E1OF2e_agcE1vE4?Fm>uwIy*Z# zapDAdd3gZe1#SR6fMV@u3uRYV*RWDSQ55|uD%vUC59JC5gQBjkPPgax`^BC;dxY2P z6~H7M(n-3}Qs`bqOM&5vIgMIcS^!WKg`}h;X3Utujvd=cNJzMfLpnvA9N#2xYwjEE z3gK`VfKVtzI2w$7?Cft0xD#NoPGkrMgZTY^PM_}wT-3|5JE6_?pzc_ ziBM&RmdlaatlTYa@;b7s9Ovc>LOhnko34gVer?g^-|s-XetHz<~pd9zEKTfGGk_z+_L#9y5E(4BBW@D^8?& zWKA!_hE}OGa^`WZqOSv?P#+#oG<|)21Ofrd%a26t^lizKCHeI91W8OB!>wC>KK=9* zix)2jr*%LGsHmtQCnpCG6ciK!uy=2<{@q9=^DySBW9SYZEFmv%kp#%lTQ_uC~}oEmTqfLdvk2$e)gp3`h9 z3YKQ zht==cu}T1ZzC{dFfj}alkei!JAkfvng;hJ3mL4KE*N5>O;F#m)Y9%;&^e8zw^Gtes z8p0vL!r2MHz_F(I}(tpkl9;uKFW39X&)pGK@eTg{Gtz7D|ZRhw;wHvIMlre#jzt8?|d z^@k7jcC8Pn2l(5!JK4AU7&XVgkaU`?UbWeAoV4`u{P-mw6DOt8dfm_IlV>@&zXq_J ziI+b+kBO5~d3Wn>zWm}c@$qpy_d@P~UPwzH&$P@*x&t0bOXgbR4I8jW(vo>&%g=c3 zMISZCzmRl;$=Y=*cxYTAZ*F{#j`jd6pI@l!q#t)vQq>L9<%`z{cHiaZ*X{h}Pah3v zeBq)j0P3%(bvn2I-YRalI#hF0+n|805!b*Hz3Mx)TmDWd z#F4y|m^6x+voi^H-{tK;f5euze!Cb7l6h)z|^ps>{DC2yvql8!1 zE@kH9)A_-yO#boyK0S(31n&0q0;;!$659E>v+;P`#EtOs$G3llH#P>3$IZNjv!&-& zuiDJ(zutz+f1Lj90zy>+KuVwpCtPyOiF$eUu(J0YH1Z z5nU;TKKl0&Ry;eO-@W-$MvU-s%iqcQb5|u}TFAG&@i%HeyTC1f2iKc#0;&T__8uoO zF@c9CjFb9=LSe36X=dk#haK&KoI>Vm)KK5TFJD{5_>?i!UuovUzZ;uNeIfh5UI!{F zj!;>%>%IXAg?jtHMd9%b>E%2CR~x=mBT!pgOH^ z?-S|N6=}bI=FAz=(Uw8mac|H`LS9gQ5uBZWos?UnVm%6M*>mQQW!H z#e@lIghIVsxNwP=Uw#?jMc@KZ?*T|oP9_xUXr3477X>jzrA< z3&p@kMS!R%^$q2U6)S0MY@oT>ekzLsL{(K4U0p_PbqekMmgeSWIy*bruwes0E^rQL zg$L;WLPNYh0Oq2;v3E!H6PyXeqrSe>+8#s^z+KdTuCxFF4QwJRcsCC|fiMsRx`B`e j*2RMj+$w_p{|)^Y#Rg@mNE1*d00000NkvXXu0mjfW(36k literal 0 HcmV?d00001 diff --git a/glabels2/data/pixmaps/glabels-splash.png b/glabels2/data/pixmaps/glabels-splash.png new file mode 100644 index 0000000000000000000000000000000000000000..713cb8a2493a24f0ea48fa3e5b1a93e5de40192f GIT binary patch literal 110600 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 !rfA6OB3}YUMJf)O`hhfNJ6&hyrOi3g$i*Qhb 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 Ef;)rG6951J literal 0 HcmV?d00001 diff --git a/glabels2/data/templates/Makefile.am b/glabels2/data/templates/Makefile.am new file mode 100644 index 00000000..63394540 --- /dev/null +++ b/glabels2/data/templates/Makefile.am @@ -0,0 +1,17 @@ +## Process this file with automake to produce Makefile.in + +templatesdir = $(datadir)/glabels/templates + +templates_DATA = \ + paper-sizes.xml \ + categories.xml \ + avery-us-templates.xml \ + avery-iso-templates.xml \ + avery-other-templates.xml \ + zweckform-iso-templates.xml \ + misc-us-templates.xml \ + misc-iso-templates.xml \ + misc-other-templates.xml + +EXTRA_DIST = $(templates_DATA) + diff --git a/glabels2/data/templates/avery-iso-templates.xml b/glabels2/data/templates/avery-iso-templates.xml new file mode 100644 index 00000000..23fc5918 --- /dev/null +++ b/glabels2/data/templates/avery-iso-templates.xml @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/glabels2/data/templates/avery-other-templates.xml b/glabels2/data/templates/avery-other-templates.xml new file mode 100644 index 00000000..cc320dcc --- /dev/null +++ b/glabels2/data/templates/avery-other-templates.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/glabels2/data/templates/avery-us-templates.xml b/glabels2/data/templates/avery-us-templates.xml new file mode 100644 index 00000000..58e897c5 --- /dev/null +++ b/glabels2/data/templates/avery-us-templates.xml @@ -0,0 +1,765 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/glabels2/data/templates/categories.xml b/glabels2/data/templates/categories.xml new file mode 100644 index 00000000..cae2d4c3 --- /dev/null +++ b/glabels2/data/templates/categories.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/glabels2/data/templates/misc-iso-templates.xml b/glabels2/data/templates/misc-iso-templates.xml new file mode 100644 index 00000000..720a7dce --- /dev/null +++ b/glabels2/data/templates/misc-iso-templates.xml @@ -0,0 +1,544 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/glabels2/data/templates/misc-other-templates.xml b/glabels2/data/templates/misc-other-templates.xml new file mode 100644 index 00000000..ac5cc808 --- /dev/null +++ b/glabels2/data/templates/misc-other-templates.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/glabels2/data/templates/misc-us-templates.xml b/glabels2/data/templates/misc-us-templates.xml new file mode 100644 index 00000000..887eb927 --- /dev/null +++ b/glabels2/data/templates/misc-us-templates.xml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/glabels2/data/templates/paper-sizes.xml b/glabels2/data/templates/paper-sizes.xml new file mode 100644 index 00000000..da61d75b --- /dev/null +++ b/glabels2/data/templates/paper-sizes.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/glabels2/data/templates/zweckform-iso-templates.xml b/glabels2/data/templates/zweckform-iso-templates.xml new file mode 100644 index 00000000..f6b2c581 --- /dev/null +++ b/glabels2/data/templates/zweckform-iso-templates.xml @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/glabels2/docs/Makefile.am b/glabels2/docs/Makefile.am new file mode 100644 index 00000000..0cb49459 --- /dev/null +++ b/glabels2/docs/Makefile.am @@ -0,0 +1,3 @@ +## Process this file with automake to produce Makefile.in. + +SUBDIRS = libglabels diff --git a/glabels2/docs/libglabels/Makefile.am b/glabels2/docs/libglabels/Makefile.am new file mode 100644 index 00000000..28e56fdb --- /dev/null +++ b/glabels2/docs/libglabels/Makefile.am @@ -0,0 +1,69 @@ +## Process this file with automake to produce Makefile.in + +# We require automake 1.6 at least. +AUTOMAKE_OPTIONS = 1.6 + +# This is a blank Makefile.am for using gtk-doc. +# Copy this to your project's API docs directory and modify the variables to +# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples +# of using the various options. + +# The name of the module, e.g. 'glib'. +DOC_MODULE=libglabels + +# The top-level SGML file. You can change this if you want to. +DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml + +# The directory containing the source code. Relative to $(srcdir). +# gtk-doc will search all .c & .h files beneath here for inline comments +# documenting the functions and macros. +# e.g. DOC_SOURCE_DIR=../../../gtk +DOC_SOURCE_DIR=../../libglabels + +# Extra options to pass to gtkdoc-scangobj. Not normally needed. +SCANGOBJ_OPTIONS= + +# Extra options to supply to gtkdoc-scan. +# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" +SCAN_OPTIONS= + +# Extra options to supply to gtkdoc-mkdb. +# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml +MKDB_OPTIONS=--sgml-mode --output-format=xml + +# Extra options to supply to gtkdoc-fixref. Not normally needed. +# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html +FIXXREF_OPTIONS= + +# Used for dependencies. The docs will be rebuilt if any of these change. +# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h +# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c +HFILE_GLOB= +CFILE_GLOB= + +# Header files to ignore when scanning. +# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h +IGNORE_HFILES=libglabels-private.h + +# Images to copy into HTML directory. +# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png +HTML_IMAGES= + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +# e.g. content_files=running.sgml building.sgml changes-2.0.sgml +content_files= + +# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. +# Only needed if you are using gtkdoc-scangobj to dynamically query widget +# signals and properties. +# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) +# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) +INCLUDES= +GTKDOC_LIBS= + +# This includes the standard gtk-doc make rules, copied by gtkdocize. +include $(top_srcdir)/gtk-doc.make + +# Other files to distribute +# e.g. EXTRA_DIST += version.xml.in +EXTRA_DIST += diff --git a/glabels2/docs/libglabels/libglabels-decl-list.txt b/glabels2/docs/libglabels/libglabels-decl-list.txt new file mode 100644 index 00000000..d1dcf984 --- /dev/null +++ b/glabels2/docs/libglabels/libglabels-decl-list.txt @@ -0,0 +1,166 @@ +
    +db +lglDbRegStatus +lgl_db_init +lgl_db_get_paper_id_list +lgl_db_free_paper_id_list +lgl_db_get_paper_name_list +lgl_db_free_paper_name_list +lgl_db_lookup_paper_from_name +lgl_db_lookup_paper_from_id +lgl_db_lookup_paper_id_from_name +lgl_db_lookup_paper_name_from_id +lgl_db_is_paper_id_known +lgl_db_is_paper_id_other +lgl_db_get_category_id_list +lgl_db_free_category_id_list +lgl_db_get_category_name_list +lgl_db_free_category_name_list +lgl_db_lookup_category_from_name +lgl_db_lookup_category_from_id +lgl_db_lookup_category_id_from_name +lgl_db_lookup_category_name_from_id +lgl_db_is_category_id_known +lgl_db_get_brand_list +lgl_db_free_brand_list +lgl_db_register_template +lgl_db_does_template_exist +lgl_db_does_template_name_exist +lgl_db_get_template_name_list_unique +lgl_db_get_template_name_list_all +lgl_db_free_template_name_list +lgl_db_lookup_template_from_name +lgl_db_print_known_papers +lgl_db_print_known_categories +lgl_db_print_known_templates +lgl_db_print_aliases +
    + +
    +xml +LGL_XML_NAME_SPACE +lgl_xml_get_prop_string +lgl_xml_get_prop_i18n_string +lgl_xml_get_prop_double +lgl_xml_get_prop_boolean +lgl_xml_get_prop_int +lgl_xml_get_prop_uint +lgl_xml_get_prop_length +lgl_xml_set_prop_string +lgl_xml_set_prop_double +lgl_xml_set_prop_boolean +lgl_xml_set_prop_int +lgl_xml_set_prop_uint_hex +lgl_xml_set_prop_length +lgl_xml_is_node +lgl_xml_get_node_content +lgl_xml_set_default_units +
    + +
    +xml-template +lgl_xml_template_read_templates_from_file +lgl_xml_template_parse_templates_doc +lgl_xml_template_parse_template_node +lgl_xml_template_write_templates_to_file +lgl_xml_template_write_template_to_file +lgl_xml_template_create_template_node +
    + +
    +libglabels +
    + +
    +enums +lglUnitsType +
    + +
    +str +lgl_str_utf8_casecmp +
    + +
    +template +lglTemplate +lglTemplateAlias +lglTemplateFrameAll +lglTemplateFrameRect +lglTemplateFrameRound +lglTemplateFrameCD +lglTemplateLayout +lglTemplateMarkupMargin +lglTemplateMarkupLine +lglTemplateMarkupCircle +lglTemplateMarkupRect +lglTemplateOrigin +lglTemplateFrameShape +lglTemplateFrame +lglTemplateMarkupType +lglTemplateMarkup +lgl_template_get_name +lgl_template_do_templates_match +lgl_template_does_brand_match +lgl_template_does_page_size_match +lgl_template_does_category_match +lgl_template_frame_get_size +lgl_template_frame_get_n_labels +lgl_template_frame_get_origins +lgl_template_new +lgl_template_add_alias +lgl_template_add_category +lgl_template_add_frame +lgl_template_frame_rect_new +lgl_template_alias_new +lgl_template_frame_round_new +lgl_template_frame_cd_new +lgl_template_frame_add_layout +lgl_template_frame_add_markup +lgl_template_layout_new +lgl_template_markup_margin_new +lgl_template_markup_line_new +lgl_template_markup_circle_new +lgl_template_markup_rect_new +lgl_template_dup +lgl_template_free +lgl_template_alias_dup +lgl_template_alias_free +lgl_template_frame_dup +lgl_template_frame_free +lgl_template_layout_dup +lgl_template_layout_free +lgl_template_markup_dup +lgl_template_markup_free +
    + +
    +xml-paper +lgl_xml_paper_read_papers_from_file +lgl_xml_paper_parse_papers_doc +lgl_xml_paper_parse_paper_node +
    + +
    +xml-category +lgl_xml_category_read_categories_from_file +lgl_xml_category_parse_categories_doc +lgl_xml_category_parse_category_node +
    + +
    +category +lglCategory +lgl_category_new +lgl_category_dup +lgl_category_free +
    + +
    +paper +lglPaper +lgl_paper_new +lgl_paper_dup +lgl_paper_free +
    + diff --git a/glabels2/docs/libglabels/libglabels-docs.sgml b/glabels2/docs/libglabels/libglabels-docs.sgml new file mode 100644 index 00000000..a4b5b381 --- /dev/null +++ b/glabels2/docs/libglabels/libglabels-docs.sgml @@ -0,0 +1,33 @@ + + + + + + + LibGlabels Reference Manual + + + + Basic LibGlabels Usage + + + + + + + + Working Directly With LibGlabels XML + + + + + + + + Miscellaneous + + + + + diff --git a/glabels2/docs/libglabels/libglabels-overrides.txt b/glabels2/docs/libglabels/libglabels-overrides.txt new file mode 100644 index 00000000..e69de29b diff --git a/glabels2/docs/libglabels/libglabels-sections.txt b/glabels2/docs/libglabels/libglabels-sections.txt new file mode 100644 index 00000000..658d109c --- /dev/null +++ b/glabels2/docs/libglabels/libglabels-sections.txt @@ -0,0 +1,194 @@ +
    +db +libglabels/db.h +lglDbRegStatus + +lgl_db_init + +lgl_db_get_paper_id_list +lgl_db_free_paper_id_list +lgl_db_get_paper_name_list +lgl_db_free_paper_name_list +lgl_db_lookup_paper_from_id +lgl_db_lookup_paper_from_name +lgl_db_lookup_paper_id_from_name +lgl_db_lookup_paper_name_from_id +lgl_db_is_paper_id_known +lgl_db_is_paper_id_other + +lgl_db_get_category_id_list +lgl_db_free_category_id_list +lgl_db_get_category_name_list +lgl_db_free_category_name_list +lgl_db_lookup_category_from_id +lgl_db_lookup_category_from_name +lgl_db_lookup_category_id_from_name +lgl_db_lookup_category_name_from_id +lgl_db_is_category_id_known + +lgl_db_get_brand_list +lgl_db_free_brand_list + +lgl_db_register_template +lgl_db_does_template_exist +lgl_db_does_template_name_exist +lgl_db_get_template_name_list_unique +lgl_db_get_template_name_list_all +lgl_db_free_template_name_list +lgl_db_lookup_template_from_name + +lgl_db_print_known_papers +lgl_db_print_known_categories +lgl_db_print_known_templates +lgl_db_print_aliases +
    + +
    +template +libglabels/template.h +lglTemplate + +lglTemplateAlias + +lglTemplateFrameShape +lglTemplateFrame +lglTemplateFrameAll +lglTemplateFrameRect +lglTemplateFrameRound +lglTemplateFrameCD + +lglTemplateLayout + +lglTemplateMarkupType +lglTemplateMarkup +lglTemplateMarkupMargin +lglTemplateMarkupLine +lglTemplateMarkupCircle +lglTemplateMarkupRect + +lglTemplateOrigin + +lgl_template_new +lgl_template_dup +lgl_template_free +lgl_template_add_category +lgl_template_add_frame +lgl_template_add_alias + +lgl_template_get_name +lgl_template_do_templates_match +lgl_template_does_brand_match +lgl_template_does_page_size_match +lgl_template_does_category_match + +lgl_template_alias_new +lgl_template_alias_dup +lgl_template_alias_free + +lgl_template_frame_rect_new +lgl_template_frame_round_new +lgl_template_frame_cd_new +lgl_template_frame_dup +lgl_template_frame_free +lgl_template_frame_add_layout +lgl_template_frame_add_markup + +lgl_template_frame_get_size +lgl_template_frame_get_n_labels +lgl_template_frame_get_origins + +lgl_template_layout_new +lgl_template_layout_dup +lgl_template_layout_free + +lgl_template_markup_margin_new +lgl_template_markup_line_new +lgl_template_markup_circle_new +lgl_template_markup_rect_new +lgl_template_markup_dup +lgl_template_markup_free +
    + +
    +paper +libglabels/paper.h +lglPaper +lgl_paper_new +lgl_paper_dup +lgl_paper_free +
    + +
    +category +libglabels/category.h +lglCategory +lgl_category_new +lgl_category_dup +lgl_category_free +
    + +
    +xml-paper +libglabels/xml-paper.h +lgl_xml_paper_read_papers_from_file +lgl_xml_paper_parse_papers_doc +lgl_xml_paper_parse_paper_node +
    + +
    +xml-category +libglabels/xml-category.h +lgl_xml_category_read_categories_from_file +lgl_xml_category_parse_categories_doc +lgl_xml_category_parse_category_node +
    + +
    +xml-template +libglabels/xml-templates.h +lgl_xml_template_read_templates_from_file +lgl_xml_template_parse_templates_doc +lgl_xml_template_parse_template_node +lgl_xml_template_write_templates_to_file +lgl_xml_template_write_template_to_file +lgl_xml_template_create_template_node +
    + +
    +xml +libglabels/xml.h +LGL_XML_NAME_SPACE + +lgl_xml_get_prop_string +lgl_xml_get_prop_i18n_string +lgl_xml_get_prop_double +lgl_xml_get_prop_boolean +lgl_xml_get_prop_int +lgl_xml_get_prop_uint +lgl_xml_get_prop_length + +lgl_xml_set_prop_string +lgl_xml_set_prop_double +lgl_xml_set_prop_boolean +lgl_xml_set_prop_int +lgl_xml_set_prop_uint_hex +lgl_xml_set_prop_length + +lgl_xml_is_node +lgl_xml_get_node_content + +lgl_xml_set_default_units +
    + +
    +enums +libglabels/enums.h +lglUnitsType +
    + +
    +str +libglabels/str.h +lgl_str_utf8_casecmp +
    + diff --git a/glabels2/docs/libglabels/libglabels-undocumented.txt b/glabels2/docs/libglabels/libglabels-undocumented.txt new file mode 100644 index 00000000..d4b8b2f7 --- /dev/null +++ b/glabels2/docs/libglabels/libglabels-undocumented.txt @@ -0,0 +1,9 @@ +99% symbol docs coverage. +141 symbols documented. +0 symbols incomplete. +1 not documented. + + +LGL_XML_NAME_SPACE + + diff --git a/glabels2/docs/libglabels/libglabels.types b/glabels2/docs/libglabels/libglabels.types new file mode 100644 index 00000000..e69de29b diff --git a/glabels2/docs/libglabels/tmpl/category.sgml b/glabels2/docs/libglabels/tmpl/category.sgml new file mode 100644 index 00000000..2143fd19 --- /dev/null +++ b/glabels2/docs/libglabels/tmpl/category.sgml @@ -0,0 +1,55 @@ + +The lglCategory Structure + + +Template category definitions + + + +This section describes a structure for representing a category of stationary and related +functions. + + + + + + + + + + + + +This structure defines a category. + + +@id: Category ID. +@name: Localized category name. + + + + + + +@id: +@name: +@Returns: + + + + + + + +@orig: +@Returns: + + + + + + + +@category: + + diff --git a/glabels2/docs/libglabels/tmpl/db.sgml b/glabels2/docs/libglabels/tmpl/db.sgml new file mode 100644 index 00000000..3d5d2de3 --- /dev/null +++ b/glabels2/docs/libglabels/tmpl/db.sgml @@ -0,0 +1,314 @@ + +Database + + +Database of pre-defined templates + + + +This section describes a set of functions to locate and add templates and related information in +the LibGlabels template database. + + + + + + + + + + + + +This enumeration defines a set of possible return values for lgl_db_register_template(). + + +@LGL_DB_REG_OK: Registration successful. +@LGL_DB_REG_BAD_PAPER_ID: Registration failed because paper id is unknown. +@LGL_DB_REG_BRAND_PART_EXISTS: Registration failed because template with same brand and part name/number already exists. +@LGL_DB_REG_FILE_WRITE_ERROR: Registration failed because an error while writing to disk. + + + + + + + + + + + + + +@Returns: + + + + + + + +@ids: + + + + + + + +@Returns: + + + + + + + +@names: + + + + + + + +@id: +@Returns: + + + + + + + +@name: +@Returns: + + + + + + + +@name: +@Returns: + + + + + + + +@id: +@Returns: + + + + + + + +@id: +@Returns: + + + + + + + +@id: +@Returns: + + + + + + + +@Returns: + + + + + + + +@ids: + + + + + + + +@Returns: + + + + + + + +@names: + + + + + + + +@id: +@Returns: + + + + + + + +@name: +@Returns: + + + + + + + +@name: +@Returns: + + + + + + + +@id: +@Returns: + + + + + + + +@id: +@Returns: + + + + + + + +@paper_id: +@category_id: +@Returns: + + + + + + + +@brands: + + + + + + + +@template: +@Returns: + + + + + + + +@brand: +@part: +@Returns: + + + + + + + +@name: +@Returns: + + + + + + + +@brand: +@paper_id: +@category_id: +@Returns: + + + + + + + +@brand: +@paper_id: +@category_id: +@Returns: + + + + + + + +@names: + + + + + + + +@name: +@Returns: + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@template: + + diff --git a/glabels2/docs/libglabels/tmpl/enums.sgml b/glabels2/docs/libglabels/tmpl/enums.sgml new file mode 100644 index 00000000..b74f00d1 --- /dev/null +++ b/glabels2/docs/libglabels/tmpl/enums.sgml @@ -0,0 +1,33 @@ + +Enumerations + + +Common enumerations used by libglabels + + + +This section defines enumerations used to interact with libglabels. + + + + + + + + + + + + +This enumeration defines a set of units of distance supported by the libglabels XML distance +attributes. + + +@LGL_UNITS_POINT: Points. Encoded as "pt" in XML distance attributes. +@LGL_UNITS_INCH: Inches. Encoded as "in" in XML distance attributes. +@LGL_UNITS_MM: Millmeters. Encoded as "mm" in XML distance attributes. +@LGL_UNITS_CM: Centimeters. Encoded as "cm" in XML distance attributes. +@LGL_UNITS_PICA: Picas. Encoded as "pc" in XML distance attributes. +@LGL_UNITS_FIRST: First enumeration. Used for generic iteration through supported units.. +@LGL_UNITS_LAST: Last enumeration. Used for generic iteration through supported units. + diff --git a/glabels2/docs/libglabels/tmpl/libglabels-unused.sgml b/glabels2/docs/libglabels/tmpl/libglabels-unused.sgml new file mode 100644 index 00000000..dc089b42 --- /dev/null +++ b/glabels2/docs/libglabels/tmpl/libglabels-unused.sgml @@ -0,0 +1,1519 @@ + + + + + + + + + + + + + + + + + + + + + +init + + + + + + + + + + + + + + + + + + + + + + + +libglabels + + + + +This section describes a set of functions for constructing new template structures. + + + + + + + + + + +Functions to help create new templates + + + + + + + +Construction Functions + + + + +This section describes a set of functions to locate pre-defined templates and add templates +to the LibGlabels template database. + + + + + + + + + + +Database of pre-defined templates + + + + + + + +Database + + + + +This section describes miscellaneous template functions. + + + + + + + + + + +Miscellaneous template functions + + + + + + + +Miscellaneous Functions + + + + + + + + + + + + + + + + + + + + + + + +template2 + + + + + + + + + + + + + + + + + + + + + + + +template3 + + + + + + + + + + + + + +@id: +@name: + + + + + + +@id: +@name: +@width: +@height: + + + + + + +@name: +@description: +@page_size: +@page_width: +@page_height: +@categories: +@frames: +@aliases: + + + + + + + + + + + + +@shape: +@id: +@layouts: +@markups: + + + + + + +@shape: +@id: +@layouts: +@markups: +@r1: +@r2: +@w: +@h: +@waste: + + + + + + +@shape: +@id: +@layouts: +@markups: +@w: +@h: +@r: +@x_waste: +@y_waste: + + + + + + +@shape: +@id: +@layouts: +@markups: +@r: +@waste: + + + + + + +@GL_TEMPLATE_FRAME_SHAPE_RECT: +@GL_TEMPLATE_FRAME_SHAPE_ROUND: +@GL_TEMPLATE_FRAME_SHAPE_CD: + + + + + + +@GL_TEMPLATE_SHAPE_RECT: +@GL_TEMPLATE_SHAPE_ROUND: +@GL_TEMPLATE_SHAPE_CD: + + + + + + +@id: +@layouts: +@markups: +@shape: + + + + + + +@nx: +@ny: +@x0: +@y0: +@dx: +@dy: + + + + + + + + + + + + +@type: +@x0: +@y0: +@r: + + + + + + +@type: +@x1: +@y1: +@x2: +@y2: + + + + + + +@type: +@size: + + + + + + +@type: +@x1: +@y1: +@w: +@h: +@r: + + + + + + +@GL_TEMPLATE_MARKUP_MARGIN: +@GL_TEMPLATE_MARKUP_LINE: +@GL_TEMPLATE_MARKUP_CIRCLE: +@GL_TEMPLATE_MARKUP_RECT: + + + + + + +@x: +@y: + + + +Enumerations for the units of length supported by libglabels. Internally +all lengths are in points. Externally libglabels supports points ("pt"), +inches ("in"), millimeters ("mm"), centimeters ("cm"), and picas ("pc"). +These units are identical to the absolute length units supported in +the CSS2 Specification (Section 4.3.2). + + +@GL_UNITS_POINT: +@GL_UNITS_INCH: +@GL_UNITS_MM: +@GL_UNITS_CM: +@GL_UNITS_PICA: +@GL_UNITS_FIRST: +@GL_UNITS_LAST: + + + + + + +@orig: +@Returns: + + + + + + +@category: + + + + + + +@names: + + + + + + +@id: +@Returns: + + + + + + +@name: +@Returns: + + + + + + +@Returns: + + + + + + + + + + + + +@name: +@Returns: + + + + + + +@id: +@Returns: + + + + + + +@id: +@name: +@Returns: + + + + + + +@orig: +@Returns: + + + + + + +@paper: + + + + + + +@ids: + + + + + + +@names: + + + + + + +@id: +@Returns: + + + + + + +@name: +@Returns: + + + + + + +@Returns: + + + + + + +@Returns: + + + + + + + + + + + + +@id: +@Returns: + + + + + + +@id: +@Returns: + + + + + + +@name: +@Returns: + + + + + + +@id: +@Returns: + + + + + + +@id: +@name: +@width: +@height: +@Returns: + + + + + + + + + + + + +@template: +@alias: + + + + + + +@template: +@category: + + + + + + +@template: +@frame: + + + + + + +@template: +@label_type: + + + + + + +@frame: +@layout: + + + + + + +@frame: +@markup: + + + + + + +@id: +@r1: +@r2: +@w: +@h: +@waste: +@Returns: + + + + + + +@template: +@category: +@Returns: + + + + + + +@template: +@page_size: +@Returns: + + + + + + +@orig: +@Returns: + + + + + + +@id: +@r1: +@r2: +@w: +@h: +@waste: +@Returns: + + + + + + +@orig_frame: +@Returns: + + + + + + +@frame: + + + + + + +@frame: +@Returns: + + + + + + +@frame: +@Returns: + + + + + + +@frame: +@w: +@h: + + + + + + +@id: +@w: +@h: +@r: +@x_waste: +@y_waste: +@Returns: + + + + + + +@id: +@r: +@waste: +@Returns: + + + + + + +@template: + + + + + + +@names: + + + + + + +@name: +@Returns: + + + + + + +@template: +@Returns: + + + + + + +@template: +@Returns: + + + + + + +@label_type: +@w: +@h: + + + + + + +@label_type: +@Returns: + + + + + + +@page_size: +@Returns: + + + + + + +@page_size: +@category: +@Returns: + + + + + + +@page_size: +@category: +@Returns: + + + + + + +@template: +@Returns: + + + + + + +@label_type: +@Returns: + + + + + + + + + + + + +@orig_ltype: +@Returns: + + + + + + +@ltype: + + + + + + +@orig_layout: +@Returns: + + + + + + +@layout: + + + + + + +@nx: +@ny: +@x0: +@y0: +@dx: +@dy: +@Returns: + + + + + + +@x0: +@y0: +@r: +@Returns: + + + + + + +@orig_markup: +@Returns: + + + + + + +@markup: + + + + + + +@x1: +@y1: +@x2: +@y2: +@Returns: + + + + + + +@size: +@Returns: + + + + + + +@x1: +@y1: +@w: +@h: +@r: +@Returns: + + + + + + +@name: +@description: +@page_size: +@page_width: +@page_height: +@Returns: + + + + + + +@template: + + + + + + + + + + + + +@id: +@w: +@h: +@r: +@x_waste: +@y_waste: +@Returns: + + + + + + +@template: + + + + + + +@id: +@r: +@waste: +@Returns: + + + + + + +@categories_doc: +@Returns: + + + + + + +@category_node: +@Returns: + + + + + + +@utf8_filename: +@Returns: + + + + + + +@node: +@Returns: + + + + + + +@node: +@property: +@default_val: +@Returns: + + + + + + +@node: +@property: +@default_val: +@Returns: + + + + + + +@node: +@property: +@default_val: +@Returns: + + + + + + +@node: +@property: +@default_val: +@Returns: + + + + + + +@node: +@property: +@default_val: +@Returns: + + + + + + +@node: +@property: +@default_val: +@Returns: + + + + + + +@node: +@property: +@default_val: +@Returns: + + + + + + +@node: +@name: +@Returns: + + + + + + +@paper_node: +@Returns: + + + + + + +@papers_doc: +@Returns: + + + + + + +@utf8_filename: +@Returns: + + + + + + +@units: + + + + + + +@node: +@property: +@val: + + + + + + +@node: +@property: +@val: + + + + + + +@node: +@property: +@val: + + + + + + +@node: +@property: +@val: + + + + + + +@node: +@property: +@val: + + + + + + +@node: +@property: +@val: + + + + + + +@template: +@root: +@ns: + + + + + + +@templates: +@Returns: + + + + + + +@template_node: +@Returns: + + + + + + +@templates_doc: +@Returns: + + + + + + +@utf8_filename: +@Returns: + + + + + + +@template: +@utf8_filename: + + + + + + +@templates: +@utf8_filename: + + + + + + +@ids: + + + + + + +@names: + + + + + + +@id: +@Returns: + + + + + + +@name: +@Returns: + + + + + + +@Returns: + + + + + + +@Returns: + + + + + + + + + + + + +@name: +@Returns: + + + + + + +@id: +@Returns: + + + + + + + + + + + + +@ids: + + + + + + +@names: + + + + + + +@id: +@Returns: + + + + + + +@name: +@Returns: + + + + + + +@Returns: + + + + + + +@Returns: + + + + + + + + + + + + +@id: +@Returns: + + + + + + +@id: +@Returns: + + + + + + +@name: +@Returns: + + + + + + +@id: +@Returns: + + + + + + + + + + + + +@frame: +@layout: + + + + + + +@frame: +@markup: + + + + + + +@brands: + + + + + + +@names: + + + + + + +@name: +@Returns: + + + + + + +@page_size: +@category: +@Returns: + + + + + + +@template: +@Returns: + + + + + + +@brand: +@page_size: +@category: +@Returns: + + + + + + +@brand: +@page_size: +@category: +@Returns: + + + + + + + + + + + + +@template: + + + + + + + + + + + + +@template: + + + + + + +@templates: +@Returns: + diff --git a/glabels2/docs/libglabels/tmpl/libglabels.sgml b/glabels2/docs/libglabels/tmpl/libglabels.sgml new file mode 100644 index 00000000..0552a20b --- /dev/null +++ b/glabels2/docs/libglabels/tmpl/libglabels.sgml @@ -0,0 +1,19 @@ + +libglabels + + + + + + + + + + + + + + + + + diff --git a/glabels2/docs/libglabels/tmpl/paper.sgml b/glabels2/docs/libglabels/tmpl/paper.sgml new file mode 100644 index 00000000..d08f8729 --- /dev/null +++ b/glabels2/docs/libglabels/tmpl/paper.sgml @@ -0,0 +1,59 @@ + +The lglPaper Structure + + +Paper size definitions + + + +This section describes a structure for representing a paper size definition +and related functions. + + + + + + + + + + + + +This structure defines a paper (page) size. + + +@id: Paper size ID. +@name: Localized paper size name. +@width: Width of paper in points. +@height: Height of paper in points. + + + + + + +@id: +@name: +@width: +@height: +@Returns: + + + + + + + +@orig: +@Returns: + + + + + + + +@paper: + + diff --git a/glabels2/docs/libglabels/tmpl/str.sgml b/glabels2/docs/libglabels/tmpl/str.sgml new file mode 100644 index 00000000..53cbd3b9 --- /dev/null +++ b/glabels2/docs/libglabels/tmpl/str.sgml @@ -0,0 +1,30 @@ + +String Utility Functions + + +String utility functions provided by libglabels + + + +This section defines string utility functions used by libglabels and of +possible use to a user of libglabels. + + + + + + + + + + + + + + + +@s1: +@s2: +@Returns: + + diff --git a/glabels2/docs/libglabels/tmpl/template.sgml b/glabels2/docs/libglabels/tmpl/template.sgml new file mode 100644 index 00000000..e7a58879 --- /dev/null +++ b/glabels2/docs/libglabels/tmpl/template.sgml @@ -0,0 +1,532 @@ + +The lglTemplate Structure + + +How templates are represented in memory + + + +This section describes a set of structures that represent a template in memory. It also +describes functions to help create and interpret these structures. + + + + + + + + + + + + +This is the main structure of a libglabels template. A template represents a single sheet +of peel-off labels or cards. + + +@brand: Brand name of label or card. E.g. "Avery." +@part: Part name or number of label or card. E.g. "8160." +@description: A description of the template. E.g. "Mailing labels." +@paper_id: A paper ID. E.g. "A4" or "US-Letter." +@page_width: Page width in points. Used only if paper_id is "Other." +@page_height: Page height in points. Used only if paper_id is "Other." +@aliases: A list of alternate names for this template. Often a single template can be used for +multiple products. +@category_ids: A list of category IDs that this template belongs to. +@frames: A list of (#lglTemplateFrame *) structures. GLabels currently only supports one frame +per template -- future versions may support multiple frames per template. + + + +This structure defines an alias for the parent template structure. An alias is used for +different products that can use the same template. + + +@brand: Brand name of label or card. E.g. "Avery." +@part: Part name or number of label or card. E.g. "8160." + + + +This enumeration defines frame types that are supported by libglabels + + +@LGL_TEMPLATE_FRAME_SHAPE_RECT: A rectangular frame. (May have rounded corners.) +@LGL_TEMPLATE_FRAME_SHAPE_ROUND: A round frame. +@LGL_TEMPLATE_FRAME_SHAPE_CD: A CD or DVD frame. (Includes credit-card style CDs.) + + + +A union of all possible frame structures. The type of structure is indicated by the shape +member, which overlays the first field of all other member structures. + + + + + +This structure is composed of a set of fields common to all frame structures. All frame types +can be cast to this structure. + + +@shape: The shape of the frame. +@id: Reserved for future use. Should always be zero. +@layouts: A list of (#lglTemplateLayout *) structures. Typically a frame will have a single +layout, representing a simple grid of labels or cards. If the layout of labels or cards is +more complex, multiple (#lglTemplateLayout *) structures may be needed. +@markups: A list of (#lglTemplateMarkup *) structures, which represent non-printing markup lines. + + + +This structure defines the frame for a rectangular label or card. + + +@shape: Common field. Always #LGL_TEMPLATE_FRAME_SHAPE_RECT for #lglTemplateFrameRect. +@id: Common field. See #lglTemplateFrameAll. +@layouts: Common field. See #lglTemplateFrameAll. +@markups: Common field. See #lglTemplateFrameAll. +@w: Width of label or card in points. +@h: Height of label or card in points. +@r: Radius of corners in points. +@x_waste: Amount of horizontal over-print to allow in points. +@y_waste: Amount of vertical over-print to allow in points. + + + +This structure defines the frame for a round label or card. + + +@shape: Common field. Always #LGL_TEMPLATE_FRAME_SHAPE_ROUND for #lglTemplateFrameRound. +@id: Common field. See #lglTemplateFrameAll. +@layouts: Common field. See #lglTemplateFrameAll. +@markups: Common field. See #lglTemplateFrameAll. +@r: Radius of label or card in points. +@waste: Amount of over-print to allow in points. + + + +This structure defines the frame for a CD or DVD label. This structure also supports +credit-card CD labels. + + +@shape: Common field. Always #LGL_TEMPLATE_FRAME_SHAPE_CD for #lglTemplateFrameCD. +@id: Common field. See #lglTemplateFrameAll. +@layouts: Common field. See #lglTemplateFrameAll. +@markups: Common field. See #lglTemplateFrameAll. +@r1: Outer radius of label in points. +@r2: Radius of center hole in points. +@w: Clip width in points. Used for credit-card CD labels. This field is ignored if zero. +@h: Clip height in points. Used for credit-card CD labels. This field is ignored if zero. +@waste: Amount of over-print to allow in points. + + + +This structure defines a simple grid layout of labels or cards. + + +@nx: Number of labels or cards across in the grid (horizontal). +@ny: Number of labels or cards down in the grid (vertical). +@x0: Distance (in points) from the left edge of page to the left edge of the left column of +cards or labels in the layout. +@y0: Distance (in points) from the top edge of page to the top edge of the top row of +cards or labels in the layout. +@dx: Horizontal pitch of grid in points. This is the distance from left edge to left edge +(not the gap between labels or cards). +@dy: Vertical pitch of grid in points. This is the distance from top edge to top edge +(not the gap between labels or cards). + + + +This enumeration defines markup types that are supported by libglabels + + +@LGL_TEMPLATE_MARKUP_MARGIN: A margin line around perimeter of label or card. +@LGL_TEMPLATE_MARKUP_LINE: A simple line segment. +@LGL_TEMPLATE_MARKUP_CIRCLE: A circle. +@LGL_TEMPLATE_MARKUP_RECT: A rectangle. Possibly with rounded corners. + + + +A union of all possible markup structures. The type of structure is indicated by the type +member, which overlays the first field of all other member structures. + + + + + +This structure defines a simple margin markup around the perimeter of a label or card. + + +@type: Common field. Always #LGL_TEMPLATE_MARKUP_MARGIN for #lglTemplateMarkupMargin. +@size: Distance of margin from edge of label or card. + + + +This structure defines a simple line segment markup. + + +@type: Common field. Always #LGL_TEMPLATE_MARKUP_LINE for #lglTemplateMarkupLine. +@x1: Distance (in points) of first endpoint from left edge of label or card. +@y1: Distance (in points) of first endpoint from top edge of label or card. +@x2: Distance (in points) of second endpoint from left edge of label or card. +@y2: Distance (in points) of second endpoint from top edge of label or card. + + + +This structure defines a simple circle markup. + + +@type: Common field. Always #LGL_TEMPLATE_MARKUP_CIRCLE for #lglTemplateMarkupCircle. +@x0: Distance (in points) of vertex from left edge of label or card. +@y0: Distance (in points) of vertex from top edge of label or card. +@r: Radius of circle in points. + + + +This structure defines a simple rectangle markup. The rectangle can have rounded corners. + + +@type: Common field. Always #LGL_TEMPLATE_MARKUP_RECT for #lglTemplateMarkupRect. +@x1: Distance (in points) of left edge of markup from left edge of label or card. +@y1: Distance (in points) of top edge of markup from top edge of label or card. +@w: Width of rectangle in points. +@h: Height of rectangle in points. +@r: Radius of corners in points. Should be zero for sharp corners. + + + +This structure represents the cartesian coordinates of the origin of a label or card on the page. +The orign is the upper left corner of the extent of the label or card. These coordinates are +relative to the upper left corner of the page. + + +@x: Distance in points from top edge of page. +@y: Distance in points from left edge of page. + + + + + + +@brand: +@part: +@description: +@paper_id: +@page_width: +@page_height: +@Returns: + + + + + + + +@orig_template: +@Returns: + + + + + + + +@template: + + + + + + + +@template: +@category_id: + + + + + + + +@template: +@frame: + + + + + + + +@template: +@alias: + + + + + + + +@template: +@Returns: + + + + + + + +@template1: +@template2: +@Returns: + + + + + + + +@template: +@brand: +@Returns: + + + + + + + +@template: +@paper_id: +@Returns: + + + + + + + +@template: +@category_id: +@Returns: + + + + + + + +@brand: +@part: +@Returns: + + + + + + + +@orig_alias: +@Returns: + + + + + + + +@alias: + + + + + + + +@id: +@w: +@h: +@r: +@x_waste: +@y_waste: +@Returns: + + + + + + + +@id: +@r: +@waste: +@Returns: + + + + + + + +@id: +@r1: +@r2: +@w: +@h: +@waste: +@Returns: + + + + + + + +@orig_frame: +@Returns: + + + + + + + +@frame: + + + + + + + +@frame: +@layout: + + + + + + + +@frame: +@markup: + + + + + + + +@frame: +@w: +@h: + + + + + + + +@frame: +@Returns: + + + + + + + +@frame: +@Returns: + + + + + + + +@nx: +@ny: +@x0: +@y0: +@dx: +@dy: +@Returns: + + + + + + + +@orig_layout: +@Returns: + + + + + + + +@layout: + + + + + + + +@size: +@Returns: + + + + + + + +@x1: +@y1: +@x2: +@y2: +@Returns: + + + + + + + +@x0: +@y0: +@r: +@Returns: + + + + + + + +@x1: +@y1: +@w: +@h: +@r: +@Returns: + + + + + + + +@orig_markup: +@Returns: + + + + + + + +@markup: + + diff --git a/glabels2/docs/libglabels/tmpl/xml-category.sgml b/glabels2/docs/libglabels/tmpl/xml-category.sgml new file mode 100644 index 00000000..f22b59ed --- /dev/null +++ b/glabels2/docs/libglabels/tmpl/xml-category.sgml @@ -0,0 +1,47 @@ + +XML Category Functions + + +Functions to parse glabels XML category definition files + + + +This section describes a number of functions for parsing glabels +XML category definition files. + + + + + + + + + + + + + + + +@utf8_filename: +@Returns: + + + + + + + +@categories_doc: +@Returns: + + + + + + + +@category_node: +@Returns: + + diff --git a/glabels2/docs/libglabels/tmpl/xml-paper.sgml b/glabels2/docs/libglabels/tmpl/xml-paper.sgml new file mode 100644 index 00000000..0909d2cf --- /dev/null +++ b/glabels2/docs/libglabels/tmpl/xml-paper.sgml @@ -0,0 +1,47 @@ + +XML Paper Functions + + +Functions to parse glabels XML paper definition files + + + +This section describes a number of functions for parsing glabels +XML paper definition files. + + + + + + + + + + + + + + + +@utf8_filename: +@Returns: + + + + + + + +@papers_doc: +@Returns: + + + + + + + +@paper_node: +@Returns: + + diff --git a/glabels2/docs/libglabels/tmpl/xml-template.sgml b/glabels2/docs/libglabels/tmpl/xml-template.sgml new file mode 100644 index 00000000..071a08ab --- /dev/null +++ b/glabels2/docs/libglabels/tmpl/xml-template.sgml @@ -0,0 +1,78 @@ + +XML Template Functions + + +Functions to create and parse glabels XML template nodes and files + + + +This section describes a number of functions for creating and parsing +glabels XML template nodes and files. Template nodes are used in both +template files and document files. + + + + + + + + + + + + + + + +@utf8_filename: +@Returns: + + + + + + + +@templates_doc: +@Returns: + + + + + + + +@template_node: +@Returns: + + + + + + + +@templates: +@utf8_filename: +@Returns: + + + + + + + +@template: +@utf8_filename: +@Returns: + + + + + + + +@template: +@root: +@ns: + + diff --git a/glabels2/docs/libglabels/tmpl/xml.sgml b/glabels2/docs/libglabels/tmpl/xml.sgml new file mode 100644 index 00000000..e0803379 --- /dev/null +++ b/glabels2/docs/libglabels/tmpl/xml.sgml @@ -0,0 +1,194 @@ + +XML Helper Functions + + +Functions to help format and parse glabels XML properties + + + +This section describes a number of "helper" functions for formatting and +parsing various types of properties for tags in glabels XML file formats. + + +These functions are basically wrappers to functions from libxml2. + + + + + + + + + + + + + + + + + + + + + + +@node: +@property: +@default_val: +@Returns: + + + + + + + +@node: +@property: +@default_val: +@Returns: + + + + + + + +@node: +@property: +@default_val: +@Returns: + + + + + + + +@node: +@property: +@default_val: +@Returns: + + + + + + + +@node: +@property: +@default_val: +@Returns: + + + + + + + +@node: +@property: +@default_val: +@Returns: + + + + + + + +@node: +@property: +@default_val: +@Returns: + + + + + + + +@node: +@property: +@val: + + + + + + + +@node: +@property: +@val: + + + + + + + +@node: +@property: +@val: + + + + + + + +@node: +@property: +@val: + + + + + + + +@node: +@property: +@val: + + + + + + + +@node: +@property: +@val: + + + + + + + +@node: +@name: +@Returns: + + + + + + + +@node: +@Returns: + + + + + + + +@units: + + diff --git a/glabels2/glabels.spec.in b/glabels2/glabels.spec.in new file mode 100644 index 00000000..0c737637 --- /dev/null +++ b/glabels2/glabels.spec.in @@ -0,0 +1,106 @@ +Summary: glabels is a GNOME program to create labels and business cards +Name: glabels +Version: @VERSION@ +Release: 1 +License: GPL +Group: Applications/Publishing +URL: http://glabels.sourceforge.net/ + +Source: %{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/root-%{name}-%{version} +Prefix: %{_prefix} + +BuildRequires: gtk2-devel >= @GTK_REQUIRED@ +BuildRequires: libxml2-devel >= @LIBXML_REQUIRED@ +BuildRequires: libgnomeui-devel >= @LIBGNOMEUI_REQUIRED@ +BuildRequires: libglade2-devel >= @LIBGLADE_REQUIRED@ + +Requires: gtk2 >= @GTK_REQUIRED@ +Requires: libxml2 >= @LIBXML_REQUIRED@ +Requires: libgnomeui >= @LIBGNOMEUI_REQUIRED@ +Requires: libglade2 >= @LIBGLADE_REQUIRED@ + +%description +gLabels is a lightweight program for creating labels and +business cards for the GNOME desktop environment. +It is designed to work with various laser/ink-jet peel-off +label and business card sheets that you'll find at most office +supply stores. + +%prep +%setup + +%build +%configure +%{__make} %{?_smp_mflags} + +%install +%{__rm} -rf %{buildroot} +%makeinstall +%find_lang %{name} + +desktop-file-install --vendor gnome --delete-original \ + --add-category X-Red-Hat-Base \ + --dir %{buildroot}%{_datadir}/applications \ + %{buildroot}%{_datadir}/applications/%{name}.desktop + +%{__rm} -rf %{buildroot}/var/scrollkeeper +%{__rm} -f %{buildroot}%{_datadir}/mime/XMLnamespaces +%{__rm} -f %{buildroot}%{_datadir}/mime/globs +%{__rm} -f %{buildroot}%{_datadir}/mime/magic +%{__rm} -f %{buildroot}%{_datadir}/mime/mime.cache +%{__rm} -rf %{buildroot}%{_datadir}/mime/application +%{__rm} -rf %{buildroot}%{_datadir}/mime/aliases +%{__rm} -rf %{buildroot}%{_datadir}/mime/subclasses + + +%clean +%{__rm} -rf %{buildroot} + +%post +scrollkeeper-update +if (update-mime-database -v &> /dev/null); then + update-mime-database "%{_datadir}/mime" > /dev/null +fi + +%postun +scrollkeeper-update +if (update-mime-database -v &> /dev/null); then + update-mime-database "%{_datadir}/mime" > /dev/null +fi + +%files -f %{name}.lang +%defattr(-, root, root) +%doc README COPYING COPYING-DOCS COPYING.LIBGLABELS ChangeLog NEWS AUTHORS INSTALL +%doc %{_datadir}/gnome/help/glabels/ +%{_bindir}/glabels +%{_bindir}/glabels-batch +%{_libdir}/libglabels.* +%{_libdir}/pkgconfig/libglabels.pc +%{_includedir}/libglabels/* +%{_datadir}/glabels/ +%{_datadir}/pixmaps/* +%{_datadir}/omf/ +%{_datadir}/applications/*.desktop +%{_datadir}/application-registry/* +%{_datadir}/mime-info/* +%{_datadir}/mime/packages/* +%{_datadir}/man/* +%{_datadir}/gtk-doc/html/libglabels/* + +%changelog +* Sun Aug 8 2004 Jim Evins +- Added support for freedesktop.org mime database registration + +* Sat Feb 21 2004 Jim Evins +- Added libglabels related files + +* Tue Dec 23 2003 Jim Evins +- Added support for scrollkeeper + +* Sat Oct 18 2003 Jim Evins +- Updated, based largely on Dag Wieers glabels.spec + +* Sat May 19 2001 Jim Evins +- Created + diff --git a/glabels2/gtk-doc.make b/glabels2/gtk-doc.make new file mode 100644 index 00000000..eeb23b49 --- /dev/null +++ b/glabels2/gtk-doc.make @@ -0,0 +1,155 @@ +# -*- mode: makefile -*- + +#################################### +# Everything below here is generic # +#################################### + +if GTK_DOC_USE_LIBTOOL +GTKDOC_CC = $(LIBTOOL) --mode=compile $(CC) $(INCLUDES) $(AM_CFLAGS) $(CFLAGS) +GTKDOC_LD = $(LIBTOOL) --mode=link $(CC) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) +else +GTKDOC_CC = $(CC) $(INCLUDES) $(AM_CFLAGS) $(CFLAGS) +GTKDOC_LD = $(CC) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) +endif + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) + +TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE) + +EXTRA_DIST = \ + $(content_files) \ + $(HTML_IMAGES) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt + +DOC_STAMPS=scan-build.stamp tmpl-build.stamp sgml-build.stamp html-build.stamp \ + $(srcdir)/tmpl.stamp $(srcdir)/sgml.stamp $(srcdir)/html.stamp + +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals + +CLEANFILES = $(SCANOBJ_FILES) $(DOC_MODULE)-unused.txt $(DOC_STAMPS) + +if ENABLE_GTK_DOC +all-local: html-build.stamp +else +all-local: +endif + +docs: html-build.stamp + +#### scan #### + +scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) + @echo 'gtk-doc: Scanning header files' + @-chmod -R u+w $(srcdir) + if grep -l '^..*$$' $(srcdir)/$(DOC_MODULE).types > /dev/null 2>&1 ; then \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" CFLAGS="$(GTKDOC_CFLAGS)" LDFLAGS="$(GTKDOC_LIBS)" gtkdoc-scangobj $(SCANGOBJ_OPTIONS) --module=$(DOC_MODULE) --output-dir=$(srcdir) ; \ + else \ + cd $(srcdir) ; \ + for i in $(SCANOBJ_FILES) ; do \ + test -f $$i || touch $$i ; \ + done \ + fi + cd $(srcdir) && \ + gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --ignore-headers="$(IGNORE_HFILES)" $(SCAN_OPTIONS) $(EXTRA_HFILES) + touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES): scan-build.stamp + @true + +#### templates #### + +tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt + @echo 'gtk-doc: Rebuilding template files' + @-chmod -R u+w $(srcdir) + cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS) + touch tmpl-build.stamp + +tmpl.stamp: tmpl-build.stamp + @true + +#### xml #### + +sgml-build.stamp: tmpl.stamp $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files) + @echo 'gtk-doc: Building XML' + @-chmod -R u+w $(srcdir) + cd $(srcdir) && \ + gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $(MKDB_OPTIONS) + touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +#### html #### + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + @echo 'gtk-doc: Building HTML' + @-chmod -R u+w $(srcdir) + rm -rf $(srcdir)/html + mkdir $(srcdir)/html + cd $(srcdir)/html && gtkdoc-mkhtml $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) html ) + @echo 'gtk-doc: Fixing cross-references' + cd $(srcdir) && gtkdoc-fixxref --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + touch html-build.stamp + +############## + +clean-local: + rm -f *~ *.bak + rm -rf .libs + +maintainer-clean-local: clean + cd $(srcdir) && rm -rf xml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + +install-data-local: + installfiles=`echo $(srcdir)/html/*`; \ + if test "$$installfiles" = '$(srcdir)/html/*'; \ + then echo '-- Nothing to install' ; \ + else \ + $(mkinstalldirs) $(DESTDIR)$(TARGET_DIR); \ + for i in $$installfiles; do \ + echo '-- Installing '$$i ; \ + $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ + done; \ + echo '-- Installing $(srcdir)/html/index.sgml' ; \ + $(INSTALL_DATA) $(srcdir)/html/index.sgml $(DESTDIR)$(TARGET_DIR) || :; \ + fi + +uninstall-local: + rm -f $(DESTDIR)$(TARGET_DIR)/* + +# +# Require gtk-doc when making dist +# +if ENABLE_GTK_DOC +dist-check-gtkdoc: +else +dist-check-gtkdoc: + @echo "*** gtk-doc must be installed and enabled in order to make dist" + @false +endif + +dist-hook: dist-check-gtkdoc dist-hook-local + mkdir $(distdir)/tmpl + mkdir $(distdir)/xml + mkdir $(distdir)/html + -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl + -cp $(srcdir)/xml/*.xml $(distdir)/xml + -cp $(srcdir)/html/* $(distdir)/html + if test -f $(srcdir)/$(DOC_MODULE).types; then \ + cp $(srcdir)/$(DOC_MODULE).types $(distdir)/$(DOC_MODULE).types; \ + fi + +.PHONY : dist-hook-local docs diff --git a/glabels2/help/C/Makefile.am b/glabels2/help/C/Makefile.am new file mode 100644 index 00000000..340802cd --- /dev/null +++ b/glabels2/help/C/Makefile.am @@ -0,0 +1,9 @@ +figdir = figures +docname = glabels +lang = C +omffile = glabels-C.omf +entities = legal.xml + +include $(top_srcdir)/xmldocs.make +dist-hook: app-dist-hook + diff --git a/glabels2/help/C/figures/glabels-template-cd.png b/glabels2/help/C/figures/glabels-template-cd.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3de3bfaf31c0e831f7232e93c963acfda8e347 GIT binary patch literal 9930 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
    V{=|8(1n!5&6#bN~ zl%Ad*47c1-swYce?0`pLue}9Jc5v;^#|iw$TDGb4ZejqNb^-d8S{yIUgAcE#bmJhd zt~*IdWN2=yQ1}qI^gExAd7{n4Le2tx+~prZ#rWBi`sDM#bp0bi8^Xvd4tLr*I`a6u zuyBdQJbw~_5oifT&sUP3VErFdsX^x-gjD%(OAd~Xc0b-k1t+S#; zGUsVD#TrZ^Ty)}l9xYp;CrF`OLEPIfT0)y2YRGEuyfb)!dV1s@S_(W*Ccc`C$iOhb zGwA8)x3fS~fr4Uq_Q;^lgr1Hr&Oj8g0GR-X7tJu?QPKn{xT)-nYy{VUuI<3o%%C&* zGCaceSVijuu-IQvvw%MjIP1M%3vjr@%Ene|@KcQT2h2DO)&?)9B_}3cp{I|3C4yLh zV1RSMXu$J4ABy9xKmu?TbAyh*4S~fQMmYZ}mk0-zb zTL9VgM%0zwh+H-g{d;4yOtZHESP#Fj2Nhp9HL61P8!k<(uzBg5H z1yq>&FZ4sr|KA)+kd z0=U)SC^em*)yp&ArsO9|zx8Mvs^`dC!^PFrV!Pyn2&OWPa4mLqWo6)&syaGJTI_nJ z9qv<;lL63XfxZ#2lKtIXZH?1!xv&K5*oi?TQP&;6h0vONCCwCT! zY3H#6!s_ax|2=;M#RF}>v2__*I{Uk>~ypw9&j78Vu;w?|O0 z)t$D(ov4+SEb2ZND&{M5VsS;qF2E7I4--_-KfVbq#gdZF@88SI$~LsVf|0}q(?>fy zG7kq>z5cvC@7oy~$ppUs=FJw<9ff12 literal 0 HcmV?d00001 diff --git a/glabels2/help/C/figures/glabels-template-label.png b/glabels2/help/C/figures/glabels-template-label.png new file mode 100644 index 0000000000000000000000000000000000000000..87a724b9dcba29b59f807007af9f7469b82033b3 GIT binary patch literal 3115 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 literal 0 HcmV?d00001 diff --git a/glabels2/help/C/figures/glabels-template-layout.png b/glabels2/help/C/figures/glabels-template-layout.png new file mode 100644 index 0000000000000000000000000000000000000000..c71279520eb56db0701e359666bfb403f1b3e953 GIT binary patch literal 6012 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

    y@R+U8kVSirP1EH-|6a`3cfyvNg}eBM*WXLD+@ zIrtZlh|%&{)_krt0f15g?34v1ZEMDX3_bbbT;}H`2t*MA!NA0Xc_b@j30V0T2_5W% zKf#F+DbS~NW;90f1|KuV+AnrzFvfCSzkZ#A`^(CKjvGkrrlwP5bN%;*~*-Q^u z-wrrN$KI@Sbaal5P!qE%CxgJip8)?VSsh!5b^s^v)9KQOpZ@IVY5V$hW30mQa2pE< zq=3y*Pfy(G`%O;|Gh0l&ePyh5lE#Av5B&Z80bosNj9wCvkl*0pVV8%ed$`}Z6V~Hk z+jxVFl9pDGpWjwAL!A$rDJUcq54ulXQ**7nCR&L{RGmy=EV`(qq@=FSYR(mUFx$}r2iqTRxPk)?F2(Vl6W1jP+e!sxH=RKf9b``9jQ zlE2{RwWiLuccQ#ECZrv@(*Z?THuydTH}=wX>HOM{sxCd1W3u>p82|T25}&-+SIQAt zasf~gkuAnwQef(+d3g~4E53X8&OP!KBU*pgzwyf~Jt-#)W{w^bt4GKVpZZV53$JlC zeKS&4R8-{Txc~G26E(msV}L3lvFLXtBN1cF?klmC#rFMXvhT7->2jM8`k@Fr^a;>)agt@ zNM-jP9QZOOzlwnYC$~1;jKuk&nC4dBzkh%Er;-ErSv3v@^6v?7^K0tq>3MoeV84OX z08AUsary8xIaetzf4dM}x5?TOhO%dp-XKtu5H@o{Ut26+M0 zzB9#jvi^l^1NDbvF1%~ar{9*l8RQ9eVn7)9%09;(UgFV~VvE-BHwS3C)CIGhJa! zpnbcBPF?hOdPK3&rKWc$>5?FQAG-LLiJg*xqGNu!fLD!vS!b+!pr0 zN9w@v%D{OKMs!R9(b;6v9<#l@Eo%EUTHgFbAM}RCy?gx~f~2IRaKeyL7&-0xq9Qd- z%{+4u0@(wIzbjMr!=2#gF(X4mAJYX+$=ANUx{gAjY+Np;@QH|s+`2^o7ux1^kn$x% zPVEoFlAu=WYu=xh+_-k>6%fIvhf$Nc^cokhUX7~;6YWU%V!Y&^-7Q2=3DWKz3k4u=zlPK z*S#eEoSzVN=$}D~<@V~dph-TR-kaXByLXH!Ykp%2)^K-g;|IA6>Ar#f`jLwP<`dU? zrs%|j*~FOFlTS#zzZ~=MZHC|Bb9a_PR(=U&=s0L?Tp5S{iSHLdfF{CHmvmD8_ABor zdl;@H>u;S)Bzy9?A++Kwqj(_PP&4&=^?&QXzq&a{Vlct&N)KpZ!*IS*>7^0;CwOPeRR zOi&%Lp8_9WOuHRkk6Fa(HV6imY!SHD2x?JL(Y7$h?sWVYIt2io7hbCsj(t<$siW{S z1%coi*6d*T;|~c5iIY)pvAUV%nGQa+2R4!0w;1QVRO7@Gm1SZJt?W& zWgPn86v%HEpkFXg0r;|!+|pnpnVFdx8HejN)8ypjVhvo1`ruE3R#1g(=c8(E8NSTA zcfY>HFD^bf&YuJG1F_LSp9nLU{0XH8wa)Ni<3+uG(XCEJ&%CR`mX x&|(#{i~dec#J7lo+zjJk_`j!75J=mO!hzqTs6u848OX6A>MGjGrAk(z{{RyiE93wG literal 0 HcmV?d00001 diff --git a/glabels2/help/C/figures/main-window-empty.png b/glabels2/help/C/figures/main-window-empty.png new file mode 100644 index 0000000000000000000000000000000000000000..305bd6098cbe3747718eb03b77cc372c9cbef3b8 GIT binary patch literal 24965 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 Bsc`@R literal 0 HcmV?d00001 diff --git a/glabels2/help/C/figures/merge-ex1-2.png b/glabels2/help/C/figures/merge-ex1-2.png new file mode 100644 index 0000000000000000000000000000000000000000..a87675aa06aa52dc08891d1547d0eb325834a978 GIT binary patch literal 65785 zcmafb1yogC*Y2SNY3Yy@=}=NSl$P%9?(PPqQ$RpKy1QFIy1PT^?ykFd-|rju{$u=O z+&#<#`? zjsbpiL2WN3ErS=~9mS=D;iq08K_S5xvO07?AfyoSPlAfB^ZThTnpi3`JtKq4s;as> z^ew6aU0<|*FUKRy3Sb&U*zCK>hkwCi>k`G3dOw6`5S3pcVu1VRGLnIslvH?EzHVso zD$37E3n!btXp?g#isVOXi_36>k%_m*VUk**%pjUCDS|)v#hQ$nVsZ?ndrG)g&V&vt z2!0WCG7;87LDD^9?(4BU{&@*KJ4R80E+U~|Q4m2E>k{etPEw{HqE{m`b)hO}j7-^? z8P((FYTuOqdDCXacgRg<8{Zof(~pObeq_J*=`tS=ZO_O4_r9cReKp9aDXSCHh&aKS zN-FB;QF#gwV~o*`_l%{ns|Ig4#TRqdcKTLwcbjFiDECnz>4av+h1{ zY+30Mg5ahJtnpE& z*I`fLSAS7Iw5IPx_+Zt=4fy5`aq=fhpD{5`Ji17lYc*>zPqpQLdidi~2TT5Pm~~w# zURm?FU>LiBnN8`N7=^H~@a=|`l~siDzYC*YvOCKdJXYw+!$%gVhvz3CtF0|9hb1fr z?I%Ew#cjDPLte4;qIO>S;gv-yQ=y`jMqj2 z2GVi~{9DMVE*(>|Pg-q9b)vbD=SG5pXnom|JK4$k5kr%7=Cyw}$wa@uiB%tWgO&A2 zK2!Ro+rrEXCp&Z`w>8S<_}Ezc$H9zd|G#Ce%R4iSe;d9|61|)CSxV{L7-;28E4nbv zPSF`QW5gP@DQnh9#8H#H#x@du>0!W)a#zm?uM&@&y3~?C&}-xw^VYjHCQ(5B6=c-B z#)(M>+tXeBJrh$|?kOrNs%FwI_Sxy_>({S8FywGU*L~&A6$EiqC}I1aUJ}9WoEin9 znlNR`T3X8J=H|Asv4Mkwla{9K$=9alYh&nhvH37FscdDI9JOK@{bXnC8RP1H#+oKT zkMU=RJ)3c=~Yxz zq~&&M8y*@Bc4?>aYV`4h5GtywHl*Lx*4Dzo-8eflTUZpt$76TCiz4Rj9~x3BnmU}8 z`HP9xuYoFR7WAD2@uyAj$B|lQlceC>jGwAi?i%*at>zp10vZLnSAE6A?Ug|mM>o9; zJr{`{4eH;%SzL8({ni;ES)On+WJ;9rk&^J%eB4BcvbHjOS~@>|%o^`|!$X5OeIPZF zK0>5Ei@d+T{f9o6nwBB&Z`oOc${`IzccVDrR(YBMaX7`E+Viid@Z6Il@(!Q1@0~)} z3=%|l>8n*}D4WKkJCC(*O8i?NFbo6Sv*p)+1fhB@8UD70Xy1Mmnq1YjQ9+7{9_~|l z@TT9J4*1I<>I(54oYvo}!`$?A_Pl`ia#DVAzQlQ>$d*XZF2fe)C~_;W*t≧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 literal 0 HcmV?d00001 diff --git a/glabels2/help/C/figures/merge-ex1-4.png b/glabels2/help/C/figures/merge-ex1-4.png new file mode 100644 index 0000000000000000000000000000000000000000..71e11864da8f52a893b8744460382c78f825f964 GIT binary patch literal 42154 zcmZ_01yohtw>Ew#2}M9cKvFSir4*zD0ZA!AIwhq`xF(~5Zulnt z?*0Go9pn4X7_aZ)u=hTDuQlgf&wQR|;U_I6f{jIrg+L&%Mc=%ZMIewJ5C{}93}pD^ z&7H&y_#dYE8zn3F{T=v^3u$FCdI~;7w-%KYLLa4QC z=DobqJ;dK5sop>gL9x#scl?n&a*cJ|)IN`hWv-W3(v{^Q`G5AqBAOfXV7&2puIL7x zzZX?J%B^P>b$m=+LE%6AYwKECe1BSXbJ}(BSWVlT-ML6VMG?TD_EP>6|K0u;!aRW! z^9-5V3)cwKH#h+qapU0rtlYCh3^-&!fUb!#m^mYkKa?MLgc;6pdEaIcd{6oHaK*A6 z?R)l#-4lUZ<=59jbLS_na2B{&PAuEMMYvS!++Z}T;5N!AfRUtd$JAQ@F|+gOATbfk zYPwc4chtn*P)5du3!$V!h#HvpJ-Jy^Z0=MTgL=QFXxs;l&s{qFhb-C$UEMV%S$K)O zTAQT%HGPLLhrLSj0=GufBeNtN6%j&n!a1KyLx8oni$ziMNu6mjx=T}w;)@IW{ApH1 zNbmuvB>M6bmyPrX;oY}RHTLuINbfQl$rbe%NL1PuiTH%{r&yfiQwwF z8BfZK*a-i2tXkg?4Mlc$Ytyy-sp>(6;i1VA9U2;1Ikx>)&9V7IbPvg$ilN@On(K{+ zEV9;gx|m+NQb^kyn_r%bHV-y^i}#k5GM&wvT)xF1JWRB(KPt;2yB|fVeEiWh^xRB~ zp=D0&b=~`lhe&SS%fqgh-J)x*XjYa+7n3!o$OZf|xuT49tFPKh3zmVkzOBgBJL^USlZZ z;DI~MGNbx$T^17)hc9*ob{h|Bj%Ob{v|Xm#>l{D7f4;!YB_|*&Rbx`M#Xhw7Oo_Sf z`~J|TIU(a7(S_}w@l!f(gWK`6)U@5E*~Z?}ulH|yt0aBb8qJmddxE>+inh+A9{poT z{wWWSnxLSke^GK>=4vvR5SnqPDH?Jpjp)ONLPjD*$;sO4>Up7|MR9S}IXOA}RBxoD zy1KgZGBSEXJ1Vc%vh-TM9zPV}dsTww<~SR?FiyYH4Sj8y|1w$c%C5wY#FZd=_W2rAQUTHD8g%%Cj99D<1dRkhr`rYQkTU zn@NRmIzN^X5kW`1EQP3-l`O}N@A#-mKiVm_pWZ>J*9GDK6_cCa z+C{r?*ZsC0K3RQ_#Kz)YPW7XisJpt=T6WPWG_7wMd-8q-{&jsEw82qQHL(Q)&sp=a z>~=>-Mq(pPFA?g3(3ic&Jc3uJ)4x&%zYteEU)9 zQ*uXU+t>`n)B(@OdWSXRMZ0Fzt`DEaZQr74Ypub%D$2P?wy!;Vd*QhLwP^OK>On?C zd-od?>59%jZ*r*!vIuhCR^%2^EjIb$+_-Tgxh{L)5gnAIP=U*3J}-o{vN9b#y^5-; zs=E3kTH1(>XLDMglBWmc9Uge+&<4Ib$6?y+^e6u>`y8F9J!D6c#!IFc4ItZzMY| ztv2?APm>Cs4dq#*?1&Lpo%aN=<=K zlQ_6L_^pJDG;3a~^DASWS32?uC`!r-wVG`#AKo2|D|%MiY{peNc^df^&Phrnu!su# zpB$Y8>{#R{Uk*~TeGiV#`}_N%DsGj?*>Svw(pacR$YGW5Ba&*pMxA_k5Va`>atAzc=TOht1veDHyQkk&*ZNz6|l?s{nN1Cgv!gvXt9t$kwbm;l=#*o zIo}4&9s_G^Y;1U5cYdme4?7nvqa|(xFQE9%5?$O{VpOIhz+f#dny$M-+`{A}L?M-n zaiD+sQqj*uO218hDKn8UDtzHC5v`Fm5e5?C4N{^;oLHwIqCvB*Fr2H$;8yQZK*yp& zxZ+;}G1OPB?d^X%Zk`B<&Pf^=ts>R$(+2gYzmV-89Lpg3@Or}ee99%{#I05#jY!## zmb0+1dvUPy_05#590b1t?Yj`$)lT0(d1`;EVnpiv-UbFce$XH9Z$JNF$lEg~iU<4EB+=}lz*bgB3ZKJ^+0p$n6bAJ5kYvq_b6A}6t4 zkD6Fo77Z-lbTnMD{OJdq*Jq{% zw=g5MTj+!kZd5DQJ~Xd%{9Pk3*1T?b2=_b`E!qt@{fUs2k%^|Ee!wdCWaefEXEJ3D zo6lKv)c=hkjv-}P8=wK3d2^E#IU!&`6J_Mc(cREAjRo?4ly6S{+ z-5Zy%CO$kK4HyXb>P_((3nnHeyol=xPwQPp6%^iY7RiV(oRNIY|0IWOQyXoa(A1dD zz|c^%6CWSHX?{mrTRVd`p3BDH&o6UK+hjC1C-nDj;46)f4&v;n7bBZxV z8&9kn?i3lJ&ey4QPT2p=@Bj5`P@Km#p3Njj5?$wk*>sb)Dgx0Tv>8ms(-bO8wZh;b z+_FJbsvPlC?`UgsJz={o>~X}NV$k6Yz4AdUe`TlL1-}fR$8Qs)`xzM-vrFHL+tSnK zz7F+gFO!saq|Hb0V~I{ge{s2QjXBuOC)Gw*Sdj2@CTS+)Cw|W1))cpKTUyC|rogVO zi5dyF(9pSQ{o7FyimE>^&4Z_@BfqdXNd?fx-QSvHe;h9yD-r!vRzdjD%V4X80ZD4f zAf~~kp_F4oohm;2QwGM1u>0d4U8ma&x1^rg?Zn_qrATInJDe4&KA}NsU0E@R^l(w) zd@Jigf=AL2Vj!-gZ4{uqhohT>yJojhwu`&5tSVQnIhj-$D^%vIOwW(vgWPO@To9R9vxjjs8(rw$b zZ|095eUlOUjCpd-los6hC)U+KToLu`FrC-sf(O{>MTYgSc1>=nO^%U$^CO5eCvawgI?C zc+V-S8QQu+6#9^;cJBE~%RMRSH8vNJ*sT+9xN@nO-&XaiC6rZ`(RlJCrI+|PP;f=j z6Cn9CZlG|A==}5BNgB^5WS3Q+{TNf9;=_K4cHIOdf3-q6NsWHj#2BbxAMc{2MSX~O z-3nMIkDO{$r1l%S4fovl!WHNg;VyHzUCu^|nCYc~pEE`qbKifwsAi3pLYFXuQ<9b* zP^i?knj+;(@$`voXshyXnl){EUAZ5%kWhCz#N*S$jQdbhCSF zsWaB|26iLf-+-K|*49>5{jS%-!f8K#Al#~}s{;c&L#PFR2UAXeLAuEfS*RRQ0M@B}x zyu36uQnv3ueAqlW$#egHV_#p9MxBeLrKQB9ur}Sa^mIo@$L*2A`PQ!w($dl-Z%Jil zW@?x;|N8ZV)_qOiDE0C-1$XPL`Ri=U^W&ZM;r!q)U%q_)Y;I@wR#dd1CqVh;&d6!A zH$S$lva<5H9WyugL`TQXm!!^)G@`XG7Y-8@79Tmro0LO+SkDDO@SUgi2gV%FRD=iB#>R%j z(Uzp7{qf&ffOb(#YBAyAx+W%@o11~LH}_GzRSHMM&f@;|8DNW=8?ur5Hl36|^7i%? zNGkAiTyycFp{1g7>(twxu7lg3eVM@9G;5xml2T>2-CL~R{o@M@J$<&YVyXFTW61;- zAz=gskHfF#X6KgLMe`TrT-GCXu6(hbd1o1~1hwpayT66U?C`xh2gS$}Q~h!WS|)y4b^iI2@uGcxM^;XbS)+C$Tanp= zijAE;6QxZ?M&{YGXPB6nKY#v&xK92qe(^Of?#sB{zUPPXtLCA64Gj4Qa&mGIeW5@8 zvdUDX_8N$aib`s<4`wS;a({Zt!0-`LwV|OQ*(ABD>MVxc`2PL-6B85nA3RWD+CF#A z9Iw?;)RQEYKk6EXdKLEgEt9Q=%W_xzPpf4PW8v{)#eDVElSZB?6%KoJ&Opk758cru zta@yfW2sx>wp%ZGT;#WP^i5F{xd0gDfB)W79ldoJ&kJYS9G%a%N6_2kkgKUpN~+lY zNjM*`O^J%x^~(|$6@A9aI{#+1mA;KjnJ%@?;n}ovFdGWnL$_{ST|xpTo6F+dgsh-E zVO6HQ%Fp4FP_Y~NJ(t$_-L`dXsET775>}S7&|`QQdRTxy&nxONKr=P?vas^ zOEWVe5fKMm)Wg$u!!fx?lGB5a+70YBIgeL*J$-vA$wUq>t@fy+XzMn|T(w4#ebaQy z*Evk@@%7ox=gs49I9@F}8YT3Pv~4UW6@(wSvO{Z~gx37fvY z{%v15X9UgT$NBHKYM;-{ZO{tF?)n-1k{-}&6BD-?!l@=Z7|`ISm4Dk8$d zVh}jQw>+qRq^8=~*i6^Cn(6C{;Ce+zM^{!l2nh+Ps!r@Jci+Uq0#>QgdR5!Vi0hX@Cu&nD8LBRr%Q$96HX$2^a+LN~`_tcPkzHsda8ta!U^Ou@S?r3Zx-~Zu67DY*xfsmeO~7lP@H}% zGhq@|`iUCHVXgB8C?mCRX%pD(k5A)Y1?UADw4aP5e;FDYij@0}^`fHXY9!U7$%Nx1 zPW7o(#Zkk}4kE7O8>)t4OviPLTd{VDmI-X1QtW!zd|gy*6XUjCXqwe8rubfL3Dty! zgcvxaRhc#^w0x~8+u|*>_UrFBu5J#vt75Zmu{~8o_X?IIyZ#|^tF+tWcg+j!i&YRI zy1n7pqY{qPYp2AU2zjD?g)*q_xi@tz7mw zpnJghkHSRbafDKOf&GLP0VboUs7SreMRN0r>2O|rYU;z-P9}PK$BWYgSkrd*_Fyto zQ&XW{Y3k^BLU9ws3(ifx>AuEgE*?q~q0060Wxqkm4{f5rwmL$^79Umu8YY~h(|LIqzxVC=A#+_Zg;k5`0nhvr%V~a11I6CstufcB?ryW)ea?hDt9#CeyH_qp zBMZ)bR+kllRUQ*dUv{u7$Q(BP$9E5Ir|>QE%UIQKRO+xS0t5;G| zQZ6pMo(%Z%6b33_Tk1TLb~w* zf?rw9(_mO>y3sAQKS;AY%*5W;A#eDl#V(>io{Zj2w>j`H+os~i;jYjpSS054|B9BU{({pTaZ@p+-g6T-u z`@O~EU^9x`;-gniBkIpG*2pr{D_HB^@SI%aV5(xhVjd%Q(?x%B`OB!|e%5le#lV$I zOCI~fyQ)7M`CmM`Aedse#{5By zRQl0M?}KO03LEg8_imSSrq~@Ps;sch!7W&&-ySV{{%QSmvHZcb-AYfA#ud_lh4b3T z=EUlQ3uGoXGu!Ok+)mA>@>qN<2x8P8Oe(|*!nmcPj~B;|6j4`@A*iytva%vv-l)sc ztb*hgsG}C9QNvf=u1L_EsgS_qIP^;aLo#4D`fmI3bV{0{ITC_~Xfn*UmOn}sR>ot` zVarLK_ND3EZ>~{%S4=-=m`rBXh8n9_I<$ZI=9p;HA0(xwMudg+r%B$UtGd`<4TC8T z6voFu-PzfBo5UyMFeIZ1GsChZjr5y;$r`LBFb%Ongx}tx=n< z|CVCI`L9RIMB!PGFH`(>!S*ME2SwwntZ`eDReQT?ksbTJ=qSv=<=Zu#M5ZN$JiE+Y9qA)n!g*p8L7_~_~mtEmwlk-Se`_tx*3H|tEjpLU~%xH-9@x)aCO zb+j_Lc$55yqN>caIc^SSIy2dkbmnXEOd zFb~=1s+E0I`e1uj)iTwzyevgITHRtQDJiK@>ol5n9HuRGKMdh1CCvJqK@YcJ)dMFU z!G+|=bcXRli02*E(r7=RU0BpjjEqj_ns4qX48P%3S<4NWrZ zwpW@@SVcBoQmk>B#kp#JJBxdE=Gn--6lC(NaD2W6`Sfs8-za0v@#&|mCjLZ}G@&ZIje}*ZZ3{CysIx^p?UoG%8Y)6Wdjii=(7{XF zPOGgE=N7@JPP>uXqy5h=@sUhw4m0)cFu#T!U8xWTgrl z-L=?c``=3=deU@~ce>3*!%DxLiHT`AUn2@~X_02t=``wV;zKe1RYYT-Y_!LOI-T^l zcn4Sv&(F`P1%24&>{J9*PBzP@V-}0+b8hZ5lAKGizVEuLoEH&!%y6Kkqq7HKX3bns zK)|E2vJyD&n3$NNB1;#SOF%z5IyxQg?a)3zKbDuC-m<(mU2VU&G0I95V6#2N1GA+p zVk@5Bzs~D44xNS(dVcPWa=xnf?`31Y$vW^Gwd~C|bR+YNuv`a&G|9)~HH)sEc9RQh!=suO5B%7|>12%^S zSM}10ch4@|wepHLkI=mtEy~PfZL4geS|*5hDmtNPOoOf$Pb{`EiM(vcRT&$Q^t+v9K`jdk3i_Jt#s0&t{Zn38;*XY-9~yrP>r^utV`ai)4|f;E5l@(z zac@zakZcQjHaxc&gpFotB;b()H_jbDifAW!=Pv{v)8hg6};KYSU#>D*91S5Yn*Njv0Wu zh)fz7`FBf4M&_%Jj}J5pQ9-{=a>lNzOjp%Ilq$xulaAh+s?uZgAm#GrmY9r}85tdA&3(Qq&85F? ztmUzmlesW$5fOtBQXq}|`4S$#RQd8PSq0ydk6-&+A>9}(N$pn#I?-4~ICe&IVU(e) zsi|#Tpa@3&DLdk$SYxs886dH8R9dtAIgyc(k@id3$o0S-|9Rw}GL1^hfWk6e2?>e) z{>RYLBLxsYk65?-dM>*jnHb;>PI^Y+C{duwXr8h_)wr`YS90|%T0ey2%Oh@ESMOEuHe&h0(NygoKQEouf&mFfuT}Ey=6U1C#RM!w3B? z4V;m>>@Cjq;HKGX$D^*cHv8c`^78w0k&JPl{{A}n+3!QajW;BtSY{E`DXnN#^O^a& z&zmmHzNvR>ddX3{AU88AN)ew`*+Q*q6qVv7n{!%+hRSndQqrM{ZFics{r!EJ6!Lsu zbuPyRqVZF+|IX9Fk-?!5-FHOD`7h9#|%TAs~9SwH4 zo}v42y(N2LU)d3-BVOQ^G?HBfQmGIHK z<6oBB=T{N-4h`k)EU*K&d&PNM(j+@M)odiM7zx3zy>y#Ba+$@>$eZIybY3B0C{5j% z*oEh5_kh@B#?5_TGJ&`?WK#}wj|7yRS@l~_S9hYyuDiP%=lRx($V9a2g?+irw&)`a z?bZ-#2z{U$>MjmrrJv-yWd$bAZfk<%g}LT~EsIy)WOwgIk=|Vz=jJnQ;MRwG0s3L0 z+P*mGLD9gJIPkjqZz-Q|BYzHBg+AsM*^Ab0vwV&It%m)&X&#{3CiByGe)-|YK1(4y z8aJyOT>kS865;XV$98r{UGXn{y}X>}nce*SL^IPYdd_}i;^wECWf&(b%F1U<-A2Ai zpO&jW`Q2QlCF3bOdv0OG_eTHB5wT4mK&)1JsD*@@8yf}SUoK>OXxn_7I4u`2mP%KA zg^VZmOoww-hLZ$+PtC{xsX}JI_5QPcjHnVe(~gUa%kcGJANE9#30;L0`87POsHVip z#Z}q+bLR5mEIuv{+(|LdQ%qh@Ljx|?Eq12v>a`X+IZE4@kz!aJhw+dD}q ziI?B^%XQj}ssX7ai2Nm_KJhK#>23(r=4DuZocC8`goTCq`Rk#}HZKlx>Dh=>;F%bj zx8UF1-8D2c9C4mTi&*8b5VYM}lH3r*eHriXPucWC6jNy?Vvq6z7F+DWnB*G454zmf zn)C-F1E1{eztSkl%M;+?S!|A#zROmSNg8f!Og0|QLw2WPV%i$YRVg={KHT5`)gRg$ ze9zRl-E_6C@p1n03F(UBd%NW0q;KTIf^XEj@F?cnDS1`~zes*=u}R&i*s3$44^**} z4-oXZMZ%){`N_WU>(?KrYk4?06jW5k$Hq?gSNlO*Io{;wGq)YD*D1%i_{EtAB-2yh zln*Hf<>~t3AFDDeww9J`m#pX+cMJj(Gb1VmnQyBN__J+{m=woZeYSIaHLaI2(Q_Z3 zp3!+B7>jTOOQ25Ic020%=zqQrRkw&EQ)Yv^|Hd0MH0Xm)H~T-Jcx!> z)?`ExqX|rQ>Ou<1%7$iU((=w!3u}x<=VWHK z=@pNDECW$1C`hW@bQ08sGc}_9-+}i!qL|BziYlGYI7CDFq;L|rY}$YQ(yezxviXBg zK>@1ODHJDer(@g}GJ)J6mw2P`PwExsN$ueVhgq3fS(kg=d;&>-eb*WoRm#p!mJ=28 zR5NuF0E%a4WK=ty?24#-@{*>vg!lp?SYx4SNWXvV4ky=O8@AZmn$p_(Y@}3r|Ee{x z{9soB>JIS-3qa`j1WZ%6*a|1MSv^LmLUtizYI0xZIBN|F`a=57?BGLk> zsiLe5%L2fmP#O|^d{%%sR#tnala**UZpd1}Zy;XJrK`N_PR|}vQ)}%mv~7-;0}l=* z-x+`_U{WMa0BXFvycLZ67=!xa_X)6IAWb0)4GavlwJmoSM2)iFe~?p3{qE_Bf{*~U z>|kwhARN>O&FJMSJIhK-(GU+Fq`-{T zxn50;j@rZcBcv4+IP7;9UU}Y_ge5W2_3~?27>ZkCVMhXd?MUR~>;a*{p15eKN1NZbuo0*xdjkFc&v}9CMQhU|XF);xRss?0% zJ@f`=3ZucqckUn~fIC|s%1uf8I9k-)*0#DaS`1O{aIp3+kX>2}zC-8i zX#1MTgp_&n=8b{D3Y_lj>}+hTNO1lpl!1{kp4*-!Udk0}rK&1fX=%QNOwABn)xwyDEIY$QvBieK!#-w7{{MNLg5aHU}+jGUcK$KNf zydWVV0X@cp%4kA|EpN`D~J3RaFH{bi^3DsbTj1 ztfJ?zqWIwK`d#FcQh)1w6NKiAWw}UFpZW-^YVHf5p-QS{0Zqn;{zfFrps)i0to@7 zVR3O01{mJJ&_I`h_zuM4@*c#MSnm8#HjES^BtAYjFHh>C?0XuOm$VIhD;$~}1!BBc z_v2cGTkiFX(YI-|K&uJ(1VG7;#^gZ*W;ZR@m^V5$qJ`{4fHjum>C=qm!vbEF4j5&I z@hM>jlf6TIa#DMI5xR}^)KqA{rE$`(Vf|=vI=C3}^UXlDY4pCCNhy7Cb~HRRq+aV} zZ);m7{X_!11ric8qPtM6(9qCwSLA6S?09%;pc?-@IR}UeCB>i13W?e)%gWsRh51bV zWR=}dRa0T%-{8XlAtxdtLNxRoDqo67FrW|k?$`F;4CJE2!XAvtD`d(E3;T?P42@_9 zvOC$_I~$a(aX9E38oHbh<^xg%T&keZ@rUY8jyF|K=jNivd>9}9oSIu0CK~!t+SOl- z-L;~$tc-$H?+?H-a&mH**U41zC_pxFpJtPl>`$H;3}nbaV+O)Xcu0t5;rsNriQr}^ zD=PyObNlw~ft@SSut)4G9`}K@q2r@qHwp)K&B^Kf`Q`3Y;xFK;ZE0zV1u%Gz<0BBn zTU%QP4C2nVh;Pqye7=5_k(Iq;`UUs&C!Paay8HT~+jPm>9AqXXrDAwMtAl}sbqCAa8Gy-D%^8e& zT_w-?+ECGN3WL+Katm=4mB-IB_}10gBLaq9v+DN#h@wTCAB^=sV}`#u zJ}MsF7@Oj9y{!KElQXJgvOvo-FOMmr53mURf#xomkbi*IebEvGKY}xv5s-H3oS%Gr#!%p%CfyBSAj( zO9+q(A3!}?6(+Afy}AvECGiHB1_Ap#owzl!AR|I&6^M)`hF-7%tH zHq8k82As&rc+;>HY}V;H+zu(X#>e47@OfuNc&TaQ5?S z!zp^Yy1Hu99RgG5e4nC9==y9jAC>EGLqv6y0+C(-j*X0Z^J|P&iV;dv47yoS(VC0@ zS^0D873qH{N;;rr?DVzjf8NXOjpYmf*ZVMS6X*L(|1Ou&ARs81c}1H{`wxC4Ed^H$ zUj6=eS!c@sd_?41&V2o}q~Cu#vT0Xb-%E_-fj*Arf8GMs9}lgY^Ab=)JbN<%RT{H} z*EgEctOeFBc%}|daNTf!lHMMzoBlVtNea1x-0Bq9!!`JKXBV#5gM)Pq?x?-~;m5{* zU;kf7@ZVkjgMR-#-v7ag|MO6-e|LiWKM(zPq5lObkrA4jcRzz90TlKVTH1y@e(Z z(m{S&)mh#>g0^yh}G)_lLJ6dKE3o8<&UO;nW zmxyG`{LXDk-nfK>+K;0w=c_)mW%i&S9|1nfR?Pp+9}x5P$B%_%p#az@5fIP;AjD8t zcR&CeY+T1@XF$_erFwFmraq1SW52ibPF}vEvJ$jX6(uFDM798pBl%3=5naHDbTsYS z@;*S>qoiaXmdBc!8fY9@ug*|-hBL1Ayku{ z9gt{$sHmt6YLx`TJf|EW z7&9<1fF&n3yAj$jXeH-(b@xpQ-sfb>rK?we!mC1VGVyF~X#ucF0Vn7^dYeE-Ogy4m zI$3FB-1Gg_NcKwXD%dlC7db@n8TYXVEh@plxAqxVe3$0aPu%ML*{~M$_w_Y02~B@X zOVhKp<+wiZMg>S8Faj3MDP}nUYOXHN%=*{C$E5`WUC7t_d&^I8=lX2qT=~uj7lWCD>Oup zf+q#JRoc-38Trn?eaSHv+ z%}H!;+}0$kU(t7a8D^|!icl}6yDEF;O&ErRNW;G2%Nv2eJU(2SiHyJ|lvd0;c$lS< zFIBJINaYlXdVL;7u?mf>>OegrFu=3tdvhyCCCNTGd6xp%&mp%9+r-xcll z&VhYrH^{$~%#6NlZS_V{<5#~S);^=hR`9OAo!Efw38SxFW<)9mTw%tX`WZQbUye|o z&?v9ChUokrjwne_KWYizv`S2iZ|nQkRumFi&1|<+8PB_Eubd+iZu%D$bdwYBx6{&K z%9zdQJbF{aFGG|g>F)R7F8b5knqISqQFqAEDO{-9yp)>ib(mYlnr1(IPue~3V8*W> zyh{^Zpi354iT!M+!0G;%i?L$$sno`#?7xpl7E)iSV7JrF2$CMhdD=)7Y_k1D3z5Tc zSTondCa{?8A^hxwjd=R~<~I_4DWu~BbP7tMz!PobhwAB4Dj73PRRrJh3Z{!Kn-&Ug zjL>PC-Bi3kyJP&c&%#Ny0vTNr`WSZZ37NBf>ZmF6p?A9*p8 zR4i6z5x?^(@u{tPYWi*c@1+xr(kvAEVeLcEG+BUo>3BJqlA zzOfsrL6s+*ai)u_9xU)Sl-BUeO67Jz@muW?M&fR1`kPQNOt{Z(EosgeFP$x1A+KB*v=z0 zoV->gFMFpalN=$x)lmEtRg@^h>9Q>`0tZ1wkJglngy`aP!{XH?oSKS-2ziI7WAxnA|6W0GSUH>V3+W3A zaVbj$>&ZGs#zX`v0(GZZWz;*uHLe<4krD;5zk-2~mcAu>$7V44!d~$E6O|LRM;KIX z%uG|q?L+?Wem=E!SUg1j6)E>d;qqA$rI(kWI^M(=pMBMW?RSdtmVFVv;TfLqkhKU<2TY4?6R%@W3(7#|e;|Bhbj z$_&#lmtQ?u7F1Z?YATaEc#?th2zHQ)Mk5fEtl&IQiqOz8+8+JH{OR;? z{oU6EMZIq?5Qv#gk(IvM-8b(&4VPAa~gs^30)6^iCr)sU6R zu5XBO{dD`DDdnv9dYhB2ltgbMs{Oi&U$#~(lHy}|0}}y@=4BA&@l=f?Fv7Xr%yWe3 z^ubc8dV>2Z#6$RHiS8lhPiRpP$IIjx-kMq%Lur4_xVc@hnepkEY2L4+hBCZxMwgoK z=(Eh25q!-M{?2K~@(cNht&bh8`H@B|liU38Dh`5`9 zm}4ASi$vkw%j@gwd!MSeUuX~gQ~k$?jvpfJB-X#lZs1e)rumib;lAXG?vJ3N#@74j zF6B_ronlY4y-!|2is?>&PeafJueHOeFl4$S-x7;D9hX4&d*GaF6l>XivfImGk%pe; zg_{MU{5R5srA~fAQE@Ra4&vhCNL0_B$p{F{RWbaACISTo1(db*1jYvsbikZysQJ<~ z;~}BSHfm>+PI;%NaQ3=aTP4;Vb^>l2bguQLpc6^8thc3xzmI&rAQ&)du}HpIAEh@qew;{{gN4X(9d#-~JEuo8(YGu6i!d z>vH}rG!z*@N=kZ7xKd-ZaKrlVY5=^4)zTll#3IKdQ)qKR*8>Z=*?1WkZSq!g!=s{J za&h^q(>-|tY!k9ue*QLyTA6;(U@4av$ncB@`ulT%3jO9yD$LWvN1S3oMWn&^&ETz65@NhlhuiwHR3ZYyQJvR-|+G zn@BF&mP8(G9`4I}mz^dNZF#c$!O(COh;pzvBLSJD0Q?mYXR)b-kHUUhE{f^s%mWX5 zwAwGSU-1nz1K76s@X;f{z}kRA56p&pd!M~{@vUCpa1Nm$dj~sLGM1yp<)ZSG+t1Gr zNSi1oHBuJc*1lBn*xl?x;2J?vfy-b0ofQO{0Gc*t)e22Bv$s4=u%LxT+q`3g*;DOQHpeMFl?L$Mfx3^y&&*Ok8AOEq` z8&T2H*HtTu#PtI`ef|C7Vq#-Jaa<$tKgITYdO#O}eGs$=WhEu{%G{fGnYe)!gl|dq zO@fcmP*DK~qbs5ce4FIBk=VU#`4gP{)zzx|p&g6<>QlAOu{5H+=O6PwLSQWi%yHZAozbKvKxr@bYJ`Bf$O++`*u)30Dj{2 zmJ!%f0kmn#DMo&G#T}7B23(9^kH^NwF1KB;QuPerYigC&0I8*b=fHm?fpCLqQ+faX2_2o(x2IY_WdJ>g zf_@u#i)&o0rGrZ_t}8L%mvY$_O@&NO&35OqvV zP5u781atUqt)#fvxIfKA<>knKdjYUxJGX!!b#mg)`=!wX`xViU8-ToTeryVS=ip#z z`(@~9Fueuvg!101Oo~q3ooSM>8Co05%fmnllaNFM#R5&v_{hk{#82oqEZagK&b{Jd zW0MyY)cO5|1X}T-zP=a^6J-$lKM6woeB^M1&zHLs&A@yLG~_`z`Sk#tu@XZq1U4@+ zlIXw^Mio$d|G)q=yx;`yggwNaorAr-(JUYQeSKTN7!Q;XP`r3VM7GfLas7eoi0)sU;IU+fEueaSBMT^ggs*(gMkwA3p^ywu$>2@6TH!`Fo(cZf2Q;M@`a4!<2QH;Ae1gH zE;z}8fJ+RlLoxsJ07_sk#5dYaB7|E}(Jt&jf_nlg51Pr0&ASM0xPEp-j!HQbE32HS zXyz-)<>h6{7v}Jn1^QO^dwP0+CJLx?{5#VChOo(Md+00i75noyy7{ga_D+&f?SRP+ zAYu%Sj5M97$P$p1g<2j3;Q^XpEQd)^X(@~_D2;C-COZ({^Yi(P2A-^K!~O!$!5!@F zWgH`5Ho<0EuG@BJO^uV26BG{!Qy}x@z451iK&Bw z!(1<99(gGwgq~ zp~9y3=Ns^dl$@4cl@DIC4w2#GTV0;p@6cvtWesFxTc*ig|0#-&i3wFi&%l7ZoLpFF zXtKKh!r~&58xVPjffp!2_Rv`A%Oy^fII#4te7;9YI=27WSWizF*9(ksz@dW7d>0ST zeH{;f0-g%fyOGms>2r`Xn_|Ue(FgGeKlw*SnwnI+GS*a)r^+x8u)_iju+n$G*V*r- zfd`eXiSOzh1u>wdW8?$uKx9OOUwScA>|g(RvZBI5P}n{^C6?^AK&qdfPUKRm6w`Kh zc?C=?kQESEX407p3%U>~aGl~H`vh+Lx$SLc2U=W=>z!drN~6Hm`gKRf$2-sc!d%-1 zzWOn&Z7StKTyLs%T5dB%oegWa%4{z|j&OhK0k243UuaAb#8YVKo!*AAD zNm%|@mg(V@6@0x_L%6b-F}!C~)K9;XeRG%*}bM@86{+RR%#yt9TT)91Xky79R*u0i6GjIsN3iyUzQ0c1o*cD5WdFz(HXPY{TArtMapmE~ zPJc0}RnpMVNViBE4?xZUF2L|^gcJgOwY8%IHjWJ2Du;p6DE$OJgnNE$qn`8`Hfq8S z2UsV;69td|YkU7buOLw1va)?383GCaufXPh18xksc}EcB5T8ISbgC^wPts6`peYq* zBMs~XIeX*u&nQ%|v8lnnzAP8^+!vr-z)O`Dqsb&&QAP&u&K+&A|hwh@h{};yn zUx)sOw*CJPl~%hpP_FDfq zA8M`X?)C+Eiv|&-J-n`uyFtM|Rq#7`^5Lujw~S2D{607^_ic4X1)%@vT(Rko@Z4O9 z@gXVcV;I9R|J+NTmud}Nc5ZINn>VF?D+*Er;H%u^e5$XlC;f$|cxr~T&TbvoHm-I3 zxT5^w_l5*6E5guBYp1yX?}>>c2qU=2E3~W+6?}}}uOa{i>Zn6Ehn+U%e5BODF$K0= zm$CRwmzthuvWkj|qK1ZjZ!eHsW8;%0Zl|%j@e$Y2(9AE*^ib2YCud|JFL!_{Kt#EC zaRG0w;63Y76S5K5vfs*5Q3m>@kFUD1(eZ0_u(v|o!K9H-#galoYRB}!y@Q5;do5jLnk0)eO_0=g-sG#Q zs#=&FQr6Pe(8$P*_%NKMz^HyR>EQJrpNfAYxq-#oXxO&>weWnl*^&-rK>RQ5 z%SpeeIV&MoA$fX(4Fsp0Tk4fH*|D*v*h6SB44#^HWg^Z zXM)?$*zY%)E7@rmdMuOX$fuAEs_*5}3yo*e?J^HAeM*$D3a+EMsBz%eX!xm7QF^AA zt;Rh~eSJ|EM~eqzFaEmt``ZmB$aQefPLz7Kw70WWttpUXj2r9IwSFF6JEE|4uy@15 zcag}k$aHDp+ht{qUfo2%mxp{xURY3&b@S#u7B5$YBqB<1ZrM`rt*l&CU9A$5_^m0< z4{SHGCmu~=Vj}6hJf3^`R!&}C-?%4>D!-s0YKeE}J3Bg1X2vB7fm{GJ9+C)f{PKZb zY-bK>D_dJgQMGk%m6iEixUff6_pAQtGiRWT37PR*UYz5Ng!z{TIt5fLSZmnzaCpZH zrKcSUY3s?>L_d|PnwoqmznYmL4bJbZc_wd^q^aZO-#?UPS2VBL?~}5F;Wc zg6!40zdJ2H-aj!FoMt$BL=pHiSkv-g9k}z2{ppUJkD?WeU;FyDvCzQIaNOAVaDsI8 z$wN>HnCEryIf8!e_vXVcWKoqe`3WKdf846j>*iFGXL1}w2{IbW2ZgwbGat4SF6Ynh z+_9t2MHb6eT3VVgx3}kjN(IC}DoC`Kf-*8Q*d%WB5Ni|W*4F&Gd2pu?--m~zSaDO~ zoriRYo`aHrAeayn6Z`Ue4v*mLRR7@M4sule5Y5LFtv?A3nOs)*O-M_U3D?xxdI0wo<+OIJY~;OrYQ_})AYoeg ztxrGgEn&95;N|t|)hl)m4n{VyFKCO{BvU{4mYGDuSd137xuGGXs`m-HVr*I`Cnv-| z0(2Cz2?5-r<-><5ltb8`XwUD!wyU`2{+w^>Kz~2MjS}OxB@72Ar--0n8%TNte`uXM+uOnKqx5zgYE6lc{{r3^4*}A6 z{NPwczj762R?(B_FUTql%NA;5;3TlsY8e*TweV6=1)`j|9}^R`j79+jdeD_CXw#A1 ziAoexXpZi}P5bK?Lgv`Py}~Cepy^hLMs|Yw|LWz-cpVlIv>(pSqX!p+UmrxdqCUUL zf@yg#6&q3KU3_s_R@DYHDluxS3?;=ijR8ZH^nj+C-NHte|d6pI1^69cz9XI}I%@N;Konh{<$} zjndcGH_7K|-P@6^31N_d!KPxl!QS2%edAW6kAHIT_kHnp1p~Hi+qU}6U5~d`O8k0M zNbLfztF?6sjK;HXP_5F_U%&dHq1CkNd`%nk+EpkI=(+Z&jBLE<_+s!k)Ejk4-|(bS z>u{xTfHDNag3G;qQbbhL87X4V7ikMm?VBdfTVk%WMww_Xx**&`rvvsfdDdhjq2`xy zQ~bg1`G>8?^mjHEG`i2X&!$Y3?+a?3CVYh{SheM`y)`iJVfdtU%HXp_Fvy+dPMTwYv280u>bX? znt!B~FWtKKLux$wshEnu+zQmZ{jS9oixaP7_nZT+hDHqE+OU3oj{Ar)`T|@KYRWec zB#KAU4Xgp+8=b+6AlcSuF$iE%-QlRb(CY!{Yb6*m)D zkAO>6EYA;zZI)CUgnb9xDA63cjIuOR6)bPnRr(mfTEH>@Ln&|H8=?->nP5bCSHpIxHw#bzG5w5m5IQEpKA*F41zP-2nv6+M(2t@p##BZ z+PK3Y;%(fXb2jJ#070R2*?jjkJuU6F2O_(6Eu*B_#>)$6u6Dq+54nSv_l~I9+W}WN z(7rc%&rb^DGICB)AD;wt04n-siuS{O#VEprQP}bCy1S$N+Uo)6iKFuMjf_0;2h{n+ z&z}R+yobN~u@4t2XcINTCtECL64l^?PFcWdt45E_NwN1NB+0e(LmI9Q4B#bZ; z#SIGhqPzPv#C^r4zfjhHXGeBdqep+wzraeo#q&j(2u&p>9Oh1<90JGwG$RA1b6#sy zFUNItdxwVV2VDIYMvBmIoGmt0RIGr|iDcSwIj;wxl)J*B;5lY)Y55g)4zg4nf#4Q%?os@L6P`<64e0i70VMoKCw%*3kS z4k$JtAOIZ`OnHe#yA&1UM6QR1F8q2vij|0d2W!L|p*cRDd)Hl!6qbwAb<{@%r_VDPsxQ1@W{6De$9ZZva&KJBfK7P zMQyI5rnkDneRZ?07b#X1W*{LYS6mE z5qkXiap&$*o+xBF{!pP1-V7^i>qymoTf-Y|ATEtyQS((WKqS=Cx?bCdf`*Dn6H`z) zsjmGZ~kjGiLxUy1Gq<~>fNJio6=+;yLe5&p9 z8LwgGWH^L+#Cv^s?G9n#;LuPM<{aXdtA-?lswn(JLTI*zx512u`eUN%Oux*w`Y#bq zrCw7ZZVD)KQ0rmM3yX>lj(egRMj1os7#iLsp{Bcn%)wAJAhH69cXgEruO-EWWzk5% z`?h9b$yz-=cI;TQBRpRf7iVs;oRWy%w-p^m_{r+NaVQq*ZlIM0)OitNT}w;ep{p4g zJ7OA_S*VP-naH1CdISQzq(kmrhY!<)*Xrr&LehZ&F&bK0uyTV&LS6u9-_g;5dW)0; z{UxbAp{%7vpOyepN?bhhO;ckdIjl!hlZEDr)oDy*I(=i;?;js_B_>k;A9JwW`5!8V5Kurl!6z+ckj=i zPm+>Ooj#qGn0ORTWTuG>Ly$5}_*Qw`bO@P|S=v8-B=@(8NsN;dME)eHv%CyoIT=?J+u^xJ5jKm$P<4SYR$3^^2IkLc;>fW)H`LRTlXd-vkf5`ypHGtDSLW@biP zQ)r_ho?cDh#$=VxA4W95NDeR+z+Z7SAUCKPI5CtL1r(ZZ-YNK$41u3M8UFUo231&k z`VSP2_{=EZj@qEZg&Z356fhI8ns|j8Wq$YMa2q4x?c-Bp>pM4a_iGfA@@hg+QBgv@ zVie|*o2vxM-@kc7N5Fh?K;ZM|&+11X+ar_ouT~F14g81|SUN=|rZ!ZYV6Y9JDBN{~ zzm-DC9$H%XjS)SNzaI;tB;=Tm(`+3%EFvW#!JHM*uh9u9HZEOA{Oa|O+S-){5+7GAsVzvntoTgMa4c_mMn>caVeIkr#IkY(2l@q^zmb1 ze7q9Etw{QlC!De_@jwGn+tAU`O+u-sO2lJeRAS|UbFS)| zo3oKtP@A81bK~3LD$9wb;Ci6aT&%ypzmA-U4B>ucAss9Olau!}1wLv^* z_>^$;f$6DVxQmE)+{(gY|0cK%0TRJwQQy*{i}?Dqx~>kQTV*UAJp@rhLsl~@Cnv1Z z8L%$E=g~-D6LZPAT`RRfuiI*mD?2O8i71ns2#OWM+5mjwnuF*$u+Sboed=UsdDPU@ z!P*+Q1`kGtVJ)=!0f@hUpFJe8#C_z9vvXEPh6#KJD1?D-mT&;hvC2e*1Zqq6GaDX} z3?MuE$F{bpmuTydOnIGOATP^^iNVhZ3HN8DUa@3;6g(}04_fsN4H3AC44)%FGp`#B zbiDTSukJwc@Vm9|Mr?yjZGoy#5r7tevA~?7xI7D3Cs2e}kiK8p2YB~r#mY$?oo0|p zXrt$Ow_Z5AG*7bg0&dYIY;p%iB1M@3_S>+v&L@q;My7*4x_l4 zx4PDU8kyOZSy>?yt+c-b>ymoh)_i1ysQufz4t$i@y_=j^_Tgz#&h^2e8M8X0M6(ekM5+~My&f^rIK2EMmaHFye3(_PNk+7HA}9n`aa zi)@ZAQf`TlpZ~PIz0B<@a@xs{A1GemK~-pf=1k#PlV9CsdqD%Q-*%9w1O--K+gv!w zM8IafdF$3+U%!IEjzCr`I!gyx>i2;GYe&ZuW@am(ukip;$gdA%dbjgTD+;;``yR%{ znL+aH=$MJRqFV41w!mAo{fKBNWsVe8W4~ebF>uOqv(OBMIxuGdcyS&7T7%ue+*VK* zZ~_n|)7l$ciob@2I$9srR#*S*F6(M-Ju1WkB6q(fQW{pO2ba8;ih_QA>Jat^(5$7& zciJeUGWTwal(0hwAmj9jd$6ECcYmnC3TL*F$oze>FazRH_jx~(6*d!)CHLWvjR3FU z0ko`vH3xzOj24LMetp#VI8aKxJzp;<%q1e?;+!olnVFcB%yv5& zpaK9DM<{_JsHwS9V@VGALxe(=_R|UO9fbQnliiQH{G{-g6AG=QLshv743eyzoCI4K zc@KWP4~C73Qxcsk>ankD*dFLWvWYsqhteN<=jx+d!;8)h9>EMFRNQ4PZe3`6@KCTn zUHJ_z!72+vjhq<;H)Kd-sp~*Pt~G{c<&&7D*k^V&Ho7fxq`vn0(;a0)fb-ERND2r% zN|Pjpk{Q|eSbLm12e_@qvcU5Ex_;@0=qj*blhvb8^VA*jIDh{3?ATBDg3Eju% zU4cp`Sy)+RE*6{I*-GLv2xG_{NJ#uee4PqczdCPYQLQ(+#~mkI&(Ae+Kei!s)M-9( z{Y$q6Q3&@nw-P)}Qr@Uq2{F&HF9&J0v5r(#t+4|@JL9UDFNmY3X~|Q53DD{JXn9^y zk?8jAXVTwbbz{k>@aiUM0HAO^cdjN*CIRttcxt!}?XSZR1-*mo>F7@Vn-<{UL4-(L z7G7*De)#BpXq7FH@)HtzA-JHVq%=0po7_+356B)Vok~ebiCAJw|Cyn|eet-mauU=b z{ksSPY|Nl!*doYDQl?a~(%sc{5$Gq{vO5C;)_HKjz=T>oYPWkgz{AQ)C6xJy;dk!d zmC=8KG9owkD2VM|U+4Guw{Wj@e7EhmGd+fumRy%ecVOYf!Cqq^UZD>iDi=UKD8aGe z$^jm_7KSWyj9o0+VhKtHjQv?x*Amx(kZRt&d!OU7WeUDtTfgmPRTY|EbtenyhMpcj zybvwEliLtfI^XwdGb8t+Z2~E9KYcD#v|J6P#+x^Mae~H&55EI5+4t%?+4yK^*sC_S zQqvO$ud^2b{RR>*HUF^d=MOa+*!F-p!-IwX!~r#iV-^G`-mspL1Z3#cXwM2}3<5Em zoR~-)Es%k8nA{OLnY$Qf31)A=5YWbnoaDKI`pepu# zQim5VxVB9-EHC@zjw0rbAVUGj7*-~5ie)-s<3cdTn*z5U|Lg)_|^ z9di(;5ZHyP<+tBYi}$<89#uHAO|$4bmks(nJVtai^XotPnQEI$pv9MoR6B-`I(Gl& z3W}q2I*=FyShFqhmshM%n$;M_H-Y?|YgQILi!^0ZIR|LvVBbH%; z6Uu1e!H=!GUaD=`J>PNXW9E(IXLzDe?K`6%v9-M$8(Rv0z))NW?gx?qBpNaf?ajw> zFkTie!IX|iq#}fwIWaxm*vJU&N$0d<2XZ!uYn{YWCC33 z_~VS8Mr}l*P?(%%QK~h2W5L&T@o6(Y6Q0*tv>xm)r0w7uuv2Z!d|i-B*GX+uc3mjs zrZ2_sp3~rnu$!M`Wr+$2are;P{R+r4_kDCk1h+;G=8?uK_>`oks(tNp$}B{X1m9YC ziV+U9Q6R7P?mdIJO*q`@wZc{G!f)fAv)|^-uFN>CpJzfv(>V~X2sZu7u+I&!Vn>#uPqny1kM9TcX9hCzF``k3QxPjYoS(tNWK2 zD$91X2e_Co>?;_VLYuMAbBw6n;4|x{vBG0?dB{Kj1v^Se_)VUTwopgix}~ym_FLh* zk00N@eqE)j%0-^XfppRRyvD7|a%G`s#p*%>SHg5I_8V}i0z*fD?Wl^Y@zOV_Kgz)h zb5d&-?SxzeMR4rRo0pz*`4ES0aL%D5iCKC_lY1(!1H*%6J#w3a&cf4<;N`xktEyQP z$Li;|feq>mEDy2|_1wAgE*K zW$hyg({N}P+cdIENfiJFyCLTm{e}#vckW=19bVaNeAzf1t@7^OyRq+4Kj$v4XXFcQ zS_+q)Usy0acFdtOA5C4NAAq6xsj7;!P~%Jl0cq)Jl-3wzgld87OYK=8o+z~-xY9K+ zcs1aPS;5JRoN@%u+cnq>`wAvIiaSxxsnxCZdD(Q$E2Ruba=x*AmXUYKJiMi8%NU$}Jz zu+d#bq|eKfWLQ0~LN$x9Y+#EXLH3Xn0kRe_=IuRJ)5hOj2 zG7yRkF2BXIq&b&Xr;F;|qVzcs84v?P6BOXrR=CCI+!Huwovg;GLM{cG0Wr0Xr zFyLTieVm#q3#66P;(fxtefwlN5sT^m{2L(=kiIZ0|`t)lVD;t}yvgRd@ z(TE8c_`&3{Z@v;_E1JeG{x)M1lRiYUH!UqWpSku|x-D>_2pWW1hm3enpFV{&#o?kn zG8fbxHRCE=YDEOFI1ZTRv%VH;8w-obhY!1_y>R<6LF4Q`{MDH=_ix`O zL*AwYzrEPS=#~rHK-yxcj?2E5pd%YKZG3#>Z%_egQV8(a5t8V_`HvOccT=yqIdO_eTA?hx_vzWzP1zHpaT`YLsY4$V#4H2F zD8;Dl+s!*hGHD39{QYJb_3C_E+P1Q6Gs#RT!-yi(9R&j$tv$M`l%{I0Co6gJh(%CweedUgNC zKpGCZf&|;PO&*U_Pu(_I#h#w+!Bh9TEKXUM>F(O&bCpL|(d)YuP^}I#{d1K=(|Hrz zo6CEsL{{HZpe*m9Pj6riugJMyzGB{>TcH^b;%i~Ki$9M2^FqmGg zZi|0P_sUDhg!=RzCigW4KC~R#m$J9gyskXPb!4@&subt5RXL&*#J&gd&sVeDdHFPt zo9X4^*%i+s=Bzvo!PE^08aT`)%zGF|d+wEDwkOA{k{2mP&t{lQ*k2@Y1*EiJdRr%M zB4*%LV0>n*)+Y4=wVpDMB%=W1WhVibFEp2zDGg=Jzgv(GNPFE$O{eZ+J2uYQ<(@lc zD>aGK zW~zA)YCYr!1m7J!)-PX4;V6k+fveO?|6J0EDz(K~l+&*nX5&e05X(#&yeTM?l$TqO{`DpxrtV)#l}eZGQXL z5&qjb4wg_7v1PR94+sfe`AU;5;gox1^#vC(YC>#ea^*Hr`9{~}H_uNw+KX??D!lGI z?E3mP-|I=38$r+@c}ZCWBvu);FH2T+mP_D$N&9t*`jG6l&)5 za^NCC_>@o(w+tvv)Qul3R`jgheXNJ8l5UO8d&Tn7mN(CDe_eQ6S6}8=LFD*`EH95l z*HiUQ;uskUnXO7r>%#^PXXt6oE$!rY%}YNyxvac&H-kHi?b)>01@7u{Lg5EbA@GxwF#qy*F~V3vH*;l4?F?ug9o0^&*9%y8QA6nS?@y8zPQp=}QMA4C#n$ zUxDn~U+TEHyq+B1@#5XOS5tv|wR??NO5a>Q*COUKyCAv!GWom|)_IB-Yn7OkR%A?0 zj+z+Q{;GVnLE?!WL*XNWh@Qh48u*_`%}kJZv6u8|{!iLx%F}K9RHihv3IAjfms~GD z!6&M8%f5PQ-t--dHcoHVhcq*4w=1mo{X{LI%J!A+wKuz>hB6t)zMCC+`(!~#@K8`^ z`T;^svynrwy`+zQL$C@!kR1k3X0LI8k8{L4isK6FMQ?ced2EkiWV~s9nbtvJ_2ZRG z>Bg9@Vil9=}NLeiL)ym-Qwt`)JN|?|;DLDH>n+iz}*cJ|KoF zximmAj;LU{VM^`D;P8;@#Px2EFYkA%HC?H!kAFFTsJ1$zal8L5nX$oBOdpl^3uoUp z?^*3>GP_)+9z=EL0R<7})@!`)mf;I+g%!_-d69CfBORjhqq$HM(dfM2_Q~}a&J2NtZL7M^eIF(cE&Fef;d#7v+U$}X z&!X5mQwPPIZ6m;6(7?H$KVL(19x8)d+k zZ3i_W)5aII_f7xzMa>^lYq*S6S(0r6RR>opbXO5Wd&C^&+hbmKk9Ix2DCqoRz({sp zZ`fWajW~bX&uxM#T;F0d%N>eCtKFoQSBAslB1mio{!?03a?SdMP<%R@Be+e0gr(4g zQ4#-}8i*OEF6t=ZkpT76J0#eTk5}(>5ewRRuCp`4_H@KU+LKOWg-inU4tn~IrBrRx zIjz0BeQg58{KfrS1S#H)RJ2e!oA02=YxMBwUT5)6{n>9iqY$x%jkOysh;7g<1V=vm z{Nc>ok1ih6?`e#G`>#8IOj@wbTVk%FJTQ9J;EI?(kez>0J^zES;U>j$bm&U??5yX6 zM|#EVSK3XXSEw#Ap{8Bgi5gbs>{k`9n^nD>C`LDYz5_AcV$kzh zpr(#1Ja@zGP*MUSzI#*&9A0-jz>+c)i5Afi@1h;W)F%sc!Qjku^Gz_G8j_wk-}%!R z;D%}n%m{WVen*Q?n4Mk8HmtKHUpoeKkiisTR9Zq)zw#Vlp{x_nr6F}dAqqql@&PpL z*SGAwvv|am`ud=)RNXx%#lW)`5&%d}Sz1yOV12;gtn^;jKYEmx1Fg+==3tQI@3J*P zA;Qu|5f7pY0*ad{#=zD)qoDyawP&g$e^Vpt*4lrsI-GHKYo67IlF+4vt4C%nF*$3vq>?*u1VEACmAF@1< zAhvybh{)|oOwa*a2bInJ*jSO4Ag~9gFos0S@iX8)U{=+G0DI;D&p~4VICp(qleri~ z$JU$qLlV<#bXZoyuXWxkx3F;2sjR^1(;0yV+)NR1+fqEDs(+Ap^zh+h{3$J0aW+aX zkS6tgOynG-xrr1tzMJFi4wLPmdohb~XNZhMGBD$>k{HZ?N8~t$WeL8v;Pt8E*rGiY zNTz99;Ls@`i|~ZXJjWA(E&>m$k5qc@HI)ui6EqmRPL|q1oH#seqN__mKuVllR5a)! z3r%J>(AB3;f1wG2z6xV?zMsd`K~(kN1Ta@%4l?f_!^7yMS~Spcqk&9KNDv1xfEoB; zxFDK@u4M*dVImtilXT2TU!Nq@pcn`M$Y*nr9mIdQa;*N1am9Gt82EKH{5bmX#^z=h z+(~Q@sXq#@#eutKb%}6|QC0#kW|w{ebK6r#X}QDLBhYK3)W;*lA0UwEg6G1p!)ccM8m*v zr)&%eZvAu3Bpf4V3CzmQPAK|KLxW{r2Y|FFp=`KNB#r|W#3BcZ^=>tcXkhY4)t~My z9U+{Xp{Jt*k*C!VZaEkLRo?Z{rqA6o;dF9xdg{rAmxG|42iE`b!-sWO4glmQRRw#_ zts%a>eW1}$U0Vy4KUF1g`()>zGCkhPy2r4GpmQ9037H9mh|q)R6^*G^t0CnGv7tUbFNEPxn?cll_|P%{uy+{|N;mF45P#S>d}j%# z76r$P&0qy7i88tUl&)9@Rua2*9pUAUalGZ^0bGPd71EdE0P{9)){2%$fn+5y6>?Rg z5_o|1KIs@acViZ3u)pSy&FH09^`G*1n@cWQ?J&px^(&Ss@ytI0YyE&Npa3#Z!^==nH68~ z11y^!?ZK%q+!#`c0cMPh;RyAZoDnI*O}Mzb3vdNl=R-Y|praN?=ZJ`m9R>c7xn|Q& zA_7ab-y3Bc@!*oH6b%?E{(b_0urJ;k-*$gV69!ge5<*nD^L_K|m1 zI%E}}4{sMJpkV)7DY``6n>Vq0J$4b0AkuH$Ckyu=j5$`nFdB)X642n^H&kTP4ve~k z-U&PhRxmhCtm)VI&^4l>8j6}$pIne~6z#ERA$Adyl!RGy{-N)cZl14bD)X*+; z+7PT>=?TpDlQ<2s`pJ_wgTJl!kn0Tej0w9l9_3#;VNyj1gd8HdVK_3A4lz!M#ZOkL zOw&70?p2*tP10uY9WA_#A$afr0005|QZoqXqphDKCE1@;mtsDe)*l;;d~JLCJzuTv z!{2R{NMj`vlbBs|{Al^YjjCRN+<0J5dw+9-9%kMGyfv8zM`cC&yknz#1=dYK^BxmB zJCdOsQt(y5wChd}@Km2e)P*H6l$O(h*;q&CfuRBp2C8alZM_jjHk6oj6?bl0#}#Tc zOB+8{;*Lnw+sAF~z(RbFI^b%#Q~VGtqi#tZr}ENHJ^nEMC^1pu>>sQf)>LbtU&ue5 zi0L=^HIlgma-C(tm(AhENJvRp=XC&|+T;GyD9IX6sNKOG?=-79@v~e+&=$)@Gu2^>=jdgVY3-40*8(GAjxYP@kt(6&}c2$RF9?1*5=;A&QP)*Kg9KaK^OO zZ*@l5{T7T;Th2Nx2t4rOXV0*^q%YoctF}w>lLSt}jv+_@h2dgUhfK@wyNsZqEhg#o z&+_zqg2aWz&tMKQm-y1#+v2bRnlGdsNaH7EXkeJO9*Ti`1KbFbz3_5=@}!Bq)&sg= zl|-O*t#?P4*UM9IuCO{m^1aa&Q_cGL5LvX zY*Fy`#4aQObiQ)SfKL0kLU}uN`pJ4HIJVF*fJ{iCwlZONoV>LCgoR%1Be&dI8~_jw z>PS>PDmL?`Vn6SaSfq6o#|>LO$@P!ARxSZqZt&v`D97hVjOOy44PZ$UIs+nvZcX66 z=M)4Gz_h1NyYo+Pc(5ND)Y7stY`6}GBuI6zYO#z!sBI*!sU#wTH?;Rc=W3|0-_m3T zUnlm$^ArYra7F_gR0_Dj~41FJi{#0 zVpnjU^CvX%SRqb8IfrPow74k7ZIapH)A=fXH31C}s?nPtpq{`P1lu)~3UgWx2I|e{ z2tW8azKM&AYwOlszPe{HQx*GRk~Iixv(d>jsjuU^=H$9cQA(-wl9EpFo((&jU~UXa zgm%FmsyKUllK9RwdV!2!r7>kI{!J6zHWetm{ZHvL`5b{=&ByAgr!_8u^yl>@sF|p{jxK`)60tC>%}D z{_O@A2_H=Gd<;APeI@Sia2tV*O4I&Gz09kVF>{(D@J?bX6vx>eKf$;_v;g(eD!#d& z_wL`{u0glkfiyVuw_|qr2^83PFzq`FBF6|lv9E^#t6U)mLaJO(`A58Em zjJzQ#iTGi#B{VmkbdSIS1XzsGnd*xa!e>#KG&D7NxVsxbFC!6l^kACDXg4$#*v4_+ z2Rr|2S_@akM{cbBGEHwxz{04Ztv!mJqerosnK>7X7c{5AqT32mT0U-x(ZVMNX%Cjj z*!Vsw$()?CdW;9v6*ZHc|E!}o+P@n0+`Scgs;e)XZhu`@7cp_9H344q8(Za}OX~W` zlZ|b~=@KJWDp;RcbffXrp_I;m$jHdq4L37|npv=XVX`sk7BrWDq?)?j8=chnA$<|~eg2{0M1A)E~;kU|2xd^TF|1pc zK!tMYEfi$EtbSdsc3nk@=f`nQJe;KX>TflErg17Gd=uc zHTYLa=fC5K{&ysue?#w+q7&$;z>9>c@Di|dwMb|+9{O&UxJ8*IX^Tb4h!L7t&;#Aw z-O$@0X(NuMVan#+`(*k$`QX;k59p?lBx?Nn!V-m0si63Wsz>-dv|%VJ4skQ-uwedO z>-Xo{NxxfcnJY)ws*e8PSwegM9eT}~&mKMWoU&s4{HoKdI!^M0wA>K;>@JJS0h=G$ z5f&O8*e8#s0!*WoE;_WT38=Nd2HBwptdhWgQwEr$t7rZV^;~^uXQ%P_+;wRf#+56a zj5apDdq*BQh(-q5O`daT3DC~ToOz!LB40}1@9fzeNb7(K5g3n&FyN&NjriO>QE{_G zjiX*SmN_UsiH*te`m3*CCXwLpGD+Yu2Qk~U$GFXGK$XM*1W0qZ_Z%fW4C-VE>=oZJ#?=`0ufGO+#v^B@lz&AKD0G*Qt6ugsm7G@bFet zRA^XOte6F*sxEQ`jC)q)D0rYdSJg#9t9W6;3KxTor>on7dx`nP2O8QtI>tTsg(Sji z1B20!928E!dMaRfgq#u#zN#)x(!lU-X!Gbf;CBTI@>r;$ySu!!G&WIaJRQX=>gk#V zMOaZI)%tOa=%29#bLez|>0!dP4$Ft^WnfXdNe6XV^mTPH+fc{EM8gFV1-s%Xo;0+5Xjs3qLxfCG3B_ch4P3(n zM96}oXqC{=!o$HXy^25!Z=UoPhTe5<&$)Uo+2M(&eq&*1#Hvz{9Z_Gte8COJ;1e8)iJb=LmmDloVq4VQfF!(F8c_k<<=_vGJ6rS}Y-2^M^ya zqYtO)HC9xpkK&%nx&ORpMJ(lMXiaf0*-{$uj>+xvM~h?<@0&tJUdr~I= z@ey<$=mt61*e(YJactg<$sxFDWRw3A{|u{9;oLX6XsC|5vo+}LUm4AZuNEUBD#_6W zwX0n;HQ#`nM;i_pf#M4^G4ZPmK!>C!S(ne-VLa{QB*a zw^g3AomZ3lub}(uKw{8kPq_5eVvG~MTJNwUQ}5wq@Nt8t8YTgpw{gu(2gZABWykcZ zIHUqi%pGaIvUDtWbOVJBYY8=nE6@IT7U?(l=viR~-6M#!pg)8KZY6-YBYt(SoPRK` z4sa7`1%{jfCZf!1O$I6sJ35!%7syX{UTPXdh>sAgf)o+>r@~>Gzss8)WvEKJ5t`3c zI=&ox$XC=YC(R)$P;}4p zhSqo?E*ltp#MFnSJ^7&uCp$>j%=+ z_?LS`fqgNiULry0un=b= zhw;(A(yLD$_o!I3<~Y~MjXis<$}e3ykaTfSkM7I-yq5$6Wq^OT zFqG+5GUCyi5C=PlpE7g5KT7WH(0;vUyowcUp<=_LB*hUf@6$a)<}h|s** zn<#TpT{SUL?VJ+ox-6Sd;v7_g`ogtW4gg$Zpf6d*Dj5GcEja;i zA-ba0D7d*$%HJ11wI;O2GRH`9X;RP4ZTAHn|4v6Bd?68-`Alt$29kK#04jGtQXB+1 z(c|{*>zgINL280DAXtNA<3L7Tocghvzz)Yf#<`$YEzptsLcr?pPn0k|slYe^n3AJP z$#D|c#*hUfkzEf9BP!w0hP1`%HhQ6(mYCRr#sc*N1%dNvAR>oXEY}Vq=?YB4MUox5 zin;Q2i70U)q-5+bsHj+hCllj^M7yI<4nq+{j%0tr#=)`Ivicevk|o3(&sm}!ZFRIH zm?Lz1*4C>DgkPWtfIXfA76%SsWYmr>6zAr2g@w_Ttbr96oDw*YC@*vvhri8`W*1Dq ziH4Fg78;-nWtazb^chr5m6Zfh;xUS8-W)jZo!m~)o1*SaRzfU4$|lDMtt+YShOi%o$J=pn zSy@?4mN|t^pXaL>6)|N7kqLb>O1xGneCP;vbkkT}XqD^w!F*7}KY8Nt<9!-bd?+FE zi;86Gj{?b;hus{oGNNZ9&M>jefqY9IRmrB%4;WR{-fkopg7;8UhE*Q!)^Z#&wuK7c zn4Xw`&(LZD@H3%v;slB5!!CO14Uj&33uhd+Vj)3>1y?r37a-rrhGuZ}ht{~dyO)zL z*+tkhN{Vqz0{m(isRhCpeN&Gumu1{h(TetCQuw`Az7_u=j2#O zL_0{wJdMTBV<69%b_9ru_yQNCxw#moqXFLsmO)X8J^|;=091#`?#Tz(XvZI7<~co= z!Y2$SA@{*k%xfX07r2Q*h?i<QQ+WK`(xcxRpM|9wXG=|@>J-1{8r?bI^i{W`-sT4ZQ43t z5dP=OGYO9eWiy3;LV`WvK=?*TdsiZf=dm}jmdlQ0437EHqdkE6pWB+d`ES3?0SCj z9Dia~aZ*EL7?>MxB!qIcs6?8suU8jh*=72S^hz2U z7FnDFGR-p_;(P;rB&~_nHd@6+{Li4_nGA6L>eD8Jwg;;dFosSpou9udug(JsWo)L*{St#(Fb#!&@+L6mAP&5QFI?JRx@S!w z57S!oc|(QY+3gTOp0qohV~#-((lk6ECt4nYO2=)QD$}DeTV`VKee{l(ug4CJ{GM(&TCJ{Um3rETljzocx z8IxG`STd}t|Z7+-M0&<{Y@S|3Z|Qaz`fYR@X|#PM{JFl@l#2r2+z z3@HWBy8WiU9+qdW$s(wh^UJ0{4r1mkT1gFIJs1wb4}!{^2H%yOta7*>#f9;*78Vp5 z_UoTtzkMr>vi{E(c~Z#aODL)#?)FwN1J<`ekb!-7U1w(r8Xs~dZninaLGFj2eccfl zeFqvgdQBjz;an_oX3>Sot2LIw+qd6Lx*MB-Sqw@iPQVEw1{w-P=RUvXScUos2+!}J zzr-j@2YdUj_4EUSgP6rTf?7O9F%W@U`+?jP)DmH#q4sXKk%h?vM=|&nNg9(X5W@k< zmH`&USuL2P1O2+@!-z9IXYG!`#dP5bJMq^cNi+lm(t_HuFegrpbloi-#zmnrgOjOg z`vlm5qbE=LLiR7WAgzBhQD{>r(5DYKGU3d*ReqK`B?xEFVDHjkrDL2%(+jCHSZe*p z=h5O(uUT``nLhuD8XtrsZGd3z@5C5GR0;_h84G?RpZ)CKPxV!fKkstWl2KSzYc#v8 zNHdw+k<9hukZp`Gd-Q$9!zWfHyxP7KO)?$*PeyUI{b$)ik{4_)S&PvZINV=-GczHg zfo&@2UBl5$k%c1*wK1d5M&EZiK95=Q+_!wK%d_W~_h*#ddY!bv}9&E&CTO7hsO6f&$ZD=gO zFd_sGNRmPuOF&mPLJENqPVgK)W07yhV>w}BvKMdAZU*z%G)Mv9h-JS{{3;%N2+$og zZ_t4Ri2pso`QSf9ckZOWasVrtv^vC&{MgA6#8EtO$An$FL6tYsT-yj4=aOL_t{LW% z7b9R6Av?MCs;CU_1^2?2X;ftJ2O1)7LO}$867U8*7^U++GElZN%1`Pf?Nu17q(bey z7vof#gWKuvIdXgM`HD%NjMHxqCba-Xlq!aWdkF_^p@6!3%hnV8H++@5i`#(_KD_WP z8b^qwxIM$?-pKj34b>ouWURV^;$*&Y~du|G94<9eV}&nficU$si(Zm!dGt_*>*q)^GG{x8M93uP3mKY)oCNHwNBKB zMrzAHwf*|=s&hoqt9e^wyW`;(?ypr~)qj+lYKNYHL{2YxU~{3pfwn=dKPuIl(G3h3 z`kGNJxR51lgjOUuQrMGparJX&(g}brq|50!ITH_{5=cj=#D)rnjWW5Yji123LL%$w z=_Jj3cc;lF+j`to?+L%BU7gUQV2LA^z3SQ0B?4Hb8-WbD04B^&{XfW$ORi0n$+EBU zS>ZE@^O^1-w?|d4tS|=6jf2yF6%NnE>^MRv%5E>c`kju+h$uM^X3@i7Vlb!e@6%7P z1Td;(+qhO5z|FFm?$^*cNLU|sIgq-Fe_07P6Y&vkRQS>WdKu*YO|~yxe0_aM^L?gC z;O0)8O$jeu6S^MX+ASWdqE1EaWypU6mL)JN5cQVV{Lo|AK{ng=&h8bULagx|eBfc( zq~GcVp_(zKeUnq@Y!-UzAR|C4#Ua2ZIJ_C_>(yM5AEpw-c~8{CGPj0~EgMFq*+XB) z8EsBYXu;K6fpQjsb`^CPwhTPd`(7+yU`34DO_RR4lWRFg}Htt>kXgMVrQuk zM;(!jFkWr~e#%RMoREp&U$ltL%$DGAVDiiyBp_<)#miN_$SW|vW*O!1s`e?-dZP!% z1mYhUh`gJ93Cre^-owv-1f3qeqwP6;oq<;OA+H(B$SVJV|HOg|d>3~jqqKDKx=eRn zLj!I>9CUgcRv1ao_r30WELaC9_eQY)5j~*1yO>nN&d?I9!pqPWY0~)~24O^GQ2k!u zN*(~_2hfNOa%Az>i%0KKuk!icMI;2Le1lEg5(pI%ruIBlCdNQZN}dDhj;Dsg(+8$P zl)ndWaBd#l)$20*f|_feYkwVfXkd?KtZWXrkLms!>Ribw}*O z4fbr<66q4sa=Px&@or%UW(sP}TTMwv;nRMx_sV;Ca))7(2?|g?PnRuqBaQFDldHHN zUA}&~%0lmoGvD+R%}lU{n0w?W>&)-C;?q*xWxTNTvuB#|Z9~JE-9ei=E3qH2pql3^ zB+V=RVFY5+?j*5;Q`%+0pQIfzkrSiHre3~#g|Lg(Ap7IW13>#*_PADiw!XrmxwNe? zvP%UmQz;}awAv==Sy>e*z>@NsiZs!qV^|)Yuw#Y$#m{;lxr=027=jQI*jH3~BTRv% zo_!kr-n7MT61nBzZD~xyIg9^H z>+H&aKjP`{n|iNz^?*~%PRvz8VneAiHSul@$?)KyP`>3CF0!R4z#ydRYHwZhG0P0+ zj8D$UhiN%E=R#|RT2IQfiSwuxo*%hQl4!$$PiFVx%$z^QnRxBemBZsCQ;0JdGY?~ zd5n{T4(AscxmizMvGO@``_3I`Bs~$~q1Q{h7>`*gIK%vHoT6ee>-iv1p7^65IrHg} zrZ{{3gtMZC+HUrpyLORdu3T&u(PDuO8$H;Td07?}Eeae6Bc7fto1g6qFKR6RfacV( zyL1jJO8{EoD!d?!0W{C7d9>OWAsUYj-65_YdM&)H<6fQP1Y}|OLX#6GcRn2rDzKn? z&8EN$@OTckUC>Gcm;w;k+1z+;&DPy^&8NcU?|i9IitM^W8&uU|hq=4#G^GIn{SrkS zgmFfFpvJ%^!nmsw+LZd8L~>z))=3>xCkpO@%-be}+68-j_hz%PUJAiIxAj7QWc$ba z+gB5gMfZ0U5iaM9@q5I?$A+B*UqZp7!xTyr(fF>6qm-c&#g}jS26&%=f4+|~uY3Bf zPn4Brmp)PY|M^9@(*EOD-A)3(xQqVr>#uL)_kZ{8|NM&o_y&K!;y=Cte$fB1Kf-}^ z-(G@PMNeu0{_O+*eZBvGe4#wVoNhKP+e`S9Q&d@uXhr=s}PpI zin@F*KE|+$(*KtIa6uPx3o7%TXH*f-5I|o$N}>!x67odzk)ZP(%{26N<69}Y*Q3Vu zD|o!y;^k#@TlUU9i=S{li(_ZL@H2UITz-{B8;Ruy5LY&j^{9kgeD~-u#(6;Z+d{iW zDNlvhFZlQ&q`{m_df(rM$Ddy(Px5nSCzi`CLpdr6cqF4J;-zY|k_)hH)rFoS#x)8e zGP)l5x|V4C;)OpNt3U4^iM^{Rai4IJUvV6lUomsyig5|gS>>NBsZT>3-6hXLOG~10oEPqBIgx($YA9fP{o}DIi@E(x5O%cL_+BfP%ENN`rK_NQZQT za5uj9obUVYI`^)1XDx$?XP)@)y?^x(pr{~q6PpYh0|VoxjI@L@2FB$F@JAVO8J@n=RTJFapnduv>oN1uwPulTQgUeixXl0}j1mYQKE4X!zllAx zj_3gmeU+VbB=v+cF`-XxdRn(Z2WrE|I)kd?8|feqb{aFrQX4JZt#Cp@LL`b^zb@L2 zC8*{e5;4t*YVY`3W@;|#!hai$Y(CukxJ;C$sG+13?|zW-_~?=x@%3iqRD1a|x%@gM zQn$}?mPf~hKkr*4sGYwGW6ju%t;L<4=L(J{(wN?G!8|cpw7!NhMjE~}qN1tElpv<6 z8dF1McGbHgBs?L3%nxUU;TIogJWFtq7}fKVQAbBdLP;gUCgYNqFJIog*+*-*G5m@p zp5^uk=9}_aQIEs~-?#Om_`2JS`TJo6-P)QR5>FK#g}Sh35L0vi(E9wT#(aFAAbTh! z(RO}$9+B2u)jk(xu||K|8W~|DOvTjB5i=K0LK_$IzF6LYUtMMB1B1;c2AlR6ZGuR) z+XZKbPxaA?YLEWL`m=1Wlg#eE)5@ER<36=xEXi*e&u${dwv$^Ke1^%EZz&S1xXV~w z?)Jl6R{N5-fOFg%G(O5*r2f;VPwItwbeCgdYLAV?W2w;X?d^x|A~NT(_>p3ajiifn zb2Ml)>V>_1NkM^vrlzK@ZqkPjcf(9t4T@NP%Gc;7{>bQ0ApCqAhj^{{S0}~jgfo-D z%x3QQT|Ff|ThTv1>Mmu}nVE@VeX!n5FBTD*DSlTs=&ir5CsOmKEjB{6Z?wprt@d;< zCoj8-p(5;nf;VIDjYRXF{GKXaB;Fnc@2qMiX*G_jjpfHO?&z4Pm-i_3MJ)U1b8nNb zv>NG*zc8&1Z_7MRWTXkUxSy;qS~6ukaiBZlLi(cSn-_m#C&l^$%fN%HDG}Re>QRHc zm<|o^EX6Uoj-i_jo7vyslwC3a%E;iML4S zP)%z`9f=#Sf#gd^`^HLleLi7Hm!Y;G-z~oOg;2g!q_TR9AhD3)Xft}c?vC!h*w{d+!pLBNaxz~kH zi5`4t_i%VQockqZ&S;QqCd1Fy`6vwd2G= zD~emW9RDHcGW776+?^)$$hk~i+Eibd$9Xc>^kYVCCI7VuZ%@RI;~>|d`g0DZ$i?5C z2V{xpW}PE1)e{9@BOw$*x9Y>EPiCGcGs{d<1g?9^Ud}IVycTVo{{EuZLd)w9ax`$? zEPcro*v?uYdf>GDr$rT!=8=D0O^q+*$^8TYt-|7R{zKE(Z9(+t@S@}oMqyT(<}!;% zEE`z^pA|Jfh!~9^+8kL!V(0}|ZF%NNah|DmgguP&S~TNXJ9-lwzT_O0nAkD9g+w`U zw|90D)y}6i;VWCeKFlE3MluXHiIt2CJBW?pi1B_aOQN}k`tvMBTF~ug z7r}0u9n^!L$@YQpkS@bk>6`H*mBH;dzBd@+&ueHG`X*h`*YCHdP1Qb8*%;!-Ewf!! zKbo#};^B6Ty%rp^#!>gpyKCoLidSfnt*tmAAYx|emXVYgDr4OZ2^5gUs z^#&{%bBuANzA>yzDp4FC=)S&v`*wDA_O3X+S9I&#CKUw70+I+)32iP)biZ zPfSQK?$T4#9iQVpMOP&}ncrdd4Xj0y4gXve?QktfA55fc@NQlVV}HUXg$S{`n@ZKf ze>8laEL`dJH#8u>qxJ2(A0w-HQlqX^XeY~QE%tDWg;_84S^3r%Or$iJ)mcvXDA=uv z4I$F?=dxH8quR@V553%$-|WVVd*w>f&b>t@?8KZ0wO0j1G2}7Yg{B0%96wOiY*F^t zyCy2QW1PF%p0|g;S|R16f<%#K)Oh!84FCNx$N2mOmzf9?&4SkqVkR{;_2D0z4pyUn}6EDp_5>>F(9YmG2^tu!i4dA09wZBiH zT+5i|n3x;NDf<}KmHVfig3za!n1YF{89$;`{e;h>L{^G0s3i*U@N3-;vi0GFiMVV_ zu+)wOc<&vPyXImTeo9OGZd_vY5{lNKNW+phtjU0bR8Ch{_vX!;Z^ft>81&WETZ~H* zI4EBrq<<07@9f#$=Hp`IH1TaK@I&T#9BoUghUBedyhT!@zr5)#?4+fBiy{ol*xlHq zdg;RMNEC=FF+Tj6Fe9G5P|EGb6RqE`7$c5QS5wQg4LRpAYB8W*oIc4rtVU2rN4t*? z8K+J^!;^IBijiGJVms@W-a@@+BcsmD8qKd`@#X$pTB;-89cW_u4w>hy)D^2@SUk@} z@0U3+pcqlbCKb`~ye)9(#rMc_#I+y4Bl~uDaT+6)`X0ReqCeUADDc;cIW3x#vn0Co zxOi?LNI#DXy<6$ZBWZ?6tE#HXZq7D-M<%Hh7>Iq^eBbfNxQ&7!pEoL_XMd`IT^8%O z{=KH*o=Mkc{5;?M_o$j*Jsn|OflQbxbKI9jI{oR8$JCjOTM(SVy&;dZFtF>-46qeL=ma(t=uoh#B^on_w7Nf_Q^J%MQNc5+FE+P$UuJ~ zHZ|@ag}4})ve|m6!N}h$E1aY(L_Fj#o78!jSo5Q+3Q}jT-7DP7!zIla9u9vX$z-O@ zIckTKjiVhQH5~svlIec_yg74X0%;6idr=IId~hW~se1?e>S^);!LmeGcz+Y2iGEx$L{FNkJ)#2RUTqF+-l%p**CGO^~NUt7EMm| zJ2Ls_X7RCAM_7wtL0fLZ;nxExM3QivG{@+9;Fa{Z*VFRGFnLr}PhRl4#H3Htd{d5N z(5vJ!NmwP^z#3#v-=q}zP$2UoW}uR*S*9S!HzYEHyZi&0>?6PQ_x|^~pSLOd-(sbqIZjDsmpZL^ zu~*>3VMq2(|LL7~$g$cD6T|r{w4u!UYjGJs)HqJX-w+R|EsTE5FJ3)xU3!HnKQbS@?N}&${PIHvAnv?}K@> z>eXy>{_f|naHILb2Wl}|g!i^`im_1|{x8~bsnAFP=ih3t)@!#6$<hAh&r}Xj(f#d?=Dub6&8Hn(Z9p7xZ}x{?aFkYFr4Lo>GiX_l!6!Obq@?I(dk_0!t!m|GjBhk>aL8?PNa9;$&8LB>|K>H3h?o{l7tx)9Nwz*g#X0%XX2mg z4KZ}94%S5T&9Q*#-QO>JYu}9-T&llB9oVE4t~wMOp<=?k!Z8wf?HtYZ{;uPdJE4JQ zTRw)DJu@)7)gE`ISN&S(C^kX7aGdRK=OS3We8IeWiFW*;X56MZSXkpG4RR+|K2k=CzUsi+#Hz3srWmw%_I$P4|+;INlfbBW|2w z#iUG1 zjEtE&A}YGN!lzt#H+`t@5|uP3umm`=lG+rEB7)W_J#?+MxZJjUXdUo>EF@I*NjVO> zcxSt!8R?}SDQG6r=DgnfxzTj*UP?&v8)Q1ET&VZE^t?+d1tcnJy5?a4YImql6>4=O z5+^1UeXqG=`ZPtVMyd}QwtajR9WsMFj8-Mi$jj;-tFN1pgid5XiqQ6q4!se z5{0P0&G$&`@}CwX=KCu+;WiJD*onwnG{H!p&gj8Z4Li~s-14FXy!8@@7c7c=c8#57 zq_n};uxnjA?wixRAXpgQ=Y0Lc+com>iX9p$)fV2Vw7@q^V;6+$6X4rvDQV@Hob;tK zG(G%NAnq;h7jm!H_)ba^&Zr(4@^~Cwr5@0UYEt7(mr_c|PQglCMc!)9Bf}=*W@>!? zWnN$X4lSDhiBMbma``St@B3LRr$1`bV+kbIDK`yD-uIexalE&b;6VCj7BDM|e|oXT zXqor-VCyhY+G&d^_Crl}R&XRPF}DGW1VTj)S7m>2jmD=XV4f6Pr%hE$OMyBtQfaZ(f7`t@bbv9a&8n5$q@^A^hA;LAv0 z4c~R{*eOGYGMVI!v2nT31POz$xikIrggADZ+XeYGQ{=sgZ>~~WVJv<9T}*O*!~vD^ z+FqQf`7(VJZN^8|{7l)R`Jz(opMt|j%m;e0#BKRo$RD;6KI=K@X1iTJ_jCDpzDeD| z5O~?=-4>}jSau7sg1;-rq3T}zz6a0gTpbFj0m-p zo6Zh0?-4unfBuMr=|hbt#eMkY%B`c{__7Lu?mNy)grI;-eq&$auCLP&qN+WvqJk%S zLL@S}^WQWYaUz9Yfp8*ra4STl@X9Tpw@7bIlZ#J~g-fJ&uQCa4hZ~d9z&n;6r}r-E z)6!ja3Is7`X&?VqfXI2(yQ`P5;L{bDblFB?-qmaH$(lm^Teq;Jap(z-ufa=v1R)~l z$;DUTl`4C5WArJ-ExFN)?VY`$vuY1z@jj`8pByNAm&C)uTUjXFd5GatPNCsb5|m%x zfk^Y~?=`xA|4B6o4%e!=cnaSBE*k%qJKn{2AB2Tx!vC@_zT3e|%$rFN{v-U>boWIM zM;^IP=Fgu$+3Qb>VR#=O9|P`JP*B*~+9GX;i--4>I-(_{QgC&}kB?UiDTQ52Ek}#b z{+{sh@@D7caFOB!rl$tM?v*l81xTdehJ+`Jc(faFlCWqzc)d2#Eqd;Lv_0R|)rFuA z-iqfksi~=vla~((2@w_+?*72v1q?5zNY#Fv=)j(pkfn(9RUml){`qsOAp--H$Q7v z(4f72e3psYK1y%zMbJvYH;6wL6@0z+p4+T%sW*d!O~>^4b0h%)bnHJfGcT;I*MI-^ z=BRU6zGW$kfpIwUSXz$0ggh?d;oUBEeGkX^_L$k0u&G6g0GyS?`G^nCQ_k*DWb0*}S>|2|zyK}B39U3Ymc zNyAzQuzeT1lEe{!#Pt;vte5+;E?v6x_U&7Xp-F0OdQUOlj8!2fVrZ8Odr($`9h0_%_`etTKQEdZ*gTQM4?vLBxqeMhRwzs#d zU;o+O*~wsR@9X2FqigK%C!oGq_wtFnl2THI+7;`5l%7-suN>aZ?ZxSPGBGo|ZT|Wm z!>q1M_|nwW)XK`rz`*WzV}QQr(Mwpjz)A%K1Uh0_eXO7yDPN00V~8%%Z><@vJBkN7 zQz8@Az!&C+3tgk<=Bc+rnB$6g`cs3$%gzo+42(Ai?=IE*U1+fkOQjalP?BPPmv2Fn zfR~c-!|9S=UWeyu^pW8gFNs|!)>Kp%?L$eU=NdUaIr+^bIC6werCnA@@mP%u*VW8} zhQUE1flC;hkE(5FE~6M(SU$~ac7EU|cr3jURaC^`a2ewlt)hm;NW@@JV4y&;fR6aZ zzR~_?>lghD7gxapA zS!`}@#A~CjB_k`FLHB?(c%$y5Kt(|n2-t8>&zIujD(5X4pYLLb z$tuT==H~2K{wSP#CpwQFQ8O_ui%;Ze=khO?s%ibD5O&@5Kf|9pJal$)a^m6Pp^wT< zOPl%i%XWWFGnk|KAqU5+xz-3!N#*FFoF==v*hEAq3~QXX479bii-_fu1RQ6ZL#91X z{xtaE%@|#$qN=?nsRT=?lE(Pw`$tO8NQg-8+|kz2nIPiV*3{&weXR5hib_RA#n5mT z7UL9?&<7!x;?z{JZHY?Py_L>HKK<&~o$c)_6P5N!+V+tzn6tdx1x7-W#??t@S5{V- zRI*ugs|XG6l935qe1i{WR(AH#z<^Gzt0Q!Rxm36gyPKP~_Vyh=e}2l%t%N4_yD8|U zkr5KbW&HE2Wuf^IVl2HC5H`53y>PotzF{*PqN>qeCO3 z+Kd90swjVaBlX%FR0lOj_mu`GDGqO9r*VlU3-Ki5ad-L7{=Vn-T)^CRWaObj*p8gk>7s7AD z!h>cgbSTKNF#!&ah>m#*e!IrDwzi20Ar_Xk?fH(sCkGX!r9$=#IPs$+^O0r=D9}ta$xLD^mN(lP3qI>&JVmFk7HH-@SWBO-)TYnN3WP%ngo7~5BfVq>8*ad$4pXgMn@YkhtFF0RSx;g-9Iz9ko|T+@lKuRunFR%6&4 zOg(wFyWC%7*m9qld39;&>a}YT`6M`)v)|rc@i^I6RaVBv!s7QjtAW$^?p-syuT|?a z9o0*#>AJ}uKTyzQ)zuGR(ne3bP*zcq3L)ch-h56=OY2%`RMEe@tX7fb(B>|2l9zR6 z@_6*ehGe-AdMMa}x?&^_}Vaj?c<_Zb}ZSB48I z6Fc=vO_e-7>oojdJ|Km@J~K13yI1n@<43dp?1-xb3PbVSiTmOHnW}YzvAjB5 zDC&9Y3^fPS&}nVtQNi^4#KiNxVSSh|I}4q(JH~UTwvhA)Y{aPRLJ>3l3ejF zkHrv+Ud=;l>Y1PMTSY|^>?@bsZoq>^=oo|ySZ_j`oG;?X9UE=uXh&Y@$kZ6y!5)1C#OO|$;ik+OOuUb zyNQi`YxONGeP{+p$H!B39)f~`)iKsKW_QY-2{eCAPe*Z5_STtao#T-UIIIjXy?i-; zes)j~yZ$jZx2?T>dv}+RSr|SfDq0WYa<{zv%a?Giryd@EX{AEpa$JBZN)dOMPOwgQ z%ab__n|Btw*>$VX$op(;7trGf`Itr%R++Ie{Rg8*Er!Y@k{J~E;l!+364Sk#PzSVV z>&Yq*vvxZ9roW6@vc;{guF86;-9#WrxlO~Ny`WmBr|X}lh`@#ZTv&L%)j|nl0{TQ= zetz55^4wfzZtiGL&vSEgICnDXgyiRpfp)K7tEs50zQcscF*H03Q-pzmL0wgKd3BY6 z?qX~RyY1`LIKNsODe}3F_uAgx;$Syo;8c>}p@4v1rQJ2dy95L!cJu860|QWGH%QpN zR#pbwEN}dzS33sy?fdsj)X%^-JXSL>_zlNfVLh3blhZO|d%U|WuJjC=!{f)zd8+vj z@8X8FBnmpM!y=VFhEZkx?ad{CsNg5UYT^StSyBSElFnr*{5C&7KQvUq!@~ox74!Z3 zbYbx@d`3%5>QyTI&9inZ7W$ufZ`7Yp4GqP%%ob^Uf@US^yeS4&hm@3*rFPUzXkOlZ zVeOti#dql+p`L}9nPD@5Ewca|yMF#;;pL63u`o9WG)YQ9p&;T3g$^q#C|dHhW6>)j zj196Vf40EK9~p!?tN~Wh;r6D~wRv2Jr8B3|*VmW6Apt!(HB6O=h{)C9-f_a|9b#f) zBBGZD2Flvn%&*ag!PV<^STe8*5Y(>pejn11C}U$|xMa0(8uwO*t7*J?@s*+a;aMn9 zXp}Uxv=@~}NxAXo&!lS?9cAvLAfe6no*qTJw9ru8BNZtrKTkGd{_#j_5)XL-UFojm zbgb7KQy#y*T>`rYY}&SVfb6ge>>u9kz4>>@+RSj-rZXqzsu3lC{#UPFCGy!&z@YH; zm6VqDhh}cN+Uol_O|jL8vn_fSuKPQj+kMJb0MR|%-D_%V^=q6t0DU(Fk+?ZK_xNN& zBfEb6x|F2k1q0BNq(b&wyVMiWnNC}8e1 z*%UYZAJc*32APN=%<0cq8LW|@g2AL-1htWoQRCtcJeQT8PNTJZQEYJCu3z^9v^Rga zHT$PPRrbj2{iE0al?CVz85|x4zBE;Cl?c25x_DyZ1+0L*J6Id-Uw{0nQU|RFXBF1X zvM*@cMs5*K(8yXNao6v_K-K+f`@+?=Dj=XOOEyj+MT9l>v8HBaadB~FWqgxCOiWCG z;|(m{MmXy6$=dWI|8<+s2ck2-FCNP9MuVn6Xw$-8XF9vO0AA3FGBQ|k9ngR>)6;+N z{~3qAF>uWG$hz~rkc-{(=Tx<}z+a#pj8{3X!bPT+doRY$K)DRl_}2us07X<4BUxIq z%T2S^aO%g89|K-;7ZHUAC#UjmiBKhyHQvXR93D07n5Cn#wQd1SRwC)pP zb2LL|Gw4^;ZJeB(Y;84#-hA)gJyhBQc6N4Q;lFT7pikGIpPkfsoOC4%yX`J1MM6ZN z=rrqa}ViwYINb1^D|v;Nr^g<18(YTVGqVG%_kRYKt`KPKLP_ zUijnT!-wzV$zdDy}dobKlTwF9o^U*y(`w<+`IrI5of|X1%o1#xOj@No3WW0zxBjJfV;ib zU5y4|1B@?iY(#;*!u35mJbcK{e-o-@d#(+UCK*J04HGjmDxt8@=D=NB@$usYn2zou z(*PJ`WZFhYkASTu@>sFj0bYP7+q=2|1!k6)m*?kO01b(WA-eru zO#8?k=0G+f=gnVzS+XTn z=ko_uE_Gz?jPRp9?C+N^Uqa6*`T*39p9K|pKFVRJ#-r(F;Bdbr)PeivAUK_oJ_;cD zXq`+`#gnH`!@#28j7Nru;azu{1d_$b%v`8Zl+J9YSLe>}z0ticS2yoL+zi{r$6c zl|mHVy}hr73v`j;RqjH)0h&$C&BP=mv}hJqR)E$_fh%3*fM%UtTpXXKWwK!U^fv#7 zgicqI;Bds_q=&D504r&2T>?r1FbZhsg{$KjK%f!sdXo9l+rU>TU#JZFzut6R6I|&T43KFiLIcLoTHTqfzs&%D^w)R z%FA1sn;Yn~3J3`y=d;%7W|7s^t@Y5Ky>|^p4!c&VDbz^)*|7yIerU-6x)|gWNZK>&sH>%zuN%U?sQ5o-l}s9%wju{ISuzT8N`k1D z2#S%G_R3}DgOG4eE-oNP)-PVXc=@vIMZ>%7Z2I6=Fs4#cQeemh1OyZovddI@oqGbf zfw5y@vHI~NV=za&2nZ`DGk%n<(YmrOH0ZB7)(#H4K!03>rbzVNzb}Fh2OJNYs>kP# z5M+{<&&qgiW|muBE$G*98=@I)r-0T$)KgVcgV+ofHnzE?Wg{sUY4DZnxVwMG)n#Ou z=;-F4*#Yo@hT9TKPJ5(N?>RX&r6(oT($n*Rj_#@ zI16cz49L$vSxoWjvw>@)p{?D~(ZQ}+jMkyTx9~L;vH1+G?*^*1p~0tAt5}@Q{u?P^ z@}PoyS_W{DKPqKl;!#+dnvN)I)7gj1QI%(9?!Ox-Uh;(zYlEwfX$S)ukO4pJS zgCw|UNsBO- zcXoDQjwmQS1KK$t1V1qaa`N(uI4t!5i;`4&W@%{&P}JG^5DsBX;~Xq}6Jz7PmXQDg z2KuMTEQHv;C~8S1@TFmqDm;0T&bZPXat96*U>1-8IMc0NUA$aeCub)cGVK8F&vv>+ zErttJ6%{vkb~@VI6Zq}3;q8iyEbQ#+>guAlzut&Z9m3@WMlc$`RGdkVz{4Bv?KQKu z2DT5N1``vrv$GS&3zSnN&#Z5iZlP@GFZYDnrE894+22@t$tkp`$G%G!_a!{KNb-bpesFffoM?^DJ# zVl5H?E@WnLQP|oni?L&cCK6R*|(o2xHzwC^;@p9Zn+%TENG(?mt@*2@sV7=DfeN(?BYlOz=t1;w2U< z56@tC_fv-eqw+br_{2oFy_G?wjK}iHLj3IPVV?QW-Z(foKs|^PYU)fDK7ljY-Q5l9 zYD#)~I%qEdv;eqrb8{z)dL@U4izyAjkI)5D0B^!!o}Qli;ZedVIs;(S78Anpl124Dx^{s8U(R2b<;{M0v3HZnJW#dx7Va2g>{AFHa!sOQ$!K7ka+ zWN(_UUbw%z>tJguhJXf>otX(}|C3hP1sm+?v0b02^ur~mVX8k_ufB8z6W}FC#}_gT zFsrVvg1o%IIZb_i8%xU%utTb)5@rY{6V52Q^Lm=L=`>~+sM;|N5)ST`r7&CpcL(3$ zD=019T`jC9uH|8(qWU&AcH9=lFh>ZPqe>k%{-)8fF}-?Ea>Kinl=T3_VXtf9keQgw zK#9e{6bCWB%?QG6hwve6Y;3qVgp&8@=wNA(l9Eo;xRg{?X+3?qu`-ySvd%*nnBMvq z0bQJ~%GAsZOo}L9u&2^nZZ$t-Vfoq6VAvE$Wb`^nf~oB^Ye5D@65nspQfm?k5m+6a z4@*Z8!Jn3Ywiy-zz->(dfp6F6%QKJc@{47!RZ^=(aFrWIW!`hP7lc28uAjE`nS#S?}cqT0aaMIR%Ag(i>MVS5ftS0CB7T z@6+`%i>!lI6B#$RlWRAK(eK^`*1dfGTug6iWu?w}3uVqMK~SN`r=(mG`Sa1IWUzg} zZiR>4t5p)+b@~r(;P}L=W7}jFlv|dw93)ucnGh$sa4QtXgIR z*lJw&@=OieBtEbKn19BY@#_(Vo#`SZz~6mgW6=C;C6p?*qa_S(EFp4c(Rn9wNdf|8~pc%mFLZks92Jd5A0IZnCMzq2a zOeZi!po%t~YoNI%!6M75-pgDVT|N*5?VF60G~AiCjNV}xE-WI=+xv2HrXvhIcM&f@ zUUa7Td^S^=9q9ycHT-$a$4brg-M4&eYyZBvbcKb5Wo*0XTT@fh=xAkLo;j?A{%m=W z5c$mrm%nw3oX9%xEz|maR1%yVYnIFEu`snHDb1$BA(bq;(_XZ(3ejg0lzn4Y-zt zsVR^=sF+h|>M)_HEg-A}&f?7A;GpQ);jH(y8`jfxR?nY*TioHZ8q3Vg+|^r0c%0MH zK{ybJICK|D=_Wy36@Q1r!O4k@i)(Fd-PO?%6db&}zYnG>_k#x-W#+2THebHHcXaR8 zt)HMm0QPC!xCNlsWd2@t4_-N|IM{?bD0W*d$B-bTe?a*3vwffc>tcuqfsI;4D|H8yuA0Bn0hIl zm%SMSm6epBSIbIBG=k0M0>chudO!$8Ekrl2dK=@<`MB%pQB-F7AzhDmbC+=bK$}%j zR?dE!!ZsQRZLqA!8Vzgm_TiI19J%~G76BgOtxZi?u!A%->9A_RMoGWI-d5f-|AZbn zuB=QT%__U{qhg&X(yEa($`>Yw!A-AW;YXheiP?0d>+Bc)9}+`jOH04+lZDL!sJRCU zE77JBxcPt$!5G)CbJyG!C-n%N-2u*dG)L%%EQZLezdzN%kN`hFP=LPHR{x(w^NWiB zg+Ls-&&U`a)@oz{H39lRoLDU1AMgNqI(RFPh6%)e>61sqGnnnXrT~6I|@M-S5%}teD%B3tl!<;9p)0?Od*$T zBXm!?WYFa+SK2N;?aH*|)#mJu{as&JxB*_+I7v826WTK0j7varqZIXo)aeTg3qiBK zOi;dS_6#FFeOd!Wy9NGM$ec zSbIgleY)}A`hsxDfU@?|-AsDq=gfhtfCwUA%IF>r)uPPrXqz8auVWc_ltEPj;Z%+S zUkm7Ep}r`fSgY~!vdD&NK-JR|x+nDEr+@##x`5s|IWckn{(bQCn@p-QlX&q_4exFe zAg)49&GASorFiV$*31G!GAG58?7?%f6cG>5v#RYE6^h?N)4h86JM`r?r>VBK2SP%p zAS4+z#p*eA&EGMp4|gf?U=E_BMJqIB`Pxu~i6w&R3?@I>ojW9igd?M)fU2F^=RXb| zbioQ)X9}`@CQGt7m65Ddu|BPwn)qk5WD!ydz|6?cg)>1s4m>lkR8&-KDe(xS(;g70 zPwkJIydJR>MOug9nObN+Ff?R6UjEswD|k|knCYWQvYeaU2fM|gTT&}9z3THPYvv`|eC-1prp=<`f#kufTo)3>Kie6j@Ov~l zYF?vt6QjdO4XIjxL6Bnk!RO5YHHdFLSQy`m&L1`M|5FOa^8QT!I%51TfAhb$^8a+R z|Km6R4+b=R0^^?}{ZAkPM;dwTku*OB34c!p~W3&vJfAsp6D zxG>}I3cET;y*rD})kMZt>-Jt!L!S&vT#sC69Y|X*9eURq1S0qq$YK!HxNyh6`!qB(a5P_j`y84n zc)H-OfYdQHbp}2K=`18OK+yo51(uqdt7|g9J*HtWM|n}vj9n!Ny`iC@q_Z&S-@L(q zVF?Zrh>5wqj7&^zlaonvqDHOZ(2t%BN!XzWn)BGS%W({KG&EZ0?MjM^zv>jg{Q_-| zim{CNWe7+}On`J68v}I~spe4?VlMNRz(B*3m2fJ%|_5AEgMylSrbqh4>Y%oC2qNAcNSSJ{8 zU@AfhNpOk6_s7PZ^aaKbb^uK(-YkEGw9`@p)mkz1j>^A zt5=|IodO%l9FlPOJd{5ctB{%~c1CF74dViY0ZFBF!?+6{v#P4k3(!JqTN_-a8-_Y6 zDzt>y%h@0XK<|0>42?`@4&Z>&HZBQk+M?s)7)rEZ1zg+?DuB8e zhk)oHGPm$E-X4zq!W|hh>P+BCXYK<*4}0mVgK8Eoc2jJRJeAiI-ba>u0IDG37KBL$ z=fXRk5ojvpIET35#uqelG7yMEA2z3j6P(G5+K8f;H=or43I(Y6g0ECmPzpKQf-3`w zyVgwv28PJ5Hxe{35J6_1gtEOT4vzip?Y@D5V1NISaw}~>O3$8w#Iy!N3_c2OOA8GS zmV*X!<3>kot45UraK{G^9)PaK&wm6i{=FT$^rNVquaG52nF15BU-+3@SQsaO(yI6L zK%r2OtAWOgkAmeF$pZ=zzHWrV7hu~0mvjd~6s^i5HH5bS&<4Q1vSKc9y$TEDW4PNh z#?t#evwFd%v(QDHLk46TSe2m91t1e1yzrj8&sz2aQj;ySlc2h#ryD@x%u2^%`Z|2t56{bHyCT#NE;1)~kq&0jO+*a^`-`-eE?3?cm5@5zpKRn#( zV6O*jEvLL(O-jlHfHydrS%CFmG^rQp$S6faUAwEVYB@K*L&~8o|ZqWtpJ~43|OreWaPQ=4g#;Zm| zT?$6)g^dc=B6}kvgV7ue$VmCk?QQei7N~Lw_9rib!3l@<0s$MiHqt@_{mRU(RLd39 zo+T9(3>D1*&111c#YIKbJAOcJBBCxH`GtiHTNKpKl$B8n$FQCSmAX8scZ^Teh(#YG zlKf?FObby6WXWP(y?p0RB1AGqM@J*xw9nhYkOdNTGwBM(Vdmkrq~tXbe~FaF&1;*s zgX>^k*8+3|y%41i88}8_hev!Wz)`B5*n{@67roB^Izf(V>Gp;9(epVN1jLXK$v9^> zH}MJp82?he|NnuEnD$<()b(rEu6^H!?>sPt9L%4G)cqD7LYJ_p35kh^2=X{!$tA1A zQ{WzBzX@Bj^&BQB9?_zFDuzN35fj%l2ha=znQK z*Q@{F(m(KaX#2IgTKpnI*h8DH6xU4m@1?01mIIC)%fLQJXCX`qVuxX{XecocH#g#{ zcj%&cRo3eEbqsgq-jA||%3-+Duy~;ci@$v786Ljq-hO^9AOmP&^Fy;F=Q5U4f9BIM zzXCjPc^Ry4z}PZT^unH}U-QSU&COl^9y@Le2nvpaV9!X{$CI{7Kt`4j8Tn)0PP;uP z%NoD4p7|I=5V%~Qbt-RJU%&oK9P(LGXZM!wr6`I)W(CB{I}opdvQA1)rXV5VgS;uI zT9vbTBO@bVidTf@!`G>Jw009at_fv45K8#x|@#SE}$V? zZVY?_)Ms35Y=Kw5(NH_p)z#2#VEUmx0$m5}3s~wuxy3d}Y{Rf$BFd_>u(T8cjwmbJ zF*j!fjTGDmbPr5vkcR>6LXKIxFj$Q0*Uk~(DQK#o;GF|Kg5wlP*;rhJ`{o@0n?qxQ zd}eEFD~o>JU1|rgfB^n4EiDC;3%-WXBb+1zwLmk3Xqx~mf3}YyomH#yo!FfL{vPk8 z&c(sO|9Xwo#md_H0-wN8T!lm+bm9i!-Jz7CUGsLZE97_Y(h-;sZID$R0=7EC~Aj1Uiu$#Gu6x z65bVj9gJfQ$&6OBst}&7gNp}4q1Vwo$?*$sD|R?p+OP(v-FI##cEaVWtE+Q(Tkz?TCLK_=N-a&Z-j0=x%yA-;>1g~bURK|r=;mNuJS4I|Ha0YvJhxw9DC+uE=$ zEL@v^F)gO}_dkV)1_#Tcp;uT5Y~|)sii-iH1#$kuLhT34zYRL^*?RQ`q_lw&g(9(U z-n`fL>GNkv(G6LTI33>M;b9wn`Pb_c{4ai7g^aQ>c`4YV4s?y?m2jP ztenW-%Pl}Wj~8;f5Hw@a`MR0ZPLq)ZG9fuRIVUokT>>9wC;*JhZ{M^TsX^Mr7i!|- z!29~lJDfucf{TkeYXKr;#hg|{s%;b;9f(&1B3)r+!RiB*%2{X%AP{5}*%NLVPPkr% z`!sxVJnH$Q3be{rz&HlU4JrVN6K|kw#z0O!zH_(=kVk>gzi{xY@eVRhBmam9C0pAEDPYuehXn`I4eywN zybmrY+;MCKqkV3QR^Elch2dlVwu;lAUtWG{6j;_BtMsoB{Ju#>Q)z)=H; zn04J2CKO<3C~~7sG)FeyTcgXp$5${!T!s0lK*R)<0U*O`s0kRLKu{q4`3u%ZAo92E zLx{iuBLy83{JN>BDLhJ%O!eqvHopceJUkL?Ur3KYW16gWS{=M)p00BmhpCeJ= zFfegqSPC%OFc2^Ah*IJl^Fvg z1wl#;pzeP|6g?TcUoE63PnRI47QK@%DFZ#t7R$Dd@C$Ju;ZX_czl!8Hr|AD^E4l^wl!p+8ANN{=^oiKX zH=fM$=FEKuHXr=kx0x#M8lLt)73ClWv&huV37t(dXzsv<|_3RGKX`0|Yg2DX0esxkgn$*e)CbOhiOYvs=)-!O|usAh?oo z?;oB#g7-Q=k$|EN3hDC)uw(%X0A*V~{Z9fC)YT7(iGtvfLl#iH;>yJ?c7;6#B*LKZ z;j8^(s3QEH7{g#l-epaZ6=Y}gx@^z={%x@2@^AB4z0y=j?jZlrP{>u>e()S4={ZEn zz}bb2=T`{)LzzLd(pOdn2Wb<~!Iv)=p}i${2nPN3ssB^$mW(q{XNu+k)rj8Z7lot} zz?*`C0x)vtc&&c}J=g#8{5#n5ph1IB0+m@@QUZ7LKxG3vJq7*uhX^*T<=sn5$vN5O zZrKH_%K&hPz@q`Z_r3i4vyu%Q|R!(Jf7=c zf^xYw96m-Cl?vko7VL>1$Gi8CwnD;sflYw;$N>^471bj-0M7_%F@eDJU!icH9ejB& zP)>M(+uQU%?vh)A;;>FWpdj@q!xeaRm6c@(;fM=j}E7FGO=+0JpZ1frKxnHrc--{`{|q zQ{5J1_uTJfP(Ad z3N!PCJZ<7VX9J0Gv^ z{>oTz=5cBgOH=$tIkRLJ635>kf{=Sn&W0pd%9)b) z0&j9$<}i;&kP_XXk#xoPm5dcWzrIs@P~pWwjcG(uaBxMx#4o<2|9waI&jFj7&GxB)pg z2%eJMLiMptm}qyc@2vbd8`!BkT6+6f0OtvCcbK^TS`QmD}W?;t1u*Q^3mRg9z`^(!?wY(|bYqKqMI`AdEzRq#Wu94x#JhsF2X)HSM(&l5*HxDZ9ZP`{1NTrun+Na%GNd;AUaORpdPrdc*Qz(Z4-l)p{Yg14!OiN* zO4wIGA@G}fz&(R#A$0uTuWd2@ujbA?9Ls%u`>0kbiB_dFQOasiDpVAbnNlQ8sH_H5 z8jvBRh!#rGphN>n5>k{5Ez%q%MJY-OO%h4Q_j6n8xA$)!d++0TkN25s zlj0Adw4d6Z}Kk1G52jREJ5 z&~P=SFF|UQrm)^b$`?=*kl@6`#B5Y|Wn{Eqxk$Wl0e3=S)Fmv)vhp`eO19&ht;`EA zq7uD^31rza7Ok$Ho=eRep2w0m!f|ZA07m^nOL88nkyF&v(y-gKyL~F1(zkEO&6~Oy z{dEG@Uu8fJN29S1EhE$AF1&iy?0?)@9B5gu1e+D`Z9fddC5@-p4FSy$5qMY9=Q!3pQiwH@~s(O&jC ze7N%%I(CT7ietujH9cR4Sd3#-XhFuk5KWzaEFN*g(sH2ZX)~2iWNZ3^Wo4Ijk-j(# zVK#S`{V6JC__e9DtSnVA8%|C_LPFpY9Xl|$c!C!wa==lP$3v#A#n8}q$kZy;FrZX3 zQVX)HqW+IB2#daJXZ*bpIu_g6oxx0c`0$`3_g!3F4`{i<_RhRXHr6=}YD za4La{y9_B4fBwArf(1*iZa$^*i@B-kgKbmr8I)cU`I^r5yL&n@F>C$fQ99zW#bsq0 zGiEH2J)(mrVg7u{<-dw7kpC{28?fzXt=;0M^9I`Tdt)Qp17{bOHnVYFDbi)bMF#da zJWNm&YQd$KVoD}1oHOT7usQw+3R)N+dcAC)inC0$M=da3zHAvR<%$(6DCWn8G}P7A zP4>3PLz((57E%FKd-mqnH)t27CmR7qTzH z%M9`%A`Y(_3>QE=BDB-P3T+A1v1gUrtSC1-S64L}PP+Fu{KGO~@zZC|u&RaS)mknO zSTz_T!6I%xK@p3_gJY^e8@Ic}% zuIfJn-`^|g|2|+gR}=MxmGr2={xYgxcXQh*7|Cf^$0(?%7>77$^r~&$nlL)4rr6Na5{w4%u zY3bmy0V4K(y^a2$C#MY;fccM23fT5$&b+qf{^3JMj^w=0Hx!Y}viCbK+Y*W;LFiP5 zp+bAX`g+CrVP;fRIh1_i35|6q0$;vlQwLKAZLkoDSL0&qRdVO`^$N_+?tn-VJYb=r zUqRQ#ui8kEuXtWOXVN-V5q%R?%w$MjD(Yby@2CBt9ZCs1Nqbw{pvg89Lws*4o8sb$ zn|B{7+#LZl4MP3O+tU07}MeU!wo8IK@*&Y$niezNz|KB!4s2C@>Z ze*1%hj;q)obbh!4ImXS+4X%J@aePkP*!{z1e#3ps;Tn&1o${Tt^N!RNluefaPbf_Za-mE=%0Q!_KC55@6FpMrm!vyLfQem!2)CqQ9KOv|-j_#XNGmVWn| zKC%7BvxsW^IT<0<8jcpCjG?ZqJSq6KQ(#50u%dRBo9zNiTUzErtJlnNitDfA-(5tc zf8T!(UVp`=T?IiwL2ozDAVi0o*B)yi!|3Yj3Vw{=e@|8dEI|^Ix$rpSNyD zuNuJwY82sCed4&-@Vqz5s~O(_7n0$+iM3HzQ*#b<2MbO?2JyhdGUPWK%~W*k>O+tXHP63eP;+l<-m-Dy=c7~X-WQx` zEh@(?9Mx%t&@Q9-Bgz~&{Dr>V4_7(77JDsfFZ^l8F9{{(GLt_d0&bWCdCY)4d z!_Ufrg6qN*a zKK^6PV6gvd5Ch5vR}D*5ftu*zqS|WFBqmtXJ01s%a>+-a&`@#8u5LL)i&Nclb(m=C zt;)(v8=g;1BQWXd>(f%Js;=$<@S1$$UPXnivtu4NZ(OWI9`On0cNOp_RO^?#%S_B1_WH@zWe!gAF*F(d1sUdo!YN6q&a~k`l6cg5aK>B ze6tx#d#p316N-t~H1NxfsPUY&7jfgy`| z?V2@HB<7A2R8*>&-Me;qx75a!_*{Xt%*ygYdtioyiNVUj`U@9g2veLiNx*PmAleX0 z2a0<5Om_>-o`g%S}jV)53b_C)G4o#oqQJQ4Kui)A-ncZUZPfKC8-DIL$k}nHho32Z^Zhe5hwc z9GMz3-prX1QszsR7>>goo{ek?gNupo`4qgfBpILPHvvSpXmywIQ>LWMeRVh@;u?e{ zfdYZG{%0F#nS6r}?$T&nGaTZQybL~~kt6q84*)Y2-GpCe4@gyZ^#txfY=rb$U@SbP z){(BlkRFT!PXN0RX$?O0bOP4^E^ufNUn(o7u6;0=LPW<9)C!ELeh|?>m5^%ZO{>+;Lk{8h)^{>T{5T3OS`ZoroAkmakEDB%hDuZ@v=Z^my zMv9057`sZN;jg_6`x~%8RURmtGM@2SFQC)Op2`y2I@;W+r!Vvdn#}3P~vY=M|HFz(`gqv2lkO#95bd}ofx-h-E2%i*v^)uZxVD@K>L<0s|M?TI6P|l^dEE( z;fP$SqqEB|Qk}B}74&yi=4YIrk=#Mg^!`}K+x&s#K$U_6mYR!_J9|bhEx`yN35kgt z*RQ|o`D2r@{qMh50b#J({1!_hFUrVJXYh)d=FgbS%vnlGpM~z1`}bR`!p!#c z8#!XY0D8swDP~#FA$CJK7`pj(BwX!P)p9y*Z(CT58Hwh%mSVbCr8H#>RD<`{{TQxaRJ7;u7!$3 z;bT+R+ygX<%d@daYy3&(^4#Jr=p+uszp>93-cM-hzB9_->Zr+}re3MA3%?J(RZ*ce zV@5L^_8I+fyO&K-J?pYP`jmGy3ZQqyq7d$uAtQ-KHR zm#3~XTeK*gX7klc|9AVqvV`@*PgNm_zb!+#X=|YhlbnV(t&$_I1`zK?4wWaVk z(x0|w%^1A~>esW0iL>z!E)2ry{5&Y`tcb{n1HwB3zys_}T_qgDl%ovT!1YbD7!5Z3 zG6rK_ekc}TuyC)5ueJ^I`ESnT)orj-U}P!^cvfHQyMox;Y*LS;aK&%iTgz37trq#WCbnTtLg zR6upL=^}x7eOeTPD7G+2>5c>pb*7t@9r_LO33nBc6h!d*+c-Ex#1LZTz#cdc`{yYG zA!tS~trVzS9f+Mmcmw*+@i{WYm40uWbg2U#=A1ZzE-BsWG5Z;2#DKm-*V47&{h+YW z2TcgsiA3K+Y)-(k-sCE|y_9iUxL6?U?O#OC7)BY2Rg6HdCb%7MR@g>GM$TgJ#eU5e zh&WW>q05Kx_YQu6k_0?-lFVW^6;J}Rc(!icDlY%m1H@%I+HZj|zhi9t2R;j;M`EH< z>n~d%5)S&E4o^!@rxU#rnh1}Rw9oLXiMxP7~t-NxD;UQmL4j{HUhk55Q2(A8B@ zRXs7=bI|djoOu89phr4hDX3OVvND!g#d;O;iNs8mNWFYlO%$Z^q=HaRX@$RPe-9BWxf< zB|jDw@m1K1Dg`e??4I=0M6gwHm+O}hbE04>1M;M;2X5QG9Zj0^F0B#K{u+?de?0^T zG3!WE?B?y;lM)jLIxz<6qcYQ690&nvGydXt|IXEaLl`0Bhpz1JeB=br3#m%G--qWv zUUd<{d%Nh4fB(9WVksrbkccaW3m0x-oRr`ZJRL#9VPiuBsI_wIHP$rO9$q9f^!Wir z3K>XyZZy6Cz$-bi5kE4RfNGp-E!^Do0h{5*4Q--0c5b@6{@@n+c7L^=d1TD20&lZY zfYc4&zYD+fuVrU02;BCmq4-h;Tu|yzXx;|oZ2z(%ZOZ?uRu>e1W{wW7PVBKHei@}@ z5Mci8-G!g|f=PyPXPEV9vPSqPjG3!6P=DY?VR+w3%9r%?>Boni)_2{jyJaez71su} z$E+mC7#;CEW#nBp@@dI&u`DWrqILETqMp!C%?JRB>Xc{!8kP|Y`B-OpTp_JZoVbBY zGS86vi}&*>D`iL&VT+S#wrq#zIs<9NF8pM`ZG$mdr6tO}Psfa0fhzzdWFv{@!w1=6 z!zPB9JT5K0N~aMGVu2;mqoWEGQE`nzk*gj+Zqm#7KeNq(o zFIU#g_RX6Ojf@@_6}=$ElEPyhJI2LAYZ7B{@UjDbz0&ZrO)_NGh{;o@Zlx9^{<4t0 zECbjJeo~Kv3N<9UX(#!TdJl86Xq2Os7B2{)x}~{Uh}pa{)HNfCVPY&NZoi z=HtunP}uqGZei+qfkqvisuh0MR~g^6I)4_LXyDZt>xWv;Ffu6}$bnK(G?ebI&Rw_= zEOq+q*;~pINA90sMu?HoUT39T9KYesjTm&BrVb;TF9 z$MgLqNwy<3Tqn8?6i{ChrIjT9c*qCMMzGJq53weQExgscJd5Sg-Y?PW>_X=?NPCxWBh4y zdWLdX`G)aaCjXCkDA0S%+BY^Ho|u^U zZwk?>o;`MEpPBx$IMgj;^WU0$}Cd)VtwS7p5vg%K-CJ_KS&(SFqpe8hzy4{14gRYHZI+ z%U9tOp-l4&6+&1bV>8Mw#>YdPEnU9cL|pnreCm}e=z_N~Lx?NXCWHy+@MV4IWtG$6 zpiV?P8dSrj&@|?WBYPA*eY&QBR2X#o?Ui%_RJOIAp8u-BpH7H8N-gbFA01krx#-|I z6$d9LAikr${WWkeN+L8XxYkfSh48ATCYbcHTRtSf@3UOMg7mJ^f`s>QQ+Xx=ViuZU zVfFSO(d}X)nTxcwMaIYYy#G9FNX^5dKyz8ahd6BF=+SoT*Ej#!bL5VWpVjRx-|YtL z+t_Hr^U$kZTrA8Sfd!H1(}#9HGhWd{BnAL!%YhkadF@MSU!Kj>2YM5)PP2n&`qfwW zPML?phoRB&p6!0n#uPxGAKiId&vd`~`>Zu78!a@||A)f)t5#8a%%1t04&%m-?ea$W z7H3hW{AiIbFUb3X7@O3yzkJN~ky`hZC1MA(LM5bsxKa{2R>^R0`@6+5Ym0`OxVl%X~>ydR70S)Mt?*BcGN~5fSgm8=s}@!p$WE!XhG!#tj_#zROw1w&TGDgZ_$_V(%czv|&_SbyNQFlhs40cdpcrzDCv5Sa;vVQB9J`jko<9eP`#9@tbf$@ogO%V}?LXz;`%((9E z<}w=B3mtubEO?x(5F@RTP2R=P#ymH`0jB1;IyyF5cOfY5c5eFc>qzffaqy=^UZDQU z3CT2L7*Oiz>tE`1vjZ$JXT#&eQBfGlSF$EDN!xPWAX))u5ofuu&bDeT#+;2;Qp&Fr z%mp7Vnj7g9F^6s2IYlTSA*J1QO$izm-9_E}5s<}vwb6DcM=F0DV}2_Z>^5ZbaC3A3sOC1bnyQs!3(AMj zC`>x_O-){5%n>x1>~U`Im9=L+_2F(_4E239BL>eT&P9`U2K-?^!td5cctf7CeAX= z2`C-TZ%W?C3VKp^0izpsuhm?Wjy4H8O71dFxELPjOjxokbBj0?U z^+{6Xq)gm_nu<*iW6C#M?B2WAD7`7^>{&*Y1)S(F(sCC6Prb_O!zKNzjAm16B<_+wfxsu+GNXx}6O`Mk7@d$qB2U_BZdyrV$+kh*Z^& zOn^T_N4zzu+0jM=AKVQ0Z!rw)MZlt*dRtdlm_~2>?OV5qL_vFc_Lb%2FEhP~gj>$6 zYiej(3y@JDg=i9E*65@rJR))~QwRkcB=@e4Z*4mRzQUsJ?%{!gx5v*YX1#p&Z1Ij61ohZhgeK~x z2&vNv37(8mpPxX~P-l+<-bU z5x0;@I8WB?Px*CSon&Nn$pZJ|QU?!4dAbEDsxe0{vq$RaeV*4sRz9h2dn3p6Ja(nn zKV$$Q`Ty;Z`VXY||0=Zq!DCvcsK!>lYim99WJuS09sU`(c+ro}IIsJ^jzR|rC@$Y&=w*kw=v^;qLy?_x z9h@{{Tx}zqP@o6i-}T? zF*jxy!meKp<&&K56?u>BzJtbnV!S&Y``+{>nFXu3mXUDMoywKp#1aLUiWi}Mh zehhxPZodagQq9oNwv`uVEFX_j_TL_{M_;i=kNtaEJX2CS zJk&ibEelOdqScDi)BDUERuB|WOnVYuZ~3`$&qbs6_SaWvD9O_kHM}y?{1`|@N=lg&k8&^cA>F-OOTkIb*9~|?oWzRs zBEtn$I97My65+)G&R+g1NWgV@xf{A~e1GZEXPq~LCza?f){nh(=}OwZif4mtEfPM@ zL^=;L$IrMvmm0>4mqkheE30bo|5va0HECV}YahBH65b1;V4|AscG=4X6O&{-u+9w*_daBQhzIf`Cytnw;o+D;^ z=!%2N-0c@FFow_)QZ&GwDsxk5@|;E18>x(-D{x=IARyt>(?*K}R1h=+{LAy?Ro&!c zQc~(!7m?G}%}4s6@1-$c#`a}~i;39VHlbTE?x|CA_?s~=#&jkU^*lVkf!yP zs=L3U&trBq3fg8|>ty9UE#miY;jPYBOTLb67#q9L*#Bkjv!=zHq)SGXttj8U1aeho81aKBqv3zC7rjI^&|esJ4t15C0{8kdkh#)%_O8G86x0vtPxea}Hjb zfq9qv_~*S_(?jn^(}s$)pE(DR_+@hT{LW}Eallpq@{)~5Bzn_#2bxg~PMtc+kGZvsU0Zfpe#9&{xfW@8ZkwKoi6ib7 z0tMCzAz@_Y=%~AVC?34$+-!S?i%CAunr2-~oAklGY_?{n`}Nn?w3T%iAMW^W#rh3! zG^BNf`5x>exB8qWzfkx^CEM&-@QuVL1~=6#5Do0t#RS6O=1(hvE|!zpfu{gX33Uln zb%Zv}?u!khHbq62MZT>W#!_cGq1!Nz1t2TB?$CbkZNi9L8wM|_ouu$oxI zyrXcGtG(Z6-QxYc?T3=}FDz5~=+TW1r2>R6Ru>iq4ucbvO#D1(QvZR~5_t@fR_buu z;=b5@lf%V~3mJPNZ#|ql{e)`dI@9CK!N@6zJZZ6DfzW&aV?`BBOR*Ib9)=8YhgN3H z0^=G2lg=?hh8h_7o1T&)?ZX>gvNCm!!J?l1wsUu3nX9HuV?)Hxg*BJm-QnG z0LI9d=JcSJ14oW%F*td_Z%q0ars_~ko-e(H^^3IvJ6%FoeOXy6op=Wy%wQ1HvXl*a z-(x>C);&oboqA}*_#O`=m{RBQG*Anrz^YFm~mX3Pk%9SgVVY?(l zD#Lzkhzv^7R<*pM7d;WFbH}$Tqpzn|y7uV!?B^GX#>&```dGU^Cdb2x|=$<=yUozgwUFYV^KcDcPuFZx$gtD;9-;&XHlY_`kA7l)%38E8v z0vBdal#>(rpMTx}zrUo{l9{i1clF>2wdsGAe*Ue0K==`i0RI)`KC)EL&fVd9bIXMR zl(=uSzil1rt4g&yTP%*(fN8HDAJZ+MGG!D8;d7_6r`4lzLG$m;FBJaONN>LGMV*zq F{tx@zYVZI6 literal 0 HcmV?d00001 diff --git a/glabels2/help/C/figures/merge-ex2-2.png b/glabels2/help/C/figures/merge-ex2-2.png new file mode 100644 index 0000000000000000000000000000000000000000..e1d8f2af0c5a9a7550ce59f0d781e5530a0ca9b2 GIT binary patch literal 54708 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

    iCRa^g*;0fIp|BXJI)XQHug*etOcvLWhb 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

    &z1vSz)FzY5X&uZXhGy9=`` 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

    wWq)mFH&-?J9t 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 XpNV8{cW|p4@eeAb(@NP2=WhNVG*8#( literal 0 HcmV?d00001 diff --git a/glabels2/help/C/figures/merge-ex2-3.png b/glabels2/help/C/figures/merge-ex2-3.png new file mode 100644 index 0000000000000000000000000000000000000000..baac803a92a338aeb2033cda28be9f810377205a GIT binary patch literal 24091 zcmcG$bySsWyEi%!l@5_k5fEvlI~7S0kS+mf5TqLeK~!2n8brFgK?#v=>Fx&U{;s*+ zz4qDfUVD%4jB&=9f2^3yc%D11>sR*-eEjGk4kkG!0)fDhlfAEsKwKd}AW)XkufQ`A zbz#UqVA#uQJHp@L4>&?7%M;O)@Fbd(oYDid!Rt6E1bF0rI6Mf%Eri^C$tP~3>l3be zH<#wnwwJg_2@VJv3~s-Zy1}Tvmh+y%=Gtn8PR_ZYZm&?5PpR~p#e_yKCi<0GsZ?k6 z+zjVWWvWCdnx?JPToL12A?Zr}tf(Gx3qeb6iNCE&#UbO{*u)QM2S2ecOH)m zL5s`8rzU?{dPy62&cnEn-lJ1ECdzj!;>Z_uR=ki_#ts!R&HD}~&=0?_rzgq%*cVmG z(k>-0t*D461Ycv2l@xbqcs#geNP6v!#i(=H%qO$%2-l_bL}oqnb*HKzJ%jDjyR3kp5s<5M@+UE_VKA`=bAIX7)j zy%{$RE7hA9{v=v&sjJgO>WdB5<`nt#rimY&_;<&3);xYlhdLQfHKL@4m4NGlW8q*U zd-H2fj$+x%z(5SDB-5r@^L@V6wKbtr_YV)8_1Hs9wF|X6mUgqVv&sC8Nd3E))>c*o zN6ml6%jW;ynf>Ebh%@b;bMi|%shh#Cz)zOmMnzkCHu`J~FOiu#ZEBB~jhWrBp0;(+ zt|Uvk@Vj#Lz@E#b29>$K7aM+P&iGL`5NT`5sJ90s)i|}pU%q}`MkJc6j+hG zskgrO-Ic%B5`(t6a>X*;^<*zTH!H1ZH!3rvGtGVLQgpKGa4W=ee~@g5VAL5y{cfbjg`Pj0dz9dN#66eF^ss z3=)EZaFnoCIH@=`g5NRBn(y&78AqCGtEt`ec-_|2^zGZX;emmUo*vm-`0tu$1Mp~w ziHUy?4ULhBRfhWL4f~K9qbAVtqSMZgAAgXE+~j{w1%uGg(6Iiyd&+rP*nG|0E|zo$ z@8T25aI4Ksq_8lFD|1XZm&2L4>9H%GZTu6B-h!=`xEH9l*KFO;eA|S*OP9}Q4*c-B zZ=R#ZPR8ypL^Fp8&e)^Vs_)NIlw%ba)9`Tq)by#1jn(|#>zafW^^W3s>gK^Rmw`@n zTVD&_g}_B)-Enu^C4b^U%6>F)pPWn0de(^UN-%}Rl0}N4Hk*(~@^ph8gC9N>_05Aa z&ZOGFVBCi%U6vLZVdoNu6F<<()yiptFZ2w%OUkO|y9NdL>+zdQpH`eW(4eC5tlP?} z&Ge=`#Kpz+!?!dO@z|3+cwN~x`7;GA+SgSvVZMj}gBCln`?IW;6na3TskWT7w6vvV zW?0ybsP@6$-g|s}E=~p6BA&C!322Qo#tIT@;zuQPe(jteGv96uPaFA#>Xvgg;qZoV zcYSC&$7o-hf9$!M-d<0stwbD;|6#T5kKI_^4vJCWD{8X!?l_UlvFgSv*In<87rfX_ zd!Hbxfy2bk6fa=YN)Gc(0Rm#WU0_I5_abUOYpV=gG24;dUn15)7xPQtUzxn*`f-DqY%F4>>>J>?Kb#;CH+=K)l z1B1Ny_}croTf4inb8?=M{%mV2GHD6+@G#d3lBCiB#rOEGq z%{lcY(=E;BsB10UTiU+3XiLnLb`8w%&$qKQo{E>f*v$*wJS!4SGVe0fNvz*I`zDZp z|3^ca2Gu+MO+fH7({Go5V%uN()Cvp9KRR<*%Vn4JD~RRG$-c41|8Ce<`PF$jxdFA{MYRH*3|hYem33;K27CBbxt#ox8kxHQ}gdDMEx1L?<(lE@ib$rAy zY6*Dz5f3ZbB!`vF>H~-Fm(`n6ZEbBI-*$0{I?F7IW|TxXVOrB3c3tb)W@C)puytDQ zd4>BeJ-vU%Wn(loJ^eCWghh1}Dy}C59*x+*@PATN>ZVCq^%V!fU>VG9Xy)J>^_W-6_nW}OvT zZ@So+Q4dl5y2`g?%9_fChRS*3v{4zW2G=aeqZ3b$kI&B+!b(a?{Qdn)N_d3Qqyum* zEiL>0I8-Nk*-1aOx_Ru59Yoix{MO-8V~~`z*f{Rn>!nT{siTuLkvC=7jSMw>lnHg? z<$xMe1Om@yVnhFA>8Ra|*wjC#iCTF-d|gT)i#W!Cmd-{i-R^gei2YenU7+Kyr!-Q( z@Wc~LE4&Wsu{3ynM=F`9d=HkU?$ioDwb_36J{{+fTJuW`dRD^kg!;YH{1rTpqiPOA zF2kob$=P(f``XcXPBK^YsiPWaIQ{UkupCWHB-uQOwj0hS#+Lh1vCc172ebRSS_ZQ< zSKP$K>$5fUFZ2z(?WFUAnA&6R>Jz4H=ZD>+&GBoNV|KeyQMKs1WxCf+T7+iSDQ3N; zSV6uMe7T5YSSP;wVZ6->SJP14W?inzV0(FSyWEpKj;f2`&Z*=iBUX95=wWg4+v?SV zYzMh)aqpyySZ5%El!d=Z<9Neogx1?VF^i_?Jeb-SMq!7j4YOs`K;<2|(%huSo z$G3dZvWGLp=RR8zUwzo>^{FurqmxnGyZ*kO-Db~&p^^#TLs7XOiGju{@s-jf`fAEj zvYT5flzG9?we`V;x|>_QeKW7cZ(cC{&bxiM+W(bRN{f3*Oz1ivc0h`iFY#cMNT+gs zE;IfID-0tyq3a$pzpGBnyk3Pil2~wE&U%`sntlpiq7WSVY%b1LGxk`Q$*5T`&wzs4 z9M$pAKPJ2=ZjC^t_Eof_^GJ%XhT#DTX?Q~i4SCjwi_RxhsM#)!q_{rBxKR0S?GCA} zvFlYN86A(X;KpiIUs6$EFKxB(+>jdfJ-zh~$3kPVOO#<>{c_#!QjpAaaUjAr!+50r zP+4I}EZjf6UaizOTfo4!kF2v z^jO4JPBd+f>6mJ$Bw@)*hFf6t8@%T zzzTz^;67*m(%qXw>i7p!ECD#5@s4G>hK;7(Jt^kJqndb`I3@(iWR|8Pp3G0-av7t> z5Gi-RU)Jt*RKw)ZCJ{H+)=)ql4Z?(sczLo|65? zm&JtYb7T!hPMuCpo%5PXQ}35qwDS}X8$M>6q?J5JbU(O#uy*Jh6hEJMh<(h@r=@3) zig3dr)fM8cdh>NJTtKWD$bpPGde0d0-!0eAldmgJ37PHN^8mMzefyA_Xprz%%k_Xp z$$of&Y7yCvtBrjn--%9;X!*v=Vt zqaEVAO-E;FK%|*(5VUa>(PQjE!JKc)^T^3*4=Z0!M`yIkdCkD;4()dYg8XgDxANYB zDckvlh1!qIbsr_HbY2>{q9CT3k0)fXPOoeRQScjhSIsK4A`qBlJ9@}VnRfpEqx&5G zUFkugH;%miC(SbL^<^js1Y2?W&LMt4yJc59MQLfN@jdEI6hso$Gw#=PO5r4fGf%ZO z?h;aqd1)z;X=)A``W#==y@HU?^`Pkc*z?+&0tE$ywVgnU)PKfaATlzNmX`MB9mP;K z$MchYJn^$_s7Kh1Pf<}3HPge7Ysz{X>R(nHH@`BkW?v_&v|nkO1rMk z_r^w({xl`4#qEA&ap&cpAANlUu{4OJ!e`vG&57T_n~T-wY0TsFE390LOVJXN3O`o$mmzQsP_-P z`}oo8Xq&c76d|GJLBaLcY7pd@yHjyH?5>E&_>Uj7qN3+VJ9A7-OjBOFINp|x{x}Me ztRuCau8N8sfERfa&5ev`X`2QHKH(GKfQHE4iya-8xvDrUOxQM19RtXHk~HUkIBhK@U2m-+I?wC6eoS3nAC)vmhI0^oJamd zFe>9>V}CPmWM*M8HI!FU%FWI$E-gJjKb%_W%QvW9U0jqgU)b0P`ml;XIK*r%-v0gj zw_hmGk22da0;xZ{yDOyH&CShSU0th7#Wo{Fu!!shD5*mjUA5B9v*&x7nQ&hA^{Gnz zdWDL%Tt7KESyGUtje>aD7yF^6U^pppC$lSFSXfZdcD&-n@t=ij*RH*I@#4piA4Lqs z#l`uC^%pxWG}(!aiQPlJz3#N<2nq^{Lanov^h98f%(>hM1Qe7*)5(aes;U@#V`F0} z^qCzu6&004pOeg}sHnQSi!b*~7CWM)KPV-N>E9&;W(BuZ1-*>JGk$-6UqN18D{^C` zI6Ww+lf=;Lp53I#&6^QlzkaQ%5)u{`UMEH%vP`6BTq(La7#NycTU*D+MQCY%^z`&h zO(o(taDL3rww985tv3@F7iVU$v@_Rox#fGAou5wwV;sq*`#axI+-l%%p_YxMrJ%`A z?5698m;MG?Hsdw!j$LtrgM)*BL8p8#YuA~QmYg<5OU>&BDjm&N3T)h0wqd5y6r-gA zY;9}^Y4)?sn4mJvn$U4^6-Cn^CgEk3_Z+6uuOMC$lT-BB^|!Tlc6z(3Ka@ovEUay6 z2Hc>^MxrX4gTMq|i>RTjiPUCWp~5q)G^^{vL-dFc)<4c_F1$fS6~u;#*#1*%q^91oSie6m&()~_LDGpRl5OEO3P$u!AK)ys)UgU@V^O;+G@N6LzvHy5Y z&12SfViJ<5$jGm7{e>vxE5n5*P#Ah~5j~WJGnJ)Yh4gY`?WY$)8Ah~`SUzjClhpd=Ip#bWaz8ZLL=;AGhASlmzM|YR#H;3 zC78-YTZ5H&Yq&7Qu-*rr1nxOe?b_YeW{j+~C#R>ytnEcP_4W0S?|y4^@{*F0g7=7u zisDfU6xdCP(a_K+D|bUp=;s2+3Wdqh$;oRjh#wZ@a^H#{lq~%!rx%WnW0j7K?M21r z-DcW+930Ab2`B4)4PDp4w_a@;@IRE;d(=H0|&2Z}~_zH$P9m5de^#NkcVH zIW0?@aP0AJX+-vyzRp*N7>JtJ!%3w6(L9y}wDWDBSyD1p%{5YFN)Y%A78ooxWEpjKb{_1m%*e1f+?)WUotu+$w%4z0Vr=Y>L!qIq zUHM{8MoJd;qJ@Qpfq{XSS51BWlVs=F0w`r-ZidE!r>KQqMhF)^)dluza5TY?3r$x}B#`2>8J0lTE`P3n zda$wb{rf9a7&0wgT?O=!63d&SVGlTdW?c?vr>94Sh9CdsL4JOIsdssK&s9~!qoYTXr2{aru*m$A(bT9zmR44d zuaMkF4-5$@FDeqUpO%0z(bD=75P+tS@2$R4vbnk0_n`j~l-Agqni^97m8p91_M)s& z`}N_%n0%_-;aIymxg`n1@K_?m_w2wRM&$&2snIf91$6hlY-(vp%SbcV;rlT3&B^A{Q<7_Oy9rGi0;tv?K3=9mg=z=z872^c%!Cr&$;pcbVnQh)1 z2xV3hPPa2LY2@r^3cR_Z>fqo&%wfQ)`Ez*q3;v&@9g|4Y_V#v5{s$43pZPvy@jWqA zPPHB?fs$`Lmnz_UaTZ4R@b>N7#wI4vIM+vtF=%1M(ED}73-j~x?$0)Vpz%GsNBa!g z^j7_)80~yYh}ioNAFAzVq@0|bTwM5Qn|}SuC@8RReotib^J6k&5f6{eFefZL@6&@^ zXcv1c{ilap;yz~;F;6+UxmlQ)D&f5k9z00VP^(IEUi&RaLa&*ooG3<#y9DD4&}l(< zt42*tEoG*p&upaLSKKxd7HFoGH1Fppr7nHiuyL7qdDSESx&u=T9Gvszln|fOjdHn& zJ5<6h9esV_Mqgl}o=?@qH_rG41ccCtC$!Ajj+L>|(?4tb!~|cFnw&fXd*^2eO}*n% z*XpX3)GxSo*nxltmO5hrwj>|-DJd#~AblO1bbG>eN(mNbXAJME?{3Z0A6NACCjxIW zius&r?WS^KBc&uCN$f@eVPW6ng{Uj9Zi$Kcz!&XZ4a>{h6sYV0G;Ece}qSHa94Y~G#wx2xfpvuV{#)b z05LJKJ9qBXpC3?=qak7>eS9tetZ3vLTX_Jti6I|LmUleCfjKpyVM+???| zS_tvd>svhQLTMXIW*VDt}`d!-|e z=jZ2nl5wGQfT^)JQf#i7t20<`H)UplWBG(MK^NFnd{LAS# zcpV)bd;9zGadEHTys38CkQaA&6fdN{Ypof?JpN|`D)3~Dd#(@KQ_@AKh{xNFc)Fu^ zo|{(RG)C140m*8|t>zjQG4Q8W?;*@ z6EL0YWm;AGg`(k6?`=&@H8-2Wpcxl_F&zQnDJdxlF8SKktM?y1v~IuiOEX&~v4_`Y z)x7KB?XVo};-B5!-5?vbx3lo^fr3ABE?HJ%Y_y^P_}3v;YlSbIBGXJeU+_$xGA6IC zPK=*l^CUktl_9a)ZZyZn))pp=nv5*^)2I2ZEpb?9p`rMWj*e2Y#>Th3sf}TFFleEf z1mIE?6%-8DxbMCvVwvjV4cT6F zTToD7+8%ig4bA-7vl`gK7Z(?7zG`*fDFQ4e2kPqTR?R<$g%twb0XW?{F;Sb9m6etz z^TPMB;g@jTJg8o?d_|?D>XeyQ+V5~)5*zg-NkV%UgY6CV3a+3S-U=79w=t%<`9ubQ zw^k$|h8NDxY%DAhbv))>l;Yyz>fF$Y|ASDarldeIfSz8Fk#X09HCEKq1!jEZc<=pt zO!f4~PuLD4l*Lvis`+W@Z{3QIVHaStM@C%$91q$6m>g zhlkT5O`kn$T5vEiF`0t##KXe_zu<&cBBBAB?Me8!LwB5DN<~mdXD89aGMFPf#ir{e zdf1K2Yinr0N3LD_{Q0x@_75}|gB6bYv)it-x9{9BgUe!PXNM|T#L=4<$h>#E5~lim zsI5)jVoAYpB0C$?gl6FYg6OLE<4f8Ck23-uGCQ8|;D7AM989Qr}{cB#8Ug zWn^SPSAy*y7#P@h8bCoxN=Qsx#Ht|9xCoD>rT!&V*t^P`wMtkD^aLY2@xrby4i2Lg zFHEGR8=-2>&CWtW;muDtStw$S{ruS(L<}JNhZ|!g`fCh#C**+PPU-I#o`Vu$GyKatyKH#)9={=C4vQ>BbTvk>V zR`sOYT+ls}pT9cgb+ir~?U<2P&LW$qx01&^{>}nCO#(nl`>eqagPNKe^!}XO-1D>DZf`Fy5m8a!qnQBM zg&Ctwe)#HdiI^s2viRcqOludv)Xj|DQKr`~#b27-*t!-v`R4}FWH zIgJ`%6W7$%Li5Yir$_>F%s5)j&R;%)imO-cf}?zBO$DmKP_Ayd$G#O#d%#0#D(>MBv!;mx~b$N%nEFG|cx%5j*mr>j{)5UV;oI`{4g_Bd$SpI%AtS%nGx|3BF z9`w5_kIRbo@0I&DGE95hX4*d3Q53qx$>Zp`Yhs&uP-{Ik7vH}c@y5*mBwzE#8paSG zLPE~r7B>=U1ikD)sBc%}AZ~rTC%%jdq_%`L{ZYKtB17GGPgN9PyfH*|^O$UudA9#6 z-TgO8{GS9Ei8x+rII}cDZ)qVTaVTcDRCr6VYK?`7iB7w)z(6vWW}#5ZV637O!$ysX z^>Vn!?0`P!@?*qS7 zt%EIugsOyugq$QkWaTn)0_$svMVsFDLkgMy$zT^*$cOss`Cb=1{4(A^(g>eFY#{^V#acAKmmbvrmLd{A53oh z{Uu6gWd-!&Ug;1ID7#dAo$bY5#}0w_9RQZfoG;i5IE}ICR}D-})fYNy!H&bSd9Oi4 z0f5U?xrpY>M^=|vPfbl7s2y5K#wa|eprBy58_)o%4F4{{?w>ycH8F{aA#|q-rA{k- zprk>eX1ain-MgEAl(kpEp+wcp1&!pE-`)7#?U_cp+qdy4IC`O?Bu0|pJ4nOFYwGH2 zYs;bE;2qHUvt_MN%0h1n;Qe5Kzd8A;LF1&qu~~-PrlxEpY)nPZ*tTV``NbyPObVbLR`B(pU zv<^YI#5h4mYH=U0<(}k9$0dNNHS3X@zDluqnm0Wt_TE=zWz!wqA^OfO_Q0UV?FF<9 z80n0xEG{lC2WMv};hVa4wW-IH?1pue1Oz|}=gb7W)POl}jFn%42E#xg$Ibev%(ItE zS+%mFg2$zL3cd#99Kd>1f)3vT1Lc6Sxww=8WepB~BrW|W3xkb~jYh;x0_{^mHi)&t z!ec*w0_W!It{2a!Ov}y6Pm;5fKF}l|?Hl{v`5-A(R$iW*|G6H(DHsvJyzcYA!l0D% z9ZYO4ED({948;v1rCPvQ1;;TtK+w*PckOC+e!jaw2Nt=zd!-hui?cHk=G$)H9Pt;k z_tn*j0(P(9I+ZBf&;1ONIsd$2%j2Rm8uCMq8L^Nc=3NEY1Bw@5gmkBm)yRiuiW%sG za4XOubWCrS{-)Vmn4cdQ8aiC=om=To-!oVA!!Oj*)7Mw>#5OfGUFuHkZf~F4af3ku z8M(Ue_zcwG`pXMXb@k7nP5?rzt*ODK7LgSXJ~}$Odi^>vAz>U8!LMImw=aOc4Nvl9 zCEU1iW6w*)6P9%>=T%g5^dhA&gZuGymqf}KKE;XoOIU-e!LEp_rA0Ah4ma(Q|*b)Vw|@z>gwu3ZtEDd%Dc5DDR17qfyn|@KBOf( zGxHt@W6!665re8P4ftkk%-qZjG<3|XuV25u(j?PAJ$k()$0VRn6Df8>ozgBgTUlNP zhz5=k`@MT%bvz)NsHDh1;qiO>HeSqIN2nF70pOh*8yorh)fy@)M%LDzJF^ey=;+v^ zKp&3{3p0B9^r@+7GbeT8#hbaY}OpL@XTq+}%}U-fAwih0YULtG{= zE9+e5PC$FgXENI)1$jUXf; zxhVzu`T-~)=H1kWhK9+HEv&5-xJ^K+1#DOCv7bdO`Y^ea0Q0Sv*kxa;f*!l(jyhmb zDOuPDTC8cP*RNl92>V`SV`MY~RYNA2l8l`E1Xv|A4r8S0!(d85m-S)SN%y6A*U6pj zZMV#|2leg`wmhACH+_Pg`@_osmNrhHD>Hc)=mS=rhu zp);|vmJ}A!`ppAAy;lSp7of*yjmbsrLA8jTGz=(5FRQ zH{!>(>;8Z?d*8 z&d>J*YpST+p!Mrs($vrZKrJXF1plNG^Qr*Bz{A4>81U_|UrkN(3%OAz!i#*zuGD)` zx3hd`@1ECjcu@45z&NmL7tI6U1epmG1`c-iI`}Urldu5MY5!+vZ5l#y2voS-&Jbix zCx2KkrRC)zA3w4(GXuGTZ32JoZf%wO%Nye6 zYIXPPx73`KZzyek$zBY;)7d{JVIzTcG9YLVI}R0%*&EgsFDm-G5ukgv~_Dp9nJ1-7Y;LxpsbN7?w6(`-7TnxgJUvCGDJwFlom8uL(XhgKk`8 z0{K=zXQcjNxcE}fsy{kuU^hNdSMP0K;R#9*H(e>#Nv%KE5X!k=jfi0swsgQ_u}nm* z#X(rycj)P`P|*)ss(F}P=2a1Pu^IB~?E2&9Uux#lQJ6ci_xKPzLXRq|s_GJ2d;7Rh z=QAo@XLiRM<(15m%6kcseR3s*rGDu=i;XBRJJajWJO=Hzf`Z2fx)N-9wzeDK0~#C` zH<9^=)n31-k~Ax^&k8=>o76x8+0oJ_P^e*MXJtV|M~OD8qm<3&W>K#X4(U!M0)-(&plA0bhCi7vxUimpRsd+B4J~} zFDzWmu3yy=C#a^&Oi4}s+`>W@y?1EnarOaR> zB1XRo^%hB}yyt)2fNfjjjxbREuQKv~8|MGyPyb|s|9D0swj`^CM_oe$>EMETH>x@V zx*B9AgpwW%LcI=t^9FTN1m-h03X~_vZzLuH*~T1O*@FwluW?bSb1ukMHSu3JqKB|IZ0=%eC_uKUcXyH{Oj0vs?wlE-D@id|G-&MzmN=h$F4o=IB)xRaJRFFAEC`1EH!tiX-IR zySwb{2GuTXwD0bi=#M<7KAR22r0(pVt$8I2`>G*eTz}FxxaDe$P zF1VPO00T&=l-mIVK*wtC?6h6#ig!8#dGIFFM*w4jNh=u#n)7JkZr-Ib~k zg-%N+^D#8|TO+(Yd_MvvRXrJp#q{ThYpTO@+Ax@c;|Bbd^;nfA4N8%rm6RDC)c7qKr$Y`it6fqUr`Z} zZ*&;6S6+Pwd)SDSJ&Gm%8Gv@UBV=g-Rox$t<^m|BQ8p@~WPG@1aB!nH1&wwdXhvTc z0A*Ugz0C>TvS)H~7#rpg+wq9kyC?FW-tg4l-tgd)?=3Cn@WD|Wh6y~DeQ;Y~;T8;{ zAatJF;7dWsXaFE)e%*=H{_5bv5NiFRXRV+}cXo7$T^yO{B!T`5APe9SEmxET*hCPn zg0$sh6&2d}!H#Hd3|b^wRZ^;T+qoUz_>qizfE6h)nRmryW@Lb}%8yP9k|c7Flzvkh ze%}B~&B5Uhn2E6R)wH!Ojf`#pj|Esgs_<01?Ay0z0BcT8P9XNt#|qZkkIRe0df<}s z^(@Vt9k4dXN-T@P2;Sbd_csE|9zr7!D&XW*sCVBr13(VcAJhOqMkE{tACc?ftH~Q9 zQiyjz_sj4As8mU-cweA99B~B)+Ay94}prPW z|DckRRh8H2Se=QXiAqUH0gTo24uQ~tgpMyPHb@o!F7R@j@4fft+(ITUDEfDsCk0|y z0mUFkgMuOkjR|p}is;-aN&QOh!yZwG2PAMO!7s92(}d$%(@%vGkmmNUMY8LU8jH6S zvYvvC4uY+lr)Ph_g| z{S1G!wzOObC#u$O2IU@OXm4rHZQrq3hziOh zY~%#Y4x|sXE@?Yde2RQ7Zgko%DHHWtoaDz}LPI&7mLETS*aD8)>?|BFfOG>aEH7{G z`lDGakCWHIiV)Di!Ev^?|H5hX8jeHpJA)B*xnA5oFLpWkPxCU}5$WbQJ&$775ATvZ zsQR!TNZ$Mw9FWLJP<=otOMm(D(0GXJ?>Dz;cFU#lmW1k&T|-cqpwj zI_v`4K6qbtNmgIx{BM=U2icZnO5}QjRqca%d0c&&%Q;ZNS*pkXyUSX%c2`smvYpU6 zAUtq#u(7tZ#7Ky#rmFhsxrY#!m{=X;Vu9s=Is(GgR!{O9h}-QkHNUq_Z8hL|_A9ia zLLl(|Yvdfn$Tftx-t?(aK$jCcJT&i96aIOZIO3cV9Dr3IfbcLkHOHV6Tn$93!7vZCkO2XIJ*hoc5+1KBXj9i3=|LNqP zx(jX_u2tSrJ6j2~Bvw`%kei@@1F`!+!cpga>LMfa6N*2ij39r6Oix^#pSE|-gNxDD z-E9X)MaHEb+zyM$;=-1uiBZ6^uCN%%e5Sj2jjy7wZM@3)gFi~Vx`f2b^_=mE2|OyH zPtnnW?tkWqSTye1u8xk5g5MAM8qiJ`A!i0c{1f$?LJpwifqVpgRIASG7zmfDs_Mz% zR=s8a9mvYGwGocVN7ViT;~G{v=(5YU2;-D!E|Zp5vBJ3Hibp$}{@(SOZP=CFFLsx@ zX?U$Zg@h=Bas>k7$}jk$qmz?1Y5{aw5K}g%>V2VEV$gytk(KoV#1u%!b;a;1z`E?} z0#EhDUQZ8?1D2@cqN1&BZf)&37+cKD%-~IP7}Qw&ZIXf-27VbtHs*1EA0Hq4;X|!Z zS6|pYhP~~r&Z}LLn!3O}WN~qJ3?zDUxNvTl2S!KMd;t~+f3`ubhqku%;P2m{D@T6* z%#^DIhmHUk?vd?x=d?m~hmMJQWOpz5{(k-asMMQD+S7&2j^FlZ)hoyLgRN| z1SEDl%mQL`08@&7;FBUBS}H1qAW(w%iDXhP%piUsk58&V(fO?LIXEgeE9OD_z7BY^ zkZ6QqmLoY|%dfYpVDIjq&Ki}x(Ov}9%>a5H02JusAio0*mP=)T?h2O=eHTa$m^9W_ zRtdh`t!1C@7$R6$S?T=*1O=1JQ3T`$bKvq{(Qeqv2CVeX!0m&~tLE`q3I`SSO+$lJ z;Qia4_m{^jiz6cXe+E%dkduQ)KuJRKki!%7OmMl7Rey85(!sIkj3V{_sw6%3xW&iM z524FByZZAx<&Q1ZAKX@X^eDI_>;2lVq8z7Qr_ZJ&`i6!a$Om(d|?7Czl zE{_L4?iKrj7v|&R73_bxl3%2+G*ryZ(1bxud`6t~>I!GC+ z10a|P!Wslh0nNw< z$_U;A)`8*7&_OK9dD^-k#!U$8uMF865{*v(CD+?B5Co#rg2KLka3JP=;soM+jQP}4 z?E_G>!M_-R?o|5@jumXni!258moARVm`v&Ck5z{mbRm()-fgzKRZv>Nu>s#SD?3{= zPY)z)u(K!Qh$?(9F97_dYPN@wB?akR?(#u^Y-4rxB*q489choYi^1z&A8fZF+zxSd z5V`k27cMB^WM+QfzQCu;|H3l7A>Y`-2W}@71re}ONpxCZLz;$9A=)tfwY#av21-jmwenR9 zQ3RW?+`?Clo46<-i{hhSjS(*_ZB;9!1b729%8AIpR>{DID#kX5m{rUE^uU&F;slYe zZ&PCr0Xu-p>T1)=y(#a@t-ThXupLA=fEDECb_57aw}H84Scqqg9HQ&zwTF{nxHQcm zp$C<}5o~0n1+yqA3LG{%xf{G%DbT7a<}lIrNVc$3=BAdLk4rm+75deHstT-=7r*Jv6S@KszRT~SFl!!knSV!&GJc)b^urX{ebM_ z;p_z(T6ZjeNaQD3dbnlKJWRDU3cuNuLfEaPTl{hyLRBCVLyH16#0mGkTI)XF!RCap z!@TU*lTX1Xg1+=JzZ z#1^6+Pfq+0BMnMgd3v4Nk-2$!)DW@>tc!6oBM0fQtVCjPnLfQ&>ohZhwW6&Hg!3XQMQ`?L&@ z_~*|=wD&uo5Z213ESj-($GsU}i2;bG1L$L50JM5I?aIt{(8`zyGzMuBfUp5e6O#P^ zb=3#u;gFQmhn~S2pn{-E0mcEM4si00;umD1zp^u(xoePB)3UQWQ9Lm!>JTQ@y6+ay z2ft7_AxtSb&D-QjrO^j|7jB8|n1;u9NbNmV4{w~|F}koy``Qk;>TBZb6BIGGSR+%<9d{HzKLWEsZmUdfK1g5QD@&t;#McU`daQEe0&}iA z{PaLVf&pmIJeFWHDg%M+gmJ3wj~zHgED2?Ly*f`ta_!pXtm z1Qr_L@rwrC9H7d6q2O|Y{TH(C)ZwVA*l%2FV0hBC>%zCMt}?|0)|xy7fGJU#uCg(VvzrEn9Sae~Dv{aw-AOO1Hquo=C( zggCKN;E+OG94kQ}=wlYPwy?ja_x7CpjhvjFks6AjA&Bl4ybPvG8oIjG&sqrp3xc-` zNno%TEx3qipFzq4%8&z{>&B?_@gGxO$E0iXX_(m9l)^6S1xAekS^5ACg8Yq4c5>Kf z-@^vkAOfWG!%ck$qFoJe3zJ;3dQj;KPu~V&IqHO0BM}tgNmw+lGGm z@&%yL+%`%+W18JjS?kS~&qU+2e)Or|nscc0W$VyFPb(bv;EHomb!Qm|>LmhEpEmt&bzNxoS3t z_<;Gt36dwZZAI%a#?Ueh*6E5+;H=gt@;63+s#{^g=H?X^rVz$Nd|xA=kV@vHr8NRv z92^{MWMl;LC^Y`J4X|gAPfmPxnn{4|>2L`O3PP&-#}6Y&7Q#79dU`*60%~e@*Fiti z5fF7iLxXh#hr6I`!66rOD9$6$Bj5V_d$_qdtqxeiF%5_qIaR*@9F}bh;u=I@fH}iD zgsM6Pd3g?we28upLWW=+dYH$-I;=P7gVm6UY+mTQ2LuV46R_v>Zal+cvmkIefcr&7 zY1-JZ9(cl$w2b2arXhp}E6U0a*Ls%2SuLB^|4l>qr5}`^n~Q^kv*1t(d3*qB(Bnhv z?wdn4l!BUib9y=yejWp~gHNA6L0DZz$@Cf0X$Hgv=^B86;*ie;HU+*hzwPLKLuXf4 zagcw^%oag>B8sBG$CtRAC^QMUe>+;lor{*9j?M(gH~uU&o~!hENRB z+o?xGH2KQ_rT#>{M$rxl6#PHiGt%nUAXM^K!g+5B8E;+`WO0Nkf@1^#$xOk508FH= zZUclAvVnd5#@LOJnSx*VKxUk-UR8|c!#Nd&4LSfT0K`i$0^rS9SXkBrC6F)y72bg) z4;Hkgon1W~tpF(nFc30S>!5}_8Vyk<7$I0f(CmUge89rRjnweRcYvwA^CYdJ;tPH_ ztW;R9adC?1m9AR}vr%t=g+q_5fzk|O4M=&=zhYu^3=Qp`KHZj5y@@a|uhFRYXKk;8 zbC}S2%*@PYW@cc)1;u!s>|NSzb*01zor=7iijDn@PaMX3_3F1-9ljrLU+e70cd2mKLB5XQ|rcM0F`?d<`!rG4Q~-9`uS3lcV+ z5}OgOAemjL?+|Z+IhcYZ*BUoSaZ{dKwSdAPl*f&|3+H{|aKy`{<6pmi0md|%M3qPk zbL2YA@6vv5lXC}s)~&G2{xG|CoC^>z9F0rw$LR<@I2O(vu-eBz9^mQTh10`8V*t0< z)$5@kIKS_CoC9+AxWw^^u1xPY47|ZLD>W0_xM+hqrGk#&B>Z@0O#!GT_}#njT?mB8 zO}fj`pLVtDSrROK89O** zj3$Z>yJnf_>^TAAyCXV;kpEw~oPT?TFK=XRP06JWt@U~%5RFeHB)&_u$RrxVZ^ij@ zu!7g{zZ}K=`|bY>{r>YARX6nH}MIc|m*}c1*;Ug73A1XYCzw9K0-OZg27mI;<{ja~C_%09O z>y5!ZBgYAQYIu3qgMnDcNUO0U;D(&YHphy+K%POZ6<=(%HxK-R+nqa$WCpb;h-Ib( z%NQ5^U=X%@Ro>80m=zzx0V4R7vDK5uCMGGp7USi1G}o^q{G|j>{#+OBD8p5H#ATYIp(hHYlnozW(wy_LM_CJx}>!$A;|X!uS6CF(w6I zd5@HcGz_|syn+JM!r8gG+S*!-*WfIHpqZ5=pQ;LBiIA^%S-WvH1dFs-?>?;M5pY#i zA!H!_V9FH@VYR!2@~M5Dol304{XA?Dt(?r94cj7@kbz}en|e|2yR{U-=u&fNFc>e) zqvY#*u&#Mormy0%;&U-{S@nPFxbkqQ_dR^hlW05Ewo_;uHBDqmlVQpw+XzKNNR;fx zk~K@|P&o&qj3`QuE!Bv|mZiA1gfz*%3<-_Ys8Ml3y07Ox_j&Glo_ps%{+jtMpYP{g zz2zFuL{+7)jm;@6oGRZS7n4blUf$e>EBZR53fngRi$zS`l-=oZ`P7G?u;a&Xn&obz zu?RE}!Ur?R2oqg#ospu+JJH3G{}f~}aScftfRJ|soO zMM8RHK3Vw&h~*%RY5az#+m|R?J#$iX@JX7a@fuoCqBZ^SCn1hE{Ir283XQdB#Q1SX%)?+)AysU|j`i9LJf)Uy*GMX9-B zZjKxtLwfJ8Mwe3*u4~=A8KDubvCGBS_oxid>7nYXMv8u>_lpIb09A0$0ur2`YTAL= z6s`$4uo|hRA|*reO{TNWshVadH5x%Ww;d1p?!h&@2)`}QuZ+{3d;7uqFVv#B9@efT{(0(<$)S!vVs}(cMW69MwzKia zq2mCyA0K}f*O5dxNiO~M*jUo7TOS-jB#tl_)A9kC z#^%>dwy#7arc^j66STyKF-}xc66kuJOKPa~m2E9-zt$Wfq%Yk|ex>=O!CRTZSaCz^ zk>^r(PtX2B=R;;@W?)2-QPj;qWyka8W~fhVD~h?hHsLbsQu;8}kHnKw??zj3ZKL@D z2P)gv!1Js85C3TI!Vu$a$F8Js@^k%0GaZ*5GqmgedEMADj*g^AM*F*4X0C{02Ec*>>_Uw3u@=$;E5pQ^55BVA zYCUgTxuKt1 z7Wcy)#+@k>)~Xl%I@*6%v?2y6wJ-BqCgogH^)nHKx^BMtIgx(ekcfS?8mCGH12OGOJsME8v zU)+biLQqVSddKzojkZBsFht#^0PG;33?%i?@u#;HZ-&CMH@IBl(OK;_Dsd`DWn>P% zdbQBf;W3&Pl+4)^7j=iNm>gzrU$k!b>KL;fa3+iBEXH3uaPP67?|}LN4*Cg}i`(0) zdEO2j$EEt_AYH-j$=vQ0%!kX1W*(&!YUZrXElx@(R*|+MZF(TQ%JlPb&aQAt5$^1N zYOF9>!%N=Qy(a7W7~f^1;Db%8tz-CL*n+`||0eOEM-ILM+I=f*`mSap4l1;6%VA&H=DEu9!SEfijRv*&%X)I5#1U|{BLjtgQ;Z$T3FX$smma)C<)Bo9rsZ2_*9()bDi

  • Fg$nPPN6}9W5ka+&v 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 NK;_lszQ~w`{U32a-A@1j literal 0 HcmV?d00001 diff --git a/glabels2/help/C/figures/print-copies.png b/glabels2/help/C/figures/print-copies.png new file mode 100644 index 0000000000000000000000000000000000000000..d34d03c97cae00753bf436c4b9e1a98bc1208ba8 GIT binary patch literal 6642 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 RguBcLWd(Kl0@?e|{{w1L`sV-u literal 0 HcmV?d00001 diff --git a/glabels2/help/C/glabels-C.omf b/glabels2/help/C/glabels-C.omf new file mode 100644 index 00000000..ad12113a --- /dev/null +++ b/glabels2/help/C/glabels-C.omf @@ -0,0 +1,22 @@ + + + + + Jim Evins (evins@snaught.com) + + + gLabels + + 2004-08-09 + + + User manual for the gLabels label and business card creation program + + + user's guide + + + + + + diff --git a/glabels2/help/C/glabels.xml b/glabels2/help/C/glabels.xml new file mode 100644 index 00000000..6d96d3e1 --- /dev/null +++ b/glabels2/help/C/glabels.xml @@ -0,0 +1,2136 @@ + + + + + + gLabels"> + +]> + + + + + +
    + + + + &app; Manual V&manrevision; + + + 2003-2007 + Jim Evins + + + + + + + Jim Evins + + + &legal; + + + + + Jim + Evins + + + + + + + + + + + + + + + + + + + + + gLabels Manual V&manrevision; + &date; + + Jim Evins + evins@snaught.com + + Jim Evins + + + + + This manual describes version &appversion; of gLabels. + + + Feedback + To report a bug or make a suggestion regarding the &app; application or + this manual, follow the directions in the gLabels Contact Page. + + + + + + + gLabels + + + glabels + + + + + + + + + + Introduction + + The &app; application is a lightweight program for creating labels + and business cards for the GNOME desktop + environment. It is designed to work with various laser/ink-jet + peel-off label and business card sheets that you'll find at most + office supply stores. + + + + + + + + + + + Getting Started + + + To Start &app; + You can start &app; in the following ways: + + + + Applications menu + + Choose + + Office + gLabels + . + + + + Command line + + Type glabels, + then press Return: + + + + + + + When You Start &app; + When you start &app;, the following window is displayed. + + +
    + &app; Start Up Window + + + + + + +
    + + + + + + The &app; window contains the following elements: + + + + Menubar. + + The menus on the menubar contain all of the commands you + need to create and edit labels and business cards in + &app;. + + + + Main toolbar. + + The main toolbar contains a subset of common File and Edit + commands that you can access from the menubar. + + + + Drawing toolbar. + + The drawing toolbar contains a subset of commands for + editing the current glabels document. + + + + Display area. + + The display area is the main drawing interface to + &app;. + + + + Object sidebar. + + The object sidebar provides an interface for viewing and + editing all properties of an individual object. + + + + Properties toolbar. + + The properties toolbar contains a set of tools to + manipulate the properties of selected objects and set default + properties for new objects. + + + + Statusbar. + + The statusbar displays information about current + &app; activity and contextual + information about the menu items. + + + +
    +
    + + + + + + + + Usage + + + + To Create a New Label or Card + + To create a new label or business card, choose + File New + + to display the New Label or Card dialog. Select + the media type and orientation for the new document, + then click OK. A new document is + displayed in the display area of the &app; + window. + + If your particular media type is missing from this dialog, + see + + + + + + To Open a File + + To open a file, choose + File Open + to display the Open File dialog. + Select the file that you want to open, then click + OK. The file is displayed in the display area + of the &app; window. + + You can also open multiple files in + &app;. The application creates a separate + application window for each open file. + + The application records the paths and filenames of the + most recent files that you have edited and displays the files as menu + items on the + FileRecent Files + menu. + + + + + + To Open Multiple Files from a Command Line + + You can run &app; from a command line + and open a single file or multiple files. To open multiple files from + a command line, type the following command, then press + Return: + + glabels + file1.glabels file2.glabels file3.glabels + + + When the application starts, the files that you specify are + displayed in separate &app; windows. + + + + + + To Save a File + + You can save files in the following ways: + + + + + To save changes to an existing file, choose + File + Save . + + + + + To save a new file or to save an existing file under a new + filename, choose File + Save As . Enter a name + for the file in the Save As dialog box, + then click OK. + + + + + + + + + To Change Label Properties + + To change the media type and/or orientation of a label, choose + File + Properties to display the + Label properties dialog. Select the + new media type and orientation for the document, then click + OK. + + + + + + To Create a Custom Template + + To create a new custom template, choose + File + Template Designer ... + to display the Template Designer dialog. + This dialog will assist you in creating a custom template for + most types of label or card stationery that you may encounter. + + If you prefer, you can create your templates manually. + For this option see + + + + + + + To Close a File + + To close the current document, choose + File + Close to close the application + window. If the current document is modified, a confirmation dialog + will be presented, allowing you to save the document or cancel + the command. If the window being closed is the only open window, + &app; will exit. + + + + + + To Quit <application>&app;</application> + + To quit &app;, choose + File + Quit . This is equivalent + to closing all open windows. See + . + + + + + + To Print Labels or Cards + + To print labels or cards, choose + File Print + to display the Print dialog. + Once print options have been selected, click Print + to print the labels or cards. To simply preview the results, + click Print Preview instead. + + The Print dialog allows you to specify the + following print options: + + + The Labels Tab of the Print Dialog + + + + + Print control (Simple) + + + For simple labels or cards (no document merge), the job + tabbed section contains the following copy controls. + + + + + + The number of copies of the label can be selected by + choosing the number of full sheets to print, or a specific + subset of labels on a single sheet. + + The mini-preview can also be used to graphically select + the subset of labels by clicking the first label on the + mini-preview and dragging to the last label. + + + + + + Print control (Merge) + + + For labels or cards using the document merge (also known + as "mail merge") capability, the job tabbed section contains + the following merge controls instead of copy controls. + + + + + + The total number of labels or cards printed is the + product of the number of records in the merge source and + the number of copies selected. If multiple copies are + selected, these can be either collated (copies of the + same record grouped together) or un-collated (one copy + each record is printed before next copy). + + Printing can begin on any label on the first sheet. + This can be selected with the Start on + label spinbutton. + + The mini-preview can also be used to graphically select + this first label, by clicking on the desired label in the + mini-preview. + + + + + Options + + The following options can also be selected. + + + print outlines + Print outlines of labels. This option is useful for + dry-runs, to test printer alignment. + + + print in reverse + Prints the labels as mirror images. This option is + useful for printing on clear labels that will be viewed + from the reverse side (e.g. in a car window). + + + print crop marks + Prints crop marks along the edge of the sheet. + This option is useful for printing on blank stock, to + be cut after printing. This option does not work well + with all templates. + + + + + + + + + + + + To Create New Objects + + Objects are created by choosing the appropriate selection under + the Objects + Create Object submenu or + the Drawing Toolbar. This will place the + display area into object creation mode as indicated by its cursor. + To return to the default object selection mode without creating + an object, choose Objects + Select Mode . This will + return the display area's cursor to the default selection arrow. + + The following describes the object creation mode for each object + type: + + + + + Text + + Click the desired location of the upper left corner of the + text object. New text objects are initialized with the + string "Text." To change this text, or other properties, see + . + + + + + Box + + Click the desired location of the upper left corner of the + box object and drag to the desired location of the lower right + corner. If you simply click in a single location, a square + box will be created. To change properties of the box object, see + . + + + + + Line + + Click the desired location of one end of the + line object and drag to the desired location of the other end. + If you simply click in a single location, a diagonal line + will be created. To change properties of the line object, see + . + + + + + Ellipse + + Click the desired location of the upper left corner of the + ellipse object and drag to the desired location of the lower + right corner. If you simply click in a single location, a circle + will be created. To change properties of the ellipse object, see + . + + + + + Image + + Click the desired location of the upper left corner of the + image object and drag to the desired location of the lower + right corner. If you simply click in a single location, a square + will be created. New image objects are initialized with a + simple checkerboard image. To change this image, or other + properties of the image object, see + . + + + + + Barcode + + Click the desired location of the upper left corner of the + barcode object. New barcode objects are initialized to a + POSTNET barcode with representative data. To change data + and properties of the barcode object, see + . + + + + + + + + + + + To Select Objects + + A prerequisite for performing operations on objects is the + selection of individual objects or groups of objects. The + display area must be in the object selection mode to create new + selections, as indicated by an arrow cursor. The object + selection mode is selected by the + Objects + Select Mode menu item, + or the corresponding command on the Drawing + Toolbar. + + + + + Selecting a single object + + A single object can be selected simply by clicking + on the desired object in the display area. + Once selected the object will be highlighted with a set of + resizing handles. + + + + + Aggregate object selections + + Multiple objects can be selected by first selecting the first + object as above and then by holding the Ctrl + key while selecting additional objects. + Individual objects can be added to an existing selection + at any time by holding the Ctrl key while + selecting the desired objects. All objects can also be + selected by using the Edit + Select All + menu item. All objects in an aggregate object selection will be + highlighted. + + + + + Area selections + + Multiple objects can also be selected by clicking an empty + area and dragging to form a rectangular area. When released, + all objects contained in the area will form an aggregate + selection. An area selection can be used to add to an existing + selection by holding the Ctrl key while + performing the selection. + + + + + Unselecting objects + + Individual objects can be removed from an existing + selection by holding the Ctrl key while + clicking on a previously selected object. An entire selection + can be dismissed by using the + Edit Un-select All + menu item + or by simply clicking any empty space in the display area. + Once an object is unselected its highlight is removed. + + + + + + + + + + Clipboard Commands + + Object selections can be manipulated using the standard clipboard + operations Cut, + Copy, Paste, + and Delete. + + + + + + + + CtrlX + + Cut + + + + Moves selected objects to the clipboard. The objects are + then available for pasting back into the current document or + another document. + + + + + + + + CtrlC + + Copy + + + + Copies selected objects to the clipboard without deleting + them. The objects are then available for pasting back into + the current document or another document. + + + + + + + + CtrlV + + Paste + + + + Pastes objects from the clipboard into the current document. + &app; can only paste objects from + another &app; document. + + + + + + + + Delete + + Delete + + + + Deletes selected objects without placing them on the + clipboard. + + + + + + + + + + To Edit Object Properties + + Most object properties can be modified through the object + editor sidebar, illustrated below. To use the object editor, + a single object must first be selected. See + . + + +
    + Object Editor Sidebar + + + + + + +
    + + + The object editor will contain a subset of the following + tabbed sections, depending on object type: + + + Text Tabbed Section (Text objects) + + This section contains a small editor for changing the content + of a text object. It also contains a dropdown menu of available + document merge keys, that can be inserted into text. + + + + + Image Tabbed Section (Image objecs) + + This section contains a file entry with preview to select + image files. The browse button can be used to easily locate + image files. Alternatively, a document merge key can be used + instead to provide a filename at print time. + + + + + Data Tabbed Section (Barcode objecs) + + This section contains a text entry to enter literal barcode + data. Alternatively, a document merge key can be used to + provide this data at print time. + + + + + Style Tabbed Section (Text objects) + + This section contains controls to select text properties, + including font family, font size, font weight, color, and + text justification. + + + + + Style Tabbed Section (Barcode objecs) + + This section contains controls to select barcode properties, + including barcode style, color, whether to print text, and whether + to include a checksum digit. + + + + + Line Tabbed Section + + This section contains controls to select properties of lines + and outlines. These properties include line width and color. + + + + + Fill Tabbed Section + + This section contains controls to select fill properties of box + and ellipse objects. Currently the only fill property is fill + color. + + + + + Size Tabbed Section (All except line objects) + + This section contains controls to select the width and height + of an object. A checkbox is provided, so that the current aspect + ratio can be locked while manipulating the width and height controls. + Image objects also provide a button to reset the size to the + image's natural size (Assumes 72DPI). + + + + + Size Tabbed Section (Line objects) + + This section contains controls to select the length and angle + of a line object. + + + + + Position Tabbed Section + + This section contains controls to change the position of an + object. + + + + + + Shadow Tabbed Section (All except image and barcode objects) + + This section contains controls to add a shadow to an object. + + + + +
    + + + + Other Manipulations of Objects + + Objects can also be manipulated in the following ways. + + + Moving and Resizing Objects + + Objects can be moved by simply clicking on a selected + object and dragging the object to its new location. If the object + is part of an aggregate selection, all objects in the selection + will move with the object being dragged, maintaining their relative + positions to one another. If no object is selected, clicking on + an object will create a new selection containing that object. + See . + + A selected object can be resized by clicking one of its resize + handle and dragging it to obtain the new size. + + + + + Changing Stacking Order + + Stacking order refers to relative position in the z-axis of + objects. That is when objects overlap, which object will appear + on top of the other. By default, newer objects will appear above + older objects. To change this order, select one or more objects + and choose Objects + Order + Bring to Front + to raise the selection to the top of the stacking + order, or choose Objects + Order + Send to Back + to lower the selection to the bottom of the + stacking order. These menuitems are also available by right-clicking + the display area when there is a non-empty selection. + + + + + Rotating and Flipping Objects + + Objects can be rotated 90 degrees in either direction, or flipped + horizontally or vertically, by choosing the appropriate menuitem + in the Objects + Rotate/Flip sub-menu. These + menuitems are also available by right-clicking + the display area when there is a non-empty selection. + + + + + Aligning Objects + + Objects can be aligned horizontally or vertically, relative to + one another, or relative to the center line of the label, by + choosing the appropriate menuitem from the + Objects + Align Horizontal + or Objects + Align Horizontal sub-menus. + These menuitems are also available by right-clicking + the display area when there is a non-empty selection. + + + + + Using the Property Bar + + The property bar can be used to change some common properties + of objects en-masse. These properties include font family, font + size, font weight, text alignment, text color, fill color, line + or outline color, and line width. The property bar also controls + the defaults for these properties for any newly created objects. + + + + + + + + + + + Performing a Document Merge + + Document Merge (sometimes called "Mail Merge") is a powerful + feature that allows a unique label or card to be printed for each + record in an external data source. + + The first step to performing a document merge is to prepare + a source document that contains your merge data. This data could + be mailing addresses or any other data that you wish to create + unique labels or cards for. Currently back-ends only exist for + text files and the evolution data server -- others are planned. The currently + supported text-file format is very simple: each line is a record; + fields are delimited by commas (CSV), tabs, or colons; and newlines + can be embedded into fields by using the "\n" entity. This file + could be created using any text editor or could be created by + another program or script. A common way of creating CSV files is + to export them from a spreadsheet program. + + A label must then be configured to "point at" this data file. + To configure the merge properties of a document, choose + Objects + Merge Properties menu item + to display the merge properties dialog. This + dialog is used to select the exact data file format and file + name (location) of the merge data. + + Finally, once the label has been configured for a data file, + field keys can be inserted into text objects and used as source + or data for barcode objects and image filenames for image objects. + See for more information + on using merge data for these object types. + + Now that your label is configured, gLabels will print a unique + label for each record in your source document -- substituting fields + from each record for field keys in the all text, barcode, and + image objects. + + See for a detailed + tutorial on the document merge feature. + + + + + +
    + + + + + + + + Settings + To configure &app;, choose + + Settings + Preferences + . The + Preferences dialog contains the following tabbed + sections: + + + + + + + + + + + + + + Locale + + + + Units + + Use this radio button group to specify your prefered units. + Select one of the following options: + + + + Points + Use points (1 point = 1/72 in = 0.352778 mm). + + + + Inches + Use inches. + + + + Millimeters + Use millimeters. + + + Default: + Inches. + + + + + Default page size + + Use this radio button group to specify your prefered page size. + This will make it quicker for you to locate media types when creating a new + label or card. + + + + US Letter + Most of your media will be of the US Letter page size (8.5 x 11 inches). + + + + ISO A4 + Most of your media will be of the ISO A4 page size (210 x 297 mm). + + + Default: + US Letter. + + + + + + + + Object defaults + + + + Text + + Use these controls to set the default properties of new text objects. + These properties are + + + + Font + These controls are used to select font family and font size, and + whether the font should bold or in italics. + + + + Color + This control selects the default text color. + + + + Alignment + These controls are used to select the default text alignment (left, center or right). + + + + + + + Line + + Use these controls to set the default properties of lines and outlines of + new objects. These properties are + + + + Width + This control selects the default line width. + + + + Color + This control selects the default line color. + + + + + + + Fill + + Use these controls to set the default fill properties of + new objects. These properties are + + + + Color + This control selects the default fill color. + + + + + + + + + + + + + + Document Merge Tutorial + + Document Merge (sometimes called "Mail Merge") is a powerful + feature that allows a unique label or card to be printed for each + record in an external data source. It is however, the most mis-understood + feature of glabels. The following examples + will step through a couple of common tasks using the document merge + feature. + + + Example 1: Name Tags + + In this example we are organizing an orientation party for the new + crew members of our ship. We have a list of freshman crew members that we + created in gnumeric and exported as the following + CSV file. We could have created this file by using a text editor, but heck it + is the 23rd century. + + +Name,Department,SN +"Jim Kirk",Management,"SC937-0176 CEC" +"Mr. Spock",Sciences,S179-276SP +"Leonard McCoy",Medicine,unknown +"Montgomery Scott",Engineering,SE-197-54T + + + In glabels we have created a new glabels + document using the Avery 5395 "Name Badge Labels" template. Next we use the + Objects + Merge Properties menu item to display + the merge properties dialog. We use this dialog to + select the source type (in our case CSV) and the merge source (filename) as + shown. + + +
    + Merge properties dialog + + + + + + +
    + + + Before applying the merge source, we uncheck the first record since it is only + column headers from our original gnumeric spreadsheet + and would simply waste our first label. We could also unselect any other records + that we didn't want to print a label for. + + We can also view each record in more detail by clicking on the appropriate + expander (the little triangles) as shown. Once we are satisfied with the + selections in this dialog we click OK to accept the + changes. + + Now we start adding objects to our glabels document as shown. + + +
    + Adding objects + + + + + + +
    + + + In this example we have added three text objects and a barcode object. The + first text object contains only simple literal text ("Hello, my name is"). The + second text object contains a single merge field ("${1}") corresponding to the + first field of a record (first column of a line) which contains the new crew + member's full name. The third text field contains both literal text + ("Department: ") followed by a single merge field ("${2}") corresponding to + the second field or the crew member's department. The barcode object is + configured to use field (or key) "3" which contains our crew member's + starfleet serial number. + + Now we can print our name tags by selecting the + File + Print menu item. This will display + print dialog as shown below. + + +
    + Printing name tags + + + + + + +
    + + + Just to make sure our labels are going to look okay, we select the + Print outlines option and click + Print Preview. This will display a print preview dialog + as shown below. + + +
    + Name tags preview + + + + + + +
    + + + Everything looks good, so we can now load up our printer with + the appropriate label stock, print our name tags and start beaming our guests + aboard. + +
    + + + Example 2: Address Labels + + In this example we are going to throw a party and need to print mailing + address labels for our invitations. We have a list of our closest friends + that we created in gnumeric and exported as the + following CSV file. It should be noted that not everyone has a middle initial or + a two line address. + + +LAST,FIRST,MI,ADDR1,ADDR2,CITY,STATE,ZIP +,,,,,,, +Critter,Ess,S,"123 Faux St.",,Alexandria,VA,22310 +Doe,John,,"Apt 1X","451 Mystery St.",Trenton,NJ,08601 +Summers,Joyce,,"1630 Revello Dr",,Sunnydale,CA,95037 +McGarret,Steve,O,"404 Piikoi Street",,Honolulu,HI,96813 +Kramer,Cosmo,,"Apt 5B","129 W. 81 St.","New York",NY,10024-7207 + + + In glabels we have created a new glabels + document using the Avery 5512 "Address Labels" template. Next we use the + Objects + Merge Properties menu item to display + the merge properties dialog. We use this dialog to + select the source type (in our case CSV) and the merge source (filename) as + shown. + + +
    + Merge properties dialog + + + + + + +
    + + + Before applying the merge source, we uncheck the first record since it is only + column headers from our original gnumeric spreadsheet + and would simply waste our first label. We also unselect the second record + which is empty (an artifact of our original spreadsheet). We could also unselect + any other records that we didn't want to print a label for. + + We can also view each record in more detail by clicking on the appropriate + expander (the little triangles) as shown. Once we are satisfied with the + selections in this dialog we click OK to accept the + changes. + + Now we start adding objects to our glabels document as shown. + + +
    + Adding objects + + + + + + +
    + + + In this example we have a single text object. This text object contains + all of our merge fields organized on multiple lines as a mailing address. + Notice that fields ${4} and ${5} (corresponding to ADDR1 and ADDR2) are each + located with no other text on their own lines. When + glabels encounters a field as the only text on + a line, it will not expand the line if the field is empty. + + Now we can print our address labels by selecting the + File + Print menu item. This will display + print dialog as shown below. + + +
    + Printing address labels + + + + + + +
    + + + Just to make sure our labels are going to look okay, we select the + Print outlines option and click + Print Preview. This will display a print preview dialog + as shown below. + + +
    + Address labels preview + + + + + + +
    + + + Everything looks good, so we can now load up our printer with + the appropriate label stock, print our address labels and start mailing + our party invitations. + +
    + +
    + + + + + + + Manually Creating New Templates + + Predefined templates are defined by XML files located in + ${prefix}/share/glabels/, + where ${prefix} is usually something like + /usr/local or /usr depending + on the configuration option prefix. gLabels will + use all files of the form *-templates.xml + or *.template, that it finds in + ${prefix}/share/glabels/ and + ${HOME}/.glabels/. + Additional templates can be added by creating additional + *.template files in either of these directories. + + + The format for these files is defined in the DTD: + glabels-2.2.dtd. (This DTD also describes other + XML formats used by glabels.) + + + Assumptions/caveats + + + A sheet contains only one size of label or card (if a sheet + contains more than one size of item, it can be split into + multiple templates for multiple pass printing) + + + Distances can be expressed in units of pt, + in, mm, + cm, or pc. For example: + "1.0in" or "2.54cm". If no + units are specified, computer points (pt) will + be assumed (1 pt = + 1/72 in = 0.352778 mm). + + + + + + + Template Files + + +<?xml version="1.0"?> +<Glabels-templates> + + ...templates... + +</Glabels-templates> + + + + + + Example Template + + <Template name="Avery 8160" size="US-Letter" description="Mailing Labels"> + <Label-rectangle id="0" width="189" height="72" round="5"> + <Markup-margin size="5"/> + <Layout nx="3" ny="10" x0="11.25" y0="36" dx="200" dy="72"/> + </Label-rectangle> + <Alias name="Avery 5160"/> + <Alias name="Avery 6233"/> + </Template> + + + + + Template Node + + A Template node describes a single stationary + product. It must contain one instance of any type of Label node + (Label-rectangle, + Label-round, or Label-cd). + This node can be followed by zero or more + Alias nodes. + + + + + + + + + Property + + + Description + + + + + + brand + + Brand or manufacturer of stationary product. + E.g. "Avery" + + + + part + + Part number or name of stationary product. + E.g. "8160" + + + + size + + Size of sheet. E.g., "US-Letter," "A4", ... + + + + description + + Description of stationary product. E.g, + "Mailing Labels." + + + + _description + + Translatable description of stationary product. + E.g, "Mailing Labels." (Only useful for predefined + templates) + + + + width + + Page width. Only valid if size="Other" + + + + height + + Page height. Only valid if size="Other" + + + + + + + + + + Label-rectangle Node + + A Label-rectangle node describes the + dimensions of a single label or business card that is rectangular + in shape (may have rounded edges). + + + + + + + + + Property + + + Description + + + + + + id + + Reserved for future use. Should always be 0. + + + + width + Width of label/card + + + height + Height of label/card + + + round + + Radius of corners. For items with square edges + (business cards), the radius should be 0. + + + + x_waste + + Amount of horizontal waste (over-print) to allow. This is useful + for minimizing alignment problems when using non-white + backgrounds (e.g. images). + + + + y_waste + + Amount of vertical waste (over-print) to allow. This is useful + for minimizing alignment problems when using non-white + backgrounds (e.g. images). + + + + + + + +
    + Label-rectangle Parameters + + + + + + +
    + + +
    + + + Label-round Node + + A Label-round node describes the dimensions + of a simple round label (not a CD). + + + + + + + + + Property + + + Description + + + + + + id + + Reserved for future use. Should always be 0. + + + + radius + Radius (1/2 diameter) of label + + + waste + + Amount of waste (over-print) to allow. This is useful + for minimizing alignment problems when using non-white + backgrounds (e.g. images). + + + + + + + + + + Label-cd Node + + A Label-cd node describes the dimensions + of a CD, DVD, or business card CD. + + + + + + + + + Property + + + Description + + + + + + id + + Reserved for future use. Should always be 0. + + + + radius + Outer radius of label + + + hole + Radius of concentric hole + + + width + + If present, the label is clipped to the given width. + (Useful for "business card CDs"). + + + + height + + If present, the label is clipped to the given height. + (Useful for "business card CDs"). + + + + waste + + Amount of waste (over-print) to allow. This is useful + for minimizing alignment problems when using non-white + backgrounds (e.g. images). + + + + + + + +
    + CD Label Parameters + + + + + + +
    + + +
    + + + Markup-margin Node + + A Markup-margin describes a margin along + all edges of a label. + + + + + + + + + Property + + + Description + + + + + + size + + Size of the margin. I.e. the distance of the margin + line from the edge of the card/label. + + + + + + + + + + Markup-line Node + + A Markup-line describes a markup line. + + + + + + + + + Property + + + Description + + + + + + x1 + + x coordinate of 1st endpoint of the line segment. + + + + y1 + + y coordinate of 1st endpoint of the line segment. + + + + x2 + + x coordinate of 2nd endpoint of the line segment. + + + + y2 + + y coordinate of 2nd endpoint of the line segment. + + + + + + + + + + Markup-circle Node + + A Markup-circle describes a markup circle. + + + + + + + + + + Property + + + Description + + + + + + x0 + + x coordinate of circle origin (center). + + + + y0 + + y coordinate of circle origin (center). + + + + radius + Radius of circle. + + + + + + + + + Markup-rect Node + + A Markup-rect describes a markup rectangle. + + + + + + + + + + Property + + + Description + + + + + + x1 + + x coordinate of upper left corner of rectangle. + + + + y1 + + y coordinate of upper left corner of rectangle. + + + + w + + Width of rectangle. + + + + h + + Height of rectangle. + + + + r + Radius of rounded corners of rectangle. + + + + + + + + + Layout Node + + A label node may contain multiple Layout + children. If labels are arranged in a simple grid pattern, only + one layout is needed. However, if labels are arranged in multiple + grids, such as a running bond pattern, multiple + layout tags can be used. Note: a single label + can always be treated as a grid of one. + + + + + + + + + Property + + + Description + + + + + + nx + + Number of labels/cards across in the grid + (horizontal) + + + + ny + + Number of labels/cards up and down in the grid + (vertical) + + + + x0 + + Distance from left edge of sheet to the left edge of + the left column of cards/labels in the layout. + + + + y0 + + Distance from the top edge of sheet to the top edge of + the top row of labels/cards in the layout. + + + + dx + Horizontal pitch of grid. + + + dy + Vertical pitch of grid. + + + + + + +
    + Layout Parameters + + + + + + +
    + + +
    + + + Alias Node + + An Alias node provides the name of a + product with the same size and layout characteristics as the + parent template. + + + + + + + + + Property + + + Description + + + + + + brand + + The brand or manufacturer of the equivalent product. + + + + part + + The part number or name of the equivalent product. + + + + + + + + +
    + + + + + + + + + + + + + + About &app; + &app; was written by Jim Evins + (evins@snaught.com). To find more information about + &app;, please visit the + gLabels Web + page. + + To report a bug or make a suggestion regarding this application or + this manual, follow the directions at the + gLabels Contact Page. + + + This program is distributed under the terms of the GNU + General Public license as published by the Free Software + Foundation; either version 2 of the License, or (at your option) + any later version. A copy of this license can be found at this + link, or in the file + COPYING included with the source code of this program. + + + + + + + +
    diff --git a/glabels2/help/C/legal.xml b/glabels2/help/C/legal.xml new file mode 100644 index 00000000..ac97e1de --- /dev/null +++ b/glabels2/help/C/legal.xml @@ -0,0 +1,76 @@ + + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation + License (GFDL), Version 1.1 or any later version published + by the Free Software Foundation with no Invariant Sections, + no Front-Cover Texts, and no Back-Cover Texts. You can find + a copy of the GFDL at this link or in the file COPYING-DOCS + distributed with this manual. + + This manual is part of a collection of GNOME manuals + distributed under the GFDL. If you want to distribute this + manual separately from the collection, you can do so by + adding a copy of the license to the manual, as described in + section 6 of the license. + + + + Many of the names used by companies to distinguish their + products and services are claimed as trademarks. Where those + names appear in any GNOME documentation, and the members of + the GNOME Documentation Project are made aware of those + trademarks, then the names are in capital letters or initial + capital letters. + + + + DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED + UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE + WITH THE FURTHER UNDERSTANDING THAT: + + + + DOCUMENT IS PROVIDED ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR + IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES + THAT THE DOCUMENT OR MODIFIED VERSION OF THE + DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR + A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE + RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE + OF THE DOCUMENT OR MODIFIED VERSION OF THE + DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR + MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY + CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY + SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS + LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED + VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER + EXCEPT UNDER THIS DISCLAIMER; AND + + + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL + THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), + CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, + INITIAL WRITER, ANY CONTRIBUTOR, OR ANY + DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION + OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH + PARTIES, BE LIABLE TO ANY PERSON FOR ANY + DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR + CONSEQUENTIAL DAMAGES OF ANY CHARACTER + INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS + OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR + MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR + LOSSES ARISING OUT OF OR RELATING TO USE OF THE + DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, + EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF + THE POSSIBILITY OF SUCH DAMAGES. + + + + + + diff --git a/glabels2/help/Makefile.am b/glabels2/help/Makefile.am new file mode 100644 index 00000000..a68e4e50 --- /dev/null +++ b/glabels2/help/Makefile.am @@ -0,0 +1,3 @@ +## Process this file with automake to produce Makefile.in. + +SUBDIRS = C diff --git a/glabels2/iec16022-0.2.1/BUGS b/glabels2/iec16022-0.2.1/BUGS new file mode 100644 index 00000000..9de2b176 --- /dev/null +++ b/glabels2/iec16022-0.2.1/BUGS @@ -0,0 +1,6 @@ +iec16022 -f i -c aaaaabbbbbccccc +Barcode too long for 32x8 +No barcode produced + +We should find a suit barcode and not error here. + diff --git a/glabels2/iec16022-0.2.1/CHANGELOG b/glabels2/iec16022-0.2.1/CHANGELOG new file mode 100644 index 00000000..7c02bce3 --- /dev/null +++ b/glabels2/iec16022-0.2.1/CHANGELOG @@ -0,0 +1,26 @@ +0.2.1 + - Fix 'Barcode too long' bug. Thanks to Alessandro Zummo. + - Use Lindent to start cleaning up the code mess. + +2006-11-11 Stefan Schmidt + +0.2 + - Rewrite Makefile. + - Documentation update. + - Exclude double include of header files. + - Layout cahnges. Place return value in front of function name. + - 80 character per line. + - Print version number before usage. + - Tests + +2006-02-06 Stefan Schmidt + + +0.1 + - Initial release. + - INSTALL, README, TODO, CREDITS, Makefile, LICENSE and CHANGELOG files + added. + - Fix some include issues. + - Fix some signed/unsigned issues. + +2006-01-08 Stefan Schmidt diff --git a/glabels2/iec16022-0.2.1/CREDITS b/glabels2/iec16022-0.2.1/CREDITS new file mode 100644 index 00000000..37e2bcc8 --- /dev/null +++ b/glabels2/iec16022-0.2.1/CREDITS @@ -0,0 +1,10 @@ +Adrian Kennard, Andrews & Arnold Ltd for the original source code. You can +find it at http://aa.gg/free/ + +Cliff Hones for the RS coding. + +Jan Luebbe for writing the manual page and maintaining +the debian package. + +Daniel Willman for maintaining the gentoo +ebuild. diff --git a/glabels2/iec16022-0.2.1/INSTALL b/glabels2/iec16022-0.2.1/INSTALL new file mode 100644 index 00000000..102a61e1 --- /dev/null +++ b/glabels2/iec16022-0.2.1/INSTALL @@ -0,0 +1,8 @@ +To install this software you need the following libraries installed: +- libpopt +- zlib + +Installing iec16022 is really simple. Just do a 'make' and 'make install'. + +In standard configuration the binary will be installed in /usr/local/bin. You +can change the prefix and DESTDIR in the Makefile. diff --git a/glabels2/iec16022-0.2.1/LICENSE b/glabels2/iec16022-0.2.1/LICENSE new file mode 100644 index 00000000..3912109b --- /dev/null +++ b/glabels2/iec16022-0.2.1/LICENSE @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/glabels2/iec16022-0.2.1/Makefile.am b/glabels2/iec16022-0.2.1/Makefile.am new file mode 100644 index 00000000..566bdc09 --- /dev/null +++ b/glabels2/iec16022-0.2.1/Makefile.am @@ -0,0 +1,35 @@ +INCLUDES = \ + -DLIB \ + $(GLABELS_CFLAGS) + + +IEC_FILES = \ + iec16022ecc200.c \ + reedsol.c + +noinst_LTLIBRARIES = libiec16022.la + +libiec16022_la_SOURCES = $(IEC_FILES) + +EXTRA_DIST = \ + BUGS \ + CHANGELOG \ + CREDITS \ + iec16022.1 \ + iec16022.c \ + iec16022ecc200.h \ + image.c \ + image.h \ + INSTALL \ + LICENSE \ + Makefile.dist \ + README \ + README.glabels \ + reedsol.h \ + TODO \ + test/testsuite-example.bin \ + test/testsuite-example.eps \ + test/testsuite-example.hex \ + test/testsuite-example.png \ + test/testsuite-example.text \ + test/testsuite.sh diff --git a/glabels2/iec16022-0.2.1/Makefile.dist b/glabels2/iec16022-0.2.1/Makefile.dist new file mode 100644 index 00000000..4929afdb --- /dev/null +++ b/glabels2/iec16022-0.2.1/Makefile.dist @@ -0,0 +1,40 @@ +CC=/usr/bin/cc +INSTALL=/usr/bin/install +GZIP=/bin/gzip + +prefix=/usr/local +bindir=$(prefix)/bin +mandir=$(prefix)/share/man + +CFLAGS=-Wall + +.PHONY: test clean + +all: iec16022 manpage + +iec16022: iec16022ecc200.o image.o iec16022.c + $(CC) -c iec16022.c + $(CC) -o iec16022 $(CFLAGS) reedsol.o iec16022.o image.o iec16022ecc200.o -lz -lpopt + +manpage: iec16022.1 + $(GZIP) -f --best < iec16022.1 > iec16022.1.gz + +install: all + $(INSTALL) -d -m 755 $(DESTDIR)$(bindir) $(DESTDIR)$(mandir)/man1 + $(INSTALL) -m 755 iec16022 $(DESTDIR)$(bindir) + $(INSTALL) -m 644 iec16022.1.gz $(DESTDIR)$(mandir)/man1 + +test: iec16022 + cd test; ./testsuite.sh + +iec16022ecc200.o: iec16022ecc200.c iec16022ecc200.h reedsol.o + $(CC) -c iec16022ecc200.c + +image.o: image.c image.h + $(CC) -c image.c + +reedsol.o: reedsol.c reedsol.h + $(CC) -DLIB -c reedsol.c + +clean: + rm -f iec16022 iec16022.1.gz *.o diff --git a/glabels2/iec16022-0.2.1/README b/glabels2/iec16022-0.2.1/README new file mode 100644 index 00000000..072c0aef --- /dev/null +++ b/glabels2/iec16022-0.2.1/README @@ -0,0 +1,13 @@ +With iec16022 you can produce 2d barcodes. Also known as Data Matrix. These +barcodes are defined in ISO/IEC 16022. + +The code was originally written by Andrews & Arnold Ltd. You can download this +code from http://aa.gg/free/. +The current maintainer of the code is Stefan Schmidt. + +Website: http://www.datenfreihafen.org/projects/iec16022.html +Maillinglist: https://sirius.lasnet.de/mailman/listinfo/iec16022 +SVN repository: https://svn.datenfreihafen.org/iec16022/ + + +Stefan Schmidt diff --git a/glabels2/iec16022-0.2.1/README.glabels b/glabels2/iec16022-0.2.1/README.glabels new file mode 100644 index 00000000..ad1dced7 --- /dev/null +++ b/glabels2/iec16022-0.2.1/README.glabels @@ -0,0 +1,6 @@ +The following changes have been made to the stock iec16022 0.2.1 distribution +to facilitate compilation with glabels: + + Makefile renamed to Makefile.dist + added Makefile.am, which is configured from ../configure.in + diff --git a/glabels2/iec16022-0.2.1/TODO b/glabels2/iec16022-0.2.1/TODO new file mode 100644 index 00000000..6c0a97bc --- /dev/null +++ b/glabels2/iec16022-0.2.1/TODO @@ -0,0 +1,9 @@ +- Fix compiler warnings. +- Test on 64bit, powerpc, arm, etc. Anyone? +- Test stamp feature. Anyone? +- Use autotools + +Some things to think about: +--------------------------- +- Use libpng? +- Merge iec16022 in barcode? diff --git a/glabels2/iec16022-0.2.1/iec16022.1 b/glabels2/iec16022-0.2.1/iec16022.1 new file mode 100644 index 00000000..681c3a7f --- /dev/null +++ b/glabels2/iec16022-0.2.1/iec16022.1 @@ -0,0 +1,52 @@ +.TH iec16022 1 2006-01-14 "iec16022 0.1" +.SH NAME +iec16022 \- program to generate 2d barcodes +.SH SYNOPSIS +.B iec16022 +.RI [ options ] +.SH DESCRIPTION +This manual page documents briefly the +.B iec16022 +command. +.PP +.B iec16022 +generates 2d barcodes conforming to the ISO/IEC 16022 standard (which is +also known as Data Matrix and Semacode). +.SH OPTIONS +These programs follow the usual GNU command line syntax, with long +options starting with two dashes (`-'). +A summary of options is included below. +.TP +.B \-s, \-\-size WxH +Sets the size of the generated barcode. +.TP +.B \-c, \-\-barcode text +Specifies the text to be encoded. +.TP +.B \-\-ecc 000|050|080|100|140|200 +Sets the type of ecc to be used. +.TP +.B \-i, \-\-infile filename +Read input data from file. +.TP +.B \-o, \-\-outfile filenmae +Save output to file (instead of standard output). +.TP +.B \-f, \-\-format Text|EPS|Bin|Hex|Stamp|PNG +Set the output type. +.TP +.B \-?, \-\-help +Show summary of options. +.TP +.B \-\-usage +Show short overview of options. +.SH EXAMPLE +To produce a datamatrix barcode for foobar in PNG format you need the following +arguments: +.TP +.B iec16022 -f PNG -c foobar -o foobar.png +.SH AUTHOR +iec16022 was written by Adrian Kennard, Andrews & Arnold Ltd. +.PP +This manual page was written by Jan Luebbe , +for the Debian project (but may be used by others). diff --git a/glabels2/iec16022-0.2.1/iec16022.c b/glabels2/iec16022-0.2.1/iec16022.c new file mode 100644 index 00000000..6fb7c30a --- /dev/null +++ b/glabels2/iec16022-0.2.1/iec16022.c @@ -0,0 +1,462 @@ +/** + * + * IEC16022 bar code generation + * Adrian Kennard, Andrews & Arnold Ltd + * with help from Cliff Hones on the RS coding + * + * (c) 2004 Adrian Kennard, Andrews & Arnold Ltd + * (c) 2006 Stefan Schmidt + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#define IEC16022_VERSION "0.2" + +#include +#include +#include +#include +#include +#include +#include +#include "image.h" +#include "iec16022ecc200.h" + + // simple checked response malloc +void *safemalloc(int n) +{ + void *p = malloc(n); + if (!p) { + fprintf(stderr, "Malloc(%d) failed\n", n); + exit(1); + } + return p; +} + +// hex dump - bottom left pixel first +void dumphex(unsigned char *grid, int W, int H, unsigned char p) +{ + int c = 0, y; + for (y = 0; y < H; y++) { + int v = 0, x, b = 128; + for (x = 0; x < W; x++) { + if (grid[y * W + x]) + v |= b; + b >>= 1; + if (!b) { + printf("%02X", v ^ p); + v = 0; + b = 128; + c++; + } + } + if (b != 128) { + printf("%02X", v ^ p); + c++; + } + printf(" "); + c++; + if (c >= 80) { + printf("\n"); + c = 0; + } + } + if (c) + printf("\n"); +} + +int main(int argc, const char *argv[]) +{ + char c; + int W = 0, H = 0; + int ecc = 0; + int barcodelen = 0; + char *encoding = 0; + char *outfile = 0; + char *infile = 0; + char *barcode = 0; + char *format = "Text"; + char *size = 0; + char *eccstr = 0; + int len = 0, maxlen = 0, ecclen = 0; + unsigned char *grid = 0; + poptContext optCon; // context for parsing command-line options + const struct poptOption optionsTable[] = { + { + "size", 's', POPT_ARG_STRING, &size, 0, "Size", "WxH"}, + { + "barcode", 'c', POPT_ARG_STRING, &barcode, 0, "Barcode", + "text"}, + { + "ecc", 0, POPT_ARG_STRING, &eccstr, 0, "ECC", + "000/050/080/100/140/200"}, + { + "infile", 'i', POPT_ARG_STRING, &infile, 0, "Barcode file", + "filename"}, + { + "outfile", 'o', POPT_ARG_STRING, &outfile, 0, + "Output filename", + "filename"}, + { + "encoding", 'e', POPT_ARG_STRING, &encoding, 0, + "Encoding template", + "[CTXEAB]* for ecc200 or 11/27/41/37/128/256"}, + { + "format", 'f', POPT_ARGFLAG_SHOW_DEFAULT | POPT_ARG_STRING, + &format, 0, + "Output format", "Text/EPS/PNG/Bin/Hex/Stamp"}, + POPT_AUTOHELP { + NULL, 0, 0, NULL, 0} + }; + optCon = poptGetContext(NULL, argc, argv, optionsTable, 0); + poptSetOtherOptionHelp(optCon, "[barcode]"); + if ((c = poptGetNextOpt(optCon)) < -1) { + /* an error occurred during option processing */ + fprintf(stderr, "%s: %s\n", poptBadOption(optCon, + POPT_BADOPTION_NOALIAS), + poptStrerror(c)); + return 1; + } + + if (poptPeekArg(optCon) && !barcode && !infile) + barcode = (char *)poptGetArg(optCon); + if (poptPeekArg(optCon) || !barcode && !infile || barcode && infile) { + fprintf(stderr, "Version: %s\n", IEC16022_VERSION); + poptPrintUsage(optCon, stderr, 0); + return -1; + } + if (outfile && !freopen(outfile, "w", stdout)) { + perror(outfile); + return 1; + } + + if (infile) { // read from file + FILE *f = fopen(infile, "rb"); + barcode = safemalloc(4001); + if (!f) { + perror(infile); + return 1; + } + barcodelen = fread(barcode, 1, 4000, f); + if (barcodelen < 0) { + perror(infile); + return 1; + } + barcode[barcodelen] = 0; // null terminate anyway + close(f); + } else + barcodelen = strlen(barcode); + // check parameters + if (size) { + char *x = strchr(size, 'x'); + W = atoi(size); + if (x) + H = atoi(x + 1); + if (!H) + W = H; + } + if (eccstr) + ecc = atoi(eccstr); + if (W & 1) { // odd size + if (W != H || W < 9 || W > 49) { + fprintf(stderr, "Invalid size %dx%d\n", W, H); + return 1; + } + if (!eccstr) { + if (W >= 17) + ecc = 140; + else if (W >= 13) + ecc = 100; + else if (W >= 11) + ecc = 80; + else + ecc = 0; + } + if (ecc && ecc != 50 && ecc != 80 && ecc != 100 && ecc != 140 || + ecc == 50 && W < 11 || ecc == 80 && W < 13 || ecc == 100 + && W < 13 || ecc == 140 && W < 17) { + fprintf(stderr, "ECC%03d invalid for %dx%d\n", ecc, W, + H); + return 1; + } + + } else if (W) { // even size + if (W < H) { + int t = W; + W = H; + H = t; + } + if (!eccstr) + ecc = 200; + if (ecc != 200) { + fprintf(stderr, "ECC%03d invalid for %dx%d\n", ecc, W, + H); + return 1; + } + } + + else { // auto size + if (!eccstr) + // default is even sizes only unless explicit ecc set to force odd + // sizes + ecc = 200; + } + + if (tolower(*format) == 's') { // special stamp format checks & defaults + if (!W) + W = H = 32; + if (ecc != 200 || W != 32 || H != 32) + fprintf(stderr, "Stamps must be 32x32\n"); + if (encoding) + fprintf(stderr, "Stamps should use auto encoding\n"); + else { + int n; + for (n = 0; n < barcodelen && (barcode[n] == ' ' || + isdigit(barcode[n]) + || isupper(barcode[n])); + n++) ; + if (n < barcodelen) + fprintf(stderr, + "Has invalid characters for a stamp\n"); + else { + // Generate simplistic encoding rules as used by the windows app + // TBA - does not always match the windows app... + n = 0; + encoding = safemalloc(barcodelen + 1); + while (n < barcodelen) { + // ASCII + while (1) { + if (n == barcodelen + || n + 3 <= barcodelen + && (!isdigit(barcode[n]) + || + !isdigit(barcode + [n + 1]))) + break; + encoding[n++] = 'A'; + if (n < barcodelen + && isdigit(barcode[n - 1]) + && isdigit(barcode[n])) + encoding[n++] = 'A'; + } + // C40 + while (1) { + int r = 0; + while (n + r < barcodelen + && + isdigit(barcode[n + r])) + r++; + if (n + 3 > barcodelen + || r >= 6) + break; + encoding[n++] = 'C'; + encoding[n++] = 'C'; + encoding[n++] = 'C'; + } + } + encoding[n] = 0; + //fprintf (stderr, "%s\n%s\n", barcode, encoding); + } + } + } + // processing stamps + if ((W & 1) || ecc < 200) { // odd sizes + fprintf(stderr, "Not done odd sizes yet, sorry\n"); + } else { // even sizes + grid = + iec16022ecc200(&W, &H, &encoding, barcodelen, barcode, &len, + &maxlen, &ecclen); + } + + // output + if (!grid || !W) { + fprintf(stderr, "No barcode produced\n"); + return 1; + } + switch (tolower(*format)) { + case 'i': // info + printf("Size : %dx%d\n", W, H); + printf("Encoded : %d of %d bytes with %d bytes of ecc\n", len, + maxlen, ecclen); + printf("Barcode : %s\n", barcode); + printf("Encoding: %s\n", encoding); + break; + case 'h': // hex + dumphex(grid, W, H, 0); + break; + case 'b': // bin + { + int y; + for (y = 0; y < H; y++) { + int v = 0, x, b = 128; + for (x = 0; x < W; x++) { + if (grid[y * W + x]) + v |= b; + b >>= 1; + if (!b) { + putchar(v); + v = 0; + b = 128; + } + } + if (b != 128) + putchar(v); + } + } + break; + case 't': // text + { + int y; + for (y = H - 1; y >= 0; y--) { + int x; + for (x = 0; x < W; x++) + printf("%c", + grid[W * y + x] ? '*' : ' '); + printf("\n"); + } + } + break; + case 'e': // EPS + printf("%%!PS-Adobe-3.0 EPSF-3.0\n" + "%%%%Creator: IEC16022 barcode/stamp generator\n" + "%%%%BarcodeData: %s\n" "%%%%BarcodeSize: %dx%d\n" + "%%%%BarcodeFormat: ECC200\n" + "%%%%DocumentData: Clean7Bit\n" "%%%%LanguageLevel: 1\n" + "%%%%Pages: 1\n" "%%%%BoundingBox: 0 0 %d %d\n" + "%%%%EndComments\n" "%%%%Page: 1 1\n" + "%d %d 1[1 0 0 1 -1 -1]{<\n", barcode, W, H, W + 2, + H + 2, W, H); + dumphex(grid, W, H, 0xFF); + printf(">}image\n"); + break; + case 's': // Stamp + { + char temp[74], c; + time_t now; + struct tm t = { + 0 + }; + int v; + if (barcodelen < 74) { + fprintf(stderr, + "Does not look like a stamp barcode\n"); + return 1; + } + memcpy(temp, barcode, 74); + c = temp[5]; + temp[56] = 0; + t.tm_year = atoi(temp + 54) + 100; + t.tm_mday = 1; + now = mktime(&t); + temp[54] = 0; + now += 86400 * (atoi(temp + 51) - 1); + t = *gmtime(&now); + temp[46] = 0; + v = atoi(temp + 36); + printf("%%!PS-Adobe-3.0 EPSF-3.0\n" + "%%%%Creator: IEC16022 barcode/stamp generator\n" + "%%%%BarcodeData: %s\n" "%%%%BarcodeSize: %dx%d\n" "%%%%DocumentData: Clean7Bit\n" "%%%%LanguageLevel: 1\n" "%%%%Pages: 1\n" "%%%%BoundingBox: 0 0 190 80\n" "%%%%EndComments\n" "%%%%Page: 1 1\n" "10 dict begin/f{findfont exch scalefont \ + setfont}bind def/rm/rmoveto load def/m/moveto load \ + def/rl/rlineto load def\n" "/l/lineto load def/cp/closepath load def/c{dup stringwidth \ + pop -2 div 0 rmoveto show}bind def\n" "gsave 72 25.4 div dup scale 0 0 m 67 0 rl 0 28 rl -67 0 rl \ + cp clip 1 setgray fill 0 setgray 0.5 0 translate 0.3 \ + setlinewidth\n" "32 32 1[2 0 0 2 0 -11]{<\n", barcode, W, H); + dumphex(grid, W, H, 0xFF); + printf(">}image\n" + "3.25/Helvetica-Bold f 8 25.3 m(\\243%d.%02d)c\n" + "2.6/Helvetica f 8 22.3 m(%.4s %.4s)c\n" + "1.5/Helvetica f 8 3.3 m(POST BY)c\n" + "3.3/Helvetica f 8 0.25 m(%02d.%02d.%02d)c\n", + v / 100, v % 100, temp + 6, temp + 10, t.tm_mday, + t.tm_mon + 1, t.tm_year % 100); + if (c == '1' || c == '2' || c == 'A' || c == 'S') { + if (c == '2') + printf + ("42 0 m 10 0 rl 0 28 rl -10 0 rl cp 57 0 m 5 0 rl 0 \ + 28 rl -5 0 rl cp"); + else + printf + ("42 0 m 5 0 rl 0 28 rl -5 0 rl cp 52 0 m 10 0 rl 0 \ + 28 rl -10 0 rl cp"); + printf + (" 21 0 m 16 0 rl 0 28 rl -16 0 rl cp fill\n" + "21.3 0.3 m 15.4 0 rl 0 13 rl -15.4 0 rl cp 1 setgray \ + fill gsave 21.3 0.3 15.4 27.4 rectclip newpath\n"); + switch (c) { + case '1': + printf + ("27/Helvetica-Bold f 27 8.7 m(1)show grestore 0 setgray \ + 1.5/Helvetica-Bold f 22 3.3 m(POSTAGE PAID GB)show \ + 1.7/Helvetica f 29 1.5 m(DumbStamp.co.uk)c\n"); + break; + case '2': + printf + ("21/Helvetica-Bold f 23.5 13 m(2)1.25 1 scale show grestore \ + 0 setgray 1.5/Helvetica-Bold f 22 3.3 \ + m(POSTAGE PAID GB)show 1.7/Helvetica f 29 1.5 \ + m(DumbStamp.co.uk)c\n"); + break; + case 'A': + printf + ("16/Helvetica-Bold f 29 14.75 m 1.1 1 scale(A)c grestore 0 \ + setgray 1.5/Helvetica-Bold f 22 3.3 m(POSTAGE PAID GB)show \ + 1.7/Helvetica f 22 1.5 m(Par Avion)show\n"); + break; + case 'S': + printf + ("10/Helvetica-Bold f 29 17 m(SU)c grestore 0 setgray \ + 1.5/Helvetica-Bold f 22 1.5 m(POSTAGE PAID GB)show\n"); + break; + } + printf + ("2.3/Helvetica-Bold f 29 10 m(LOYAL MAIL)c\n"); + } else if (c == 'P') { // Standard Parcels + printf("21 0 m 41 0 rl 0 28 rl -41 0 rl cp fill\n" "37.7 0.3 m 24 0 rl 0 27.4 rl -24 0 rl cp 1 setgray fill \ + gsave 21.3 0.3 16.4 27.4 rectclip newpath\n" "22.5/Helvetica-Bold f 37.75 -1.25 m 90 rotate(SP)show \ + grestore 0 setgray\n" + "3.5/Helvetica-Bold f 49.7 21.5 m(LOYAL MAIL)c\n" "2.3/Helvetica-Bold f 49.7 7 m(POSTAGE PAID GB)c\n" "2.6/Helveica f 49.7 4.25 m(DumbStamp.co.uk)c\n"); + } else if (c == '3') + printf("21.15 0.15 40.7 27.7 rectstroke\n" + "21 0 m 41 0 rl 0 5 rl -41 0 rl cp fill\n" + "0 1 2{0 1 18{dup 1.525 mul 22.9 add 24 3 index 1.525 mul \ + add 3 -1 roll 9 add 29 div 0 360 arc fill}for pop}for\n" "50.5 23.07 m 11.5 0 rl 0 5 rl -11.5 0 rl cp fill\n" + "5.85/Helvetica f 23.7 15.6 m(Loyal Mail)show\n" "4.75/Helvetica-Bold f 24 11 m(special)show 4.9/Helvetica \ + f(delivery)show\n" "gsave 1 setgray 3.2/Helvetica-Bold f 24 1.6 \ + m(next day)show 26 10.15 m 2 0 rl stroke grestore\n" "21.15 9.9 m 53.8 9.9 l stroke 53.8 9.9 0.4 0 360 \ + arc fill\n"); + printf("end grestore\n"); + } + break; + case 'p': // png + { + int x, y; + Image *i = ImageNew(W + 2, H + 2, 2); + i->Colour[0] = 0xFFFFFF; + i->Colour[1] = 0; + for (y = 0; y < H; y++) + for (x = 0; x < W; x++) + if (grid[y * W + x]) + ImagePixel(i, x + 1, H - y) = 1; + ImageWritePNG(i, fileno(stdout), 0, -1, barcode); + ImageFree(i); + } + break; + default: + fprintf(stderr, "Unknown output format %s\n", format); + break; + } + return 0; +} diff --git a/glabels2/iec16022-0.2.1/iec16022ecc200.c b/glabels2/iec16022-0.2.1/iec16022ecc200.c new file mode 100644 index 00000000..0b28db70 --- /dev/null +++ b/glabels2/iec16022-0.2.1/iec16022ecc200.c @@ -0,0 +1,963 @@ +/** + * + * IEC16022 bar code generation + * Adrian Kennard, Andrews & Arnold Ltd + * with help from Cliff Hones on the RS coding + * + * (c) 2004 Adrian Kennard, Andrews & Arnold Ltd + * (c) 2006 Stefan Schmidt + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include "reedsol.h" +#include "iec16022ecc200.h" + +static struct ecc200matrix_s { + int H, W; + int FH, FW; + int bytes; + int datablock, rsblock; +} ecc200matrix[] = { + 10, 10, 10, 10, 3, 3, 5, // + 12, 12, 12, 12, 5, 5, 7, // + 8, 18, 8, 18, 5, 5, 7, // + 14, 14, 14, 14, 8, 8, 10, // + 8, 32, 8, 16, 10, 10, 11, // + 16, 16, 16, 16, 12, 12, 12, // + 12, 26, 12, 26, 16, 16, 14, // + 18, 18, 18, 18, 18, 18, 14, // + 20, 20, 20, 20, 22, 22, 18, // + 12, 36, 12, 18, 22, 22, 18, // + 22, 22, 22, 22, 30, 30, 20, // + 16, 36, 16, 18, 32, 32, 24, // + 24, 24, 24, 24, 36, 36, 24, // + 26, 26, 26, 26, 44, 44, 28, // + 16, 48, 16, 24, 49, 49, 28, // + 32, 32, 16, 16, 62, 62, 36, // + 36, 36, 18, 18, 86, 86, 42, // + 40, 40, 20, 20, 114, 114, 48, // + 44, 44, 22, 22, 144, 144, 56, // + 48, 48, 24, 24, 174, 174, 68, // + 52, 52, 26, 26, 204, 102, 42, // + 64, 64, 16, 16, 280, 140, 56, // + 72, 72, 18, 18, 368, 92, 36, // + 80, 80, 20, 20, 456, 114, 48, // + 88, 88, 22, 22, 576, 144, 56, // + 96, 96, 24, 24, 696, 174, 68, // + 104, 104, 26, 26, 816, 136, 56, // + 120, 120, 20, 20, 1050, 175, 68, // + 132, 132, 22, 22, 1304, 163, 62, // + 144, 144, 24, 24, 1558, 156, 62, // 156*4+155*2 + 0 // terminate +}; + + // simple checked response malloc +static void *safemalloc(int n) +{ + void *p = malloc(n); + if (!p) { + fprintf(stderr, "Malloc(%d) failed\n", n); + exit(1); + } + return p; +} + +// Annex M placement alorithm low level +static void ecc200placementbit(int *array, int NR, int NC, int r, int c, + int p, char b) +{ + if (r < 0) { + r += NR; + c += 4 - ((NR + 4) % 8); + } + if (c < 0) { + c += NC; + r += 4 - ((NC + 4) % 8); + } + array[r * NC + c] = (p << 3) + b; +} + +static void ecc200placementblock(int *array, int NR, int NC, int r, + int c, int p) +{ + ecc200placementbit(array, NR, NC, r - 2, c - 2, p, 7); + ecc200placementbit(array, NR, NC, r - 2, c - 1, p, 6); + ecc200placementbit(array, NR, NC, r - 1, c - 2, p, 5); + ecc200placementbit(array, NR, NC, r - 1, c - 1, p, 4); + ecc200placementbit(array, NR, NC, r - 1, c - 0, p, 3); + ecc200placementbit(array, NR, NC, r - 0, c - 2, p, 2); + ecc200placementbit(array, NR, NC, r - 0, c - 1, p, 1); + ecc200placementbit(array, NR, NC, r - 0, c - 0, p, 0); +} + +static void ecc200placementcornerA(int *array, int NR, int NC, int p) +{ + ecc200placementbit(array, NR, NC, NR - 1, 0, p, 7); + ecc200placementbit(array, NR, NC, NR - 1, 1, p, 6); + ecc200placementbit(array, NR, NC, NR - 1, 2, p, 5); + ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4); + ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3); + ecc200placementbit(array, NR, NC, 1, NC - 1, p, 2); + ecc200placementbit(array, NR, NC, 2, NC - 1, p, 1); + ecc200placementbit(array, NR, NC, 3, NC - 1, p, 0); +} + +static void ecc200placementcornerB(int *array, int NR, int NC, int p) +{ + ecc200placementbit(array, NR, NC, NR - 3, 0, p, 7); + ecc200placementbit(array, NR, NC, NR - 2, 0, p, 6); + ecc200placementbit(array, NR, NC, NR - 1, 0, p, 5); + ecc200placementbit(array, NR, NC, 0, NC - 4, p, 4); + ecc200placementbit(array, NR, NC, 0, NC - 3, p, 3); + ecc200placementbit(array, NR, NC, 0, NC - 2, p, 2); + ecc200placementbit(array, NR, NC, 0, NC - 1, p, 1); + ecc200placementbit(array, NR, NC, 1, NC - 1, p, 0); +} + +static void ecc200placementcornerC(int *array, int NR, int NC, int p) +{ + ecc200placementbit(array, NR, NC, NR - 3, 0, p, 7); + ecc200placementbit(array, NR, NC, NR - 2, 0, p, 6); + ecc200placementbit(array, NR, NC, NR - 1, 0, p, 5); + ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4); + ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3); + ecc200placementbit(array, NR, NC, 1, NC - 1, p, 2); + ecc200placementbit(array, NR, NC, 2, NC - 1, p, 1); + ecc200placementbit(array, NR, NC, 3, NC - 1, p, 0); +} + +static void ecc200placementcornerD(int *array, int NR, int NC, int p) +{ + ecc200placementbit(array, NR, NC, NR - 1, 0, p, 7); + ecc200placementbit(array, NR, NC, NR - 1, NC - 1, p, 6); + ecc200placementbit(array, NR, NC, 0, NC - 3, p, 5); + ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4); + ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3); + ecc200placementbit(array, NR, NC, 1, NC - 3, p, 2); + ecc200placementbit(array, NR, NC, 1, NC - 2, p, 1); + ecc200placementbit(array, NR, NC, 1, NC - 1, p, 0); +} + +// Annex M placement alorithm main function +static void ecc200placement(int *array, int NR, int NC) +{ + int r, c, p; + // invalidate + for (r = 0; r < NR; r++) + for (c = 0; c < NC; c++) + array[r * NC + c] = 0; + // start + p = 1; + r = 4; + c = 0; + do { + // check corner + if (r == NR && !c) + ecc200placementcornerA(array, NR, NC, p++); + if (r == NR - 2 && !c && NC % 4) + ecc200placementcornerB(array, NR, NC, p++); + if (r == NR - 2 && !c && (NC % 8) == 4) + ecc200placementcornerC(array, NR, NC, p++); + if (r == NR + 4 && c == 2 && !(NC % 8)) + ecc200placementcornerD(array, NR, NC, p++); + // up/right + do { + if (r < NR && c >= 0 && !array[r * NC + c]) + ecc200placementblock(array, NR, NC, r, c, p++); + r -= 2; + c += 2; + } + while (r >= 0 && c < NC); + r++; + c += 3; + // down/left + do { + if (r >= 0 && c < NC && !array[r * NC + c]) + ecc200placementblock(array, NR, NC, r, c, p++); + r += 2; + c -= 2; + } + while (r < NR && c >= 0); + r += 3; + c++; + } + while (r < NR || c < NC); + // unfilled corner + if (!array[NR * NC - 1]) + array[NR * NC - 1] = array[NR * NC - NC - 2] = 1; +} + +// calculate and append ecc code, and if necessary interleave +static void ecc200(unsigned char *binary, int bytes, int datablock, int rsblock) +{ + int blocks = (bytes + 2) / datablock, b; + rs_init_gf(0x12d); + rs_init_code(rsblock, 1); + for (b = 0; b < blocks; b++) { + unsigned char buf[256], ecc[256]; + int n, p = 0; + for (n = b; n < bytes; n += blocks) + buf[p++] = binary[n]; + rs_encode(p, buf, ecc); + p = rsblock - 1; // comes back reversed + for (n = b; n < rsblock * blocks; n += blocks) + binary[bytes + n] = ecc[p--]; + } +} + +/* + * perform encoding for ecc200, source s len sl, to target t len tl, using + * optional encoding control string e return 1 if OK, 0 if failed. Does all + * necessary padding to tl + */ + +char ecc200encode(unsigned char *t, int tl, unsigned char *s, int sl, + char *encoding, int *lenp) +{ + char enc = 'a'; // start in ASCII encoding mode + int tp = 0, sp = 0; + if (strlen(encoding) < sl) { + fprintf(stderr, "Encoding string too short\n"); + return 0; + } + // do the encoding + while (sp < sl && tp < tl) { + char newenc = enc; // suggest new encoding + if (tl - tp <= 1 && (enc == 'c' || enc == 't') || tl - tp <= 2 + && enc == 'x') + enc = 'a'; // auto revert to ASCII + newenc = tolower(encoding[sp]); + switch (newenc) { // encode character + case 'c': // C40 + case 't': // Text + case 'x': // X12 + { + char out[6], p = 0; + const char *e, + *s2 = "!\"#$%&'()*+,-./:;<=>?@[\\]_", + *s3 = 0; + if (newenc == 'c') { + e = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + s3 = "`abcdefghijklmnopqrstuvwxyz{|}~\177"; + } + if (newenc == 't') { + e = " 0123456789abcdefghijklmnopqrstuvwxyz"; + s3 = "`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~\177"; + } + if (newenc == 'x') + e = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\r*>"; + do { + unsigned char c = s[sp++]; + char *w; + if (c & 0x80) { + if (newenc == 'x') { + fprintf(stderr, + "Cannot encode char 0x%02X in X12\n", + c); + return 0; + } + c &= 0x7f; + out[p++] = 1; + out[p++] = 30; + } + w = strchr(e, c); + if (w) + out[p++] = ((w - e) + 3) % 40; + else { + if (newenc == 'x') { + fprintf(stderr, + "Cannot encode char 0x%02X in X12\n", + c); + return 0; + } + if (c < 32) { // shift 1 + out[p++] = 0; + out[p++] = c; + } else { + w = strchr(s2, c); + if (w) { // shift 2 + out[p++] = 1; + out[p++] = + (w - s2); + } else { + w = strchr(s3, + c); + if (w) { + out[p++] + = 2; + out[p++] + = + (w - + s3); + } else { + fprintf + (stderr, + "Could not encode 0x%02X, should \ + not happen\n", c); + return + 0; + } + } + } + } + if (p == 2 && tp + 2 == tl && sp == sl) + out[p++] = 0; // shift 1 pad at end + while (p >= 3) { + int v = + out[0] * 1600 + + out[1] * 40 + out[2] + 1; + if (enc != newenc) { + if (enc == 'c' + || enc == 't' + || enc == 'x') + t[tp++] = 254; // escape C40/text/X12 + else if (enc == 'x') + t[tp++] = 0x7C; // escape EDIFACT + if (newenc == 'c') + t[tp++] = 230; + if (newenc == 't') + t[tp++] = 239; + if (newenc == 'x') + t[tp++] = 238; + enc = newenc; + } + t[tp++] = (v >> 8); + t[tp++] = (v & 0xFF); + p -= 3; + out[0] = out[3]; + out[1] = out[4]; + out[2] = out[5]; + } + } + while (p && sp < sl); + } + break; + case 'e': // EDIFACT + { + unsigned char out[4], p = 0; + if (enc != newenc) { // can only be from C40/Text/X12 + t[tp++] = 254; + enc = 'a'; + } + while (sp < sl && tolower(encoding[sp]) == 'e' + && p < 4) + out[p++] = s[sp++]; + if (p < 4) { + out[p++] = 0x1F; + enc = 'a'; + } // termination + t[tp] = ((s[0] & 0x3F) << 2); + t[tp++] |= ((s[1] & 0x30) >> 4); + t[tp] = ((s[1] & 0x0F) << 4); + if (p == 2) + tp++; + else { + t[tp++] |= ((s[2] & 0x3C) >> 2); + t[tp] = ((s[2] & 0x03) << 6); + t[tp++] |= (s[3] & 0x3F); + } + } + break; + case 'a': // ASCII + if (enc != newenc) { + if (enc == 'c' || enc == 't' || enc == 'x') + t[tp++] = 254; // escape C40/text/X12 + else + t[tp++] = 0x7C; // escape EDIFACT + } + enc = 'a'; + if (sl - sp >= 2 && isdigit(s[sp]) + && isdigit(s[sp + 1])) { + t[tp++] = + (s[sp] - '0') * 10 + s[sp + 1] - '0' + 130; + sp += 2; + } else if (s[sp] > 127) { + t[tp++] = 235; + t[tp++] = s[sp++] - 127; + } else + t[tp++] = s[sp++] + 1; + break; + case 'b': // Binary + { + int l = 0; // how much to encode + if (encoding) { + int p; + for (p = sp; + p < sl + && tolower(encoding[p]) == 'b'; + p++) + l++; + } + t[tp++] = 231; // base256 + if (l < 250) + t[tp++] = l; + else { + t[tp++] = 249 + (l / 250); + t[tp++] = (l % 250); + } + while (l-- && tp < tl) { + t[tp] = s[sp++] + (((tp + 1) * 149) % 255) + 1; // see annex H + tp++; + } + enc = 'a'; // reverse to ASCII at end + } + break; + default: + fprintf(stderr, "Unknown encoding %c\n", newenc); + return 0; // failed + } + } + if (lenp) + *lenp = tp; + if (tp < tl && enc != 'a') { + if (enc == 'c' || enc == 'x' || enc == 't') + t[tp++] = 254; // escape X12/C40/Text + else + t[tp++] = 0x7C; // escape EDIFACT + } + if (tp < tl) + t[tp++] = 129; // pad + while (tp < tl) { // more padding + int v = 129 + (((tp + 1) * 149) % 253) + 1; // see Annex H + if (v > 254) + v -= 254; + t[tp++] = v; + } + if (tp > tl || sp < sl) + return 0; // did not fit + /* + * for (tp = 0; tp < tl; tp++) fprintf (stderr, "%02X ", t[tp]); \ + * fprintf (stderr, "\n"); + */ + return 1; // OK +} + +// Auto encoding format functions +static char encchr[] = "ACTXEB"; + +enum { + E_ASCII, + E_C40, + E_TEXT, + E_X12, + E_EDIFACT, + E_BINARY, + E_MAX +}; + +unsigned char switchcost[E_MAX][E_MAX] = { + 0, 1, 1, 1, 1, 2, // From E_ASCII + 1, 0, 2, 2, 2, 3, // From E_C40 + 1, 2, 0, 2, 2, 3, // From E_TEXT + 1, 2, 2, 0, 2, 3, // From E_X12 + 1, 2, 2, 2, 0, 3, // From E_EDIFACT + 0, 1, 1, 1, 1, 0, // From E_BINARY +}; + +/* + * Creates a encoding list (malloc) + * returns encoding string + * if lenp not null, target len stored + * if error, null returned + * if exact specified, then assumes shortcuts applicable for exact fit + * in target + * 1. No unlatch to return to ASCII for last encoded byte after C40 or + * Text or X12 + * 2. No unlatch to return to ASCII for last 1 or 2 encoded bytes after + * EDIFACT + * 3. Final C40 or text encoding exactly in last 2 bytes can have a shift + * 0 to pad to make a tripple + * Only use the encoding from an exact request if the len matches the target, + * otherwise free the result and try again with exact=0 + */ + +static char *encmake(int l, unsigned char *s, int *lenp, char exact) +{ + char *encoding = 0; + int p = l; + char e; + struct { + // number of bytes of source that can be encoded in a row at this point + // using this encoding mode + short s; + // number of bytes of target generated encoding from this point to end if + // already in this encoding mode + short t; + } enc[MAXBARCODE][E_MAX]; + memset(&enc, 0, sizeof(enc)); + if (!l) + return ""; // no length + if (l > MAXBARCODE) + return 0; // not valid + while (p--) { + char b = 0, sub; + int sl, tl, bl, t; + // consider each encoding from this point + // ASCII + sl = tl = 1; + if (isdigit(s[p]) && p + 1 < l && isdigit(s[p + 1])) + sl = 2; // double digit + else if (s[p] & 0x80) + tl = 2; // high shifted + bl = 0; + if (p + sl < l) + for (e = 0; e < E_MAX; e++) + if (enc[p + sl][e].t && ((t = enc[p + sl][e].t + + switchcost[E_ASCII] + [e]) < bl || !bl)) { + bl = t; + b = e; + } + enc[p][E_ASCII].t = tl + bl; + enc[p][E_ASCII].s = sl; + if (bl && b == E_ASCII) + enc[p][b].s += enc[p + sl][b].s; + // C40 + sub = tl = sl = 0; + do { + unsigned char c = s[p + sl++]; + if (c & 0x80) { // shift + upper + sub += 2; + c &= 0x7F; + } + if (c != ' ' && !isdigit(c) && !isupper(c)) + sub++; // shift + sub++; + while (sub >= 3) { + sub -= 3; + tl += 2; + } + } while (sub && p + sl < l); + if (exact && sub == 2 && p + sl == l) { + // special case, can encode last block with shift 0 at end (Is this + // valid when not end of target buffer?) + sub = 0; + tl += 2; + } + if (!sub) { // can encode C40 + bl = 0; + if (p + sl < l) + for (e = 0; e < E_MAX; e++) + if (enc[p + sl][e].t + && + ((t = + enc[p + sl][e].t + + switchcost[E_C40][e]) < bl + || !bl)) { + bl = t; + b = e; + } + if (exact && enc[p + sl][E_ASCII].t == 1 && 1 < bl) { + // special case, switch to ASCII for last bytes + bl = 1; + b = E_ASCII; + } + enc[p][E_C40].t = tl + bl; + enc[p][E_C40].s = sl; + if (bl && b == E_C40) + enc[p][b].s += enc[p + sl][b].s; + } + // Text + sub = tl = sl = 0; + do { + unsigned char c = s[p + sl++]; + if (c & 0x80) { // shift + upper + sub += 2; + c &= 0x7F; + } + if (c != ' ' && !isdigit(c) && !islower(c)) + sub++; // shift + sub++; + while (sub >= 3) { + sub -= 3; + tl += 2; + } + } while (sub && p + sl < l); + if (exact && sub == 2 && p + sl == l) { + // special case, can encode last block with shift 0 at end (Is this + // valid when not end of target buffer?) + sub = 0; + tl += 2; + } + if (!sub && sl) { // can encode Text + bl = 0; + if (p + sl < l) + for (e = 0; e < E_MAX; e++) + if (enc[p + sl][e].t + && + ((t = + enc[p + sl][e].t + + switchcost[E_TEXT][e]) < bl + || !bl)) { + bl = t; + b = e; + } + if (exact && enc[p + sl][E_ASCII].t == 1 && 1 < bl) { // special case, switch to ASCII for last bytes + bl = 1; + b = E_ASCII; + } + enc[p][E_TEXT].t = tl + bl; + enc[p][E_TEXT].s = sl; + if (bl && b == E_TEXT) + enc[p][b].s += enc[p + sl][b].s; + } + // X12 + sub = tl = sl = 0; + do { + unsigned char c = s[p + sl++]; + if (c != 13 && c != '*' && c != '>' && c != ' ' + && !isdigit(c) && !isupper(c)) { + sl = 0; + break; + } + sub++; + while (sub >= 3) { + sub -= 3; + tl += 2; + } + } while (sub && p + sl < l); + if (!sub && sl) { // can encode X12 + bl = 0; + if (p + sl < l) + for (e = 0; e < E_MAX; e++) + if (enc[p + sl][e].t + && + ((t = + enc[p + sl][e].t + + switchcost[E_X12][e]) < bl + || !bl)) { + bl = t; + b = e; + } + if (exact && enc[p + sl][E_ASCII].t == 1 && 1 < bl) { + // special case, switch to ASCII for last bytes + bl = 1; + b = E_ASCII; + } + enc[p][E_X12].t = tl + bl; + enc[p][E_X12].s = sl; + if (bl && b == E_X12) + enc[p][b].s += enc[p + sl][b].s; + } + // EDIFACT + sl = bl = 0; + if (s[p + 0] >= 32 && s[p + 0] <= 94) { // can encode 1 + char bs = 0; + if (p + 1 == l && (!bl || bl < 2)) { + bl = 2; + bs = 1; + } else + for (e = 0; e < E_MAX; e++) + if (e != E_EDIFACT && enc[p + 1][e].t + && + ((t = + 2 + enc[p + 1][e].t + + switchcost[E_ASCII][e]) + < bl || !bl)) // E_ASCII as allowed for unlatch + { + bs = 1; + bl = t; + b = e; + } + if (p + 1 < l && s[p + 1] >= 32 && s[p + 1] <= 94) { // can encode 2 + if (p + 2 == l && (!bl || bl < 2)) { + bl = 3; + bs = 2; + } else + for (e = 0; e < E_MAX; e++) + if (e != E_EDIFACT + && enc[p + 2][e].t + && + ((t = + 3 + enc[p + 2][e].t + + switchcost[E_ASCII][e]) + < bl || !bl)) // E_ASCII as allowed for unlatch + { + bs = 2; + bl = t; + b = e; + } + if (p + 2 < l && s[p + 2] >= 32 && s[p + 2] <= 94) { // can encode 3 + if (p + 3 == l && (!bl || bl < 3)) { + bl = 3; + bs = 3; + } else + for (e = 0; e < E_MAX; e++) + if (e != E_EDIFACT + && enc[p + 3][e].t + && + ((t = + 3 + enc[p + + 3][e].t + + switchcost + [E_ASCII][e]) + < bl || !bl)) // E_ASCII as allowed for unlatch + { + bs = 3; + bl = t; + b = e; + } + if (p + 4 < l && s[p + 3] >= 32 && s[p + 3] <= 94) { // can encode 4 + if (p + 4 == l + && (!bl || bl < 3)) { + bl = 3; + bs = 4; + } else { + for (e = 0; e < E_MAX; + e++) + if (enc[p + 4] + [e].t + && + ((t = + 3 + + enc[p + + 4][e]. + t + + switchcost + [E_EDIFACT] + [e]) < bl + || !bl)) { + bs = 4; + bl = t; + b = e; + } + if (exact + && enc[p + + 4][E_ASCII].t + && enc[p + + 4][E_ASCII]. + t <= 2 + && (t = + 3 + enc[p + + 4] + [E_ASCII].t) < + bl) { + // special case, switch to ASCII for last 1 ot two bytes + bs = 4; + bl = t; + b = E_ASCII; + } + } + } + } + } + enc[p][E_EDIFACT].t = bl; + enc[p][E_EDIFACT].s = bs; + if (bl && b == E_EDIFACT) + enc[p][b].s += enc[p + bs][b].s; + } + // Binary + bl = 0; + for (e = 0; e < E_MAX; e++) + if (enc[p + 1][e].t + && + ((t = + enc[p + 1][e].t + switchcost[E_BINARY][e] + + ((e == E_BINARY + && enc[p + 1][e].t == 249) ? 1 : 0)) + < bl || !bl)) { + bl = t; + b = e; + } + enc[p][E_BINARY].t = 1 + bl; + enc[p][E_BINARY].s = 1; + if (bl && b == E_BINARY) + enc[p][b].s += enc[p + 1][b].s; + /* + * fprintf (stderr, "%d:", p); for (e = 0; e < E_MAX; e++) fprintf \ + * (stderr, " %c*%d/%d", encchr[e], enc[p][e].s, enc[p][e].t); \ + * fprintf (stderr, "\n"); + */ + } + encoding = safemalloc(l + 1); + p = 0; + { + char cur = E_ASCII; // starts ASCII + while (p < l) { + int t, m = 0; + char b = 0; + for (e = 0; e < E_MAX; e++) + if (enc[p][e].t + && ((t = enc[p][e].t + switchcost[cur][e]) < + m || t == m && e == cur || !m)) { + b = e; + m = t; + } + cur = b; + m = enc[p][b].s; + if (!p && lenp) + *lenp = enc[p][b].t; + while (p < l && m--) + encoding[p++] = encchr[b]; + } + } + encoding[p] = 0; + return encoding; +} + +/* + * Main encoding function + * Returns the grid (malloced) containing the matrix. L corner at 0,0. + * Takes suggested size in *Wptr, *Hptr, or 0,0. Fills in actual size. + * Takes barcodelen and barcode to be encoded + * Note, if *encodingptr is null, then fills with auto picked (malloced) + * encoding + * If lenp not null, then the length of encoded data before any final + * unlatch or pad is stored + * If maxp not null, then the max storage of this size code is stored + * If eccp not null, then the number of ecc bytes used in this size is + * stored + * Returns 0 on error (writes to stderr with details). + */ + +unsigned char *iec16022ecc200(int *Wptr, int *Hptr, char **encodingptr, + int barcodelen, unsigned char *barcode, + int *lenp, int *maxp, int *eccp) +{ + unsigned char binary[3000]; // encoded raw data and ecc to place in barcode + int W = 0, H = 0; + char *encoding = 0; + unsigned char *grid = 0; + struct ecc200matrix_s *matrix; + memset(binary, 0, sizeof(binary)); + if (encodingptr) + encoding = *encodingptr; + if (Wptr) + W = *Wptr; + if (Hptr) + H = *Hptr; + + // encoding + if (W) { // known size + for (matrix = ecc200matrix; matrix->W && (matrix->W != W || + matrix->H != H); + matrix++) ; + if (!matrix->W) { + fprintf(stderr, "Invalid size %dx%d\n", W, H); + return 0; + } + if (!encoding) { + int len; + char *e = encmake(barcodelen, barcode, &len, 1); + if (e && len != matrix->bytes) { // try not an exact fit + free(e); + e = encmake(barcodelen, barcode, &len, 0); + if (len > matrix->bytes) { + fprintf(stderr, + "Cannot make barcode fit %dx%d\n", + W, H); + return 0; + } + } + encoding = e; + } + } else { + // find a suitable encoding + if (encoding == NULL) + encoding = encmake(barcodelen, barcode, NULL, 1); + + if (encoding) { // find one that fits chosen encoding + for (matrix = ecc200matrix; matrix->W; matrix++) + if (ecc200encode + (binary, matrix->bytes, barcode, barcodelen, + encoding, 0)) + break; + } else { + int len; + char *e; + e = encmake(barcodelen, barcode, &len, 1); + for (matrix = ecc200matrix; + matrix->W && matrix->bytes != len; matrix++) ; + if (e && !matrix->W) { // try for non exact fit + free(e); + e = encmake(barcodelen, barcode, &len, 0); + for (matrix = ecc200matrix; + matrix->W && matrix->bytes < len; + matrix++) ; + } + encoding = e; + } + if (!matrix->W) { + fprintf(stderr, + "Cannot find suitable size, barcode too long\n"); + return 0; + } + W = matrix->W; + H = matrix->H; + } + if (!ecc200encode(binary, matrix->bytes, barcode, barcodelen, + encoding, lenp)) { + fprintf(stderr, "Barcode too long for %dx%d\n", W, H); + return 0; + } + // ecc code + ecc200(binary, matrix->bytes, matrix->datablock, matrix->rsblock); + { // placement + int x, y, NC, NR, *places; + NC = W - 2 * (W / matrix->FW); + NR = H - 2 * (H / matrix->FH); + places = safemalloc(NC * NR * sizeof(int)); + ecc200placement(places, NR, NC); + grid = safemalloc(W * H); + memset(grid, 0, W * H); + for (y = 0; y < H; y += matrix->FH) { + for (x = 0; x < W; x++) + grid[y * W + x] = 1; + for (x = 0; x < W; x += 2) + grid[(y + matrix->FH - 1) * W + x] = 1; + } + for (x = 0; x < W; x += matrix->FW) { + for (y = 0; y < H; y++) + grid[y * W + x] = 1; + for (y = 0; y < H; y += 2) + grid[y * W + x + matrix->FW - 1] = 1; + } + for (y = 0; y < NR; y++) { + for (x = 0; x < NC; x++) { + int v = places[(NR - y - 1) * NC + x]; + //fprintf (stderr, "%4d", v); + if (v == 1 || v > 7 + && (binary[(v >> 3) - 1] & (1 << (v & 7)))) + grid[(1 + y + + 2 * (y / (matrix->FH - 2))) * W + + 1 + x + + 2 * (x / (matrix->FW - 2))] = 1; + } + //fprintf (stderr, "\n"); + } + free(places); + } + if (Wptr) + *Wptr = W; + if (Hptr) + *Hptr = H; + if (encodingptr) + *encodingptr = encoding; + if (maxp) + *maxp = matrix->bytes; + if (eccp) + *eccp = + (matrix->bytes + 2) / matrix->datablock * matrix->rsblock; + return grid; +} diff --git a/glabels2/iec16022-0.2.1/iec16022ecc200.h b/glabels2/iec16022-0.2.1/iec16022ecc200.h new file mode 100644 index 00000000..08678f08 --- /dev/null +++ b/glabels2/iec16022-0.2.1/iec16022ecc200.h @@ -0,0 +1,47 @@ +/** + * + * IEC16022 bar code generation + * Adrian Kennard, Andrews & Arnold Ltd + * with help from Cliff Hones on the RS coding + * + * (c) 2004 Adrian Kennard, Andrews & Arnold Ltd + * (c) 2006 Stefan Schmidt + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * + * Main encoding function + * Returns the grid (malloced) containing the matrix. L corner at 0,0. + * Takes suggested size in *Wptr, *Hptr, or 0,0. Fills in actual size. + * Takes barcodelen and barcode to be encoded + * Note, if *encodingptr is null, then fills with auto picked (malloced) + * encoding. + * If lenp not null, then the length of encoded data before any final unlatch + * or pad is stored. + * If maxp not null, then the max storage of this size code is stored + * If eccp not null, then the number of ecc bytes used in this size is stored + * Returns 0 on error (writes to stderr with details). + * + */ + +#ifndef __IEC16022ECC200_H +#define __IEC16022ECC200_H + +unsigned char *iec16022ecc200(int *Wptr, int *Hptr, char **encodingptr, + int barcodelen, unsigned char *barcode, + int *lenp, int *maxp, int *eccp); +#define MAXBARCODE 3116 + +#endif /* __IEC16022ECC200_H */ diff --git a/glabels2/iec16022-0.2.1/image.c b/glabels2/iec16022-0.2.1/image.c new file mode 100644 index 00000000..f7dc3056 --- /dev/null +++ b/glabels2/iec16022-0.2.1/image.c @@ -0,0 +1,668 @@ +/** + * + * Image handling tools, (c) AJK 2001-2005 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include +#include +#include "image.h" + +#define INTERLACE +#define CLEAR +#define USEZLIB + +#ifdef USEZLIB +#include +#endif + +unsigned char const bbc[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // + 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00, // ! + 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, // " + 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00, // # + 0x0C, 0x3F, 0x68, 0x3E, 0x0B, 0x7E, 0x18, 0x00, // $ + 0x60, 0x66, 0x0C, 0x18, 0x30, 0x66, 0x06, 0x00, // % + 0x38, 0x6C, 0x6C, 0x38, 0x6D, 0x66, 0x3B, 0x00, // & + 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, // ' + 0x0C, 0x18, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, // ( + 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, // ) + 0x00, 0x18, 0x7E, 0x3C, 0x7E, 0x18, 0x00, 0x00, // * + 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, // + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, // , + 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, // - + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, // . + 0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, // / + 0x18, 0x24, 0x66, 0x66, 0x66, 0x24, 0x18, 0x00, // 0 (non crossed) + 0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, // 1 + 0x3C, 0x66, 0x06, 0x0C, 0x18, 0x30, 0x7E, 0x00, // 2 + 0x3C, 0x66, 0x06, 0x1C, 0x06, 0x66, 0x3C, 0x00, // 3 + 0x0C, 0x1C, 0x3C, 0x6C, 0x7E, 0x0C, 0x0C, 0x00, // 4 + 0x7E, 0x60, 0x7C, 0x06, 0x06, 0x66, 0x3C, 0x00, // 5 + 0x1C, 0x30, 0x60, 0x7C, 0x66, 0x66, 0x3C, 0x00, // 6 + 0x7E, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00, // 7 + 0x3C, 0x66, 0x66, 0x3C, 0x66, 0x66, 0x3C, 0x00, // 8 + 0x3C, 0x66, 0x66, 0x3E, 0x06, 0x0C, 0x38, 0x00, // 9 + 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, // : + 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x30, // ; + 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x00, // < + 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, // = + 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x00, // > + 0x3C, 0x66, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00, // ? + 0x3C, 0x66, 0x6E, 0x6A, 0x6E, 0x60, 0x3C, 0x00, // @ + 0x3C, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, // A + 0x7C, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x7C, 0x00, // B + 0x3C, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3C, 0x00, // C + 0x78, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0x78, 0x00, // D + 0x7E, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x7E, 0x00, // E + 0x7E, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x60, 0x00, // F + 0x3C, 0x66, 0x60, 0x6E, 0x66, 0x66, 0x3C, 0x00, // G + 0x66, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, // H + 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, // I + 0x3E, 0x0C, 0x0C, 0x0C, 0x0C, 0x6C, 0x38, 0x00, // J + 0x66, 0x6C, 0x78, 0x70, 0x78, 0x6C, 0x66, 0x00, // K + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7E, 0x00, // L + 0x63, 0x77, 0x7F, 0x6B, 0x6B, 0x63, 0x63, 0x00, // M + 0x66, 0x66, 0x76, 0x7E, 0x6E, 0x66, 0x66, 0x00, // N + 0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, // O + 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x00, // P + 0x3C, 0x66, 0x66, 0x66, 0x6A, 0x6C, 0x36, 0x00, // Q + 0x7C, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0x66, 0x00, // R + 0x3C, 0x66, 0x60, 0x3C, 0x06, 0x66, 0x3C, 0x00, // S + 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, // T + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, // U + 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, // V + 0x63, 0x63, 0x6B, 0x6B, 0x7F, 0x77, 0x63, 0x00, // W + 0x66, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x66, 0x00, // X + 0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x00, // Y + 0x7E, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x7E, 0x00, // Z + 0x7C, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7C, 0x00, // [ + 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00, 0x00, // + 0x3E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x3E, 0x00, // ] + 0x18, 0x3C, 0x66, 0x42, 0x00, 0x00, 0x00, 0x00, // ^ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, // _ + 0x1C, 0x36, 0x30, 0x7C, 0x30, 0x30, 0x7E, 0x00, // ` + 0x00, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, // a + 0x60, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x7C, 0x00, // b + 0x00, 0x00, 0x3C, 0x66, 0x60, 0x66, 0x3C, 0x00, // c + 0x06, 0x06, 0x3E, 0x66, 0x66, 0x66, 0x3E, 0x00, // d + 0x00, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, // e + 0x1C, 0x30, 0x30, 0x7C, 0x30, 0x30, 0x30, 0x00, // f + 0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x3C, // g + 0x60, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x66, 0x00, // h + 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00, // i + 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x70, // j + 0x60, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0x00, // k + 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, // l + 0x00, 0x00, 0x36, 0x7F, 0x6B, 0x6B, 0x63, 0x00, // m + 0x00, 0x00, 0x7C, 0x66, 0x66, 0x66, 0x66, 0x00, // n + 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, // o + 0x00, 0x00, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, // p + 0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x07, // q + 0x00, 0x00, 0x6C, 0x76, 0x60, 0x60, 0x60, 0x00, // r + 0x00, 0x00, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0x00, // s + 0x30, 0x30, 0x7C, 0x30, 0x30, 0x30, 0x1C, 0x00, // t + 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, // u + 0x00, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, // v + 0x00, 0x00, 0x63, 0x6B, 0x6B, 0x7F, 0x36, 0x00, // w + 0x00, 0x00, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x00, // x + 0x00, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x06, 0x3C, // y + 0x00, 0x00, 0x7E, 0x0C, 0x18, 0x30, 0x7E, 0x00, // z + 0x0C, 0x18, 0x18, 0x70, 0x18, 0x18, 0x0C, 0x00, // { + 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00, // | + 0x30, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x30, 0x00, // } + 0x31, 0x6B, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, // ~ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // +}; + +const char smallc[] = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-+&()/[];%"; +unsigned char const small[] = { + 0x00, 0x00, 0x00, // + 0x1F, 0x11, 0x1F, //0 + 0x11, 0x1F, 0x10, //1 + 0x1D, 0x15, 0x17, //2 + 0x11, 0x15, 0x1F, //3 + 0x07, 0x04, 0x1F, //4 + 0x17, 0x15, 0x1D, //5 + 0x1F, 0x15, 0x1D, //6 + 0x01, 0x01, 0x1F, //7 + 0x1F, 0x15, 0x1F, //8 + 0x17, 0x15, 0x1F, //9 + 0x1E, 0x05, 0x1E, //A + 0x1F, 0x15, 0x0A, //B + 0x0E, 0x11, 0x11, //C + 0x1F, 0x11, 0x0E, //D + 0x1F, 0x15, 0x11, //E + 0x1F, 0x05, 0x01, //F + 0x0E, 0x11, 0x19, //G + 0x1F, 0x04, 0x1F, //H + 0x11, 0x1F, 0x11, //I + 0x11, 0x0F, 0x01, //J + 0x1F, 0x04, 0x1B, //K + 0x1F, 0x10, 0x10, //L + 0x1F, 0x03, 0x1F, //M + 0x1F, 0x01, 0x1F, //N + 0x0E, 0x11, 0x0E, //O + 0x1F, 0x05, 0x02, //P + 0x0E, 0x19, 0x1E, //Q + 0x1F, 0x05, 0x1A, //R + 0x12, 0x15, 0x09, //S + 0x01, 0x1F, 0x01, //T + 0x1F, 0x10, 0x1F, //U + 0x0F, 0x10, 0x0F, //V + 0x1F, 0x18, 0x1F, //W + 0x1B, 0x04, 0x1B, //X + 0x03, 0x1C, 0x03, //Y + 0x19, 0x15, 0x13, //Z + 0x04, 0x04, 0x04, //- + 0x04, 0x0E, 0x04, //+ + 0x04, 0x0E, 0x04, //& (+) + 0x00, 0x0E, 0x11, //( + 0x11, 0x0E, 0x00, //) + 0x08, 0x04, 0x02, /// + 0x00, 0x1F, 0x11, //[ + 0x11, 0x1F, 0x00, //] + 0x10, 0x0A, 0x00, //; + 0x09, 0x04, 0x12, //% +}; + +Image *ImageNew(int w, int h, int c) +{ // create a new blank image + Image *i; + if (!w || !h) + return 0; + i = malloc(sizeof(*i)); + if (!i) + return 0; + memset(i, 0, sizeof(*i)); + i->W = w; + i->L = w + 1; + i->H = h; + i->C = c; + i->Image = malloc((w + 1) * h); + if (!i->Image) { + free(i); + return 0; + } + memset(i->Image, 0, (w + 1) * h); + if (c) { + i->Colour = malloc(sizeof(Colour) * c); + if (!i->Colour) { + free(i->Image); + free(i); + return 0; + } + memset(i->Colour, 0, sizeof(Colour) * c); + } + return i; +} + +void ImageFree(Image * i) +{ // free an image + if (i) { + if (i->Image) + free(i->Image); + if (i->Colour) + free(i->Colour); + free(i); + } +} + +#define MAXLZW 4096 +typedef short LZW[256]; +typedef LZW LZWTree[MAXLZW]; +typedef struct strPrivate { + int cols; // number of colours, power of 2 + unsigned char colbits; // number of bits for colours + int fh; // file handle + int lzwnext; // next code + int lzwlast; // last code in current bit size + int lzwbits; // current bit size + LZWTree lzw; // encode tree + unsigned char block[256]; // block so far, with count at start + int blockv; // pending value + int blockb; // bits used in pending value + short lzwcode; // which code we are on now +} Private; + +static LZWFlush(Private * p) +{ // flush this block + write(p->fh, p->block, *p->block + 1); + *p->block = 0; +} + +static LZWOut(Private * p, short v) +{ // output a value + p->blockv |= (v << p->blockb); + p->blockb += p->lzwbits; + while (p->blockb >= 8) { + p->block[++*p->block] = p->blockv; // last partial byte + p->blockv >>= 8; + p->blockb -= 8; + if (*p->block == 255) + LZWFlush(p); + } +} + +static LZWClear(Private * p) +{ + int c; + p->lzwbits = p->colbits + 1; + p->lzwnext = p->cols + 2; + p->lzwlast = (1 << p->lzwbits) - 1; + p->lzwcode = p->cols; // starting point + for (c = 0; c < p->cols; c++) { + p->lzw[p->cols][c] = c; // links to literal entries + // links from literals, dead ends initially + memset(&p->lzw[c], -1, p->cols * 2); + } +} + +static ImageStart(Private * p) +{ + unsigned char b = p->colbits; + write(p->fh, &b, 1); + *p->block = 0; + p->blockb = 0; + p->blockv = 0; + LZWClear(p); + LZWOut(p, p->cols); // clear code +} + +static ImageEnd(Private * p) +{ + LZWOut(p, p->lzwcode); // last prefix + LZWOut(p, p->cols + 1); // end code + if (p->blockb) + p->block[++*p->block] = p->blockv; // last partial byte + LZWFlush(p); +} + +static ImageOut(Private * p, unsigned char c) +{ + short next = p->lzw[p->lzwcode][c]; + if (next == -1) { // dead end + LZWOut(p, p->lzwcode); // prefix +#ifdef CLEAR + if (p->lzwnext + 1 == MAXLZW) { + LZWOut(p, p->cols); // clear code + LZWClear(p); + } else +#endif + if (p->lzwnext < MAXLZW) { + memset(p->lzw[p->lzwnext], -1, p->cols * 2); // init dead ends + p->lzw[p->lzwcode][c] = p->lzwnext; + if (p->lzwnext > p->lzwlast) { // bigger code + p->lzwbits++; + p->lzwlast = (1 << p->lzwbits) - 1; + } + p->lzwnext++; + } + p->lzwcode = c; + } else + p->lzwcode = next; // not a dead end +} + +// write GIF image +void ImageWriteGif(Image * i, int fh, int back, int trans, char *comment) +{ + struct strPrivate p; + p.fh = fh; + // count colours, min 4 + for (p.colbits = 2, p.cols = 4; p.cols < i->C; + p.cols *= 2, p.colbits++) ; + { // headers + char buf[1500]; + int n = 0; + strcpy(buf, "GIF87a"); +#ifndef INTERLACE + if (comment || trans >= 0) +#endif + buf[4] = '9'; // needs gif89 format + n = 6; + buf[n++] = (i->W & 255); + buf[n++] = (i->W >> 8); + buf[n++] = (i->H & 255); + buf[n++] = (i->H >> 8); + buf[n++] = (i->Colour ? 0x80 : 0) + 0x70 + (p.colbits - 1); + buf[n++] = back; // background + buf[n++] = 0; // aspect + if (i->Colour) { + int c; + for (c = 0; c < p.cols; c++) { + if (c < i->C) { + buf[n++] = (i->Colour[c] >> 16 & 255); + buf[n++] = (i->Colour[c] >> 8 & 255); + buf[n++] = (i->Colour[c] & 255); + } else { // extra, unused, colour + buf[n++] = 0; + buf[n++] = 0; + buf[n++] = 0; + } + } + } + // comment + if (comment && strlen(comment) < 256) { // comment + buf[n++] = 0x21; //extension + buf[n++] = 0xFE; //comment + buf[n++] = strlen(comment); + strcpy(buf + n, comment); + n += buf[n - 1]; + buf[n++] = 0; // end of block + } + if (trans >= 0) { // transparrent + buf[n++] = 0x21; // extension + buf[n++] = 0xF9; // graphic control + buf[n++] = 4; // len + buf[n++] = 1; // transparrent + buf[n++] = 0; // delay + buf[n++] = 0; + buf[n++] = trans; + buf[n++] = 0; // terminator + } + // image + buf[n++] = 0x2C; + buf[n++] = 0; // offset X + buf[n++] = 0; + buf[n++] = 0; // offset Y + buf[n++] = 0; + buf[n++] = (i->W & 255); + buf[n++] = (i->W >> 8); + buf[n++] = (i->H & 255); + buf[n++] = (i->H >> 8); +#ifdef INTERLACE + buf[n++] = 0x40; // interlaced, no local colour table +#else + buf[n++] = 0x00; // non interlaced, no local colour table +#endif + write(fh, buf, n); + } + // image data + { + unsigned char *b; + int x, y; + ImageStart(&p); +#ifdef INTERLACE + for (y = 0; y < i->H; y += 8) + for (b = &ImagePixel(i, 0, y), x = 0; x < i->W; x++) + ImageOut(&p, *b++); + for (y = 4; y < i->H; y += 8) + for (b = &ImagePixel(i, 0, y), x = 0; x < i->W; x++) + ImageOut(&p, *b++); + for (y = 2; y < i->H; y += 4) + for (b = &ImagePixel(i, 0, y), x = 0; x < i->W; x++) + ImageOut(&p, *b++); + for (y = 1; y < i->H; y += 2) + for (b = &ImagePixel(i, 0, y), x = 0; x < i->W; x++) + ImageOut(&p, *b++); +#else + for (y = 0; y < i->H; y++) + for (b = &ImagePixel(i, 0, y), x = 0; x < i->W; x++) + ImageOut(&p, *b++); +#endif + ImageEnd(&p); + } + write(fh, "\0", 1); // end of image data + write(fh, "\x3B", 1); // trailer +} + +void ImageText(Image * i, int x, int y, int col, char *text) +{ // writes 8x8 text + if (i && text) + while (*text) { + if (*text >= ' ' && *text) { + int r; + unsigned const char *b = + bbc + (*text - ' ') * 8; + for (r = 0; r < 8; r++) { + unsigned char v = *b++; + unsigned char *p = + &ImagePixel(i, x, y + r); + unsigned char m; + for (m = 0x80; m; m >>= 1, p++) + if (v & m) + *p = col; + } + } + x += 8; + text++; + } +} + +void ImageSmall(Image * i, int x, int y, int col, char *text) +{ // writes 4x6 digits + if (i && text) + while (*text) { + char *p = strchr(smallc, toupper(*text)); + if (p) { + int r; + char m = 1; + unsigned const char *b = + small + (p - smallc) * 3; + for (r = 0; r < 5; r++) { + int c; + for (c = 0; c < 3; c++) + if (b[c] & m) + ImagePixel(i, x + c, + y + r) = col; + m <<= 1; + } + x += 4; + } else if (*text == '.') { + ImagePixel(i, x, y + 4) = col; + x += 2; + } else if (*text == ':') { + ImagePixel(i, x, y + 1) = col; + ImagePixel(i, x, y + 3) = col; + x += 2; + } + text++; + } +} + +void ImageRect(Image * i, int x, int y, int w, int h, int c) +{ // fill a box + if (i && w && h) { + while (h--) { + unsigned char *p = &ImagePixel(i, x, y); + int n = w; + while (n--) + *p++ = c; + y++; + } + } +} + +// PNG code + + /* Table of CRCs of all 8-bit messages. */ +static unsigned int crc_table[256]; + + /* Make the table for a fast CRC. */ +void make_crc_table(void) +{ + unsigned int c; + int n, k; + for (n = 0; n < 256; n++) { + c = (unsigned int)n; + for (k = 0; k < 8; k++) { + if (c & 1) + c = 0xedb88320L ^ (c >> 1); + else + c = c >> 1; + } + crc_table[n] = c; + } +} + + /* Update a running CRC with the bytes buf[0..len-1]--the CRC + should be initialized to all 1's, and the transmitted value + is the 1's complement of the final running CRC (see the + crc() routine below)). */ + +unsigned int update_crc(unsigned int crc, unsigned char *buf, int len) +{ + unsigned int c = crc; + int n; + + for (n = 0; n < len; n++) + c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); + + return c; +} + + /* Return the CRC of the bytes buf[0..len-1]. */ +unsigned int crc(unsigned char *buf, int len) +{ + return update_crc(0xffffffffL, buf, len) ^ 0xffffffffL; +} + +unsigned int writecrc(int fh, char *ptr, int len, unsigned int c) +{ + write(fh, ptr, len); + while (len--) + c = crc_table[(c ^ *ptr++) & 0xff] ^ (c >> 8); + return c; +} + +void writechunk(int fh, char *typ, void *ptr, int len) +{ + unsigned int v = htonl(len), crc; + write(fh, &v, 4); + crc = writecrc(fh, typ, 4, ~0); + if (len) + crc = writecrc(fh, ptr, len, crc); + v = htonl(~crc); + write(fh, &v, 4); +} + +#ifndef USEZLIB +unsigned int adlersum(unsigned char *p, int l, unsigned int adler) +{ + unsigned int s1 = (adler & 65535), s2 = (adler >> 16); + while (l--) { + s1 += *p++; + s2 += s1; + } + s1 %= 65521; // can be delayed due to sensible "l" values... + s2 %= 65521; + return (s2 << 16) + s1; +} +#endif + +// write PNG image +void ImageWritePNG(Image * i, int fh, int back, int trans, char *comment) +{ + make_crc_table(); + write(fh, "\211PNG\r\n\032\n", 8); // PNG header + { // IHDR + struct { + unsigned int width; + unsigned int height; + unsigned char depth; + unsigned char colour; + unsigned char compress; + unsigned char filter; + unsigned char interlace; + } ihdr = { + 0, 0, 8, 3, 0, 0}; + ihdr.width = htonl(i->W); + ihdr.height = htonl(i->H); + writechunk(fh, "IHDR", &ihdr, 13); + } + { // PLTE + unsigned int v = htonl(i->C * 3), crc, n; + write(fh, &v, 4); + crc = writecrc(fh, "PLTE", 4, ~0); + for (n = 0; n < i->C; n++) { + v = htonl(i->Colour[n] << 8); + crc = writecrc(fh, (void *)&v, 3, crc); + } + v = htonl(~crc); + write(fh, &v, 4); + } + if (back >= 0) { // bKGD + unsigned char b = back; + writechunk(fh, "bKGD", &b, 1); + } + if (*comment) { // tEXt + char c[] = "Comment"; + unsigned int v = htonl(strlen(c) + strlen(comment) + 1), crc; + write(fh, &v, 4); + crc = writecrc(fh, "tEXt", 4, ~0); + crc = writecrc(fh, c, strlen(c) + 1, crc); + crc = writecrc(fh, comment, strlen(comment), crc); + v = htonl(~crc); + write(fh, &v, 4); + } + { // tRNS + unsigned char alpha[256]; + int n; + for (n = 0; n < i->C; n++) + // 4th palette byte treated as 0=opaque, 255-transparren + alpha[n] = 255 - (i->Colour[n] >> 24); + if (trans >= 0 && trans < i->C) + // manual set of specific transparrent colour + alpha[trans] = 0; + writechunk(fh, "tRNS", alpha, i->C); + } +#ifndef USEZLIB + { // IDAT + unsigned int v = htonl(i->H * (i->L + 5) + 6), + crc, adler = 1, n; + unsigned char *p = i->Image; + write(fh, &v, 4); + crc = writecrc(fh, "IDAT", 4, ~0); + crc = writecrc(fh, "\170\001", 2, crc); // zlib header for deflate + n = i->H; + while (n--) { + unsigned char h[5]; + h[0] = (n ? 0 : 1); // last chunk in deflate, un compressed + h[1] = (i->L & 255); // Len, LSB first as per deflate spec + h[2] = (i->L / 256); + h[3] = ~(i->L & 255); // Inverse of Len + h[4] = ~(i->L / 256); + *p = 0; // filter 0 (NONE) + crc = writecrc(fh, h, 5, crc); + crc = writecrc(fh, p, i->L, crc); + adler = adlersum(p, i->L, adler); + p += i->L; + } + v = htonl(adler); + crc = writecrc(fh, (void *)&v, 4, crc); + v = htonl(~crc); + write(fh, &v, 4); + } +#else + { // IDAT + unsigned char *temp; + unsigned long n; + for (n = 0; n < i->H; n++) + i->Image[n * i->L] = 0; // filter 0 + n = i->H * i->L * 1001 / 1000 + 12; + temp = malloc(n); + if (compress2(temp, &n, i->Image, i->L * i->H, 9) != Z_OK) + fprintf(stderr, "Deflate error\n"); + else + writechunk(fh, "IDAT", temp, n); + free(temp); + } +#endif + writechunk(fh, "IEND", 0, 0); // IEND +} diff --git a/glabels2/iec16022-0.2.1/image.h b/glabels2/iec16022-0.2.1/image.h new file mode 100644 index 00000000..92d6d06e --- /dev/null +++ b/glabels2/iec16022-0.2.1/image.h @@ -0,0 +1,49 @@ +/** + * + * Image handling tools, (c) AJK 2001-2005 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __IMAGE_H +#define __IMAGE_H + +typedef unsigned int Colour; // RGB value + +// Image object +typedef struct { + int W, // width + L, // Line length in Image (W+1) + H; // height + unsigned char *Image; // image array, one byte per pixel + int C; // colours (can be non power of 2, max 256) + Colour *Colour; // colour map (must have entry for each colour) +} Image; + +// macros and functions + +#define ImagePixel(i,x,y) ((i)->Image[1+(i)->L*(y)+(x)]) + +Image *ImageNew(int w, int h, int c); // create a new blank image +void ImageFree(Image * i); // free an image +void ImageWriteGif(Image * i, int fh, int back, int trans, char *comment); +void ImageWritePNG(Image * i, int fh, int back, int trans, char *comment); +void ImageText(Image * i, int x, int y, int c, char *text); // write 8x8 text +void ImageSmall(Image * i, int x, int y, int c, char *text); // write 4x6 text +void ImageRect(Image * i, int x, int y, int w, int h, int c); // fill a box +#define ImageWrite ImageWritePNG // default + +#endif /* __IMAGE_H */ diff --git a/glabels2/iec16022-0.2.1/reedsol.c b/glabels2/iec16022-0.2.1/reedsol.c new file mode 100644 index 00000000..a9502412 --- /dev/null +++ b/glabels2/iec16022-0.2.1/reedsol.c @@ -0,0 +1,172 @@ +/** + * + * This is a simple Reed-Solomon encoder + * (C) Cliff Hones 2004 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +// It is not written with high efficiency in mind, so is probably +// not suitable for real-time encoding. The aim was to keep it +// simple, general and clear. +// +// + +// Usage: +// First call rs_init_gf(poly) to set up the Galois Field parameters. +// Then call rs_init_code(size, index) to set the encoding size +// Then call rs_encode(datasize, data, out) to encode the data. +// +// These can be called repeatedly as required - but note that +// rs_init_code must be called following any rs_init_gf call. +// +// If the parameters are fixed, some of the statics below can be +// replaced with constants in the obvious way, and additionally +// malloc/free can be avoided by using static arrays of a suitable +// size. + +#include // only needed for debug (main) +#include // only needed for malloc/free + +static int gfpoly; +static int symsize; // in bits +static int logmod; // 2**symsize - 1 +static int rlen; + +static int *log = NULL, *alog = NULL, *rspoly = NULL; + +// rs_init_gf(poly) initialises the parameters for the Galois Field. +// The symbol size is determined from the highest bit set in poly +// This implementation will support sizes up to 30 bits (though that +// will result in very large log/antilog tables) - bit sizes of +// 8 or 4 are typical +// +// The poly is the bit pattern representing the GF characteristic +// polynomial. e.g. for ECC200 (8-bit symbols) the polynomial is +// a**8 + a**5 + a**3 + a**2 + 1, which translates to 0x12d. + +void rs_init_gf(int poly) +{ + int m, b, p, v; + + // Return storage from previous setup + if (log) { + free(log); + free(alog); + free(rspoly); + rspoly = NULL; + } + // Find the top bit, and hence the symbol size + for (b = 1, m = 0; b <= poly; b <<= 1) + m++; + b >>= 1; + m--; + gfpoly = poly; + symsize = m; + + // Calculate the log/alog tables + logmod = (1 << m) - 1; + log = (int *)malloc(sizeof(int) * (logmod + 1)); + alog = (int *)malloc(sizeof(int) * logmod); + + for (p = 1, v = 0; v < logmod; v++) { + alog[v] = p; + log[p] = v; + p <<= 1; + if (p & b) + p ^= poly; + } +} + +// rs_init_code(nsym, index) initialises the Reed-Solomon encoder +// nsym is the number of symbols to be generated (to be appended +// to the input data). index is usually 1 - it is the index of +// the constant in the first term (i) of the RS generator polynomial: +// (x + 2**i)*(x + 2**(i+1))*... [nsym terms] +// For ECC200, index is 1. + +void rs_init_code(int nsym, int index) +{ + int i, k; + + if (rspoly) + free(rspoly); + rspoly = (int *)malloc(sizeof(int) * (nsym + 1)); + + rlen = nsym; + + rspoly[0] = 1; + for (i = 1; i <= nsym; i++) { + rspoly[i] = 1; + for (k = i - 1; k > 0; k--) { + if (rspoly[k]) + rspoly[k] = + alog[(log[rspoly[k]] + index) % logmod]; + rspoly[k] ^= rspoly[k - 1]; + } + rspoly[0] = alog[(log[rspoly[0]] + index) % logmod]; + index++; + } +} + +// Note that the following uses byte arrays, so is only suitable for +// symbol sizes up to 8 bits. Just change the data type of data and res +// to unsigned int * for larger symbols. + +void rs_encode(int len, unsigned char *data, unsigned char *res) +{ + int i, k, m; + for (i = 0; i < rlen; i++) + res[i] = 0; + for (i = 0; i < len; i++) { + m = res[rlen - 1] ^ data[i]; + for (k = rlen - 1; k > 0; k--) { + if (m && rspoly[k]) + res[k] = + res[k - + 1] ^ alog[(log[m] + + log[rspoly[k]]) % logmod]; + else + res[k] = res[k - 1]; + } + if (m && rspoly[0]) + res[0] = alog[(log[m] + log[rspoly[0]]) % logmod]; + else + res[0] = 0; + } +} + +#ifndef LIB +// The following tests the routines with the ISO/IEC 16022 Annexe R data +int main(void) +{ + register int i; + + unsigned char data[9] = { 142, 164, 186 }; + unsigned char out[5]; + + rs_init_gf(0x12d); + rs_init_code(5, 1); + + rs_encode(3, data, out); + + printf("Result of Annexe R encoding:\n"); + for (i = 4; i >= 0; i--) + printf(" %d\n", out[i]); + + return 0; +} +#endif diff --git a/glabels2/iec16022-0.2.1/reedsol.h b/glabels2/iec16022-0.2.1/reedsol.h new file mode 100644 index 00000000..0181a8df --- /dev/null +++ b/glabels2/iec16022-0.2.1/reedsol.h @@ -0,0 +1,29 @@ +/** + * + * This is a simple Reed-Solomon encoder + * (C) Cliff Hones 2004 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __REEDSOL_H +#define __REEDSOL_H + +void rs_init_gf(int poly); +void rs_init_code(int nsym, int index); +void rs_encode(int len, unsigned char *data, unsigned char *res); + +#endif /* __REEDSOL_H */ diff --git a/glabels2/iec16022-0.2.1/test/testsuite-example.bin b/glabels2/iec16022-0.2.1/test/testsuite-example.bin new file mode 100644 index 00000000..02a4436d --- /dev/null +++ b/glabels2/iec16022-0.2.1/test/testsuite-example.bin @@ -0,0 +1 @@ +ÿÿÿÿ¿`ïÁ϶mÜ>ýÜÏÃðŠ¼N¯·«9š‚±¤Ë»¾ƒÐ@¨ÄÌEÙù£,Æ<°Ü-öb°:Çw×ɪªªªÿÿÿÿŸÀŽöÊÕï—¦‘¸%kûhŽÔ«-¨Û£0ËQ³kâÛ€Éôå£ÂÍ~„ögëTåགྷ絪ªªª \ No newline at end of file diff --git a/glabels2/iec16022-0.2.1/test/testsuite-example.eps b/glabels2/iec16022-0.2.1/test/testsuite-example.eps new file mode 100644 index 00000000..9f97c228 --- /dev/null +++ b/glabels2/iec16022-0.2.1/test/testsuite-example.eps @@ -0,0 +1,15 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: IEC16022 barcode/stamp generator +%%BarcodeData: Aolash3l dee6Ieke OhBohm1C MengaR9m zaHaoQu2 huW3Uer8 ieg7chaJ haiKua1o +%%BarcodeSize: 32x32 +%%BarcodeFormat: ECC200 +%%DocumentData: Clean7Bit +%%LanguageLevel: 1 +%%Pages: 1 +%%BoundingBox: 0 0 34 34 +%%EndComments +%%Page: 1 1 +32 32 1[1 0 0 1 -1 -1]{< +00000000 409F10E5 3E304992 23C102F9 23E0303C 0F7543B1 504854C6 657D4E5B 3444417C 2FBF573B 33BA2606 5CD339C3 4FE823D2 099D4FC5 38882836 55555555 +00000000 603F7109 352A10F0 68596EFB 47DA7094 0497712B 54D257E4 24ED5CCF 34AE4C94 1DE524E1 7F360B1A 5C3D3281 7BE60998 14AB1A1F 427C184A 55555555 +>}image diff --git a/glabels2/iec16022-0.2.1/test/testsuite-example.hex b/glabels2/iec16022-0.2.1/test/testsuite-example.hex new file mode 100644 index 00000000..874101c1 --- /dev/null +++ b/glabels2/iec16022-0.2.1/test/testsuite-example.hex @@ -0,0 +1,2 @@ +FFFFFFFF BF60EF1A C1CFB66D DC3EFD06 DC1FCFC3 F08ABC4E AFB7AB39 9A82B1A4 CBBBBE83 D040A8C4 CC45D9F9 A32CC63C B017DC2D F662B03A C777D7C9 AAAAAAAA +FFFFFFFF 9FC08EF6 CAD5EF0F 97A69104 B8258F6B FB688ED4 AB2DA81B DB12A330 CB51B36B E21ADB1E 80C9F4E5 A3C2CD7E 8419F667 EB54E5E0 BD83E7B5 AAAAAAAA diff --git a/glabels2/iec16022-0.2.1/test/testsuite-example.png b/glabels2/iec16022-0.2.1/test/testsuite-example.png new file mode 100644 index 0000000000000000000000000000000000000000..050d1f0e3caa110df74ac9b8a34777f6fe794ca5 GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^3=*07`vZ_-3-AeX{r~?zkQsXDavhLjO!9Vj zVd!9$^#F4GOI#yLobz*YQ}ap~9P@J$i!+RK6jD-C%{)`HQx*I(oboer4V@KyQ}faj zgDi6usuDdC^8-tb6f#P~jYCt5EEFBQ|bti1MFy8XRl zc=F+!Co_GHc{F}&|N8u)_?3MMSn;^w6Vo9ft(PI% zI)ZInFWhHn-xl(|#3Z`Y&tdAh$P_mDyn_rmTb&Fi&g`Cb`gGOG=?-D-VP+0u9LZff z1Lk(#Yx**&igWD(>A8l}vR3-<6q$VWb=vel+T4jZe7E)lOc!Etw)csfv)0|in5iv6 z;_!(lau=(5{Zph5-%-+CJITIzea@AatK-(aW)`t!a(r`X?sA|v89ZJ6T-G@yGywp2 CdY@GQ literal 0 HcmV?d00001 diff --git a/glabels2/iec16022-0.2.1/test/testsuite-example.text b/glabels2/iec16022-0.2.1/test/testsuite-example.text new file mode 100644 index 00000000..097a7d1c --- /dev/null +++ b/glabels2/iec16022-0.2.1/test/testsuite-example.text @@ -0,0 +1,32 @@ +* * * * * * * * * * * * * * * * +* **** ** ***** **** ** * * +*** * ** * * * *** * **** +* * ** ***** ** ** *** +* * **** * ** ** * ****** +* ** * ***** * *** * * +*** * ** * ** ** ** **** +** * ** * * ** ** ** ** * ** +** ** ** * * * * ** ** +* * * ** * ** ** * * ** ** +***** ** ** * * *** ** * * +* *** * * ** **** ** * ** +* * **** * ** * * * * +** * * ** * * **** **** **** +* ******* * *** **** ** +******************************** +* * * * * * * * * * * * * * * * +** *** *** ***** * ***** * * +**** ** ** * * ** *** * +* ** * ***** *** * ** * +* * ** * ** ** ** **** +** ** * * *** ** ****** * +** * * * * * ** * +** * *** *** *** ***** * ** +* ** * * * * ** ** * * +* * ***** ** **** * * ** *** * +**** * * * * **** * *** +** *** ******* ****** ** +** *** ***** ****** * ** +** *** ***** ** ** ** ** * +* ****** ** *** **** ** * +******************************** diff --git a/glabels2/iec16022-0.2.1/test/testsuite.sh b/glabels2/iec16022-0.2.1/test/testsuite.sh new file mode 100755 index 00000000..82a100af --- /dev/null +++ b/glabels2/iec16022-0.2.1/test/testsuite.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +FAILED=0 + +../iec16022 -o testsuite-test.text -f Text -c "Aolash3l dee6Ieke OhBohm1C MengaR9m zaHaoQu2 huW3Uer8 ieg7chaJ haiKua1o" +../iec16022 -o testsuite-test.eps -f EPS -c "Aolash3l dee6Ieke OhBohm1C MengaR9m zaHaoQu2 huW3Uer8 ieg7chaJ haiKua1o" +../iec16022 -o testsuite-test.png -f PNG -c "Aolash3l dee6Ieke OhBohm1C MengaR9m zaHaoQu2 huW3Uer8 ieg7chaJ haiKua1o" +../iec16022 -o testsuite-test.bin -f Bin -c "Aolash3l dee6Ieke OhBohm1C MengaR9m zaHaoQu2 huW3Uer8 ieg7chaJ haiKua1o" +../iec16022 -o testsuite-test.hex -f Hex -c "Aolash3l dee6Ieke OhBohm1C MengaR9m zaHaoQu2 huW3Uer8 ieg7chaJ haiKua1o" + +diff -b testsuite-test.text testsuite-example.text && echo "Text test passed" || echo "Text test FAILED" || FAILED=1 +diff -b testsuite-test.eps testsuite-example.eps && echo "EPS test passed" || echo "EPS test FAILED" || FAILED=1 +diff -b testsuite-test.png testsuite-example.png && echo "PNG test passed" || echo "PNG test FAILED" || FAILED=1 +diff -b testsuite-test.bin testsuite-example.bin && echo "Bin test passed" || echo "Bin test FAILED" || FAILED=1 +diff -b testsuite-test.hex testsuite-example.hex && echo "Hex test passed" || echo "Hex test FAILED" || FAILED=1 + +rm testsuite-test.* + +exit $FAILED diff --git a/glabels2/libglabels/Makefile.am b/glabels2/libglabels/Makefile.am new file mode 100644 index 00000000..2d1228ab --- /dev/null +++ b/glabels2/libglabels/Makefile.am @@ -0,0 +1,58 @@ +templatesdir = $(datadir)/glabels/templates + +INCLUDES = \ + $(LIBGLABELS_CFLAGS) \ + -DDATADIR=\""$(datadir)"\" \ + -DLIBGLABELS_TEMPLATE_DIR=\""$(templatesdir)"\" \ + $(DISABLE_DEPRECATED_CFLAGS) + +libglabels_la_LDFLAGS=\ + -version-info $(LIBGLABELS_VERSION_INFO) \ + $(LIBGLABELS_LIBS) \ + -no-undefined + +lib_LTLIBRARIES = libglabels.la + +libglabelsincludedir=$(includedir)/libglabels + +libglabels_la_SOURCES = \ + libglabels-private.h \ + db.h \ + db.c \ + enums.h \ + paper.h \ + paper.c \ + category.h \ + category.c \ + template.h \ + template.c \ + xml-paper.h \ + xml-paper.c \ + xml-category.h \ + xml-category.c \ + xml-template.h \ + xml-template.c \ + xml.h \ + xml.c \ + str.h \ + str.c + +libglabelsinclude_HEADERS = \ + libglabels.h \ + db.h \ + enums.h \ + paper.h \ + category.h \ + template.h \ + xml-paper.h \ + xml-category.h \ + xml-template.h \ + xml.h \ + str.h + +EXTRA_DIST = \ + libglabels.pc.in + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libglabels.pc + diff --git a/glabels2/libglabels/category.c b/glabels2/libglabels/category.c new file mode 100644 index 00000000..e82e0849 --- /dev/null +++ b/glabels2/libglabels/category.c @@ -0,0 +1,129 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (LIBGLABELS) Template library for GLABELS + * + * category.c: template category module + * + * Copyright (C) 2001-2006 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ +#include + +#include "category.h" + +#include +#include +#include +#include +#include + +#include "libglabels-private.h" + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + + +/*===========================================*/ +/* Functions. */ +/*===========================================*/ +/** + * lgl_category_new: + * @id: Id of category definition. (E.g. label, card, etc.) Should be + * unique. + * @name: Localized name of category. + * + * Allocates and constructs a new #lglCategory structure. + * + * Returns: a pointer to a newly allocated #lglCategory structure. + * + */ +lglCategory * +lgl_category_new (gchar *id, + gchar *name) +{ + lglCategory *category; + + category = g_new0 (lglCategory,1); + category->id = g_strdup (id); + category->name = g_strdup (name); + + return category; +} + + +/** + * lgl_category_dup: + * @orig: #lglCategory structure to be duplicated. + * + * Duplicates an existing #lglCategory structure. + * + * Returns: a pointer to a newly allocated #lglCategory structure. + * + */ +lglCategory *lgl_category_dup (const lglCategory *orig) +{ + lglCategory *category; + + g_return_val_if_fail (orig, NULL); + + category = g_new0 (lglCategory,1); + + category->id = g_strdup (orig->id); + category->name = g_strdup (orig->name); + + return category; +} + + +/** + * lgl_category_free: + * @category: pointer to #lglCategory structure to be freed. + * + * Free all memory associated with an existing #lglCategory structure. + * + */ +void lgl_category_free (lglCategory *category) +{ + + if ( category != NULL ) { + + g_free (category->id); + category->id = NULL; + + g_free (category->name); + category->name = NULL; + + g_free (category); + } + +} + + diff --git a/glabels2/libglabels/category.h b/glabels2/libglabels/category.h new file mode 100644 index 00000000..3727d47d --- /dev/null +++ b/glabels2/libglabels/category.h @@ -0,0 +1,59 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (LIBGLABELS) Template library for GLABELS + * + * category.h: template category module header file + * + * Copyright (C) 2006 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ + +#ifndef __CATEGORY_H__ +#define __CATEGORY_H__ + +#include +#include + +G_BEGIN_DECLS + +/* + * Template class + */ +typedef struct _lglCategory lglCategory; + +struct _lglCategory { + gchar *id; /* Unique ID of category */ + gchar *name; /* Localized name of category */ +}; + + +/* + * Category construction + */ +lglCategory *lgl_category_new (gchar *id, + gchar *name); + +lglCategory *lgl_category_dup (const lglCategory *orig); +void lgl_category_free (lglCategory *category); + + +G_END_DECLS + +#endif diff --git a/glabels2/libglabels/db.c b/glabels2/libglabels/db.c new file mode 100644 index 00000000..2ca3f83b --- /dev/null +++ b/glabels2/libglabels/db.c @@ -0,0 +1,1616 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (LIBGLABELS) Template library for GLABELS + * + * db.c: template db module + * + * Copyright (C) 2003-2007 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ +#include + +#include "db.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libglabels-private.h" + +#include "xml-paper.h" +#include "xml-category.h" +#include "xml-template.h" + + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +static GList *papers = NULL; +static GList *categories = NULL; +static GList *templates = NULL; + +static GHashTable *template_cache = NULL; + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void init_template_cache (void); +static void add_to_template_cache (lglTemplate *template); + +static GList *read_papers (void); +static GList *read_paper_files_from_dir (GList *papers, + const gchar *dirname); + +static GList *read_categories (void); +static GList *read_category_files_from_dir (GList *categories, + const gchar *dirname); + +static GList *read_templates (void); +static GList *read_template_files_from_dir (GList *templates, + const gchar *dirname); + +static lglTemplate *template_full_page (const gchar *page_size); + + + +/*===========================================*/ +/* Module initialization */ +/*===========================================*/ + +/** + * lgl_db_init: + * + * Initialize all libglabels subsystems. It is not necessary for an application to call + * lgl_db_init(), because libglabels will initialize on demand. An application programmer may + * choose to call lgl_db_init() at startup to minimize the impact of the first libglabels call + * on GUI response time. + * + * This function initializes its paper definitions, category definitions, and its template + * database.. It will search both system and user template directories to locate + * this data. + */ +void +lgl_db_init (void) +{ + lglPaper *paper_other; + lglCategory *category_user_defined; + GList *page_sizes; + GList *p; + + /* + * Paper definitions + */ + if (!papers) + { + + papers = read_papers (); + + /* Create and append an "Other" entry. */ + paper_other = lgl_paper_new ("Other", _("Other"), 0.0, 0.0); + papers = g_list_append (papers, paper_other); + + } + + /* + * Categories + */ + if (!categories) + { + categories = read_categories (); + + /* Create and append a "User defined" entry. */ + category_user_defined = lgl_category_new ("user-defined", _("User defined")); + categories = g_list_append (categories, category_user_defined); + } + + /* + * Templates + */ + if (!templates) + { + + templates = read_templates (); + + /* Create and append generic full page templates. */ + page_sizes = lgl_db_get_paper_id_list (); + for ( p=page_sizes; p != NULL; p=p->next ) + { + if ( !lgl_db_is_paper_id_other (p->data) ) + { + templates = g_list_append (templates, + template_full_page (p->data)); + } + } + lgl_db_free_paper_id_list (page_sizes); + + init_template_cache (); + } +} + + + +/*===========================================*/ +/* Paper db functions. */ +/*===========================================*/ + +/** + * lgl_db_get_paper_id_list: + * + * Get a list of all paper ids known to libglabels. + * + * Returns: a list of paper ids. + * + */ +GList * +lgl_db_get_paper_id_list (void) +{ + GList *ids = NULL; + GList *p; + lglPaper *paper; + + if (!papers) + { + lgl_db_init (); + } + + for ( p=papers; p != NULL; p=p->next ) + { + paper = (lglPaper *)p->data; + ids = g_list_append (ids, g_strdup (paper->id)); + } + + return ids; +} + + +/** + * lgl_db_free_paper_id_list: + * @ids: List of id strings to be freed. + * + * Free up all storage associated with an id list obtained with + * lgl_db_get_paper_id_list(). + * + */ +void +lgl_db_free_paper_id_list (GList *ids) +{ + GList *p; + + for (p = ids; p != NULL; p = p->next) + { + g_free (p->data); + p->data = NULL; + } + + g_list_free (ids); +} + + +/** + * lgl_db_get_paper_name_list: + * + * Get a list of all localized paper names known to libglabels. + * + * Returns: a list of localized paper names. + * + */ +GList * +lgl_db_get_paper_name_list (void) +{ + GList *names = NULL; + GList *p; + lglPaper *paper; + + if (!papers) + { + lgl_db_init (); + } + + for ( p=papers; p != NULL; p=p->next ) + { + paper = (lglPaper *)p->data; + names = g_list_append (names, g_strdup (paper->name)); + } + + return names; +} + + +/** + * lgl_db_free_paper_name_list: + * @names: List of localized paper name strings to be freed. + * + * Free up all storage associated with a name list obtained with + * lgl_db_get_paper_name_list(). + * + */ +void +lgl_db_free_paper_name_list (GList *names) +{ + GList *p; + + for (p = names; p != NULL; p = p->next) + { + g_free (p->data); + p->data = NULL; + } + + g_list_free (names); +} + + +/** + * lgl_db_lookup_paper_from_name: + * @name: localized paper name string + * + * Lookup paper definition from localized paper name string. + * + * Returns: pointer to a newly allocated #lglPaper structure. + * + */ +lglPaper * +lgl_db_lookup_paper_from_name (const gchar *name) +{ + GList *p; + lglPaper *paper; + + if (!papers) + { + lgl_db_init (); + } + + if (name == NULL) + { + /* If no name, return first paper as a default */ + return lgl_paper_dup ((lglPaper *) papers->data); + } + + for (p = papers; p != NULL; p = p->next) + { + paper = (lglPaper *) p->data; + if (UTF8_EQUAL (paper->name, name)) + { + return lgl_paper_dup (paper); + } + } + + return NULL; +} + + +/** + * lgl_db_lookup_paper_from_id: + * @id: paper id string + * + * Lookup paper definition from id string. + * + * Returns: pointer to a newly allocated #lglPaper structure. + * + */ +lglPaper * +lgl_db_lookup_paper_from_id (const gchar *id) +{ + GList *p; + lglPaper *paper; + + if (!papers) + { + lgl_db_init (); + } + + if (id == NULL) + { + /* If no id, return first paper as a default */ + return lgl_paper_dup ((lglPaper *) papers->data); + } + + for (p = papers; p != NULL; p = p->next) + { + paper = (lglPaper *) p->data; + if (ASCII_EQUAL (paper->id, id)) + { + return lgl_paper_dup (paper); + } + } + + return NULL; +} + + +/** + * lgl_db_lookup_paper_id_from_name: + * @name: localized paper name stringp + * + * Lookup paper name string from localized paper name string. + * + * Returns: pointer to a newly allocated id string. + * + */ +gchar * +lgl_db_lookup_paper_id_from_name (const gchar *name) +{ + lglPaper *paper = NULL; + gchar *id = NULL; + + if (name != NULL) + { + paper = lgl_db_lookup_paper_from_name (name); + if ( paper != NULL ) + { + id = g_strdup (paper->id); + lgl_paper_free (paper); + paper = NULL; + } + } + + return id; +} + + +/** + * lgl_db_lookup_paper_name_from_id: + * @id: paper id string + * + * Lookup localized paper name string from paper id string. + * + * Returns: pointer to a newly allocated localized paper name string. + * + */ +gchar * +lgl_db_lookup_paper_name_from_id (const gchar *id) +{ + lglPaper *paper = NULL; + gchar *name = NULL; + + if (id != NULL) + { + paper = lgl_db_lookup_paper_from_id (id); + if ( paper != NULL ) + { + name = g_strdup (paper->name); + lgl_paper_free (paper); + paper = NULL; + } + } + + return name; +} + + +/** + * lgl_db_is_paper_id_known: + * @id: paper id to test + * + * Determine if given paper id is known to libglabels. + * + * Returns: TRUE if id is known, otherwise FALSE. + * + */ +gboolean +lgl_db_is_paper_id_known (const gchar *id) +{ + GList *p; + lglPaper *paper; + + if (!papers) + { + lgl_db_init (); + } + + if (id == NULL) + { + return FALSE; + } + + for (p = papers; p != NULL; p = p->next) + { + paper = (lglPaper *) p->data; + if (ASCII_EQUAL (paper->id, id)) + { + return TRUE; + } + } + + return FALSE; +} + +/** + * lgl_db_is_paper_id_other: + * @id: paper id to test + * + * Determine if given paper id is the special id "Other." + * + * Returns: TRUE if id is "Other", otherwise FALSE. + * + */ +gboolean +lgl_db_is_paper_id_other (const gchar *id) +{ + if (id == NULL) + { + return FALSE; + } + + return (ASCII_EQUAL (id, "Other")); +} + + +static GList * +read_papers (void) +{ + gchar *data_dir; + GList *papers = NULL; + + data_dir = LGL_SYSTEM_DATA_DIR; + papers = read_paper_files_from_dir (papers, data_dir); + g_free (data_dir); + + data_dir = LGL_USER_DATA_DIR; + papers = read_paper_files_from_dir (papers, data_dir); + g_free (data_dir); + + if (papers == NULL) { + g_critical (_("Unable to locate paper size definitions. Libglabels may not be installed correctly!")); + } + + return papers; +} + + +static GList * +read_paper_files_from_dir (GList *papers, + const gchar *dirname) +{ + GDir *dp; + const gchar *filename, *extension; + gchar *full_filename = NULL; + GError *gerror = NULL; + GList *new_papers = NULL; + + if (dirname == NULL) { + return papers; + } + + if (!g_file_test (dirname, G_FILE_TEST_EXISTS)) { + return papers; + } + + dp = g_dir_open (dirname, 0, &gerror); + if (gerror != NULL) { + g_message ("cannot open data directory: %s", gerror->message ); + return papers; + } + + while ((filename = g_dir_read_name (dp)) != NULL) { + + extension = strrchr (filename, '.'); + + if (extension != NULL) { + + if ( ASCII_EQUAL (extension, ".paper") || + ASCII_EQUAL (filename, "paper-sizes.xml") ) + { + + full_filename = + g_build_filename (dirname, filename, NULL); + new_papers = + lgl_xml_paper_read_papers_from_file (full_filename); + g_free (full_filename); + + papers = g_list_concat (papers, new_papers); + new_papers = NULL; + + } + + } + + } + + g_dir_close (dp); + + return papers; +} + + +/** + * lgl_db_print_known_papers: + * + * For debugging purposes: print a list of all paper definitions known to + * libglabels. + * + */ +void +lgl_db_print_known_papers (void) +{ + GList *p; + lglPaper *paper; + + if (!papers) { + lgl_db_init (); + } + + g_print ("%s():\n", __FUNCTION__); + for (p = papers; p != NULL; p = p->next) { + paper = (lglPaper *) p->data; + + g_print ("PAPER id=\"%s\", name=\"%s\", width=%gpts, height=%gpts\n", + paper->id, paper->name, paper->width, paper->height); + + } + g_print ("\n"); + +} + + +/*===========================================*/ +/* Category db functions. */ +/*===========================================*/ + +/** + * lgl_db_get_category_id_list: + * + * Get a list of all category ids known to libglabels. + * + * Returns: a list of category ids. + * + */ +GList * +lgl_db_get_category_id_list (void) +{ + GList *ids = NULL; + GList *p; + lglCategory *category; + + if (!categories) + { + lgl_db_init (); + } + + for ( p=categories; p != NULL; p=p->next ) + { + category = (lglCategory *)p->data; + ids = g_list_append (ids, g_strdup (category->id)); + } + + return ids; +} + + +/** + * lgl_db_free_category_id_list: + * @ids: List of id strings to be freed. + * + * Free up all storage associated with an id list obtained with + * lgl_db_get_category_id_list(). + * + */ +void +lgl_db_free_category_id_list (GList *ids) +{ + GList *p; + + for (p = ids; p != NULL; p = p->next) + { + g_free (p->data); + p->data = NULL; + } + + g_list_free (ids); +} + + +/** + * lgl_db_get_category_name_list: + * + * Get a list of all localized category names known to libglabels. + * + * Returns: a list of localized category names. + * + */ +GList * +lgl_db_get_category_name_list (void) +{ + GList *names = NULL; + GList *p; + lglCategory *category; + + if (!categories) + { + lgl_db_init (); + } + + for ( p=categories; p != NULL; p=p->next ) + { + category = (lglCategory *)p->data; + names = g_list_append (names, g_strdup (category->name)); + } + + return names; +} + + +/** + * lgl_db_free_category_name_list: + * @names: List of localized category name strings to be freed. + * + * Free up all storage associated with a name list obtained with + * lgl_db_get_category_name_list(). + * + */ +void +lgl_db_free_category_name_list (GList *names) +{ + GList *p; + + for (p = names; p != NULL; p = p->next) + { + g_free (p->data); + p->data = NULL; + } + + g_list_free (names); +} + + +/** + * lgl_db_lookup_category_from_name: + * @name: localized category name string + * + * Lookup category definition from localized category name string. + * + * Returns: pointer to a newly allocated #lglCategory structure. + * + */ +lglCategory * +lgl_db_lookup_category_from_name (const gchar *name) +{ + GList *p; + lglCategory *category; + + if (!categories) + { + lgl_db_init (); + } + + if (name == NULL) + { + /* If no name, return first category as a default */ + return lgl_category_dup ((lglCategory *) categories->data); + } + + for (p = categories; p != NULL; p = p->next) + { + category = (lglCategory *) p->data; + if (UTF8_EQUAL (category->name, name)) + { + return lgl_category_dup (category); + } + } + + return NULL; +} + + +/** + * lgl_db_lookup_category_from_id: + * @id: category id string + * + * Lookup category definition from id string. + * + * Returns: pointer to a newly allocated #lglCategory structure. + * + */ +lglCategory * +lgl_db_lookup_category_from_id (const gchar *id) +{ + GList *p; + lglCategory *category; + + if (!categories) + { + lgl_db_init (); + } + + if (id == NULL) + { + /* If no id, return first category as a default */ + return lgl_category_dup ((lglCategory *) categories->data); + } + + for (p = categories; p != NULL; p = p->next) + { + category = (lglCategory *) p->data; + if (ASCII_EQUAL (category->id, id)) + { + return lgl_category_dup (category); + } + } + + return NULL; +} + + +/** + * lgl_db_lookup_category_id_from_name: + * @name: localized category name stringp + * + * Lookup category name string from localized category name string. + * + * Returns: pointer to a newly allocated id string. + * + */ +gchar * +lgl_db_lookup_category_id_from_name (const gchar *name) +{ + lglCategory *category = NULL; + gchar *id = NULL; + + if (name != NULL) + { + category = lgl_db_lookup_category_from_name (name); + if ( category != NULL ) + { + id = g_strdup (category->id); + lgl_category_free (category); + category = NULL; + } + } + + return id; +} + + +/** + * lgl_db_lookup_category_name_from_id: + * @id: category id string + * + * Lookup localized category name string from category id string. + * + * Returns: pointer to a newly allocated localized category name string. + * + */ +gchar * +lgl_db_lookup_category_name_from_id (const gchar *id) +{ + lglCategory *category = NULL; + gchar *name = NULL; + + if (id != NULL) + { + category = lgl_db_lookup_category_from_id (id); + if ( category != NULL ) + { + name = g_strdup (category->name); + lgl_category_free (category); + category = NULL; + } + } + + return name; +} + + +/** + * lgl_db_is_category_id_known: + * @id: category id to test + * + * Determine if given category id is known to libglabels. + * + * Returns: TRUE if id is known, otherwise FALSE. + * + */ +gboolean +lgl_db_is_category_id_known (const gchar *id) +{ + GList *p; + lglCategory *category; + + if (!categories) + { + lgl_db_init (); + } + + if (id == NULL) + { + return FALSE; + } + + for (p = categories; p != NULL; p = p->next) + { + category = (lglCategory *) p->data; + if (ASCII_EQUAL (category->id, id)) + { + return TRUE; + } + } + + return FALSE; +} + + +static GList * +read_categories (void) +{ + gchar *data_dir; + GList *categories = NULL; + + data_dir = LGL_SYSTEM_DATA_DIR; + categories = read_category_files_from_dir (categories, data_dir); + g_free (data_dir); + + data_dir = LGL_USER_DATA_DIR; + categories = read_category_files_from_dir (categories, data_dir); + g_free (data_dir); + + if (categories == NULL) { + g_critical (_("Unable to locate category definitions. Libglabels may not be installed correctly!")); + } + + return categories; +} + + +static GList * +read_category_files_from_dir (GList *categories, + const gchar *dirname) +{ + GDir *dp; + const gchar *filename, *extension; + gchar *full_filename = NULL; + GError *gerror = NULL; + GList *new_categories = NULL; + + if (dirname == NULL) { + return categories; + } + + if (!g_file_test (dirname, G_FILE_TEST_EXISTS)) { + return categories; + } + + dp = g_dir_open (dirname, 0, &gerror); + if (gerror != NULL) { + g_message ("cannot open data directory: %s", gerror->message ); + return categories; + } + + while ((filename = g_dir_read_name (dp)) != NULL) { + + extension = strrchr (filename, '.'); + + if (extension != NULL) { + + if ( ASCII_EQUAL (extension, ".category") || + ASCII_EQUAL (filename, "categories.xml") ) + { + + full_filename = + g_build_filename (dirname, filename, NULL); + new_categories = + lgl_xml_category_read_categories_from_file (full_filename); + g_free (full_filename); + + categories = g_list_concat (categories, new_categories); + new_categories = NULL; + + } + + } + + } + + g_dir_close (dp); + + return categories; +} + + +/** + * lgl_db_print_known_categories: + * + * For debugging purposes: print a list of all category definitions known to + * libglabels. + * + */ +void +lgl_db_print_known_categories (void) +{ + GList *p; + lglCategory *category; + + if (!categories) { + lgl_db_init (); + } + + g_print ("%s():\n", __FUNCTION__); + for (p = categories; p != NULL; p = p->next) { + category = (lglCategory *) p->data; + + g_print ("CATEGORY id=\"%s\", name=\"%s\"\n", category->id, category->name); + + } + g_print ("\n"); + +} + + + +/*===========================================*/ +/* Brand db functions. */ +/*===========================================*/ + +/** + * lgl_db_get_brand_list: + * @paper_id: If non NULL, limit results to given page size. + * @category_id: If non NULL, limit results to given template category. + * + * Get a list of all valid brands of templates in the template database. + * Results can be filtered by page size and/or template category. A list of valid page + * sizes can be obtained using lgl_db_get_paper_id_list(). A list of valid template + * categories can be obtained using lgl_db_get_category_id_list(). + * + * Returns: a list of brands + */ +GList * +lgl_db_get_brand_list (const gchar *paper_id, + const gchar *category_id) +{ + GList *p_tmplt, *p_alias; + lglTemplate *template; + lglTemplateAlias *alias; + GList *brands = NULL; + + if (!templates) + { + lgl_db_init (); + } + + for (p_tmplt = templates; p_tmplt != NULL; p_tmplt = p_tmplt->next) + { + template = (lglTemplate *) p_tmplt->data; + if (lgl_template_does_page_size_match (template, paper_id) && + lgl_template_does_category_match (template, category_id)) + { + for (p_alias = template->aliases; p_alias != NULL; + p_alias = p_alias->next) + { + alias = (lglTemplateAlias *)p_alias->data; + + if ( !g_list_find_custom (brands, alias->brand, + (GCompareFunc)lgl_str_utf8_casecmp) ) + { + brands = g_list_insert_sorted (brands, + g_strdup (alias->brand), + (GCompareFunc)lgl_str_utf8_casecmp); + } + } + } + } + + return brands; +} + + +/** + * lgl_db_free_brand_list: + * @brands: List of template brand strings to be freed. + * + * Free up all storage associated with a list of template names obtained with + * lgl_db_get_brand_list(). + * + */ +void +lgl_db_free_brand_list (GList *brands) +{ + GList *p_brand; + + for (p_brand = brands; p_brand != NULL; p_brand = p_brand->next) + { + g_free (p_brand->data); + p_brand->data = NULL; + } + + g_list_free (brands); +} + + + +/*===========================================*/ +/* Template db functions. */ +/*===========================================*/ + +/** + * lgl_db_register_template: + * @template: Pointer to a template structure to add to database. + * + * Register a template. This function adds a template to the template database. + * The template will be stored in an individual XML file in the user template directory. + * + * Returns: Status of registration attempt (#lglDbRegStatus) + */ +lglDbRegStatus +lgl_db_register_template (const lglTemplate *template) +{ + lglTemplate *template_copy; + gchar *dir, *filename, *abs_filename; + gint bytes_written; + + if (!templates) + { + lgl_db_init (); + } + + if (lgl_db_does_template_exist (template->brand, template->part)) + { + return LGL_DB_REG_BRAND_PART_EXISTS; + } + + if (lgl_db_is_paper_id_known (template->paper_id)) + { + dir = LGL_USER_DATA_DIR; + mkdir (dir, 0775); /* Try to make sure directory exists. */ + filename = g_strdup_printf ("%s_%s.template", template->brand, template->part); + abs_filename = g_build_filename (dir, filename, NULL); + bytes_written = lgl_xml_template_write_template_to_file (template, abs_filename); + g_free (dir); + g_free (filename); + g_free (abs_filename); + + if (bytes_written > 0) + { + template_copy = lgl_template_dup (template); + lgl_template_add_category (template_copy, "user-defined"); + templates = g_list_append (templates, template_copy); + add_to_template_cache (template_copy); + return LGL_DB_REG_OK; + } + else + { + lgl_template_free (template_copy); + return LGL_DB_REG_FILE_WRITE_ERROR; + } + } + else + { + g_message ("Cannot register new template with unknown page size."); + return LGL_DB_REG_BAD_PAPER_ID; + } + +} + + +/** + * lgl_db_does_template_exist: + * @brand: Brand name. + * @part: Part name/number. + * + * This function tests whether a template with the given brand and part name/number exists. + * + * Returns: TRUE if such a template exists in the database. + */ +gboolean +lgl_db_does_template_exist (const gchar *brand, + const gchar *part) +{ + GList *p_tmplt, *p_alias; + lglTemplate *template; + lglTemplateAlias *alias; + + if (!templates) + { + lgl_db_init (); + } + + if ((brand == NULL) || (part == NULL)) + { + return FALSE; + } + + for (p_tmplt = templates; p_tmplt != NULL; p_tmplt = p_tmplt->next) + { + template = (lglTemplate *) p_tmplt->data; + for (p_alias = template->aliases; p_alias != NULL; p_alias = p_alias->next) + { + alias = (lglTemplateAlias *)p_alias->data; + + if ( UTF8_EQUAL (brand, alias->brand) && + UTF8_EQUAL (part, alias->part) ) + { + return TRUE; + } + } + } + + return FALSE; +} + + +/** + * lgl_db_does_template_name_exist: + * @name: name string + * + * This function test whether a template with the given name exists. + * + * Returns: TRUE if such a template exists in the database. + * + */ +gboolean +lgl_db_does_template_name_exist (const gchar *name) +{ + GList *p_tmplt, *p_alias; + lglTemplate *template; + lglTemplateAlias *alias; + gchar *candidate_name; + + if (!templates) + { + lgl_db_init (); + } + + if (name == NULL) + { + return FALSE; + } + + for (p_tmplt = templates; p_tmplt != NULL; p_tmplt = p_tmplt->next) + { + template = (lglTemplate *) p_tmplt->data; + for (p_alias = template->aliases; p_alias != NULL; p_alias = p_alias->next) + { + alias = (lglTemplateAlias *)p_alias->data; + candidate_name = g_strdup_printf ("%s %s", alias->brand, alias->part); + + if ( UTF8_EQUAL (candidate_name, name) ) { + g_free (candidate_name); + return TRUE; + } + g_free (candidate_name); + } + } + + return FALSE; +} + + +/** + * lgl_db_get_template_name_list_unique: + * @brand: If non NULL, limit results to given brand + * @paper_id: If non NULL, limit results to given page size. + * @category_id: If non NULL, limit results to given template category. + * + * Get a list of valid names of unique templates in the template database. Results + * can be filtered by page size and/or template category. A list of valid page sizes + * can be obtained using lgl_db_get_paper_id_list(). A list of valid template categories + * can be obtained using lgl_db_get_category_id_list(). + * + * This function differs from lgl_db_get_template_name_list_all(), because it does not + * return multiple names for the same template. + * + * Returns: a list of template names. + */ +GList * +lgl_db_get_template_name_list_unique (const gchar *brand, + const gchar *paper_id, + const gchar *category_id) +{ + GList *p_tmplt; + lglTemplate *template; + gchar *name; + GList *names = NULL; + + if (!templates) + { + lgl_db_init (); + } + + for (p_tmplt = templates; p_tmplt != NULL; p_tmplt = p_tmplt->next) + { + template = (lglTemplate *) p_tmplt->data; + + if (lgl_template_does_brand_match (template, brand) && + lgl_template_does_page_size_match (template, paper_id) && + lgl_template_does_category_match (template, category_id)) + { + name = g_strdup_printf ("%s %s", template->brand, template->part); + names = g_list_insert_sorted (names, name, + (GCompareFunc)g_utf8_collate); + } + } + + return names; +} + + +/** + * lgl_db_get_template_name_list_all: + * @brand: If non NULL, limit results to given brand + * @paper_id: If non NULL, limit results to given page size. + * @category_id: If non NULL, limit results to given template category. + * + * Get a list of all valid names and aliases of templates in the template database. + * Results can be filtered by page size and/or template category. A list of valid page + * sizes can be obtained using lgl_db_get_paper_id_list(). A list of valid template + * categories can be obtained using lgl_db_get_category_id_list(). + * + * This function differs from lgl_db_get_template_name_list_unique(), because it will + * return multiple names for the same template. + * + * Returns: a list of template names and aliases. + */ +GList * +lgl_db_get_template_name_list_all (const gchar *brand, + const gchar *paper_id, + const gchar *category_id) +{ + GList *p_tmplt, *p_alias; + lglTemplate *template; + lglTemplateAlias *alias; + gchar *name; + GList *names = NULL; + + if (!templates) + { + lgl_db_init (); + } + + for (p_tmplt = templates; p_tmplt != NULL; p_tmplt = p_tmplt->next) + { + template = (lglTemplate *) p_tmplt->data; + if (lgl_template_does_page_size_match (template, paper_id) && + lgl_template_does_category_match (template, category_id)) + { + for (p_alias = template->aliases; p_alias != NULL; + p_alias = p_alias->next) + { + alias = (lglTemplateAlias *)p_alias->data; + + if ( !brand || UTF8_EQUAL( alias->brand, brand) ) + { + name = g_strdup_printf ("%s %s", alias->brand, alias->part); + names = g_list_insert_sorted (names, name, + (GCompareFunc)g_utf8_collate); + } + } + } + } + + return names; +} + + +/** + * lgl_db_free_template_name_list: + * @names: List of template name strings to be freed. + * + * Free up all storage associated with a list of template names obtained with + * lgl_db_get_template_name_list_all() or lgl_db_get_template_name_list_unique(). + * + */ +void +lgl_db_free_template_name_list (GList *names) +{ + GList *p_name; + + for (p_name = names; p_name != NULL; p_name = p_name->next) + { + g_free (p_name->data); + p_name->data = NULL; + } + + g_list_free (names); +} + + +/** + * lgl_db_lookup_template_from_name: + * @name: name string + * + * Lookup template in template database from name string. + * + * Returns: pointer to a newly allocated #lglTemplate structure. + * + */ +lglTemplate * +lgl_db_lookup_template_from_name (const gchar *name) +{ + GList *p_alias; + lglTemplate *template; + lglTemplateAlias *alias; + gchar *candidate_name; + lglTemplate *new_template; + + if (!templates) + { + lgl_db_init (); + } + + if (name == NULL) + { + /* If no name, return first template as a default */ + return lgl_template_dup ((lglTemplate *) templates->data); + } + + template = g_hash_table_lookup (template_cache, name); + + if (template) + { + for (p_alias = template->aliases; p_alias != NULL; p_alias = p_alias->next) + { + alias = (lglTemplateAlias *)p_alias->data; + candidate_name = g_strdup_printf ("%s %s", alias->brand, alias->part); + + if ( UTF8_EQUAL (candidate_name, name) ) + { + g_free (candidate_name); + new_template = lgl_template_dup (template); + g_free (new_template->brand); + new_template->brand = g_strdup (alias->brand); + g_free (new_template->part); + new_template->part = g_strdup (alias->part); + return new_template; + } + + g_free (candidate_name); + } + } + + /* No matching template has been found so return the first template */ + return lgl_template_dup ((lglTemplate *) templates->data); +} + + +static void +init_template_cache (void) +{ + GList *p_tmplt, *p_alias; + lglTemplate *template; + lglTemplateAlias *alias; + gchar *name; + + template_cache = g_hash_table_new (g_str_hash, g_str_equal); + + for ( p_tmplt=templates; p_tmplt != NULL; p_tmplt=p_tmplt->next ) + { + template = (lglTemplate *) p_tmplt->data; + + for ( p_alias=template->aliases; p_alias != NULL; p_alias=p_alias->next ) + { + alias = (lglTemplateAlias *)p_alias->data; + name = g_strdup_printf ("%s %s", alias->brand, alias->part); + + g_hash_table_insert (template_cache, name, template); + } + } +} + + +static void +add_to_template_cache (lglTemplate *template) +{ + GList *p_alias; + lglTemplateAlias *alias; + gchar *name; + + for ( p_alias=template->aliases; p_alias != NULL; p_alias=p_alias->next ) + { + alias = (lglTemplateAlias *)p_alias->data; + name = g_strdup_printf ("%s %s", alias->brand, alias->part); + + g_hash_table_insert (template_cache, name, template); + } +} + + +static GList * +read_templates (void) +{ + gchar *data_dir; + GList *templates = NULL; + GList *p; + lglTemplate *template; + + /* + * User defined templates. Add to user-defined category. + */ + data_dir = LGL_USER_DATA_DIR; + templates = read_template_files_from_dir (templates, data_dir); + g_free (data_dir); + for ( p=templates; p != NULL; p=p->next ) + { + template = (lglTemplate *)p->data; + lgl_template_add_category (template, "user-defined"); + } + + /* + * System templates. + */ + data_dir = LGL_SYSTEM_DATA_DIR; + templates = read_template_files_from_dir (templates, data_dir); + g_free (data_dir); + + if (templates == NULL) + { + g_critical (_("Unable to locate any template files. Libglabels may not be installed correctly!")); + } + + return templates; +} + + +static GList * +read_template_files_from_dir (GList *templates, + const gchar *dirname) +{ + GDir *dp; + const gchar *filename, *extension, *extension2; + gchar *full_filename = NULL; + GError *gerror = NULL; + GList *new_templates = NULL; + + if (dirname == NULL) + return templates; + + if (!g_file_test (dirname, G_FILE_TEST_EXISTS)) + { + return templates; + } + + dp = g_dir_open (dirname, 0, &gerror); + if (gerror != NULL) + { + g_message ("cannot open data directory: %s", gerror->message ); + return templates; + } + + while ((filename = g_dir_read_name (dp)) != NULL) + { + + extension = strrchr (filename, '.'); + extension2 = strrchr (filename, '-'); + + if ( (extension && ASCII_EQUAL (extension, ".template")) || + (extension2 && ASCII_EQUAL (extension2, "-templates.xml")) ) + { + + full_filename = g_build_filename (dirname, filename, NULL); + new_templates = + lgl_xml_template_read_templates_from_file (full_filename); + g_free (full_filename); + + templates = g_list_concat (templates, new_templates); + new_templates = NULL; + } + + } + + g_dir_close (dp); + + return templates; +} + + +static lglTemplate * +template_full_page (const gchar *paper_id) +{ + lglPaper *paper = NULL; + lglTemplate *template = NULL; + lglTemplateFrame *frame = NULL; + gchar *part; + gchar *desc; + + g_return_val_if_fail (paper_id, NULL); + + paper = lgl_db_lookup_paper_from_id (paper_id); + if ( paper == NULL ) + { + return NULL; + } + + part = g_strdup_printf ("%s-Full-Page", paper->id); + desc = g_strdup_printf (_("Generic %s full page template"), paper->name); + + template = lgl_template_new ("Generic", part, desc, + paper_id, paper->width, paper->height); + + + frame = lgl_template_frame_rect_new ("0", + paper->width, + paper->height, + 0.0, + 0.0, + 0.0); + lgl_template_add_frame (template, frame); + + lgl_template_frame_add_layout (frame, lgl_template_layout_new (1, 1, 0., 0., 0., 0.)); + + lgl_template_frame_add_markup (frame, lgl_template_markup_margin_new (9.0)); + + g_free (desc); + desc = NULL; + lgl_paper_free (paper); + paper = NULL; + + return template; +} + + +/** + * lgl_db_print_known_templates: + * + * Print all known templates (for debugging purposes). + * + */ +void +lgl_db_print_known_templates (void) +{ + GList *p; + lglTemplate *template; + + g_print ("%s():\n", __FUNCTION__); + for (p=templates; p!=NULL; p=p->next) + { + template = (lglTemplate *)p->data; + + g_print("TEMPLATE brand=\"%s\", part=\"%s\", description=\"%s\"\n", + template->brand, template->part, template->description); + + } + g_print ("\n"); + +} + +/** + * lgl_db_print_aliases: + * @template: template + * + * Print all aliases of a template (for debugging purposes). + * + */ +void +lgl_db_print_aliases (const lglTemplate *template) +{ + GList *p; + lglTemplateAlias *alias; + + g_print ("%s():\n", __FUNCTION__); + for (p=template->aliases; p!=NULL; p=p->next) + { + alias = (lglTemplateAlias *)p->data; + + g_print("Alias: brand=\"%s\", part=\"%s\"\n", alias->brand, alias->part); + + } + g_print ("\n"); + +} + + diff --git a/glabels2/libglabels/db.h b/glabels2/libglabels/db.h new file mode 100644 index 00000000..c6b6f7ef --- /dev/null +++ b/glabels2/libglabels/db.h @@ -0,0 +1,148 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (LIBGLABELS) Template library for GLABELS + * + * db.h: template db module header file + * + * Copyright (C) 2006-2007 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ + +#ifndef __DB_H__ +#define __DB_H__ + +#include +#include + +#include "paper.h" +#include "category.h" +#include "template.h" + +G_BEGIN_DECLS + +typedef enum +{ + LGL_DB_REG_OK = 0, + LGL_DB_REG_BAD_PAPER_ID = -1, + LGL_DB_REG_BRAND_PART_EXISTS = -2, + LGL_DB_REG_FILE_WRITE_ERROR = -3 +} lglDbRegStatus; + +/* + * Module initialization + */ +void lgl_db_init (void); + + +/* + * Paper + */ +GList *lgl_db_get_paper_id_list (void); + +void lgl_db_free_paper_id_list (GList *ids); + +GList *lgl_db_get_paper_name_list (void); + +void lgl_db_free_paper_name_list (GList *names); + +lglPaper *lgl_db_lookup_paper_from_name (const gchar *name); + +lglPaper *lgl_db_lookup_paper_from_id (const gchar *id); + +gchar *lgl_db_lookup_paper_id_from_name (const gchar *name); + +gchar *lgl_db_lookup_paper_name_from_id (const gchar *id); + +gboolean lgl_db_is_paper_id_known (const gchar *id); + +gboolean lgl_db_is_paper_id_other (const gchar *id); + + + +/* + * Template categories + */ +GList *lgl_db_get_category_id_list (void); + +void lgl_db_free_category_id_list (GList *ids); + +GList *lgl_db_get_category_name_list (void); + +void lgl_db_free_category_name_list (GList *names); + +lglCategory *lgl_db_lookup_category_from_name (const gchar *name); + +lglCategory *lgl_db_lookup_category_from_id (const gchar *id); + +gchar *lgl_db_lookup_category_id_from_name (const gchar *name); + +gchar *lgl_db_lookup_category_name_from_id (const gchar *id); + +gboolean lgl_db_is_category_id_known (const gchar *id); + + +/* + * Template brands + */ +GList *lgl_db_get_brand_list (const gchar *paper_id, + const gchar *category_id); + +void lgl_db_free_brand_list (GList *brands); + + +/* + * Templates + */ +lglDbRegStatus lgl_db_register_template (const lglTemplate *template); + +gboolean lgl_db_does_template_exist (const gchar *brand, + const gchar *part); + +gboolean lgl_db_does_template_name_exist (const gchar *name); + +GList *lgl_db_get_template_name_list_unique (const gchar *brand, + const gchar *paper_id, + const gchar *category_id); + +GList *lgl_db_get_template_name_list_all (const gchar *brand, + const gchar *paper_id, + const gchar *category_id); + +void lgl_db_free_template_name_list (GList *names); + +lglTemplate *lgl_db_lookup_template_from_name (const gchar *name); + + +/* + * Debugging functions + */ +void lgl_db_print_known_papers (void); + +void lgl_db_print_known_categories (void); + +void lgl_db_print_known_templates (void); + +void lgl_db_print_aliases (const lglTemplate *template); + + + +G_END_DECLS + +#endif diff --git a/glabels2/libglabels/enums.h b/glabels2/libglabels/enums.h new file mode 100644 index 00000000..d139dc25 --- /dev/null +++ b/glabels2/libglabels/enums.h @@ -0,0 +1,49 @@ +/* + * (LIBGLABELS) Template library for GLABELS + * + * enums.h: common libGLabels enumerations header file + * + * Copyright (C) 2003, 2004 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ + +#ifndef __ENUMS_H__ +#define __ENUMS_H__ + +#include + +G_BEGIN_DECLS + +/* Units of distance */ +typedef enum { + LGL_UNITS_POINT, /* encoded as "pt" */ + LGL_UNITS_INCH, /* encoded as "in" */ + LGL_UNITS_MM, /* encoded as "mm" */ + LGL_UNITS_CM, /* encoded as "cm" */ + LGL_UNITS_PICA, /* encoded as "pc" */ + + LGL_UNITS_FIRST = LGL_UNITS_POINT, + LGL_UNITS_LAST = LGL_UNITS_PICA, +} lglUnitsType; + + +G_END_DECLS + + +#endif /* __ENUMS_H__ */ diff --git a/glabels2/libglabels/libglabels-private.h b/glabels2/libglabels/libglabels-private.h new file mode 100644 index 00000000..dd8bda83 --- /dev/null +++ b/glabels2/libglabels/libglabels-private.h @@ -0,0 +1,46 @@ +/* + * (LIBGLABELS) Template library for GLABELS + * + * libglabels-private.h: libglabels private header file + * + * Copyright (C) 2004 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ + +#ifndef __LIBGLABELS_PRIVATE_H__ +#define __LIBGLABELS_PRIVATE_H__ + +#include +#include +#include + +#include "str.h" + +/* Data system and user data directories. (must free w/ g_free()) */ +#define LGL_SYSTEM_DATA_DIR g_build_filename (LIBGLABELS_TEMPLATE_DIR, NULL) +#define LGL_USER_DATA_DIR g_build_filename (g_get_home_dir (), ".glabels", NULL) + +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "LibGlabels" + +#define UTF8_EQUAL(s1,s2) (!lgl_str_utf8_casecmp (s1, s2)) +#define ASCII_EQUAL(s1,s2) (!g_ascii_strcasecmp (s1, s2)) + + +#endif /* __LIBGLABELS_PRIVATE_H__ */ diff --git a/glabels2/libglabels/libglabels.h b/glabels2/libglabels/libglabels.h new file mode 100644 index 00000000..c74fbe01 --- /dev/null +++ b/glabels2/libglabels/libglabels.h @@ -0,0 +1,40 @@ +/* + * (LIBGLABELS) Template library for GLABELS + * + * libglabels.h: libglabels master header file + * + * Copyright (C) 2004 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ + +#ifndef __LIBGLABELS_H__ +#define __LIBGLABELS_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif /* __LIBGLABELS_H__ */ diff --git a/glabels2/libglabels/libglabels.pc.in b/glabels2/libglabels/libglabels.pc.in new file mode 100644 index 00000000..c16e8f47 --- /dev/null +++ b/glabels2/libglabels/libglabels.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libglabels +Description: GLabels Template Library +Requires: glib-2.0 libxml-2.0 +Version: @VERSION@ +Libs: -L${libdir} -lglabels +Cflags: -I${includedir} + diff --git a/glabels2/libglabels/paper.c b/glabels2/libglabels/paper.c new file mode 100644 index 00000000..e4d266a6 --- /dev/null +++ b/glabels2/libglabels/paper.c @@ -0,0 +1,136 @@ +/* + * (LIBGLABELS) Template library for GLABELS + * + * paper.c: paper module + * + * Copyright (C) 2003, 2004 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ +#include + +#include "paper.h" + +#include +#include +#include +#include +#include + +#include "libglabels-private.h" + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + + +/*===========================================*/ +/* Functions. */ +/*===========================================*/ + +/** + * lgl_paper_new: + * @id: Id of paper definition. (E.g. US-Letter, A4, etc.) Should be + * unique. + * @name: Localized name of paper. + * @width: Width of paper in points. + * @height: Height of paper in points. + * + * Allocates and constructs a new #lglPaper structure. + * + * Returns: a pointer to a newly allocated #lglPaper structure. + * + */ +lglPaper * +lgl_paper_new (gchar *id, + gchar *name, + gdouble width, + gdouble height) +{ + lglPaper *paper; + + paper = g_new0 (lglPaper,1); + paper->id = g_strdup (id); + paper->name = g_strdup (name); + paper->width = width; + paper->height = height; + + return paper; +} + + +/** + * lgl_paper_dup: + * @orig: #lglPaper structure to be duplicated. + * + * Duplicates an existing #lglPaper structure. + * + * Returns: a pointer to a newly allocated #lglPaper structure. + * + */ +lglPaper *lgl_paper_dup (const lglPaper *orig) +{ + lglPaper *paper; + + g_return_val_if_fail (orig, NULL); + + paper = g_new0 (lglPaper,1); + + paper->id = g_strdup (orig->id); + paper->name = g_strdup (orig->name); + paper->width = orig->width; + paper->height = orig->height; + + return paper; +} + + +/** + * lgl_paper_free: + * @paper: pointer to #lglPaper structure to be freed. + * + * Free all memory associated with an existing #lglPaper structure. + * + */ +void lgl_paper_free (lglPaper *paper) +{ + + if ( paper != NULL ) { + + g_free (paper->id); + paper->id = NULL; + + g_free (paper->name); + paper->name = NULL; + + g_free (paper); + } + +} + + diff --git a/glabels2/libglabels/paper.h b/glabels2/libglabels/paper.h new file mode 100644 index 00000000..12fe978f --- /dev/null +++ b/glabels2/libglabels/paper.h @@ -0,0 +1,63 @@ +/* + * (LIBGLABELS) Template library for GLABELS + * + * paper.h: paper module header file + * + * Copyright (C) 2003, 2004 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ + +#ifndef __PAPER_H__ +#define __PAPER_H__ + +#include +#include + +G_BEGIN_DECLS + + +/* + * lglPaper structure + */ +typedef struct _lglPaper lglPaper; + +struct _lglPaper { + gchar *id; /* Unique ID of paper definition */ + gchar *name; /* Localized name of paper */ + gdouble width; /* Width (in points) */ + gdouble height; /* Height (in points) */ +}; + + +/* + * Paper construction + */ +lglPaper *lgl_paper_new (gchar *id, + gchar *name, + gdouble width, + gdouble height); + +lglPaper *lgl_paper_dup (const lglPaper *orig); + +void lgl_paper_free (lglPaper *paper); + + +G_END_DECLS + +#endif diff --git a/glabels2/libglabels/str.c b/glabels2/libglabels/str.c new file mode 100644 index 00000000..7c1f59a6 --- /dev/null +++ b/glabels2/libglabels/str.c @@ -0,0 +1,84 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (LIBGLABELS) Template library for GLABELS + * + * str.c: libGLabels string utilities + * + * Copyright (C) 2007 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ +#include + +#include "str.h" + + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + + +/*===========================================*/ +/* Functions. */ +/*===========================================*/ + +/** + * lgl_str_utf8_casecmp: + * @s1: string to compare with s2. + * @s2: string to compare with s1. + * + * Compare two UTF-8 strings, ignoring the case of characters. + * + * This function should be used only on strings that are known to be encoded + * in UTF-8 or a compatible UTF-8 subset. + * + * Returns: 0 if the strings match, a negative value if s1 < s2, + * or a positive value if s1 > s2. + * + */ +gint +lgl_str_utf8_casecmp (const gchar *s1, + const gchar *s2) +{ + gchar *folded_s1; + gchar *folded_s2; + gint result; + + folded_s1 = g_utf8_casefold (s1, -1); + folded_s2 = g_utf8_casefold (s2, -1); + + result = g_utf8_collate (folded_s1, folded_s2); + + g_free (folded_s1); + g_free (folded_s2); + + return result; +} + + diff --git a/glabels2/libglabels/str.h b/glabels2/libglabels/str.h new file mode 100644 index 00000000..bc6312f7 --- /dev/null +++ b/glabels2/libglabels/str.h @@ -0,0 +1,41 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (LIBGLABELS) Template library for GLABELS + * + * str.h: libGLabels string utilities header file + * + * Copyright (C) 2007 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ + +#ifndef __STR_H__ +#define __STR_H__ + +#include + +G_BEGIN_DECLS + +gint lgl_str_utf8_casecmp (const gchar *s1, + const gchar *s2); + +G_END_DECLS + + +#endif /* __STR_H__ */ diff --git a/glabels2/libglabels/template.c b/glabels2/libglabels/template.c new file mode 100644 index 00000000..f6d6d212 --- /dev/null +++ b/glabels2/libglabels/template.c @@ -0,0 +1,1121 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (LIBGLABELS) Template library for GLABELS + * + * template.c: template module + * + * Copyright (C) 2001-2006 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ +#include + +#include "template.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libglabels-private.h" + +#include "paper.h" + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static gint compare_origins (gconstpointer a, + gconstpointer b, + gpointer user_data); + +/*===========================================*/ +/* Functions. */ +/*===========================================*/ + +/** + * lgl_template_new: + * @brand: Template brand + * @part: Template part name/number + * @description: Template descriptions + * @paper_id: Page size id + * @page_width: Page width in points, set to zero unless paper_id="Other" + * @page_height: Page height in points, set to zero unless paper_id="Other" + * + * Create a new template structure, with the given top-level attributes. The + * created template will have no initial aliases, categories, or frames + * associated with it. See lgl_template_add_alias(), lgl_template_add_category(), + * and lgl_template_add_frame() to add these. + * + * Returns: pointer to a newly allocated #lglTemplate structure. + * + */ +lglTemplate * +lgl_template_new (const gchar *brand, + const gchar *part, + const gchar *description, + const gchar *paper_id, + gdouble page_width, + gdouble page_height) +{ + lglTemplate *template; + lglTemplateAlias *alias; + + template = g_new0 (lglTemplate,1); + + template->brand = g_strdup (brand); + template->part = g_strdup (part); + template->description = g_strdup (description); + template->paper_id = g_strdup (paper_id); + template->page_width = page_width; + template->page_height = page_height; + + /* Always include primary name in alias list. */ + template->aliases = NULL; + alias = lgl_template_alias_new (brand, part); + lgl_template_add_alias (template, alias); + + return template; +} + + +/** + * lgl_template_get_name: + * @template: Pointer to template structure to test + * + * This function returns the name of the given template. The name is the concetenation + * of the brand and part name/number. + * + * Returns: A pointer to a newly allocated name string. Should be freed with g_free(). + * + */ +gchar * +lgl_template_get_name (const lglTemplate *template) +{ + g_return_val_if_fail (template, NULL); + + return g_strdup_printf ("%s %s", template->brand, template->part); +} + + +/** + * lgl_template_do_templates_match: + * @template1: Pointer to 1st template structure to test + * @template2: Pointer to 2nd template structure to test + * + * This function tests if the given templates match. This is a simple test that only tests + * the brand and part name/number. It does not test if they are actually identical. + * + * Returns: TRUE if the two template matche. + * + */ +gboolean +lgl_template_do_templates_match (const lglTemplate *template1, + const lglTemplate *template2) +{ + g_return_val_if_fail (template1, FALSE); + g_return_val_if_fail (template2, FALSE); + + return (UTF8_EQUAL (template1->brand, template2->brand) && + UTF8_EQUAL (template1->part, template2->part)); +} + + +/** + * lgl_template_does_brand_match: + * @template: Pointer to template structure to test + * @brand: Brand string + * + * This function tests if the brand of the template matches the given brand. + * + * Returns: TRUE if the template matches the given brand. + * + */ +gboolean +lgl_template_does_brand_match (const lglTemplate *template, + const gchar *brand) +{ + g_return_val_if_fail (template, FALSE); + + /* NULL matches everything. */ + if (brand == NULL) + { + return TRUE; + } + + return UTF8_EQUAL (template->brand, brand); +} + + +/** + * lgl_template_does_page_size_match: + * @template: Pointer to template structure to test + * @paper_id: Page size ID string + * + * This function tests if the page size of the template matches the given ID. + * + * Returns: TRUE if the template matches the given page size ID. + * + */ +gboolean +lgl_template_does_page_size_match (const lglTemplate *template, + const gchar *paper_id) +{ + g_return_val_if_fail (template, FALSE); + + /* NULL matches everything. */ + if (paper_id == NULL) + { + return TRUE; + } + + return ASCII_EQUAL(paper_id, template->paper_id); +} + + +/** + * lgl_template_does_category_match: + * @template: Pointer to template structure to test + * @category_id: Category ID string + * + * This function tests if the given template belongs to the given category ID. + * + * Returns: TRUE if the template matches the given category ID. + * + */ +gboolean +lgl_template_does_category_match (const lglTemplate *template, + const gchar *category_id) +{ + GList *p; + + g_return_val_if_fail (template, FALSE); + + /* NULL matches everything. */ + if (category_id == NULL) + { + return TRUE; + } + + for ( p=template->category_ids; p != NULL; p=p->next ) + { + if (ASCII_EQUAL(category_id, p->data)) + { + return TRUE; + } + } + + return FALSE; +} + + +/** + * lgl_template_alias_new: + * @brand: Alias brand + * @part: Alias part name/number + * + * Create a new template alias structure, with the given brand and part number. + * + * Returns: pointer to a newly allocated #lglTemplateAlias structure. + * + */ +lglTemplateAlias * +lgl_template_alias_new (const gchar *brand, + const gchar *part) +{ + lglTemplateAlias *alias; + + alias = g_new0 (lglTemplateAlias,1); + + alias->brand = g_strdup (brand); + alias->part = g_strdup (part); + + return alias; +} + + +/** + * lgl_template_add_alias: + * @template: Pointer to template structure + * @alias: Alias string + * + * This function adds the given alias to a templates list of aliases. + * + */ +void +lgl_template_add_alias (lglTemplate *template, + lglTemplateAlias *alias) +{ + g_return_if_fail (template); + g_return_if_fail (alias); + + template->aliases = g_list_append (template->aliases, alias); +} + + +/** + * lgl_template_add_frame: + * @template: Pointer to template structure + * @frame: Pointer to frame structure + * + * This function adds the given frame structure to the template. Once added, + * the frame structure belongs to the given template; do not attempt to free + * it. + * + * Note: Currently glabels only supports a single frame per template. + * + */ +void +lgl_template_add_frame (lglTemplate *template, + lglTemplateFrame *frame) +{ + g_return_if_fail (template); + g_return_if_fail (frame); + + template->frames = g_list_append (template->frames, frame); +} + + +/** + * lgl_template_add_category: + * @template: Pointer to template structure + * @category_id: Category ID string + * + * This function adds the given category ID to a templates category list. + * + */ +void +lgl_template_add_category (lglTemplate *template, + const gchar *category_id) +{ + g_return_if_fail (template); + g_return_if_fail (category_id); + + template->category_ids = g_list_append (template->category_ids, + g_strdup (category_id)); +} + + +/** + * lgl_template_frame_rect_new: + * @id: ID of frame. (This should currently always be "0"). + * @w: width of frame in points. + * @h: height of frame in points. + * @r: radius of rounded corners in points. (Should be 0 for square corners.) + * @x_waste: Amount of overprint to allow in the horizontal direction. + * @y_waste: Amount of overprint to allow in the vertical direction. + * + * This function creates a new template frame for a rectangular label or card. + * + * Returns: Pointer to newly allocated #lglTemplateFrame structure. + * + */ +lglTemplateFrame * +lgl_template_frame_rect_new (const gchar *id, + gdouble w, + gdouble h, + gdouble r, + gdouble x_waste, + gdouble y_waste) +{ + lglTemplateFrame *frame; + + frame = g_new0 (lglTemplateFrame, 1); + + frame->shape = LGL_TEMPLATE_FRAME_SHAPE_RECT; + frame->rect.id = g_strdup (id); + + frame->rect.w = w; + frame->rect.h = h; + frame->rect.r = r; + frame->rect.x_waste = x_waste; + frame->rect.y_waste = y_waste; + + return frame; +} + + +/** + * lgl_template_frame_round_new: + * @id: ID of frame. (This should currently always be "0"). + * @r: radius of label in points. + * @waste: Amount of overprint to allow. + * + * This function creates a new template frame for a round label. + * + * Returns: Pointer to newly allocated #lglTemplateFrame structure. + * + */ +lglTemplateFrame * +lgl_template_frame_round_new (const gchar *id, + gdouble r, + gdouble waste) +{ + lglTemplateFrame *frame; + + frame = g_new0 (lglTemplateFrame, 1); + + frame->shape = LGL_TEMPLATE_FRAME_SHAPE_ROUND; + frame->round.id = g_strdup (id); + + frame->round.r = r; + frame->round.waste = waste; + + return frame; +} + + +/** + * lgl_template_frame_cd_new: + * @id: ID of frame. (This should currently always be "0"). + * @r1: outer radius of label in points. + * @r2: radius of center hole in points. + * @w: clip width of frame in points for business card CDs. Should be 0 for no clipping. + * @h: clip height of frame in points for business card CDs. Should be 0 for no clipping. + * @waste: Amount of overprint to allow. + * + * This function creates a new template frame for a CD/DVD label. + * + * Returns: Pointer to newly allocated #lglTemplateFrame structure. + * + */ +lglTemplateFrame * +lgl_template_frame_cd_new (const gchar *id, + gdouble r1, + gdouble r2, + gdouble w, + gdouble h, + gdouble waste) +{ + lglTemplateFrame *frame; + + frame = g_new0 (lglTemplateFrame, 1); + + frame->shape = LGL_TEMPLATE_FRAME_SHAPE_CD; + frame->cd.id = g_strdup (id); + + frame->cd.r1 = r1; + frame->cd.r2 = r2; + frame->cd.w = w; + frame->cd.h = h; + frame->cd.waste = waste; + + return frame; +} + + +/** + * lgl_template_frame_get_size: + * @frame: #lglTemplateFrame structure to query + * @w: pointer to location to receive width of frame + * @h: pointer to location to receive height of frame + * + * Get size (width and height) of given #lglTemplateFrame in points. + * + */ +void +lgl_template_frame_get_size (const lglTemplateFrame *frame, + gdouble *w, + gdouble *h) +{ + g_return_if_fail (frame); + + switch (frame->shape) { + case LGL_TEMPLATE_FRAME_SHAPE_RECT: + *w = frame->rect.w; + *h = frame->rect.h; + break; + case LGL_TEMPLATE_FRAME_SHAPE_ROUND: + *w = 2.0 * frame->round.r; + *h = 2.0 * frame->round.r; + break; + case LGL_TEMPLATE_FRAME_SHAPE_CD: + if (frame->cd.w == 0.0) { + *w = 2.0 * frame->cd.r1; + } else { + *w = frame->cd.w; + } + if (frame->cd.h == 0.0) { + *h = 2.0 * frame->cd.r1; + } else { + *h = frame->cd.h; + } + break; + default: + *w = 0.0; + *h = 0.0; + break; + } +} + + +/** + * lgl_template_frame_get_n_labels: + * @frame: #lglTemplateFrame structure to query + * + * Get total number of labels per sheet corresponding to the given frame. + * + * Returns: number of labels per sheet. + * + */ +gint +lgl_template_frame_get_n_labels (const lglTemplateFrame *frame) +{ + gint n_labels = 0; + GList *p; + lglTemplateLayout *layout; + + g_return_val_if_fail (frame, 0); + + for ( p=frame->all.layouts; p != NULL; p=p->next ) { + layout = (lglTemplateLayout *)p->data; + + n_labels += layout->nx * layout->ny; + } + + return n_labels; +} + + +/** + * lgl_template_frame_get_origins: + * @frame: #lglTemplateFrame structure to query + * + * Get an array of label origins for the given frame. These origins represent the + * upper left hand corner of each label on a page corresponding to the given frame. + * The origins will be ordered geometrically left to right and then top to bottom. + * The array should be freed using g_free(). + * + * Returns: A newly allocated array of #lglTemplateOrigin structures. + * + */ +lglTemplateOrigin * +lgl_template_frame_get_origins (const lglTemplateFrame *frame) +{ + gint i_label, n_labels, ix, iy; + lglTemplateOrigin *origins; + GList *p; + lglTemplateLayout *layout; + + g_return_val_if_fail (frame, NULL); + + n_labels = lgl_template_frame_get_n_labels (frame); + origins = g_new0 (lglTemplateOrigin, n_labels); + + i_label = 0; + for ( p=frame->all.layouts; p != NULL; p=p->next ) { + layout = (lglTemplateLayout *)p->data; + + for (iy = 0; iy < layout->ny; iy++) { + for (ix = 0; ix < layout->nx; ix++, i_label++) { + origins[i_label].x = ix*layout->dx + layout->x0; + origins[i_label].y = iy*layout->dy + layout->y0; + } + } + } + + g_qsort_with_data (origins, n_labels, sizeof(lglTemplateOrigin), + compare_origins, NULL); + + return origins; +} + + +/** + * lgl_template_frame_add_layout: + * @frame: Pointer to template frame to add layout to. + * @layout: Pointer to layout structure to add to frame. + * + * This function adds a layout structure to the given template frame. + * + */ +void +lgl_template_frame_add_layout (lglTemplateFrame *frame, + lglTemplateLayout *layout) +{ + g_return_if_fail (frame); + g_return_if_fail (layout); + + frame->all.layouts = g_list_append (frame->all.layouts, layout); +} + + +/** + * lgl_template_frame_add_markup: + * @frame: Pointer to template frame to add markup to. + * @markup: Pointer to markup structure to add to frame. + * + * This function adds a markup structure to the given template frame. + * + */ +void +lgl_template_frame_add_markup (lglTemplateFrame *frame, + lglTemplateMarkup *markup) +{ + g_return_if_fail (frame); + g_return_if_fail (markup); + + frame->all.markups = g_list_append (frame->all.markups, markup); +} + + +/** + * lgl_template_layout_new: + * @nx: Number of labels across. + * @ny: Number of labels down. + * @x0: X coordinate of the top-left corner of the top-left label in the layout in points. + * @y0: Y coordinate of the top-left corner of the top-left label in the layout in points. + * @dx: Horizontal pitch in points. This is the distance from left-edge to left-edge. + * @dy: Vertical pitch in points. This is the distance from top-edge to top-edge. + * + * This function creates a new layout structure with the given parameters. + * + * Returns: a newly allocated #lglTemplateLayout structure. + * + */ +lglTemplateLayout * +lgl_template_layout_new (gint nx, + gint ny, + gdouble x0, + gdouble y0, + gdouble dx, + gdouble dy) +{ + lglTemplateLayout *layout; + + layout = g_new0 (lglTemplateLayout, 1); + + layout->nx = nx; + layout->ny = ny; + layout->x0 = x0; + layout->y0 = y0; + layout->dx = dx; + layout->dy = dy; + + return layout; +} + + +/** + * lgl_template_markup_margin_new: + * @size: margin size in points. + * + * This function creates a new margin markup structure. + * + * Returns: a newly allocated #lglTemplateMarkup structure. + * + */ +lglTemplateMarkup * +lgl_template_markup_margin_new (gdouble size) +{ + lglTemplateMarkup *markup; + + markup = g_new0 (lglTemplateMarkup, 1); + + markup->type = LGL_TEMPLATE_MARKUP_MARGIN; + markup->margin.size = size; + + return markup; +} + + +/** + * lgl_template_markup_line_new: + * @x1: x coordinate of first endpoint. + * @y1: y coordinate of first endpoint. + * @x2: x coordinate of second endpoint. + * @y2: y coordinate of second endpoint. + * + * This function creates a new line markup structure. + * + * Returns: a newly allocated #lglTemplateMarkup structure. + * + */ +lglTemplateMarkup * +lgl_template_markup_line_new (gdouble x1, + gdouble y1, + gdouble x2, + gdouble y2) +{ + lglTemplateMarkup *markup; + + markup = g_new0 (lglTemplateMarkup, 1); + + markup->type = LGL_TEMPLATE_MARKUP_LINE; + markup->line.x1 = x1; + markup->line.y1 = y1; + markup->line.x2 = x2; + markup->line.y2 = y2; + + return markup; +} + + +/** + * lgl_template_markup_circle_new: + * @x0: x coordinate of center of circle. + * @y0: y coordinate of center of circle. + * @r: radius of circle. + * + * This function creates a new circle markup structure. + * + * Returns: a newly allocated #lglTemplateMarkup structure. + * + */ +lglTemplateMarkup * +lgl_template_markup_circle_new (gdouble x0, + gdouble y0, + gdouble r) +{ + lglTemplateMarkup *markup; + + markup = g_new0 (lglTemplateMarkup, 1); + + markup->type = LGL_TEMPLATE_MARKUP_CIRCLE; + markup->circle.x0 = x0; + markup->circle.y0 = y0; + markup->circle.r = r; + + return markup; +} + + +/** + * lgl_template_markup_rect_new: + * @x1: x coordinate of top-left corner of rectangle. + * @y1: y coordinate of top-left corner of rectangle. + * @w: width of rectangle. + * @h: height of rectangle. + * @r: radius of rounded corner. + * + * This function creates a new rectangle markup structure. + * + * Returns: a newly allocated #lglTemplateMarkup structure. + * + */ +lglTemplateMarkup * +lgl_template_markup_rect_new (gdouble x1, + gdouble y1, + gdouble w, + gdouble h, + gdouble r) +{ + lglTemplateMarkup *markup; + + markup = g_new0 (lglTemplateMarkup, 1); + + markup->type = LGL_TEMPLATE_MARKUP_RECT; + markup->rect.x1 = x1; + markup->rect.y1 = y1; + markup->rect.w = w; + markup->rect.h = h; + markup->rect.r = r; + + return markup; +} + + +/** + * lgl_template_dup: + * @orig_template: Template to duplicate. + * + * This function duplicates a template structure. + * + * Returns: a newly allocated #lglTemplate structure. + * + */ +lglTemplate * +lgl_template_dup (const lglTemplate *orig_template) +{ + lglTemplate *template; + lglTemplateAlias *alias; + GList *p; + lglTemplateFrame *frame; + + g_return_val_if_fail (orig_template, NULL); + + template = lgl_template_new (orig_template->brand, + orig_template->part, + orig_template->description, + orig_template->paper_id, + orig_template->page_width, + orig_template->page_height); + + for ( p=orig_template->aliases; p != NULL; p=p->next ) + { + alias = (lglTemplateAlias *)p->data; + + if ( !(UTF8_EQUAL (template->brand, alias->brand) && + UTF8_EQUAL (template->part, alias->part)) ) + { + lgl_template_add_alias (template, lgl_template_alias_dup (alias)); + } + + } + + for ( p=orig_template->category_ids; p != NULL; p=p->next ) + { + lgl_template_add_category (template, p->data); + } + + for ( p=orig_template->frames; p != NULL; p=p->next ) + { + frame = (lglTemplateFrame *)p->data; + + lgl_template_add_frame (template, lgl_template_frame_dup (frame)); + } + + return template; +} + + +/** + * lgl_template_free: + * @template: Template to free. + * + * This function frees all memory associated with given template structure. + * + */ +void +lgl_template_free (lglTemplate *template) +{ + GList *p; + lglTemplateFrame *frame; + + if ( template != NULL ) { + + g_free (template->brand); + template->brand = NULL; + + g_free (template->part); + template->part = NULL; + + g_free (template->description); + template->description = NULL; + + g_free (template->paper_id); + template->paper_id = NULL; + + for ( p=template->aliases; p != NULL; p=p->next ) { + + lgl_template_alias_free (p->data); + p->data = NULL; + + } + g_list_free (template->aliases); + template->aliases = NULL; + + for ( p=template->category_ids; p != NULL; p=p->next ) { + + g_free (p->data); + p->data = NULL; + + } + g_list_free (template->category_ids); + template->category_ids = NULL; + + for ( p=template->frames; p != NULL; p=p->next ) { + + frame = (lglTemplateFrame *)p->data; + + lgl_template_frame_free (frame); + p->data = NULL; + } + g_list_free (template->frames); + template->frames = NULL; + + g_free (template); + + } + +} + + +/** + * lgl_template_alias_dup: + * @orig_alias: Alias to duplicate. + * + * This function duplicates a template alias structure. + * + * Returns: a newly allocated #lglTemplateAlias structure. + * + */ +lglTemplateAlias * +lgl_template_alias_dup (const lglTemplateAlias *orig_alias) +{ + g_return_val_if_fail (orig_alias, NULL); + + return lgl_template_alias_new (orig_alias->brand, orig_alias->part); +} + + +/** + * lgl_template_alias_free: + * @alias: Alias to free. + * + * This function frees all memory associated with given template alias structure. + * + */ +void +lgl_template_alias_free (lglTemplateAlias *alias) +{ + + if ( alias != NULL ) + { + g_free (alias->brand); + alias->brand = NULL; + + g_free (alias->part); + alias->part = NULL; + + g_free (alias); + } +} + + +/** + * lgl_template_frame_dup: + * @orig_frame: Frame to duplicate. + * + * This function duplicates a template frame structure. + * + * Returns: a newly allocated #lglTemplateFrame structure. + * + */ +lglTemplateFrame * +lgl_template_frame_dup (const lglTemplateFrame *orig_frame) +{ + lglTemplateFrame *frame; + GList *p; + lglTemplateLayout *layout; + lglTemplateMarkup *markup; + + g_return_val_if_fail (orig_frame, NULL); + + switch (orig_frame->shape) { + + case LGL_TEMPLATE_FRAME_SHAPE_RECT: + frame = + lgl_template_frame_rect_new (orig_frame->all.id, + orig_frame->rect.w, + orig_frame->rect.h, + orig_frame->rect.r, + orig_frame->rect.x_waste, + orig_frame->rect.y_waste); + break; + + case LGL_TEMPLATE_FRAME_SHAPE_ROUND: + frame = + lgl_template_frame_round_new (orig_frame->all.id, + orig_frame->round.r, + orig_frame->round.waste); + break; + + case LGL_TEMPLATE_FRAME_SHAPE_CD: + frame = + lgl_template_frame_cd_new (orig_frame->all.id, + orig_frame->cd.r1, + orig_frame->cd.r2, + orig_frame->cd.w, + orig_frame->cd.h, + orig_frame->cd.waste); + break; + + default: + return NULL; + break; + } + + for ( p=orig_frame->all.layouts; p != NULL; p=p->next ) { + + layout = (lglTemplateLayout *)p->data; + + lgl_template_frame_add_layout (frame, lgl_template_layout_dup (layout)); + } + + for ( p=orig_frame->all.markups; p != NULL; p=p->next ) { + + markup = (lglTemplateMarkup *)p->data; + + lgl_template_frame_add_markup (frame, lgl_template_markup_dup (markup)); + } + + return frame; +} + + +/** + * lgl_template_frame_free: + * @frame: Frame to free. + * + * This function frees all memory associated with given template frame structure. + * + */ +void +lgl_template_frame_free (lglTemplateFrame *frame) +{ + GList *p; + lglTemplateLayout *layout; + lglTemplateMarkup *markup; + + if ( frame != NULL ) { + + g_free (frame->all.id); + frame->all.id = NULL; + + for ( p=frame->all.layouts; p != NULL; p=p->next ) { + + layout = (lglTemplateLayout *)p->data; + + lgl_template_layout_free (layout); + p->data = NULL; + } + g_list_free (frame->all.layouts); + frame->all.layouts = NULL; + + for ( p=frame->all.markups; p != NULL; p=p->next ) { + + markup = (lglTemplateMarkup *)p->data; + + lgl_template_markup_free (markup); + p->data = NULL; + } + g_list_free (frame->all.markups); + frame->all.markups = NULL; + + g_free (frame); + + } + +} + + +/** + * lgl_template_layout_dup: + * @orig_layout: Layout to duplicate. + * + * This function duplicates a template layout structure. + * + * Returns: a newly allocated #lglTemplateLayout structure. + * + */ +lglTemplateLayout * +lgl_template_layout_dup (const lglTemplateLayout *orig_layout) +{ + lglTemplateLayout *layout; + + g_return_val_if_fail (orig_layout, NULL); + + layout = g_new0 (lglTemplateLayout, 1); + + /* copy contents */ + *layout = *orig_layout; + + return layout; +} + + +/** + * lgl_template_layout_free: + * @layout: Layout to free. + * + * This function frees all memory associated with given template layout structure. + * + */ +void +lgl_template_layout_free (lglTemplateLayout *layout) +{ + g_free (layout); +} + + +/** + * lgl_template_markup_dup: + * @orig_markup: Markup to duplicate. + * + * This function duplicates a template markup structure. + * + * Returns: a newly allocated #lglTemplateMarkup structure. + * + */ +lglTemplateMarkup * +lgl_template_markup_dup (const lglTemplateMarkup *orig_markup) +{ + lglTemplateMarkup *markup; + + g_return_val_if_fail (orig_markup, NULL); + + markup = g_new0 (lglTemplateMarkup, 1); + + *markup = *orig_markup; + + return markup; +} + + +/** + * lgl_template_markup_free: + * @markup: Markup to free. + * + * This function frees all memory associated with given template markup structure. + * + */ +void +lgl_template_markup_free (lglTemplateMarkup *markup) +{ + g_free (markup); +} + + +static gint +compare_origins (gconstpointer a, + gconstpointer b, + gpointer user_data) +{ + const lglTemplateOrigin *a_origin = a, *b_origin = b; + + if ( a_origin->y < b_origin->y ) { + return -1; + } else if ( a_origin->y > b_origin->y ) { + return +1; + } else { + if ( a_origin->x < b_origin->x ) { + return -1; + } else if ( a_origin->x > b_origin->x ) { + return +1; + } else { + return 0; /* hopefully 2 labels won't have the same origin */ + } + } +} + diff --git a/glabels2/libglabels/template.h b/glabels2/libglabels/template.h new file mode 100644 index 00000000..cbcbccf2 --- /dev/null +++ b/glabels2/libglabels/template.h @@ -0,0 +1,380 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (LIBGLABELS) Template library for GLABELS + * + * template.h: template module header file + * + * Copyright (C) 2001-2006 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ + +#ifndef __TEMPLATE_H__ +#define __TEMPLATE_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _lglTemplate lglTemplate; + +typedef struct _lglTemplateAlias lglTemplateAlias; + +typedef union _lglTemplateFrame lglTemplateFrame; +typedef struct _lglTemplateFrameAll lglTemplateFrameAll; +typedef struct _lglTemplateFrameRect lglTemplateFrameRect; +typedef struct _lglTemplateFrameRound lglTemplateFrameRound; +typedef struct _lglTemplateFrameCD lglTemplateFrameCD; + +typedef struct _lglTemplateLayout lglTemplateLayout; + +typedef union _lglTemplateMarkup lglTemplateMarkup; +typedef struct _lglTemplateMarkupMargin lglTemplateMarkupMargin; +typedef struct _lglTemplateMarkupLine lglTemplateMarkupLine; +typedef struct _lglTemplateMarkupCircle lglTemplateMarkupCircle; +typedef struct _lglTemplateMarkupRect lglTemplateMarkupRect; + +typedef struct _lglTemplateOrigin lglTemplateOrigin; + +/* + * Top-level Template Structure + */ +struct _lglTemplate { + + gchar *brand; + gchar *part; + gchar *description; + gchar *paper_id; + gdouble page_width; + gdouble page_height; + + /* List of (lglTemplateAlias *) aliase structures. */ + GList *aliases; + + /* List of (gchar *) category ids. */ + GList *category_ids; + + /* List of (lglTemplateFrame *) label frame structures. + * Currently glabels only supports a single label frame per + * template. */ + GList *frames; + +}; + + +/* + * Top-level Template Structure + */ +struct _lglTemplateAlias { + + gchar *brand; + gchar *part; + +}; + +/* + * Possible Frame Shapes + */ +typedef enum { + LGL_TEMPLATE_FRAME_SHAPE_RECT, + LGL_TEMPLATE_FRAME_SHAPE_ROUND, + LGL_TEMPLATE_FRAME_SHAPE_CD, +} lglTemplateFrameShape; + + +/* + * Frame Structure + */ +struct _lglTemplateFrameAll { + + /* Begin Common Fields */ + lglTemplateFrameShape shape; + + gchar *id; /* Id, currently always "0" */ + GList *layouts; /* List of lglTemplateLayouts */ + GList *markups; /* List of lglTemplateMarkups */ + /* End Common Fields */ +}; + +struct _lglTemplateFrameRect { + + /* Begin Common Fields */ + lglTemplateFrameShape shape; /* Always LGL_TEMPLATE_FRAME_SHAPE_RECT. */ + + gchar *id; /* Id, currently always "0" */ + GList *layouts; /* List of lglTemplateLayouts */ + GList *markups; /* List of lglTemplateMarkups */ + /* End Common Fields */ + + gdouble w; /* Width */ + gdouble h; /* Height */ + gdouble r; /* Corner radius */ + gdouble x_waste; /* Amount of horiz overprint allowed. */ + gdouble y_waste; /* Amount of vert overprint allowed. */ +}; + +struct _lglTemplateFrameRound { + + /* Begin Common Fields */ + lglTemplateFrameShape shape; /* Always LGL_TEMPLATE_FRAME_SHAPE_ROUND. */ + + gchar *id; /* Id, currently always "0" */ + GList *layouts; /* List of lglTemplateLayouts */ + GList *markups; /* List of lglTemplateMarkups */ + /* End Common Fields */ + + gdouble r; /* Radius */ + gdouble waste; /* Amount of overprint allowed. */ +}; + +struct _lglTemplateFrameCD { + + /* Begin Common Fields */ + lglTemplateFrameShape shape; /* Always LGL_TEMPLATE_FRAME_SHAPE_CD. */ + + gchar *id; /* Id, currently always "0" */ + GList *layouts; /* List of lglTemplateLayouts */ + GList *markups; /* List of lglTemplateMarkups */ + /* End Common Fields */ + + gdouble r1; /* Outer radius */ + gdouble r2; /* Inner radius (hole) */ + gdouble w; /* Clip width, business card CDs */ + gdouble h; /* Clip height, business card CDs */ + gdouble waste; /* Amount of overprint allowed. */ +}; + +union _lglTemplateFrame{ + + lglTemplateFrameShape shape; + + lglTemplateFrameAll all; + lglTemplateFrameRect rect; + lglTemplateFrameRound round; + lglTemplateFrameCD cd; +}; + + +/* + * Label Layout Structure + */ +struct _lglTemplateLayout { + + gint nx; /* Number of labels across */ + gint ny; /* Number of labels up and down */ + + gdouble x0; /* Left of grid from left edge of paper */ + gdouble y0; /* Top of grid from top edge of paper */ + + gdouble dx; /* Horizontal pitch of grid */ + gdouble dy; /* Vertical pitch of grid */ + +}; + + +/* + * Possible Markup Types + */ +typedef enum { + LGL_TEMPLATE_MARKUP_MARGIN, + LGL_TEMPLATE_MARKUP_LINE, + LGL_TEMPLATE_MARKUP_CIRCLE, + LGL_TEMPLATE_MARKUP_RECT, +} lglTemplateMarkupType; + + +/* + * Label Markup Structure (Helpful lines drawn in glabels to help locate objects) + */ +struct _lglTemplateMarkupMargin { + + lglTemplateMarkupType type; /* Always LGL_TEMPLATE_MARKUP_MARGIN */ + + gdouble size; /* Margin size */ +}; + +struct _lglTemplateMarkupLine { + + lglTemplateMarkupType type; /* Always LGL_TEMPLATE_MARKUP_LINE */ + + gdouble x1, y1; /* 1st endpoint */ + gdouble x2, y2; /* 2nd endpoint */ +}; + +struct _lglTemplateMarkupCircle { + + lglTemplateMarkupType type; /* Always LGL_TEMPLATE_MARKUP_CIRCLE */ + + gdouble x0, y0; /* Center of circle */ + gdouble r; /* Radius of circle */ +}; + +struct _lglTemplateMarkupRect { + + lglTemplateMarkupType type; /* Always LGL_TEMPLATE_MARKUP_RECT */ + + gdouble x1, y1; /* Upper left corner */ + gdouble w, h; /* Width and height. */ + gdouble r; /* Radius of corners. */ +}; + +union _lglTemplateMarkup { + + lglTemplateMarkupType type; + + lglTemplateMarkupMargin margin; + lglTemplateMarkupLine line; + lglTemplateMarkupCircle circle; + lglTemplateMarkupRect rect; +}; + + +/* + * Origin coordinates + */ +struct _lglTemplateOrigin { + + gdouble x, y; /* Label origin relative to upper + * upper left hand corner of paper */ + +}; + + + +/* + * Template query functions + */ +gchar *lgl_template_get_name (const lglTemplate *template); + +gboolean lgl_template_do_templates_match (const lglTemplate *template1, + const lglTemplate *template2); + +gboolean lgl_template_does_brand_match (const lglTemplate *template, + const gchar *brand); + +gboolean lgl_template_does_page_size_match (const lglTemplate *template, + const gchar *paper_id); + +gboolean lgl_template_does_category_match (const lglTemplate *template, + const gchar *category_id); + + +/* + * Frame query functions + */ +void lgl_template_frame_get_size (const lglTemplateFrame *frame, + gdouble *w, + gdouble *h); + +gint lgl_template_frame_get_n_labels (const lglTemplateFrame *frame); + +lglTemplateOrigin *lgl_template_frame_get_origins (const lglTemplateFrame *frame); + + +/* + * Template Construction + */ +lglTemplate *lgl_template_new (const gchar *brand, + const gchar *part, + const gchar *description, + const gchar *paper_id, + gdouble page_width, + gdouble page_height); + +void lgl_template_add_alias (lglTemplate *template, + lglTemplateAlias *alias); + +void lgl_template_add_category (lglTemplate *template, + const gchar *category_id); + +void lgl_template_add_frame (lglTemplate *template, + lglTemplateFrame *frame); + +lglTemplateFrame *lgl_template_frame_rect_new (const gchar *id, + gdouble w, + gdouble h, + gdouble r, + gdouble x_waste, + gdouble y_waste); + +lglTemplateAlias *lgl_template_alias_new (const gchar *brand, + const gchar *part); + +lglTemplateFrame *lgl_template_frame_round_new (const gchar *id, + gdouble r, + gdouble waste); + +lglTemplateFrame *lgl_template_frame_cd_new (const gchar *id, + gdouble r1, + gdouble r2, + gdouble w, + gdouble h, + gdouble waste); + +void lgl_template_frame_add_layout (lglTemplateFrame *frame, + lglTemplateLayout *layout); + +void lgl_template_frame_add_markup (lglTemplateFrame *frame, + lglTemplateMarkup *markup); + +lglTemplateLayout *lgl_template_layout_new (gint nx, + gint ny, + gdouble x0, + gdouble y0, + gdouble dx, + gdouble dy); + +lglTemplateMarkup *lgl_template_markup_margin_new (gdouble size); + +lglTemplateMarkup *lgl_template_markup_line_new (gdouble x1, + gdouble y1, + gdouble x2, + gdouble y2); + +lglTemplateMarkup *lgl_template_markup_circle_new (gdouble x0, + gdouble y0, + gdouble r); + +lglTemplateMarkup *lgl_template_markup_rect_new (gdouble x1, + gdouble y1, + gdouble w, + gdouble h, + gdouble r); + +lglTemplate *lgl_template_dup (const lglTemplate *orig_template); + +void lgl_template_free (lglTemplate *template); + +lglTemplateAlias *lgl_template_alias_dup (const lglTemplateAlias *orig_alias); +void lgl_template_alias_free (lglTemplateAlias *alias); + +lglTemplateFrame *lgl_template_frame_dup (const lglTemplateFrame *orig_frame); +void lgl_template_frame_free (lglTemplateFrame *frame); + +lglTemplateLayout *lgl_template_layout_dup (const lglTemplateLayout *orig_layout); +void lgl_template_layout_free (lglTemplateLayout *layout); + +lglTemplateMarkup *lgl_template_markup_dup (const lglTemplateMarkup *orig_markup); +void lgl_template_markup_free (lglTemplateMarkup *markup); + + +G_END_DECLS + +#endif diff --git a/glabels2/libglabels/xml-category.c b/glabels2/libglabels/xml-category.c new file mode 100644 index 00000000..0e759c9a --- /dev/null +++ b/glabels2/libglabels/xml-category.c @@ -0,0 +1,169 @@ +/* + * (LIBGLABELS) Template library for GLABELS + * + * xml-category.c: category xml module + * + * Copyright (C) 2006 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ +#include + +#include "xml-category.h" + +#include +#include +#include +#include + +#include "libglabels-private.h" + +#include "xml.h" + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + + +/** + * lgl_xml_category_read_categories_from_file: + * @utf8_filename: Filename of categories file (name encoded as UTF-8) + * + * Read category definitions from a file. + * + * Returns: a list of #lglCategory structures. + * + */ +GList * +lgl_xml_category_read_categories_from_file (gchar *utf8_filename) +{ + gchar *filename; + GList *categories; + xmlDocPtr categories_doc; + + LIBXML_TEST_VERSION; + + filename = g_filename_from_utf8 (utf8_filename, -1, NULL, NULL, NULL); + if (!filename) { + g_message ("Utf8 filename conversion error"); + return NULL; + } + + categories_doc = xmlParseFile (filename); + if (!categories_doc) { + g_message ("\"%s\" is not a glabels category file (not XML)", + filename); + return NULL; + } + + categories = lgl_xml_category_parse_categories_doc (categories_doc); + + g_free (filename); + xmlFreeDoc (categories_doc); + + return categories; +} + + +/** + * lgl_xml_category_parse_categories_doc: + * @categories_doc: libxml #xmlDocPtr tree, representing a categories + * definition file. + * + * Read category definitions from a libxml #xmlDocPtr tree. + * + * Returns: a list of #lglCategory structures. + * + */ +GList * +lgl_xml_category_parse_categories_doc (xmlDocPtr categories_doc) +{ + GList *categories = NULL; + xmlNodePtr root, node; + lglCategory *category; + + LIBXML_TEST_VERSION; + + root = xmlDocGetRootElement (categories_doc); + if (!root || !root->name) { + g_message ("\"%s\" is not a glabels category file (no root node)", + categories_doc->name); + xmlFreeDoc (categories_doc); + return categories; + } + if (!lgl_xml_is_node (root, "Glabels-categories")) { + g_message ("\"%s\" is not a glabels category file (wrong root node)", + categories_doc->name); + xmlFreeDoc (categories_doc); + return categories; + } + + for (node = root->xmlChildrenNode; node != NULL; node = node->next) { + + if (lgl_xml_is_node (node, "Category")) { + category = lgl_xml_category_parse_category_node (node); + categories = g_list_append (categories, category); + } else { + if ( !xmlNodeIsText(node) ) { + if (!lgl_xml_is_node (node, "comment")) { + g_message ("bad node = \"%s\"",node->name); + } + } + } + } + + return categories; +} + + +/** + * lgl_xml_category_parse_category_node: + * @category_node: libxml #xmlNodePtr category node from a #xmlDocPtr tree. + * + * Read a single category definition from a libxml #xmlNodePtr node. + * + * Returns: a pointer to a newly created #lglCategory structure. + * + */ +lglCategory * +lgl_xml_category_parse_category_node (xmlNodePtr category_node) +{ + lglCategory *category; + gchar *id, *name; + + LIBXML_TEST_VERSION; + + id = lgl_xml_get_prop_string (category_node, "id", NULL); + name = lgl_xml_get_prop_i18n_string (category_node, "name", NULL); + + category = lgl_category_new (id, name); + + g_free (id); + g_free (name); + + return category; +} + diff --git a/glabels2/libglabels/xml-category.h b/glabels2/libglabels/xml-category.h new file mode 100644 index 00000000..ef01d9fb --- /dev/null +++ b/glabels2/libglabels/xml-category.h @@ -0,0 +1,46 @@ +/* + * (LIBGLABELS) Template library for GLABELS + * + * xml-category.h: category xml module header file + * + * Copyright (C) 2006 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ + +#ifndef __XML_CATEGORY_H__ +#define __XML_CATEGORY_H__ + +#include +#include +#include + +#include "category.h" + +G_BEGIN_DECLS + +GList *lgl_xml_category_read_categories_from_file (gchar *utf8_filename); + +GList *lgl_xml_category_parse_categories_doc (xmlDocPtr categories_doc); + +lglCategory *lgl_xml_category_parse_category_node (xmlNodePtr category_node); + + +G_END_DECLS + +#endif /* __XML_CATEGORY_H__ */ diff --git a/glabels2/libglabels/xml-paper.c b/glabels2/libglabels/xml-paper.c new file mode 100644 index 00000000..0eda5a39 --- /dev/null +++ b/glabels2/libglabels/xml-paper.c @@ -0,0 +1,173 @@ +/* + * (LIBGLABELS) Template library for GLABELS + * + * xml-paper.c: paper xml module + * + * Copyright (C) 2003, 2004 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ +#include + +#include "xml-paper.h" + +#include +#include +#include +#include + +#include "libglabels-private.h" + +#include "xml.h" + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + + +/** + * lgl_xml_paper_read_papers_from_file: + * @utf8_filename: Filename of papers file (name encoded as UTF-8) + * + * Read paper definitions from a file. + * + * Returns: a list of #lglPaper structures. + * + */ +GList * +lgl_xml_paper_read_papers_from_file (gchar *utf8_filename) +{ + gchar *filename; + GList *papers; + xmlDocPtr papers_doc; + + LIBXML_TEST_VERSION; + + filename = g_filename_from_utf8 (utf8_filename, -1, NULL, NULL, NULL); + if (!filename) { + g_message ("Utf8 filename conversion error"); + return NULL; + } + + papers_doc = xmlParseFile (filename); + if (!papers_doc) { + g_message ("\"%s\" is not a glabels paper file (not XML)", + filename); + return NULL; + } + + papers = lgl_xml_paper_parse_papers_doc (papers_doc); + + g_free (filename); + xmlFreeDoc (papers_doc); + + return papers; +} + + +/** + * lgl_xml_paper_parse_papers_doc: + * @papers_doc: libxml #xmlDocPtr tree, representing a papers definition file. + * + * Read paper definitions from a libxml #xmlDocPtr tree. + * + * Returns: a list of #lglPaper structures. + * + */ +GList * +lgl_xml_paper_parse_papers_doc (xmlDocPtr papers_doc) +{ + GList *papers = NULL; + xmlNodePtr root, node; + lglPaper *paper; + + LIBXML_TEST_VERSION; + + root = xmlDocGetRootElement (papers_doc); + if (!root || !root->name) { + g_message ("\"%s\" is not a glabels paper file (no root node)", + papers_doc->name); + xmlFreeDoc (papers_doc); + return papers; + } + if (!lgl_xml_is_node (root, "Glabels-paper-sizes")) { + g_message ("\"%s\" is not a glabels paper file (wrong root node)", + papers_doc->name); + xmlFreeDoc (papers_doc); + return papers; + } + + for (node = root->xmlChildrenNode; node != NULL; node = node->next) { + + if (lgl_xml_is_node (node, "Paper-size")) { + paper = lgl_xml_paper_parse_paper_node (node); + papers = g_list_append (papers, paper); + } else { + if ( !xmlNodeIsText(node) ) { + if (!lgl_xml_is_node (node, "comment")) { + g_message ("bad node = \"%s\"",node->name); + } + } + } + } + + return papers; +} + + +/** + * lgl_xml_paper_parse_paper_node: + * @paper_node: libxml #xmlNodePtr paper node from a #xmlDocPtr tree. + * + * Read a single paper definition from a libxml #xmlNodePtr node. + * + * Returns: a pointer to a newly created #lglPaper structure. + * + */ +lglPaper * +lgl_xml_paper_parse_paper_node (xmlNodePtr paper_node) +{ + lglPaper *paper; + gchar *id, *name; + gdouble width, height; + + LIBXML_TEST_VERSION; + + id = lgl_xml_get_prop_string (paper_node, "id", NULL); + + name = lgl_xml_get_prop_i18n_string (paper_node, "name", NULL); + + width = lgl_xml_get_prop_length (paper_node, "width", 0); + height = lgl_xml_get_prop_length (paper_node, "height", 0); + + paper = lgl_paper_new (id, name, width, height); + + g_free (id); + g_free (name); + + return paper; +} + diff --git a/glabels2/libglabels/xml-paper.h b/glabels2/libglabels/xml-paper.h new file mode 100644 index 00000000..df90bcff --- /dev/null +++ b/glabels2/libglabels/xml-paper.h @@ -0,0 +1,46 @@ +/* + * (LIBGLABELS) Template library for GLABELS + * + * xml-paper.h: paper xml module header file + * + * Copyright (C) 2003, 2004 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ + +#ifndef __XML_PAPER_H__ +#define __XML_PAPER_H__ + +#include +#include +#include + +#include "paper.h" + +G_BEGIN_DECLS + +GList *lgl_xml_paper_read_papers_from_file (gchar *utf8_filename); + +GList *lgl_xml_paper_parse_papers_doc (xmlDocPtr papers_doc); + +lglPaper *lgl_xml_paper_parse_paper_node (xmlNodePtr paper_node); + + +G_END_DECLS + +#endif /* __XML_PAPER_H__ */ diff --git a/glabels2/libglabels/xml-template.c b/glabels2/libglabels/xml-template.c new file mode 100644 index 00000000..e4442bec --- /dev/null +++ b/glabels2/libglabels/xml-template.c @@ -0,0 +1,970 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (LIBGLABELS) Template library for GLABELS + * + * xml-template.c: template xml module + * + * Copyright (C) 2001-2006 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ +#include + +#include "xml-template.h" + +#include +#include +#include +#include + +#include "libglabels-private.h" + +#include "db.h" +#include "xml.h" + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ +static void xml_parse_meta_node (xmlNodePtr label_node, + lglTemplate *template); +static void xml_parse_label_rectangle_node (xmlNodePtr label_node, + lglTemplate *template); +static void xml_parse_label_round_node (xmlNodePtr label_node, + lglTemplate *template); +static void xml_parse_label_cd_node (xmlNodePtr label_node, + lglTemplate *template); +static void xml_parse_layout_node (xmlNodePtr layout_node, + lglTemplateFrame *frame); +static void xml_parse_markup_margin_node (xmlNodePtr markup_node, + lglTemplateFrame *frame); +static void xml_parse_markup_line_node (xmlNodePtr markup_node, + lglTemplateFrame *frame); +static void xml_parse_markup_circle_node (xmlNodePtr markup_node, + lglTemplateFrame *frame); +static void xml_parse_markup_rect_node (xmlNodePtr markup_node, + lglTemplateFrame *frame); +static void xml_parse_alias_node (xmlNodePtr alias_node, + lglTemplate *template); + +static void xml_create_meta_node (const gchar *category, + xmlNodePtr root, + const xmlNsPtr ns); +static void xml_create_label_node (const lglTemplateFrame *frame, + xmlNodePtr root, + const xmlNsPtr ns); +static void xml_create_layout_node (const lglTemplateLayout *layout, + xmlNodePtr root, + const xmlNsPtr ns); +static void xml_create_markup_margin_node (const lglTemplateMarkup *margin, + xmlNodePtr root, + const xmlNsPtr ns); +static void xml_create_markup_line_node (const lglTemplateMarkup *line, + xmlNodePtr root, + const xmlNsPtr ns); +static void xml_create_markup_circle_node (const lglTemplateMarkup *circle, + xmlNodePtr root, + const xmlNsPtr ns); +static void xml_create_markup_rect_node (const lglTemplateMarkup *circle, + xmlNodePtr root, + const xmlNsPtr ns); +static void xml_create_alias_node (const lglTemplateAlias *alias, + xmlNodePtr root, + const xmlNsPtr ns); + + +/** + * lgl_xml_template_read_templates_from_file: + * @utf8_filename: Filename of papers file (name encoded as UTF-8) + * + * Read glabels templates from template file. + * + * Returns: a list of #lglTemplate structures. + * + */ +GList * +lgl_xml_template_read_templates_from_file (const gchar *utf8_filename) +{ + gchar *filename; + xmlDocPtr templates_doc; + GList *templates = NULL; + + LIBXML_TEST_VERSION; + + filename = g_filename_from_utf8 (utf8_filename, -1, NULL, NULL, NULL); + if (!filename) { + g_message ("Utf8 filename conversion error"); + return NULL; + } + + templates_doc = xmlParseFile (filename); + if (!templates_doc) { + g_message ("\"%s\" is not a glabels template file (not XML)", + filename); + return templates; + } + + templates = lgl_xml_template_parse_templates_doc (templates_doc); + + g_free (filename); + xmlFreeDoc (templates_doc); + + return templates; +} + + +/** + * lgl_xml_template_parse_templates_doc: + * @templates_doc: libxml #xmlDocPtr tree, representing template file. + * + * Read glabels templates from a libxml #xmlDocPtr tree. + * + * Returns: a list of #lglTemplate structures. + * + */ +GList * +lgl_xml_template_parse_templates_doc (const xmlDocPtr templates_doc) +{ + + GList *templates = NULL; + xmlNodePtr root, node; + lglTemplate *template; + + LIBXML_TEST_VERSION; + + root = xmlDocGetRootElement (templates_doc); + if (!root || !root->name) { + g_message ("\"%s\" is not a glabels template file (no root node)", + templates_doc->URL); + return templates; + } + if (!lgl_xml_is_node (root, "Glabels-templates")) { + g_message ("\"%s\" is not a glabels template file (wrong root node)", + templates_doc->URL); + return templates; + } + + for (node = root->xmlChildrenNode; node != NULL; node = node->next) { + + if (lgl_xml_is_node (node, "Template")) { + template = lgl_xml_template_parse_template_node (node); + templates = g_list_append (templates, template); + } else { + if ( !xmlNodeIsText(node) ) { + if (!lgl_xml_is_node (node,"comment")) { + g_message ("bad node = \"%s\"",node->name); + } + } + } + } + + return templates; +} + + +/** + * lgl_xml_template_parse_template_node: + * @template_node: libxml #xmlNodePtr template node from a #xmlDocPtr tree. + * + * Read a single glabels template from a libxml #xmlNodePtr node. + * + * Returns: a pointer to a newly created #lglTemplate structure. + * + */ +lglTemplate * +lgl_xml_template_parse_template_node (const xmlNodePtr template_node) +{ + gchar *brand; + gchar *part; + gchar *name; + gchar *description; + gchar *paper_id; + gdouble page_width, page_height; + lglPaper *paper = NULL; + lglTemplate *template; + xmlNodePtr node; + gchar **v; + + brand = lgl_xml_get_prop_string (template_node, "brand", NULL); + part = lgl_xml_get_prop_string (template_node, "part", NULL); + if (!brand || !part) + { + name = lgl_xml_get_prop_string (template_node, "name", NULL); + if (name) + { + v = g_strsplit (name, " ", 2); + brand = g_strdup (v[0]); + part = g_strchug (g_strdup (v[1])); + g_free (name); + g_strfreev (v); + + } + else + { + g_message (_("Missing name or brand/part attributes.")); + } + } + + description = lgl_xml_get_prop_i18n_string (template_node, "description", NULL); + paper_id = lgl_xml_get_prop_string (template_node, "size", NULL); + + if (lgl_db_is_paper_id_other (paper_id)) { + + page_width = lgl_xml_get_prop_length (template_node, "width", 0); + page_height = lgl_xml_get_prop_length (template_node, "height", 0); + + } else { + paper = lgl_db_lookup_paper_from_id (paper_id); + if (paper == NULL) { + /* This should always be an id, but just in case a name + slips by! */ + g_message (_("Unknown page size id \"%s\", trying as name"), + paper_id); + paper = lgl_db_lookup_paper_from_name (paper_id); + g_free (paper_id); + paper_id = g_strdup (paper->id); + } + if (paper != NULL) { + page_width = paper->width; + page_height = paper->height; + } else { + g_message (_("Unknown page size id or name \"%s\""), + paper_id); + } + lgl_paper_free (paper); + paper = NULL; + } + + template = lgl_template_new (brand, part, description, + paper_id, page_width, page_height); + + for (node = template_node->xmlChildrenNode; node != NULL; + node = node->next) { + if (lgl_xml_is_node (node, "Meta")) { + xml_parse_meta_node (node, template); + } else if (lgl_xml_is_node (node, "Label-rectangle")) { + xml_parse_label_rectangle_node (node, template); + } else if (lgl_xml_is_node (node, "Label-round")) { + xml_parse_label_round_node (node, template); + } else if (lgl_xml_is_node (node, "Label-cd")) { + xml_parse_label_cd_node (node, template); + } else if (lgl_xml_is_node (node, "Alias")) { + xml_parse_alias_node (node, template); + } else { + if (!xmlNodeIsText (node)) { + if (!lgl_xml_is_node (node,"comment")) { + g_message ("bad node = \"%s\"",node->name); + } + } + } + } + + g_free (brand); + g_free (part); + g_free (description); + g_free (paper_id); + + return template; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Template->Meta Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_meta_node (xmlNodePtr meta_node, + lglTemplate *template) +{ + gchar *category; + + category = lgl_xml_get_prop_string (meta_node, "category", NULL); + + if (category != NULL) + { + lgl_template_add_category (template, category); + g_free (category); + } +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Template->Label-rectangle Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_label_rectangle_node (xmlNodePtr label_node, + lglTemplate *template) +{ + gchar *id; + gchar *tmp; + gdouble x_waste, y_waste; + gdouble w, h, r; + lglTemplateFrame *frame; + xmlNodePtr node; + + id = lgl_xml_get_prop_string (label_node, "id", NULL); + + if ((tmp = lgl_xml_get_prop_string (label_node, "waste", NULL))) { + /* Handle single "waste" property. */ + x_waste = y_waste = lgl_xml_get_prop_length (label_node, "waste", 0); + g_free (tmp); + } else { + x_waste = lgl_xml_get_prop_length (label_node, "x_waste", 0); + y_waste = lgl_xml_get_prop_length (label_node, "y_waste", 0); + } + + w = lgl_xml_get_prop_length (label_node, "width", 0); + h = lgl_xml_get_prop_length (label_node, "height", 0); + r = lgl_xml_get_prop_length (label_node, "round", 0); + + frame = lgl_template_frame_rect_new ((gchar *)id, w, h, r, x_waste, y_waste); + lgl_template_add_frame (template, frame); + + for (node = label_node->xmlChildrenNode; node != NULL; + node = node->next) { + if (lgl_xml_is_node (node, "Layout")) { + xml_parse_layout_node (node, frame); + } else if (lgl_xml_is_node (node, "Markup-margin")) { + xml_parse_markup_margin_node (node, frame); + } else if (lgl_xml_is_node (node, "Markup-line")) { + xml_parse_markup_line_node (node, frame); + } else if (lgl_xml_is_node (node, "Markup-circle")) { + xml_parse_markup_circle_node (node, frame); + } else if (lgl_xml_is_node (node, "Markup-rect")) { + xml_parse_markup_rect_node (node, frame); + } else if (!xmlNodeIsText (node)) { + if (!lgl_xml_is_node (node, "comment")) { + g_message ("bad node = \"%s\"",node->name); + } + } + } + + g_free (id); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Template->Label-round Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_label_round_node (xmlNodePtr label_node, + lglTemplate *template) +{ + gchar *id; + gdouble waste; + gdouble r; + lglTemplateFrame *frame; + xmlNodePtr node; + + id = lgl_xml_get_prop_string (label_node, "id", NULL); + waste = lgl_xml_get_prop_length (label_node, "waste", 0); + r = lgl_xml_get_prop_length (label_node, "radius", 0); + + frame = lgl_template_frame_round_new ((gchar *)id, r, waste); + lgl_template_add_frame (template, frame); + + for (node = label_node->xmlChildrenNode; node != NULL; + node = node->next) { + if (lgl_xml_is_node (node, "Layout")) { + xml_parse_layout_node (node, frame); + } else if (lgl_xml_is_node (node, "Markup-margin")) { + xml_parse_markup_margin_node (node, frame); + } else if (lgl_xml_is_node (node, "Markup-line")) { + xml_parse_markup_line_node (node, frame); + } else if (lgl_xml_is_node (node, "Markup-circle")) { + xml_parse_markup_circle_node (node, frame); + } else if (lgl_xml_is_node (node, "Markup-rect")) { + xml_parse_markup_rect_node (node, frame); + } else if (!xmlNodeIsText (node)) { + if (!lgl_xml_is_node (node, "comment")) { + g_message ("bad node = \"%s\"",node->name); + } + } + } + + g_free (id); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Template->Label-cd Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_label_cd_node (xmlNodePtr label_node, + lglTemplate *template) +{ + gchar *id; + gdouble waste; + gdouble r1, r2, w, h; + lglTemplateFrame *frame; + xmlNodePtr node; + + id = lgl_xml_get_prop_string (label_node, "id", NULL); + waste = lgl_xml_get_prop_length (label_node, "waste", 0); + r1 = lgl_xml_get_prop_length (label_node, "radius", 0); + r2 = lgl_xml_get_prop_length (label_node, "hole", 0); + w = lgl_xml_get_prop_length (label_node, "width", 0); + h = lgl_xml_get_prop_length (label_node, "height", 0); + + frame = lgl_template_frame_cd_new ((gchar *)id, r1, r2, w, h, waste); + lgl_template_add_frame (template, frame); + + for (node = label_node->xmlChildrenNode; node != NULL; + node = node->next) { + if (lgl_xml_is_node (node, "Layout")) { + xml_parse_layout_node (node, frame); + } else if (lgl_xml_is_node (node, "Markup-margin")) { + xml_parse_markup_margin_node (node, frame); + } else if (lgl_xml_is_node (node, "Markup-line")) { + xml_parse_markup_line_node (node, frame); + } else if (lgl_xml_is_node (node, "Markup-circle")) { + xml_parse_markup_circle_node (node, frame); + } else if (lgl_xml_is_node (node, "Markup-rect")) { + xml_parse_markup_rect_node (node, frame); + } else if (!xmlNodeIsText (node)) { + if (!lgl_xml_is_node (node, "comment")) { + g_message ("bad node = \"%s\"",node->name); + } + } + } + + g_free (id); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Template->Label->Layout Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_layout_node (xmlNodePtr layout_node, + lglTemplateFrame *frame) +{ + gint nx, ny; + gdouble x0, y0, dx, dy; + xmlNodePtr node; + + nx = lgl_xml_get_prop_int (layout_node, "nx", 1); + ny = lgl_xml_get_prop_int (layout_node, "ny", 1); + + x0 = lgl_xml_get_prop_length (layout_node, "x0", 0); + y0 = lgl_xml_get_prop_length (layout_node, "y0", 0); + + dx = lgl_xml_get_prop_length (layout_node, "dx", 0); + dy = lgl_xml_get_prop_length (layout_node, "dy", 0); + + lgl_template_frame_add_layout (frame, lgl_template_layout_new (nx, ny, x0, y0, dx, dy)); + + for (node = layout_node->xmlChildrenNode; node != NULL; + node = node->next) { + if (!xmlNodeIsText (node)) { + if (!lgl_xml_is_node (node, "comment")) { + g_message ("bad node = \"%s\"",node->name); + } + } + } + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Template->Label->Markup-margin Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_markup_margin_node (xmlNodePtr markup_node, + lglTemplateFrame *frame) +{ + gdouble size; + xmlNodePtr node; + + size = lgl_xml_get_prop_length (markup_node, "size", 0); + + lgl_template_frame_add_markup (frame, lgl_template_markup_margin_new (size)); + + for (node = markup_node->xmlChildrenNode; node != NULL; + node = node->next) { + if (!xmlNodeIsText (node)) { + if (!lgl_xml_is_node (node, "comment")) { + g_message ("bad node = \"%s\"",node->name); + } + } + } + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Template->Label->Markup-line Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_markup_line_node (xmlNodePtr markup_node, + lglTemplateFrame *frame) +{ + gdouble x1, y1, x2, y2; + xmlNodePtr node; + + x1 = lgl_xml_get_prop_length (markup_node, "x1", 0); + y1 = lgl_xml_get_prop_length (markup_node, "y1", 0); + x2 = lgl_xml_get_prop_length (markup_node, "x2", 0); + y2 = lgl_xml_get_prop_length (markup_node, "y2", 0); + + lgl_template_frame_add_markup (frame, lgl_template_markup_line_new (x1, y1, x2, y2)); + + for (node = markup_node->xmlChildrenNode; node != NULL; + node = node->next) { + if (!xmlNodeIsText (node)) { + if (!lgl_xml_is_node (node, "comment")) { + g_message ("bad node = \"%s\"",node->name); + } + } + } + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Template->Label->Markup-circle Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_markup_circle_node (xmlNodePtr markup_node, + lglTemplateFrame *frame) +{ + gdouble x0, y0, r; + xmlNodePtr node; + + x0 = lgl_xml_get_prop_length (markup_node, "x0", 0); + y0 = lgl_xml_get_prop_length (markup_node, "y0", 0); + r = lgl_xml_get_prop_length (markup_node, "radius", 0); + + lgl_template_frame_add_markup (frame, lgl_template_markup_circle_new (x0, y0, r)); + + for (node = markup_node->xmlChildrenNode; node != NULL; + node = node->next) { + if (!xmlNodeIsText (node)) { + if (!lgl_xml_is_node (node, "comment")) { + g_message ("bad node = \"%s\"",node->name); + } + } + } + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Template->Label->Markup-rect Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_markup_rect_node (xmlNodePtr markup_node, + lglTemplateFrame *frame) +{ + gdouble x1, y1, w, h, r; + xmlNodePtr node; + + x1 = lgl_xml_get_prop_length (markup_node, "x1", 0); + y1 = lgl_xml_get_prop_length (markup_node, "y1", 0); + w = lgl_xml_get_prop_length (markup_node, "w", 0); + h = lgl_xml_get_prop_length (markup_node, "h", 0); + r = lgl_xml_get_prop_length (markup_node, "r", 0); + + lgl_template_frame_add_markup (frame, lgl_template_markup_rect_new (x1, y1, w, h, r)); + + for (node = markup_node->xmlChildrenNode; node != NULL; + node = node->next) { + if (!xmlNodeIsText (node)) { + if (!lgl_xml_is_node (node, "comment")) { + g_message ("bad node = \"%s\"",node->name); + } + } + } + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Template->Alias Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_alias_node (xmlNodePtr alias_node, + lglTemplate *template) +{ + gchar *brand; + gchar *part; + gchar *name; + gchar **v; + + brand = lgl_xml_get_prop_string (alias_node, "brand", NULL); + part = lgl_xml_get_prop_string (alias_node, "part", NULL); + if (!brand || !part) + { + name = lgl_xml_get_prop_string (alias_node, "name", NULL); + if (name) + { + g_message (_("Missing required \"brand\" or \"part\" attribute, trying deprecated name.")); + v = g_strsplit (name, " ", 2); + brand = g_strdup (v[0]); + part = g_strdup (v[1]); + g_free (name); + g_strfreev (v); + + } + else + { + g_message (_("Name attribute also missing.")); + } + } + + lgl_template_add_alias (template, lgl_template_alias_new (brand, part)); + + g_free (brand); + g_free (part); +} + +/** + * lgl_xml_template_write_templates_to_file: + * @templates: List of #lglTemplate structures + * @utf8_filename: Filename of templates file (name encoded as UTF-8) + * + * Write a list of #lglTemplate structures to a glabels XML template file. + * + * Returns: the number of bytes written or -1 in case of failure + * + */ +gint +lgl_xml_template_write_templates_to_file (GList *templates, + const gchar *utf8_filename) +{ + xmlDocPtr doc; + xmlNsPtr ns; + gint bytes_written; + GList *p; + lglTemplate *template; + gchar *filename; + + doc = xmlNewDoc ((xmlChar *)"1.0"); + doc->xmlRootNode = xmlNewDocNode (doc, NULL, (xmlChar *)"Glabels-templates", NULL); + + ns = xmlNewNs (doc->xmlRootNode, (xmlChar *)LGL_XML_NAME_SPACE, NULL); + xmlSetNs (doc->xmlRootNode, ns); + + for (p=templates; p!=NULL; p=p->next) { + template = (lglTemplate *)p->data; + lgl_xml_template_create_template_node (template, doc->xmlRootNode, ns); + } + + filename = g_filename_from_utf8 (utf8_filename, -1, NULL, NULL, NULL); + if (!filename) + { + g_message (_("Utf8 conversion error.")); + return -1; + } + else + { + xmlSetDocCompressMode (doc, 0); + bytes_written = xmlSaveFormatFile (filename, doc, TRUE); + xmlFreeDoc (doc); + g_free (filename); + return bytes_written; + } + +} + + +/** + * lgl_xml_template_write_template_to_file: + * @template: #lglTemplate structure to be written + * @utf8_filename: Filename of templates file (name encoded as UTF-8) + * + * Write a single #lglTemplate structures to a glabels XML template file. + * + * Returns: the number of bytes written or -1 in case of failure + * + */ +gint +lgl_xml_template_write_template_to_file (const lglTemplate *template, + const gchar *utf8_filename) +{ + GList *templates = NULL; + gint bytes_written; + + templates = g_list_append (templates, (gpointer)template); + + bytes_written = lgl_xml_template_write_templates_to_file (templates, utf8_filename); + + g_list_free (templates); + + return bytes_written; +} + + +/** + * lgl_xml_template_create_template_node: + * @template: #lglTemplate structure to be written + * @root: parent node to receive new child node + * @ns: a libxml #xmlNsPtr + * + * Add a single #lglTemplate child node to given #xmlNodePtr. + * + */ +void +lgl_xml_template_create_template_node (const lglTemplate *template, + xmlNodePtr root, + const xmlNsPtr ns) +{ + xmlNodePtr node; + GList *p; + lglTemplateAlias *alias; + lglTemplateFrame *frame; + + node = xmlNewChild (root, ns, (xmlChar *)"Template", NULL); + + lgl_xml_set_prop_string (node, "brand", template->brand); + lgl_xml_set_prop_string (node, "part", template->part); + + lgl_xml_set_prop_string (node, "size", template->paper_id); + if (xmlStrEqual ((xmlChar *)template->paper_id, (xmlChar *)"Other")) + { + + lgl_xml_set_prop_length (node, "width", template->page_width); + lgl_xml_set_prop_length (node, "height", template->page_height); + + } + + lgl_xml_set_prop_string (node, "description", template->description); + + for ( p=template->aliases; p != NULL; p=p->next ) { + alias = (lglTemplateAlias *)p->data; + if ( !(xmlStrEqual ((xmlChar *)template->brand, (xmlChar *)alias->brand) && + xmlStrEqual ((xmlChar *)template->part, (xmlChar *)alias->part)) ) + { + xml_create_alias_node ( alias, node, ns ); + } + } + for ( p=template->category_ids; p != NULL; p=p->next ) + { + xml_create_meta_node ( p->data, node, ns ); + } + for ( p=template->frames; p != NULL; p=p->next ) + { + frame = (lglTemplateFrame *)p->data; + xml_create_label_node (frame, node, ns); + } + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Template->Meta Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_meta_node (const gchar *category, + xmlNodePtr root, + const xmlNsPtr ns) +{ + xmlNodePtr node; + + node = xmlNewChild (root, ns, (xmlChar *)"Meta", NULL); + lgl_xml_set_prop_string (node, "category", category); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Template->Label Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_label_node (const lglTemplateFrame *frame, + xmlNodePtr root, + const xmlNsPtr ns) +{ + xmlNodePtr node; + GList *p; + lglTemplateMarkup *markup; + lglTemplateLayout *layout; + + switch (frame->shape) { + + case LGL_TEMPLATE_FRAME_SHAPE_RECT: + node = xmlNewChild(root, ns, (xmlChar *)"Label-rectangle", NULL); + lgl_xml_set_prop_string (node, "id", frame->all.id); + lgl_xml_set_prop_length (node, "width", frame->rect.w); + lgl_xml_set_prop_length (node, "height", frame->rect.h); + lgl_xml_set_prop_length (node, "round", frame->rect.r); + lgl_xml_set_prop_length (node, "x_waste", frame->rect.x_waste); + lgl_xml_set_prop_length (node, "y_waste", frame->rect.y_waste); + break; + + case LGL_TEMPLATE_FRAME_SHAPE_ROUND: + node = xmlNewChild(root, ns, (xmlChar *)"Label-round", NULL); + lgl_xml_set_prop_string (node, "id", frame->all.id); + lgl_xml_set_prop_length (node, "radius", frame->round.r); + lgl_xml_set_prop_length (node, "waste", frame->round.waste); + break; + + case LGL_TEMPLATE_FRAME_SHAPE_CD: + node = xmlNewChild(root, ns, (xmlChar *)"Label-cd", NULL); + lgl_xml_set_prop_string (node, "id", frame->all.id); + lgl_xml_set_prop_length (node, "radius", frame->cd.r1); + lgl_xml_set_prop_length (node, "hole", frame->cd.r2); + if (frame->cd.w != 0.0) { + lgl_xml_set_prop_length (node, "width", frame->cd.w); + } + if (frame->cd.h != 0.0) { + lgl_xml_set_prop_length (node, "height", frame->cd.h); + } + lgl_xml_set_prop_length (node, "waste", frame->cd.waste); + break; + + default: + g_message ("Unknown label style"); + return; + break; + + } + + for ( p=frame->all.markups; p != NULL; p=p->next ) { + markup = (lglTemplateMarkup *)p->data; + switch (markup->type) { + case LGL_TEMPLATE_MARKUP_MARGIN: + xml_create_markup_margin_node (markup, node, ns); + break; + case LGL_TEMPLATE_MARKUP_LINE: + xml_create_markup_line_node (markup, node, ns); + break; + case LGL_TEMPLATE_MARKUP_CIRCLE: + xml_create_markup_circle_node (markup, node, ns); + break; + case LGL_TEMPLATE_MARKUP_RECT: + xml_create_markup_rect_node (markup, node, ns); + break; + default: + g_message ("Unknown markup type"); + break; + } + } + + for ( p=frame->all.layouts; p != NULL; p=p->next ) { + layout = (lglTemplateLayout *)p->data; + xml_create_layout_node (layout, node, ns); + } + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Template->Label->Layout Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_layout_node (const lglTemplateLayout *layout, + xmlNodePtr root, + const xmlNsPtr ns) +{ + xmlNodePtr node; + + node = xmlNewChild(root, ns, (xmlChar *)"Layout", NULL); + lgl_xml_set_prop_int (node, "nx", layout->nx); + lgl_xml_set_prop_int (node, "ny", layout->ny); + lgl_xml_set_prop_length (node, "x0", layout->x0); + lgl_xml_set_prop_length (node, "y0", layout->y0); + lgl_xml_set_prop_length (node, "dx", layout->dx); + lgl_xml_set_prop_length (node, "dy", layout->dy); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Template->Label->Markup-margin Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_markup_margin_node (const lglTemplateMarkup *markup, + xmlNodePtr root, + const xmlNsPtr ns) +{ + xmlNodePtr node; + + node = xmlNewChild(root, ns, (xmlChar *)"Markup-margin", NULL); + + lgl_xml_set_prop_length (node, "size", markup->margin.size); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Template->Label->Markup-line Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_markup_line_node (const lglTemplateMarkup *markup, + xmlNodePtr root, + const xmlNsPtr ns) +{ + xmlNodePtr node; + + node = xmlNewChild(root, ns, (xmlChar *)"Markup-line", NULL); + + lgl_xml_set_prop_length (node, "x1", markup->line.x1); + lgl_xml_set_prop_length (node, "y1", markup->line.y1); + lgl_xml_set_prop_length (node, "x2", markup->line.x2); + lgl_xml_set_prop_length (node, "y2", markup->line.y2); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Template->Label->Markup-circle Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_markup_circle_node (const lglTemplateMarkup *markup, + xmlNodePtr root, + const xmlNsPtr ns) +{ + xmlNodePtr node; + + node = xmlNewChild(root, ns, (xmlChar *)"Markup-circle", NULL); + + lgl_xml_set_prop_length (node, "x0", markup->circle.x0); + lgl_xml_set_prop_length (node, "y0", markup->circle.y0); + lgl_xml_set_prop_length (node, "radius", markup->circle.r); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Template->Label->Markup-rect Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_markup_rect_node (const lglTemplateMarkup *markup, + xmlNodePtr root, + const xmlNsPtr ns) +{ + xmlNodePtr node; + + node = xmlNewChild(root, ns, (xmlChar *)"Markup-rect", NULL); + + lgl_xml_set_prop_length (node, "x1", markup->rect.x1); + lgl_xml_set_prop_length (node, "y1", markup->rect.y1); + lgl_xml_set_prop_length (node, "w", markup->rect.w); + lgl_xml_set_prop_length (node, "h", markup->rect.h); + lgl_xml_set_prop_length (node, "r", markup->rect.r); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Template->Alias Node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_alias_node (const lglTemplateAlias *alias, + xmlNodePtr root, + const xmlNsPtr ns) +{ + xmlNodePtr node; + + node = xmlNewChild (root, ns, (xmlChar *)"Alias", NULL); + + lgl_xml_set_prop_string (node, "brand", alias->brand); + lgl_xml_set_prop_string (node, "part", alias->part); + +} + diff --git a/glabels2/libglabels/xml-template.h b/glabels2/libglabels/xml-template.h new file mode 100644 index 00000000..b940db32 --- /dev/null +++ b/glabels2/libglabels/xml-template.h @@ -0,0 +1,55 @@ +/* + * (LIBGLABELS) Template library for GLABELS + * + * xml-template.h: template xml module header file + * + * Copyright (C) 2001-2004 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ + +#ifndef __XML_TEMPLATE_H__ +#define __XML_TEMPLATE_H__ + +#include +#include + +#include "template.h" + +G_BEGIN_DECLS + +GList *lgl_xml_template_read_templates_from_file (const gchar *utf8_filename); + +GList *lgl_xml_template_parse_templates_doc (const xmlDocPtr templates_doc); + +lglTemplate *lgl_xml_template_parse_template_node (const xmlNodePtr template_node); + + +gint lgl_xml_template_write_templates_to_file (GList *templates, + const gchar *utf8_filename); + +gint lgl_xml_template_write_template_to_file (const lglTemplate *template, + const gchar *utf8_filename); + +void lgl_xml_template_create_template_node (const lglTemplate *template, + xmlNodePtr root, + const xmlNsPtr ns); + +G_END_DECLS + +#endif /* __XML_TEMPLATE_H__ */ diff --git a/glabels2/libglabels/xml.c b/glabels2/libglabels/xml.c new file mode 100644 index 00000000..0943d908 --- /dev/null +++ b/glabels2/libglabels/xml.c @@ -0,0 +1,539 @@ +/* + * (LIBGLABELS) Template library for GLABELS + * + * xml.c: GLabels xml utilities module + * + * Copyright (C) 2003, 2004 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ +#include + +#include "xml.h" + +#include +#include +#include +#include + +#include "libglabels-private.h" + + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + +#define POINTS_PER_POINT 1.0 /* internal units are points. */ +#define POINTS_PER_INCH 72.0 +#define POINTS_PER_MM 2.83464566929 +#define POINTS_PER_CM (10.0*POINTS_PER_MM) +#define POINTS_PER_PICA (1.0/12.0) + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +typedef struct { + xmlChar *name; + gdouble points_per_unit; +} UnitTableEntry; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +static UnitTableEntry unit_table[] = { + + /* These names are identical to the absolute length units supported in + the CSS2 Specification (Section 4.3.2) */ + + /* This table must be sorted exactly as the enumerations in lglUnitsType */ + + /* [LGL_UNITS_POINT] */ {(xmlChar *)"pt", POINTS_PER_POINT}, + /* [LGL_UNITS_INCH] */ {(xmlChar *)"in", POINTS_PER_INCH}, + /* [LGL_UNITS_MM] */ {(xmlChar *)"mm", POINTS_PER_MM}, + /* [LGL_UNITS_CM] */ {(xmlChar *)"cm", POINTS_PER_CM}, + /* [LGL_UNITS_PICA] */ {(xmlChar *)"pc", POINTS_PER_PICA}, + +}; + +static lglUnitsType default_units = LGL_UNITS_POINT; + + +/****************************************************************************/ + +/** + * lgl_xml_get_prop_string: + * @node: the libxml2 #xmlNodePtr of the node + * @property: the property name + * @default_val: a default value to return if property not found + * + * Return value of property as a string. + * + * Returns: the property as a pointer to a gchar string. This string should + * be freed with g_free(). + * + */ +gchar * +lgl_xml_get_prop_string (xmlNodePtr node, + const gchar *property, + const gchar *default_val) +{ + gchar *val; + xmlChar *string; + + string = xmlGetProp (node, (xmlChar *)property); + if ( string != NULL ) { + val = g_strdup ((gchar *)string); + xmlFree (string); + return val; + } + + if (default_val) { + return g_strdup (default_val); + } + + return NULL; +} + + +/** + * lgl_xml_get_prop_i18n_string: + * @node: the libxml2 #xmlNodePtr of the node + * @property: the property name + * @default_val: a default value to return if property not found + * + * Return value of a translatable property as a string. + * + * Returns: the property as a pointer to a gchar string. This string should + * be freed with g_free(). + * + */ +gchar * +lgl_xml_get_prop_i18n_string (xmlNodePtr node, + const gchar *property, + const gchar *default_val) +{ + gchar *_property; + gchar *val; + xmlChar *string; + + _property = g_strdup_printf ("_%s", property); + string = xmlGetProp (node, (xmlChar *)_property); + g_free (_property); + + if ( string != NULL ) { + + val = g_strdup (gettext ((char *)string)); + xmlFree (string); + return val; + + } + + string = xmlGetProp (node, (xmlChar *)property); + if ( string != NULL ) { + val = g_strdup ((gchar *)string); + xmlFree (string); + return val; + } + + if (default_val) { + return g_strdup (default_val); + } + + return NULL; +} + + +/** + * lgl_xml_get_prop_double: + * @node: the libxml2 #xmlNodePtr of the node + * @property: the property name + * @default_val: a default value to return if property not found + * + * Return value of property as a double. + * + * Returns: the property as a double. + * + */ +gdouble +lgl_xml_get_prop_double (xmlNodePtr node, + const gchar *property, + gdouble default_val) +{ + gdouble val; + xmlChar *string; + + string = xmlGetProp (node, (xmlChar *)property); + if ( string != NULL ) { + val = g_strtod ((gchar *)string, NULL); + xmlFree (string); + return val; + } + + return default_val; +} + + +/** + * lgl_xml_get_prop_boolean: + * @node: the libxml2 #xmlNodePtr of the node + * @property: the property name + * @default_val: a default value to return if property not found + * + * Return value of property as a boolean. + * + * Returns: the property as a boolean. + * + */ +gboolean +lgl_xml_get_prop_boolean (xmlNodePtr node, + const gchar *property, + gboolean default_val) +{ + gboolean val; + xmlChar *string; + + string = xmlGetProp (node, (xmlChar *)property); + if ( string != NULL ) { + val = !((xmlStrcasecmp (string, (xmlChar *)"false") == 0) || + xmlStrEqual (string, (xmlChar *)"0"));; + xmlFree (string); + return val; + } + + return default_val; +} + + +/** + * lgl_xml_get_prop_int: + * @node: the libxml2 #xmlNodePtr of the node + * @property: the property name + * @default_val: a default value to return if property not found + * + * Return value of property as an integer. + * + * Returns: the property as an integer. + * + */ +gint +lgl_xml_get_prop_int (xmlNodePtr node, + const gchar *property, + gint default_val) +{ + gint val; + xmlChar *string; + + string = xmlGetProp (node, (xmlChar *)property); + if ( string != NULL ) { + val = strtol ((char *)string, NULL, 0); + xmlFree (string); + return val; + } + + return default_val; +} + + +/** + * lgl_xml_get_prop_uint: + * @node: the libxml2 #xmlNodePtr of the node + * @property: the property name + * @default_val: a default value to return if property not found + * + * Return value of property (usually formatted in hex) as an unsigned integer. + * + * Returns: the property as an unsigned integer. + * + */ +guint +lgl_xml_get_prop_uint (xmlNodePtr node, + const gchar *property, + guint default_val) +{ + guint val; + xmlChar *string; + + string = xmlGetProp (node, (xmlChar *)property); + if ( string != NULL ) { + val = strtoul ((char *)string, NULL, 0); + xmlFree (string); + return val; + } + + return default_val; +} + + +/** + * lgl_xml_get_prop_length: + * @node: the libxml2 #xmlNodePtr of the node + * @property: the property name + * @default_val: a default value to return if property not found + * + * Return value of a length property as a double, converting to internal + * units (points). The property is expected to be formatted as a number + * followed by a units string. If there is no units string, the length + * is assumed to be in points. Valid units strings are "pt" for points, + * "in" for inches, "mm" for millimeters, "cm" for centimeters, and + * "pc" for picas. + * + * Returns: the length in points. + * + */ +gdouble +lgl_xml_get_prop_length (xmlNodePtr node, + const gchar *property, + gdouble default_val) +{ + gdouble val; + xmlChar *string; + xmlChar *unit; + gint i; + + string = xmlGetProp (node, (xmlChar *)property); + if ( string != NULL ) { + + val = g_strtod ((gchar *)string, (gchar **)&unit); + + if (unit != string) { + unit = (xmlChar *)g_strchug ((gchar *)unit); + if (strlen ((char *)unit) > 0 ) { + for (i=LGL_UNITS_FIRST; i<=LGL_UNITS_LAST; i++) { + if (xmlStrcasecmp (unit, unit_table[i].name) == 0) { + val *= unit_table[i].points_per_unit; + break; + } + } + if (i>LGL_UNITS_LAST) { + g_message ("Line %ld, Node \"%s\", Property \"%s\": Unknown unit \"%s\", assuming points", + xmlGetLineNo (node), node->name, property, + unit); + } + } + } + else { + val = 0.0; + } + + xmlFree (string); + return val; + } + + return default_val; +} + + +/** + * lgl_xml_set_prop_string: + * @node: the libxml2 #xmlNodePtr of the node + * @property: the property name + * @val: the value to set + * + * Set a property from a string. + * + */ +void +lgl_xml_set_prop_string (xmlNodePtr node, + const gchar *property, + const gchar *val) +{ + if (val != NULL) { + xmlSetProp (node, (xmlChar *)property, (xmlChar *)val); + } +} + + +/** + * lgl_xml_set_prop_double: + * @node: the libxml2 #xmlNodePtr of the node + * @property: the property name + * @val: the value to set + * + * Set a property from a double. + * + */ +void +lgl_xml_set_prop_double (xmlNodePtr node, + const gchar *property, + gdouble val) +{ + gchar *string, buffer[G_ASCII_DTOSTR_BUF_SIZE]; + + /* Guarantee "C" locale by use of g_ascii_formatd */ + string = g_ascii_formatd (buffer, G_ASCII_DTOSTR_BUF_SIZE, "%g", val); + + xmlSetProp (node, (xmlChar *)property, (xmlChar *)string); +} + + +/** + * lgl_xml_set_prop_boolean: + * @node: the libxml2 #xmlNodePtr of the node + * @property: the property name + * @val: the value to set + * + * Set a property from a boolean. + * + */ +void +lgl_xml_set_prop_boolean (xmlNodePtr node, + const gchar *property, + gboolean val) +{ + xmlSetProp (node, (xmlChar *)property, (xmlChar *)(val ? "True" : "False")); +} + +/** + * lgl_xml_set_prop_int: + * @node: the libxml2 #xmlNodePtr of the node + * @property: the property name + * @val: the value to set + * + * Set a property from an integer. + * + */ +void +lgl_xml_set_prop_int (xmlNodePtr node, + const gchar *property, + gint val) +{ + gchar *string; + + string = g_strdup_printf ("%d", val); + xmlSetProp (node, (xmlChar *)property, (xmlChar *)string); + g_free (string); +} + +/** + * lgl_xml_set_prop_uint_hex: + * @node: the libxml2 #xmlNodePtr of the node + * @property: the property name + * @val: the value to set + * + * Set a property from an unsigned integer and format in hex. + * + */ +void +lgl_xml_set_prop_uint_hex (xmlNodePtr node, + const gchar *property, + guint val) +{ + gchar *string; + + string = g_strdup_printf ("0x%08x", val); + xmlSetProp (node, (xmlChar *)property, (xmlChar *)string); + g_free (string); +} + +/** + * lgl_xml_set_prop_length: + * @node: the libxml2 #xmlNodePtr of the node + * @property: the property name + * @val: the length to set in internal units (points) + * + * Set a property from a length, performing any necessary conversion. + * Length properties are formatted as a number followed by a units string. + * The units of the formatted property is determined by the most recent call to + * lgl_xml_set_default_units(). + * + */ +void +lgl_xml_set_prop_length (xmlNodePtr node, + const gchar *property, + gdouble val) +{ + gchar *string, buffer[G_ASCII_DTOSTR_BUF_SIZE]; + gchar *string_unit; + + /* Convert to default units */ + val /= unit_table[default_units].points_per_unit; + + /* Guarantee "C" locale by use of g_ascii_formatd */ + string = g_ascii_formatd (buffer, G_ASCII_DTOSTR_BUF_SIZE, "%g", val); + + string_unit = g_strdup_printf ("%s%s", string, unit_table[default_units].name); + xmlSetProp (node, (xmlChar *)property, (xmlChar *)string_unit); + g_free (string_unit); +} + +/** + * lgl_xml_is_node + * @node: the libxml2 #xmlNodePtr of the node + * @name : the node name + * + * Test if a node name matches given name. + * + * Returns: TRUE if the name of the node matches. Otherwise FALSE. + * + */ +gboolean +lgl_xml_is_node (xmlNodePtr node, + const gchar *name) +{ + return xmlStrEqual (node->name, (xmlChar *)name); +} + + +/** + * lgl_xml_get_node_content + * @node: the libxml2 #xmlNodePtr of the node + * + * Get the content of a node. + * + * Returns: the property as a pointer to a gchar string. This string should + * be freed with g_free(). + */ +gchar * +lgl_xml_get_node_content (xmlNodePtr node) +{ + xmlChar *xml_content; + gchar *g_content; + + xml_content = xmlNodeGetContent (node); + + if (xml_content != NULL) { + + g_content = g_strdup ((gchar *)xml_content); + xmlFree (xml_content); + return g_content; + + } + + return NULL; +} + + +/** + * lgl_xml_set_default_units: + * @units: default units selection (#lglUnitsType) + * + * Set the default units when formatting lengths. See + * lgl_xml_set_prop_length(). + * + */ +void +lgl_xml_set_default_units (lglUnitsType units) +{ + g_return_if_fail ((units >= LGL_UNITS_FIRST) && (units <= LGL_UNITS_LAST)); + + default_units = units; +} + + diff --git a/glabels2/libglabels/xml.h b/glabels2/libglabels/xml.h new file mode 100644 index 00000000..3ef2e495 --- /dev/null +++ b/glabels2/libglabels/xml.h @@ -0,0 +1,113 @@ +/* + * (LIBGLABELS) Template library for GLABELS + * + * xml.h: GLabels xml utilities header file + * + * Copyright (C) 2003, 2004 Jim Evins . + * + * This file is part of the LIBGLABELS library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA + */ + +#ifndef __XML_H__ +#define __XML_H__ + +#include +#include + +#include "enums.h" + +#define LGL_XML_NAME_SPACE "http://snaught.com/glabels/2.2/" + +G_BEGIN_DECLS + +/* + * Get property functions + */ +gchar * lgl_xml_get_prop_string (xmlNodePtr node, + const gchar *property, + const gchar *default_val); + +gchar * lgl_xml_get_prop_i18n_string (xmlNodePtr node, + const gchar *property, + const gchar *default_val); + +gdouble lgl_xml_get_prop_double (xmlNodePtr node, + const gchar *property, + gdouble default_val); + +gboolean lgl_xml_get_prop_boolean (xmlNodePtr node, + const gchar *property, + gboolean default_val); + +gint lgl_xml_get_prop_int (xmlNodePtr node, + const gchar *property, + gint default_val); + +guint lgl_xml_get_prop_uint (xmlNodePtr node, + const gchar *property, + guint default_val); + +gdouble lgl_xml_get_prop_length (xmlNodePtr node, + const gchar *property, + gdouble default_val); + + +/* + * Set property functions + */ +void lgl_xml_set_prop_string (xmlNodePtr node, + const gchar *property, + const gchar *val); + +void lgl_xml_set_prop_double (xmlNodePtr node, + const gchar *property, + gdouble val); + +void lgl_xml_set_prop_boolean (xmlNodePtr node, + const gchar *property, + gboolean val); + +void lgl_xml_set_prop_int (xmlNodePtr node, + const gchar *property, + gint val); + +void lgl_xml_set_prop_uint_hex (xmlNodePtr node, + const gchar *property, + guint val); + +void lgl_xml_set_prop_length (xmlNodePtr node, + const gchar *property, + gdouble val); + +/* + * Other node functions + */ +gboolean lgl_xml_is_node (xmlNodePtr node, + const gchar *name); + +gchar * lgl_xml_get_node_content (xmlNodePtr node); + +/* + * Misc functions + */ +void lgl_xml_set_default_units (lglUnitsType units); + +G_END_DECLS + + +#endif /* __XML_H__ */ diff --git a/glabels2/po/ChangeLog b/glabels2/po/ChangeLog new file mode 100644 index 00000000..e69de29b diff --git a/glabels2/po/POTFILES.in b/glabels2/po/POTFILES.in new file mode 100644 index 00000000..e6b7ee95 --- /dev/null +++ b/glabels2/po/POTFILES.in @@ -0,0 +1,174 @@ +# List of source files containing translatable strings. + +src/glabels.c +src/glabels-batch.c +src/window.c +src/window.h +src/stock.c +src/stock.h +src/ui.h +src/ui.c +src/ui-property-bar.h +src/ui-property-bar.c +src/ui-sidebar.h +src/ui-sidebar.c +src/ui-util.h +src/ui-util.c +src/ui-commands.h +src/ui-commands.c +src/file.h +src/file.c +src/recent.h +src/recent.c +src/prefs.c +src/prefs.h +src/prefs-model.c +src/prefs-model.h +src/prefs-dialog.c +src/prefs-dialog.h +src/hig.h +src/view.c +src/view.h +src/view-object.c +src/view-object.h +src/view-box.c +src/view-box.h +src/view-ellipse.c +src/view-ellipse.h +src/view-line.c +src/view-line.h +src/view-image.c +src/view-image.h +src/view-text.c +src/view-text.h +src/view-barcode.c +src/view-barcode.h +src/object-editor.c +src/object-editor.h +src/object-editor-private.h +src/object-editor-bc-page.c +src/object-editor-data-page.c +src/object-editor-edit-page.c +src/object-editor-fill-page.c +src/object-editor-image-page.c +src/object-editor-line-page.c +src/object-editor-lsize-page.c +src/object-editor-position-page.c +src/object-editor-size-page.c +src/object-editor-text-page.c +src/merge-properties-dialog.c +src/merge-properties-dialog.h +src/print.c +src/print.h +src/print-op.c +src/template-designer.c +src/template-designer.h +src/bc.c +src/bc.h +src/bc-gnubarcode.c +src/bc-gnubarcode.h +src/bc-postnet.c +src/bc-postnet.h +src/label.c +src/label.h +src/label-object.c +src/label-object.h +src/label-text.c +src/label-text.h +src/label-box.c +src/label-box.h +src/label-line.c +src/label-line.h +src/label-ellipse.c +src/label-ellipse.h +src/label-image.c +src/label-image.h +src/label-barcode.c +src/label-barcode.h +src/xml-label.c +src/xml-label.h +src/xml-label-04.c +src/xml-label-04.h +src/pixbuf-cache.c +src/pixbuf-cache.h +src/base64.c +src/base64.h +src/merge.c +src/merge.h +src/merge-init.c +src/merge-init.h +src/merge-text.c +src/merge-text.h +src/merge-evolution.c +src/text-node.c +src/text-node.h +src/wdgt-print-copies.c +src/wdgt-print-copies.h +src/wdgt-print-merge.c +src/wdgt-print-merge.h +src/wdgt-media-select.c +src/wdgt-media-select.h +src/wdgt-mini-preview.c +src/wdgt-mini-preview.h +src/wdgt-rotate-label.c +src/wdgt-rotate-label.h +src/wdgt-chain-button.c +src/wdgt-chain-button.h +src/util.c +src/util.h +src/color.c +src/color.h +src/debug.c +src/debug.h +src/mygal/color-group.c +src/mygal/color-group.h +src/mygal/color-palette.c +src/mygal/color-palette.h +src/mygal/e-colors.c +src/mygal/e-colors.h +src/mygal/e-util.h +src/mygal/mygal-combo-box.c +src/mygal/mygal-combo-box.h +src/mygal/widget-color-combo.c +src/mygal/widget-color-combo.h +src/critical-error-handler.c +src/warning-handler.c + +libglabels/category.c +libglabels/template.c +libglabels/template.h +libglabels/paper.c +libglabels/paper.h +libglabels/xml-template.c +libglabels/xml-template.h +libglabels/xml-paper.c +libglabels/xml-paper.h +libglabels/xml.c +libglabels/xml.h + +data/glade/merge-properties-dialog.glade +data/glade/new-label-dialog.glade +data/glade/object-editor.glade +data/glade/prefs-dialog.glade +data/glade/print-custom-widget.glade +data/glade/property-bar.glade +data/glade/template-designer.glade +data/glade/wdgt-media-select.glade +data/glade/wdgt-rotate-label.glade + +data/templates/paper-sizes.xml +data/templates/avery-us-templates.xml +data/templates/avery-iso-templates.xml +data/templates/avery-other-templates.xml +data/templates/categories.xml +data/templates/zweckform-iso-templates.xml +data/templates/misc-us-templates.xml +data/templates/misc-iso-templates.xml +data/templates/misc-other-templates.xml + +data/desktop/glabels.desktop.in + +data/mime/glabels.keys.in +data/mime/glabels.xml.in + +barcode-0.98/compat/getopt.c diff --git a/glabels2/po/cs.po b/glabels2/po/cs.po new file mode 100644 index 00000000..83b65caa --- /dev/null +++ b/glabels2/po/cs.po @@ -0,0 +1,2484 @@ +# cs translation of Glabels. +# Copyright (C) 2005 THE Glabels'S COPYRIGHT HOLDER +# This file is distributed under the same license as the Glabels package. +# David Makovský (Yakeen) , 2005 +# Zbynek Mrkvicka , 2005 +# +msgid "" +msgstr "" +"Project-Id-Version: Glabels 2.0.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-01-22 11:49-0500\n" +"PO-Revision-Date: 2005-02-02 21:35+0100\n" +"Last-Translator: David Makovský (Yakeen) \n" +"Language-Team: cs \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit" + +#: src/glabels.c:116 +msgid "Could not initialize Bonobo!\n" +msgstr "Nepodařila se inicializace Bonobo serveru!\n" + +#: src/glabels-batch.c:52 +msgid "print this message" +msgstr "tisk této zprávy" + +#: src/glabels-batch.c:54 +msgid "print the version of glabels-batch being used" +msgstr "vypíše verzi glabels-batch, která je používána" + +#: src/glabels-batch.c:56 +msgid "set output filename (default=\"output.ps\")" +msgstr "nastavte jméno souboru výstupu (standartně=\"output.ps\")" + +#: src/glabels-batch.c:56 src/glabels-batch.c:70 +msgid "filename" +msgstr "název souboru" + +#: src/glabels-batch.c:58 +msgid "number of sheets (default=1)" +msgstr "počet stránek (standartně=1)" + +#: src/glabels-batch.c:58 +msgid "sheets" +msgstr "seÅ¡ity" + +#: src/glabels-batch.c:60 +msgid "number of copies (default=1)" +msgstr "počet kopií (standartní nastavení = 1)" + +#: src/glabels-batch.c:60 +msgid "copies" +msgstr "kopie" + +#: src/glabels-batch.c:62 +msgid "first label on first sheet (default=1)" +msgstr "první etiketa na prvním listu (standartně=1)" + +#: src/glabels-batch.c:62 +msgid "first" +msgstr "první" + +#: src/glabels-batch.c:64 src/print-dialog.c:336 +msgid "print outlines (to test printer alignment)" +msgstr "tisk obrysů (test zarovnávání tiskárny)" + +#: src/glabels-batch.c:66 src/print-dialog.c:344 +msgid "print in reverse (i.e. a mirror image)" +msgstr "obrácený tisk (např. převrácený obrázek)" + +#: src/glabels-batch.c:68 src/print-dialog.c:351 +msgid "print crop marks" +msgstr "tisknout značky pro ořez" + +#: src/glabels-batch.c:70 +msgid "input file for merging" +msgstr "vstupní soubor pro sloučení" + +#: src/glabels-batch.c:107 +msgid "[OPTION...] GLABELS_FILE..." +msgstr "" + +#: src/glabels-batch.c:127 +#, c-format +msgid "missing glabels file\n" +msgstr "chybí soubor programu glabels\n" + +#: src/glabels-batch.c:158 +#, c-format +msgid "cannot perform document merge with glabels file %s\n" +msgstr "" + +#: src/glabels-batch.c:182 +#, c-format +msgid "cannot open glabels file %s\n" +msgstr "nepodařilo se otevřít soubor programu glabels %s\n" + +#: src/window.c:244 +msgid "(none) - gLabels" +msgstr "(žádný) - gLabels" + +#: src/window.c:414 +msgid "(modified)" +msgstr "(modifikováno)" + +#: src/stock.c:65 data/ui/glabels-ui.xml.h:162 +msgid "_Select Mode" +msgstr "Mód výběru" + +#: src/stock.c:66 data/ui/glabels-ui.xml.h:163 +msgid "_Text" +msgstr "_Text" + +#: src/stock.c:67 data/ui/glabels-ui.xml.h:148 +msgid "_Line" +msgstr "Čár_a" + +#: src/stock.c:68 data/ui/glabels-ui.xml.h:130 +msgid "_Box" +msgstr "O_bdélník" + +#: src/stock.c:69 data/ui/glabels-ui.xml.h:141 +msgid "_Ellipse" +msgstr "_Elipsa" + +#: src/stock.c:70 data/ui/glabels-ui.xml.h:146 +msgid "_Image" +msgstr "Obrá_zek" + +#: src/stock.c:71 data/ui/glabels-ui.xml.h:11 +msgid "Bar_code" +msgstr "Čárový _kód" + +#: src/stock.c:72 +msgid "_Merge Properties" +msgstr "Vlastnosti sloučení" + +#: src/stock.c:73 +msgid "Object _Properties" +msgstr "Nastavení objektu" + +#: src/stock.c:74 data/ui/glabels-ui.xml.h:13 +msgid "Bring to _Front" +msgstr "Vynést dopředu" + +#: src/stock.c:75 data/ui/glabels-ui.xml.h:109 +msgid "Send to _Back" +msgstr "Poslat _dozadu" + +#: src/stock.c:76 data/ui/glabels-ui.xml.h:96 +msgid "Rotate _Left" +msgstr "Otočit do_leva" + +#: src/stock.c:77 data/ui/glabels-ui.xml.h:97 +msgid "Rotate _Right" +msgstr "Otočit do_prava" + +#: src/stock.c:78 data/ui/glabels-ui.xml.h:52 +msgid "Flip _Horizontally" +msgstr "Převrátit _vodorovně" + +#: src/stock.c:79 data/ui/glabels-ui.xml.h:53 +msgid "Flip _Vertically" +msgstr "Převrátit _svisle" + +#: src/stock.c:80 data/ui/glabels-ui.xml.h:147 +msgid "_Lefts" +msgstr "Nalevo" + +#: src/stock.c:81 data/ui/glabels-ui.xml.h:159 +msgid "_Rights" +msgstr "Napravo" + +#: src/stock.c:82 data/ui/glabels-ui.xml.h:131 +msgid "_Centers" +msgstr "_Nastřed" + +#: src/stock.c:83 data/ui/glabels-ui.xml.h:164 +msgid "_Tops" +msgstr "Nahoru" + +#: src/stock.c:84 +msgid "Bottoms" +msgstr "Naspod" + +#: src/stock.c:85 +msgid "Centers" +msgstr "Nastřed" + +#: src/stock.c:86 src/stock.c:87 data/ui/glabels-ui.xml.h:62 +msgid "Label Ce_nter" +msgstr "Střed etikety" + +#: src/stock.c:88 data/ui/glabels-ui.xml.h:51 +msgid "Fill color" +msgstr "Barva výplně" + +#: src/stock.c:89 data/ui/glabels-ui.xml.h:64 +msgid "Line color" +msgstr "Barva čáry" + +#: src/stock.c:90 src/stock.c:92 +msgid "Linked" +msgstr "Spojeno" + +#: src/stock.c:91 src/stock.c:93 +msgid "Not Linked" +msgstr "Nespojeno" + +#: src/ui-property-bar.c:345 src/object-editor.c:499 +msgid "Default" +msgstr "Výchozí" + +#: src/ui-property-bar.c:360 src/object-editor.c:512 +msgid "No fill" +msgstr "Bez výplně" + +#: src/ui-property-bar.c:375 src/object-editor.c:505 +msgid "No line" +msgstr "" + +#: src/ui-sidebar.c:180 +msgid "Object properties" +msgstr "Vlastnosti objektu" + +#: src/commands.c:385 +msgid "" +"A label and business card creation program for GNOME.\n" +" \n" +"Glabels is free software; you can redistribute it and/or modify it under the " +"terms of the GNU General Public License as published by the Free Software " +"Foundation; either version 2 of the License, or (at your option) any later " +"version.\n" +" \n" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details.\n" +msgstr "" +"Program pro tvorbu etiket a vizitek v prostředí GNOME.\n" +" \n" +"Glabels je svobodný software, můžete s ním nakládat podle GPL licence verze " +"2, nebo jakoukoliv pozdější.\n" +" \n" +"Program je distribuován s nadějí, že bude nápomocen, ale je distribuován bez " +"ručení záruky, tak jak je uvedeno v GPL Licenci verze 2. Pro další detaily " +"si přečtěte tuto licenci.\n" + +#: src/commands.c:399 +msgid "See the file AUTHORS for additional credits," +msgstr "Prohlédněte si soubor AUTHORS pro dodatečné informace," + +#: src/commands.c:400 +msgid "or visit http://glabels.sourceforge.net/" +msgstr "nebo navÅ¡tivte http://glabels.sourceforge.net/" + +#: src/commands.c:409 +msgid " " +msgstr "" + +#: src/commands.c:424 +msgid "glabels" +msgstr "glabels" + +#: src/file.c:100 +msgid "New Label or Card" +msgstr "Nová etiketa či vizitka" + +#: src/file.c:132 src/file.c:304 +msgid "Media Type" +msgstr "Typ média" + +#: src/file.c:138 src/file.c:310 +msgid "Label orientation" +msgstr "Orientace etikety" + +#: src/file.c:269 +msgid "Label properties" +msgstr "Vlastnosti etikety" + +#: src/file.c:452 src/file.c:870 +msgid "All files" +msgstr "VÅ¡echny soubory" + +#: src/file.c:457 src/file.c:875 +msgid "gLabels documents" +msgstr "Dokumenty gLabels" + +#: src/file.c:505 src/file.c:617 src/file.c:934 src/file.c:1130 +msgid "Empty file name selection" +msgstr "Prázdné pole jména souboru" + +#: src/file.c:506 src/file.c:520 src/file.c:618 src/file.c:632 +msgid "Please select a file or supply a valid file name" +msgstr "Vyberte, prosím, soubor, nebo vypiÅ¡te platné jméno souboru" + +#: src/file.c:519 src/file.c:631 +msgid "File does not exist" +msgstr "Soubor neexistuje" + +#: src/file.c:563 data/ui/glabels-ui.xml.h:74 +msgid "Open" +msgstr "Otevřít" + +#: src/file.c:565 +msgid "Open label" +msgstr "Otevřít etiketu" + +#: src/file.c:707 +#, c-format +msgid "Could not open file \"%s\"" +msgstr "nepodařilo se otevřít soubor \"%s\"" + +#: src/file.c:715 +msgid "Not a supported file format" +msgstr "Formát tohoto souboru není podporován" + +#: src/file.c:797 src/file.c:979 src/file.c:1174 +#, c-format +msgid "Could not save file \"%s\"" +msgstr "Nepodařilo se uložit soubor \"%s\"" + +#: src/file.c:805 src/file.c:987 src/file.c:1182 +msgid "Error encountered during save. The file is still not saved." +msgstr "Při ukládání se vyskytla chyba. Soubor nebyl uložen." + +#: src/file.c:848 src/file.c:1048 +#, c-format +msgid "Save \"%s\" as" +msgstr "Uložit \"%s\" jako" + +#: src/file.c:935 src/file.c:1131 +msgid "Please supply a valid file name" +msgstr "Prosím vepiÅ¡te platné jméno souboru" + +#: src/file.c:952 src/file.c:1147 +#, c-format +msgid "Overwrite file \"%s\"?" +msgstr "Přepsat soubor \"%s\"?" + +#: src/file.c:960 src/file.c:1155 +msgid "File already exists." +msgstr "Soubor již existuje." + +#: src/file.c:1271 +#, c-format +msgid "Save changes to document \"%s\" before closing?" +msgstr "Uložit před zavřením změny v dokumentu \"%s\"?" + +#: src/file.c:1279 +msgid "Your changes will be lost if you don't save them." +msgstr "VaÅ¡e změny budou ztraceny pokud je neuložíte." + +#: src/file.c:1282 +msgid "Close without saving" +msgstr "Zavřít bez uložení" + +#. Should not happen +#: src/prefs.c:156 src/prefs.c:163 data/glade/prefs-dialog.glade.h:23 +#: data/glade/object-editor.glade.h:37 +msgid "points" +msgstr "bodů" + +#: src/prefs.c:158 data/glade/object-editor.glade.h:36 +#: data/glade/template-designer.glade.h:74 +msgid "inches" +msgstr "palce" + +#: src/prefs.c:160 +msgid "mm" +msgstr "mm" + +#: src/prefs-dialog.c:248 data/glade/prefs-dialog.glade.h:22 +msgid "gLabels Preferences" +msgstr "Nastavení programu gLabels" + +#. +#. * Submenu: Order +#. +#: src/view.c:3574 data/ui/glabels-ui.xml.h:154 +msgid "_Order" +msgstr "_Pořadí" + +#. +#. * Submenu: Rotate/Flip +#. +#: src/view.c:3595 data/ui/glabels-ui.xml.h:160 +msgid "_Rotate/Flip" +msgstr "_Rotace/Převrácení" + +#. +#. * Submenu: Align Horizontally +#. +#: src/view.c:3628 +msgid "Align _Horizontally" +msgstr "Zarovnat _vodorovně" + +#. +#. * Submenu: Align Vertically +#. +#: src/view.c:3667 +msgid "Align _Vertically" +msgstr "Zarovnat _svisle" + +#: src/view.c:3728 data/ui/glabels-ui.xml.h:137 +msgid "_Delete" +msgstr "_Smazat" + +#. Build editor. +#: src/view-box.c:224 +msgid "Box object properties" +msgstr "Vlastnosti obdélníku/čtverce" + +#. Build editor. +#: src/view-ellipse.c:224 +msgid "Ellipse object properties" +msgstr "Vlastnosti elipsy" + +#. Build editor. +#: src/view-line.c:224 +msgid "Line object properties" +msgstr "Vlastnosti čáry" + +#. Build editor. +#: src/view-image.c:223 +msgid "Image object properties" +msgstr "Vlastnosti obrázku" + +#. Build editor. +#: src/view-text.c:251 +msgid "Text object properties" +msgstr "Vlastnosti textu" + +#: src/view-text.c:563 data/glade/object-editor.glade.h:28 +msgid "Text" +msgstr "Text" + +#. Build editor. +#: src/view-barcode.c:210 +msgid "Barcode object properties" +msgstr "Vlastnosti čárového kódu" + +#: src/view-barcode.c:580 src/print.c:1089 +msgid "Invalid barcode data" +msgstr "Neplatná data čárového kódu" + +#: src/merge-properties-dialog.c:231 +msgid "Merge Properties" +msgstr "Nastavení sloučení" + +#. ---- Source section ---- +#: src/merge-properties-dialog.c:237 +msgid "Source" +msgstr "Zdroj" + +#: src/merge-properties-dialog.c:245 +msgid "Format:" +msgstr "Formát:" + +#. Location line +#: src/merge-properties-dialog.c:273 +msgid "Location:" +msgstr "Umístění:" + +#: src/merge-properties-dialog.c:282 src/merge-properties-dialog.c:393 +msgid "Select merge-database source" +msgstr "Výběr databázového zdroje pro sloučení" + +#: src/merge-properties-dialog.c:289 src/merge-properties-dialog.c:404 +msgid "N/A" +msgstr "Není k dispozici" + +#. ---- Sample Fields section ---- +#: src/merge-properties-dialog.c:300 +msgid "Record selection/preview:" +msgstr "Náhled na záznam výběru" + +#: src/merge-properties-dialog.c:326 +msgid "Select" +msgstr "Výběr" + +#: src/merge-properties-dialog.c:334 +msgid "Record/Field" +msgstr "Záznam/Pole" + +#: src/merge-properties-dialog.c:342 data/glade/object-editor.glade.h:9 +msgid "Data" +msgstr "Data" + +#: src/print-dialog.c:266 data/ui/glabels-ui.xml.h:81 +msgid "Print" +msgstr "Tisk" + +#: src/print-dialog.c:281 +msgid "_Job" +msgstr "Úloha" + +#: src/print-dialog.c:286 +msgid "P_rinter" +msgstr "_Tiskárna" + +#. ----------- Add simple-copies widget ------------ +#: src/print-dialog.c:314 +msgid "Copies" +msgstr "Kopie" + +#. ------- Add merge control widget ------------ +#: src/print-dialog.c:322 +msgid "Document merge control" +msgstr "Kontrola sloučení dokumentu" + +#. ----------- Add custom print options area ------------ +#: src/print-dialog.c:330 +msgid "Options" +msgstr "Možnosti" + +#: src/print-dialog.c:553 src/print-dialog.c:592 +msgid "Print preview" +msgstr "Náhled tisku" + +#: src/template-designer.c:409 data/glade/template-designer.glade.h:73 +msgid "gLabels Template Designer" +msgstr "Návrhář Å¡ablon gLabels" + +#: src/bc.c:60 +msgid "POSTNET (any)" +msgstr "POSTNET (jakýkoli)" + +#: src/bc.c:63 +msgid "POSTNET-5 (ZIP only)" +msgstr "POSTNET-5 (pouze ZIP)" + +#: src/bc.c:66 +msgid "POSTNET-9 (ZIP+4)" +msgstr "" + +#: src/bc.c:69 +msgid "POSTNET-11 (DPBC)" +msgstr "" + +#: src/bc.c:72 +msgid "EAN (any)" +msgstr "EAN (jakýkoli)" + +#: src/bc.c:75 +msgid "EAN-8" +msgstr "" + +#: src/bc.c:78 +msgid "EAN-8 +2" +msgstr "" + +#: src/bc.c:81 +msgid "EAN-8 +5" +msgstr "" + +#: src/bc.c:84 +msgid "EAN-13" +msgstr "" + +#: src/bc.c:87 +msgid "EAN-13 +2" +msgstr "" + +#: src/bc.c:90 +msgid "EAN-13 +5" +msgstr "" + +#: src/bc.c:93 +msgid "UPC (UPC-A or UPC-E)" +msgstr "UPC (UPC-A nebo UPC-E)" + +#: src/bc.c:96 +msgid "UPC-A" +msgstr "" + +#: src/bc.c:99 +msgid "UPC-A +2" +msgstr "" + +#: src/bc.c:102 +msgid "UPC-A +5" +msgstr "" + +#: src/bc.c:105 +msgid "UPC-E" +msgstr "" + +#: src/bc.c:108 +msgid "UPC-E +2" +msgstr "" + +#: src/bc.c:111 +msgid "UPC-E +5" +msgstr "" + +#: src/bc.c:114 +msgid "ISBN" +msgstr "" + +#: src/bc.c:117 +msgid "ISBN +5" +msgstr "" + +#: src/bc.c:120 +msgid "Code 39" +msgstr "" + +#: src/bc.c:123 +msgid "Code 128" +msgstr "" + +#: src/bc.c:126 +msgid "Code 128C" +msgstr "" + +#: src/bc.c:129 +msgid "Code 128B" +msgstr "" + +#: src/bc.c:132 +msgid "Interleaved 2 of 5" +msgstr "" + +#: src/bc.c:135 +msgid "Codabar" +msgstr "" + +#: src/bc.c:138 +msgid "MSI" +msgstr "" + +#: src/bc.c:141 +msgid "Plessey" +msgstr "" + +#: src/label.c:569 +msgid "Untitled" +msgstr "Nepojmenovaný" + +#: src/xml-label.c:176 src/xml-label.c:213 +msgid "xmlParseFile error" +msgstr "chyba (xmlParseFile)" + +#: src/xml-label.c:250 +msgid "No document root" +msgstr "" + +#: src/xml-label.c:264 +msgid "Importing from glabels 0.1 format" +msgstr "Importuji formát glabels verze 0.1" + +#: src/xml-label.c:272 +msgid "Importing from glabels 0.4 format" +msgstr "Importuji formát glabels verze 0.4" + +#: src/xml-label.c:279 +msgid "Importing from glabels 1.91 format" +msgstr "Importuji formát glabels verze 1.91" + +#: src/xml-label.c:282 +msgid "bad document, unknown glabels Namespace" +msgstr "" + +#: src/xml-label.c:311 src/xml-label-04.c:75 src/xml-label-191.c:131 +#, c-format +msgid "Bad root node = \"%s\"" +msgstr "" + +#: src/xml-label.c:348 src/xml-label-191.c:165 +#, c-format +msgid "bad node in Document node = \"%s\"" +msgstr "" + +#: src/xml-label.c:393 src/xml-label-04.c:123 src/xml-label-191.c:197 +#, c-format +msgid "bad node = \"%s\"" +msgstr "" + +#: src/xml-label.c:796 src/xml-label-191.c:605 +#, c-format +msgid "bad node in Data node = \"%s\"" +msgstr "" + +#: src/xml-label.c:962 libglabels/xml-template.c:535 +msgid "Utf8 conversion error." +msgstr "Chyba při konverzi UTF-8" + +#: src/xml-label.c:969 libglabels/xml-template.c:542 +msgid "Problem saving xml file." +msgstr "Problém s ukládáním dat do xml." + +#. This should always be an id, but just in case a name +#. slips by! +#: src/xml-label-191.c:680 libglabels/xml-template.c:199 +#, c-format +msgid "Unknown page size id \"%s\", trying as name" +msgstr "" + +#: src/xml-label-191.c:690 libglabels/xml-template.c:209 +#, c-format +msgid "Unknown page size id or name \"%s\"" +msgstr "" + +#: src/merge.c:172 src/merge.c:213 src/merge.c:399 src/merge.c:402 +msgid "None" +msgstr "Žádný" + +#: src/merge-init.c:53 +msgid "Text file with comma delimeters (CSV)" +msgstr "Text se středníky jako oddělovači sloupců (CSV)" + +#: src/merge-init.c:60 +msgid "Text file with colon delimeters" +msgstr "Text s dvojtečkami jako oddělovači sloupců" + +#: src/merge-init.c:67 +msgid "Text file with tab delimeters" +msgstr "Text s tabulátory jako oddělovači sloupců" + +#: src/wdgt-image-select.c:201 data/glade/object-editor.glade.h:11 +msgid "File:" +msgstr "Soubor:" + +#: src/wdgt-image-select.c:245 data/glade/object-editor.glade.h:16 +msgid "Key:" +msgstr "Klíč:" + +#: src/wdgt-print-copies.c:179 +msgid "Sheets:" +msgstr "Stránky:" + +#: src/wdgt-print-copies.c:197 +msgid "Labels" +msgstr "Etikety" + +#: src/wdgt-print-copies.c:200 +msgid "from:" +msgstr "od:" + +#: src/wdgt-print-copies.c:207 +msgid "to:" +msgstr "komu:" + +#: src/wdgt-print-merge.c:178 +msgid "Start on label" +msgstr "Začít na etiketě" + +#: src/wdgt-print-merge.c:186 +msgid "on 1st sheet" +msgstr "na první stránce" + +#: src/wdgt-print-merge.c:195 +msgid "Copies:" +msgstr "Kopie:" + +#: src/wdgt-print-merge.c:201 +msgid "Collate" +msgstr "Shromáždit" + +#: src/wdgt-media-select.c:269 data/glade/template-designer.glade.h:29 +msgid "Description:" +msgstr "Popis:" + +#: src/wdgt-media-select.c:279 data/glade/template-designer.glade.h:53 +msgid "Page size:" +msgstr "Velikost stránky:" + +#: src/wdgt-media-select.c:290 +msgid "Label size:" +msgstr "Velikost etikety:" + +#: src/wdgt-media-select.c:301 +msgid "Layout:" +msgstr "Rozvržení:" + +#: src/wdgt-media-select.c:578 +#, c-format +msgid "%d x %d (%d per sheet)" +msgstr "%d x %d (%d na stránku)" + +#: src/wdgt-media-select.c:582 +#, c-format +msgid "%d per sheet" +msgstr "%d na stránku" + +#: src/wdgt-media-select.c:614 +#, c-format +msgid "%s x %s %s" +msgstr "%s x %s %s" + +#: src/wdgt-media-select.c:619 +#, c-format +msgid "%.5g x %.5g %s" +msgstr "%.5g x %.5g %s" + +#: src/wdgt-media-select.c:630 src/wdgt-media-select.c:644 +#, c-format +msgid "%s %s diameter" +msgstr "%s %s průměr" + +#: src/wdgt-media-select.c:634 src/wdgt-media-select.c:648 +#, c-format +msgid "%.5g %s diameter" +msgstr "%.5g %s průměr" + +#: src/wdgt-rotate-label.c:193 +msgid "Rotate" +msgstr "Rotovat" + +#. This is the default custom color +#: src/mygal/color-palette.c:396 +msgid "custom" +msgstr "vlastní" + +#. "Custom" color - we'll pop up a GnomeColorPicker +#: src/mygal/color-palette.c:438 +msgid "Custom Color:" +msgstr "Vlastní barva" + +#: src/mygal/color-palette.c:446 +msgid "Choose Custom Color" +msgstr "Vyberte vlastní barvu" + +#: src/mygal/color-palette.c:579 +msgid "black" +msgstr "černá" + +#: src/mygal/color-palette.c:580 +msgid "light brown" +msgstr "světle hnědá" + +#: src/mygal/color-palette.c:581 +msgid "brown gold" +msgstr "zlatohnědá" + +#: src/mygal/color-palette.c:582 +msgid "dark green #2" +msgstr "tmavě zelená #2" + +#: src/mygal/color-palette.c:583 +msgid "navy" +msgstr "námořnická modř" + +#: src/mygal/color-palette.c:584 src/mygal/color-palette.c:640 +msgid "dark blue" +msgstr "tmavě modrá" + +#: src/mygal/color-palette.c:585 +msgid "purple #2" +msgstr "purpurová #2" + +#: src/mygal/color-palette.c:586 +msgid "very dark gray" +msgstr "velmi tmavě Å¡edá" + +#: src/mygal/color-palette.c:589 src/mygal/color-palette.c:645 +msgid "dark red" +msgstr "tmavě červená" + +#: src/mygal/color-palette.c:590 +msgid "red-orange" +msgstr "červenooranžová" + +#: src/mygal/color-palette.c:591 +msgid "gold" +msgstr "zlatá" + +#: src/mygal/color-palette.c:592 +msgid "dark green" +msgstr "tmavě zelená" + +#: src/mygal/color-palette.c:593 src/mygal/color-palette.c:646 +msgid "dull blue" +msgstr "mdlá modř" + +#: src/mygal/color-palette.c:594 src/mygal/color-palette.c:647 +msgid "blue" +msgstr "modrá" + +#: src/mygal/color-palette.c:595 +msgid "dull purple" +msgstr "mdlý purpur" + +#: src/mygal/color-palette.c:596 +msgid "dark grey" +msgstr "tmavě Å¡edá" + +#: src/mygal/color-palette.c:599 +msgid "red" +msgstr "červená" + +#: src/mygal/color-palette.c:600 +msgid "orange" +msgstr "oranžová" + +#: src/mygal/color-palette.c:601 +msgid "lime" +msgstr "citrónová" + +#: src/mygal/color-palette.c:602 +msgid "dull green" +msgstr "mdlá zeleň" + +#: src/mygal/color-palette.c:603 +msgid "dull blue #2" +msgstr "mdlá modř #2" + +#: src/mygal/color-palette.c:604 +msgid "sky blue #2" +msgstr "nebeská modř #2" + +#: src/mygal/color-palette.c:605 src/mygal/color-palette.c:644 +msgid "purple" +msgstr "purpurová" + +#: src/mygal/color-palette.c:606 +msgid "gray" +msgstr "Å¡edá" + +#: src/mygal/color-palette.c:609 src/mygal/color-palette.c:641 +msgid "magenta" +msgstr "fialová" + +#: src/mygal/color-palette.c:610 +msgid "bright orange" +msgstr "jasně oranžová" + +#: src/mygal/color-palette.c:611 src/mygal/color-palette.c:642 +msgid "yellow" +msgstr "žludá" + +#: src/mygal/color-palette.c:612 +msgid "green" +msgstr "zelená" + +#: src/mygal/color-palette.c:613 src/mygal/color-palette.c:643 +msgid "cyan" +msgstr "azurová" + +#: src/mygal/color-palette.c:614 +msgid "bright blue" +msgstr "jasně modrá" + +#: src/mygal/color-palette.c:615 src/mygal/color-palette.c:632 +msgid "red purple" +msgstr "červenofialová" + +#: src/mygal/color-palette.c:616 +msgid "light grey" +msgstr "světle Å¡edá" + +#: src/mygal/color-palette.c:619 src/mygal/color-palette.c:636 +msgid "pink" +msgstr "růžová" + +#: src/mygal/color-palette.c:620 +msgid "light orange" +msgstr "světle oranžová" + +#: src/mygal/color-palette.c:621 src/mygal/color-palette.c:633 +msgid "light yellow" +msgstr "světle žlutá" + +#: src/mygal/color-palette.c:622 +msgid "light green" +msgstr "světle zelená" + +#: src/mygal/color-palette.c:623 +msgid "light cyan" +msgstr "světle azurová" + +#: src/mygal/color-palette.c:624 src/mygal/color-palette.c:634 +msgid "light blue" +msgstr "světle modrá" + +#: src/mygal/color-palette.c:625 src/mygal/color-palette.c:638 +msgid "light purple" +msgstr "světle purpurová" + +#: src/mygal/color-palette.c:626 +msgid "white" +msgstr "bílá" + +#: src/mygal/color-palette.c:631 +msgid "purplish blue" +msgstr "fialovomodrá" + +#: src/mygal/color-palette.c:635 +msgid "dark purple" +msgstr "tmavě purpurová" + +#: src/mygal/color-palette.c:637 +msgid "sky blue" +msgstr "nebeská modř" + +#: libglabels/template.c:848 +#, c-format +msgid "Generic %s full page" +msgstr "" + +#: libglabels/template.c:897 +msgid "No template files found!" +msgstr "Nenalezeny Å¡ablony!" + +#. Create and append an "Other" entry. +#: libglabels/paper.c:67 +msgid "Other" +msgstr "Jiné" + +#: libglabels/paper.c:361 +msgid "No paper files found!" +msgstr "" + +#: data/ui/glabels-ui.xml.h:1 +msgid "About glabels" +msgstr "O programu glabels" + +#: data/ui/glabels-ui.xml.h:2 +msgid "About..." +msgstr "O programu" + +#: data/ui/glabels-ui.xml.h:3 +msgid "Align _Horizontal" +msgstr "Zarovnat _vodorovně" + +#: data/ui/glabels-ui.xml.h:4 +msgid "Align _Vertical" +msgstr "Zarovnat _svisle" + +#: data/ui/glabels-ui.xml.h:5 +msgid "Align objects to bottoms" +msgstr "Zarovnat objekty dolů" + +#: data/ui/glabels-ui.xml.h:6 +msgid "Align objects to horizontal centers" +msgstr "Zarovnat objekty vodorovně na střed" + +#: data/ui/glabels-ui.xml.h:7 +msgid "Align objects to left edges" +msgstr "Zarovnat objekty dle levého kraje" + +#: data/ui/glabels-ui.xml.h:8 +msgid "Align objects to right edges" +msgstr "Zarovnat objekty dle pravého kraje" + +#: data/ui/glabels-ui.xml.h:9 +msgid "Align objects to tops" +msgstr "Zarovnat objekty nahoru" + +#: data/ui/glabels-ui.xml.h:10 +msgid "Align objects to vertical centers" +msgstr "Zarovnat objekty svisle na střed" + +#: data/ui/glabels-ui.xml.h:12 +msgid "Bold" +msgstr "Tučně" + +#: data/ui/glabels-ui.xml.h:14 +msgid "Center align" +msgstr "Na střed" + +#: data/ui/glabels-ui.xml.h:15 +msgid "Center objects to horizontal label center" +msgstr "Vycentrovat objekty vodorovně na střed etikety" + +#: data/ui/glabels-ui.xml.h:16 +msgid "Center objects to vertical label center" +msgstr "Vycentrovat objekty svisle na střed etikety" + +#: data/ui/glabels-ui.xml.h:17 +msgid "Change the visibility of markup lines in the current window" +msgstr "Změnit viditelnost hraničních čar v okně" + +#: data/ui/glabels-ui.xml.h:18 +msgid "Change the visibility of the drawing toolbar in the current window" +msgstr "Změnit viditelnost panelu kreslení v okně" + +#: data/ui/glabels-ui.xml.h:19 +msgid "Change the visibility of the grid in the current window" +msgstr "Změnit viditelnost mřížky v okně" + +#: data/ui/glabels-ui.xml.h:20 +msgid "Change the visibility of the main toolbar in the current window" +msgstr "Změnit viditelnost hlavního panelu nástrojů v okně" + +#: data/ui/glabels-ui.xml.h:21 +msgid "Change the visibility of the property toolbar in the current window" +msgstr "Změnit viditelnost panelu vlastností v okně" + +#: data/ui/glabels-ui.xml.h:22 +msgid "Close" +msgstr "Zavřít" + +#: data/ui/glabels-ui.xml.h:23 +msgid "Close the current file" +msgstr "Zavřít tento soubor" + +#: data/ui/glabels-ui.xml.h:24 +msgid "Configure the application" +msgstr "Konfigurovat aplikaci" + +#: data/ui/glabels-ui.xml.h:25 +msgid "Contents" +msgstr "Obsah" + +#: data/ui/glabels-ui.xml.h:26 +msgid "Copy" +msgstr "Kopírovat" + +#: data/ui/glabels-ui.xml.h:27 +msgid "Copy the selection" +msgstr "Kopírovat výběr" + +#: data/ui/glabels-ui.xml.h:28 +msgid "Create a custom template" +msgstr "Vytvořit vlastní Å¡ablonu" + +#: data/ui/glabels-ui.xml.h:29 +msgid "Create a new document" +msgstr "Vytvořit nový dokument" + +#: data/ui/glabels-ui.xml.h:30 +msgid "Create barcode object" +msgstr "Vložit čárový kód" + +#: data/ui/glabels-ui.xml.h:31 +msgid "Create box/rectangle object" +msgstr "Vytvořit čtverec/obdélník" + +#: data/ui/glabels-ui.xml.h:32 +msgid "Create ellipse/circle object" +msgstr "Vytvořit elipsu/kruh" + +#: data/ui/glabels-ui.xml.h:33 +msgid "Create image object" +msgstr "Vložit obrázek" + +#: data/ui/glabels-ui.xml.h:34 +msgid "Create line object" +msgstr "Vložit čáru" + +#: data/ui/glabels-ui.xml.h:35 +msgid "Create text object" +msgstr "Vložit text" + +#: data/ui/glabels-ui.xml.h:36 +msgid "Cu_t" +msgstr "_Vyjmout" + +#: data/ui/glabels-ui.xml.h:37 +msgid "Customize" +msgstr "Přizpůsobit" + +#: data/ui/glabels-ui.xml.h:38 +msgid "Customize Drawing Toolbar" +msgstr "Přizpůsobit panel kreslení" + +#: data/ui/glabels-ui.xml.h:39 +msgid "Customize Main Toolbar" +msgstr "Přizpůsobit hlavní panel" + +#: data/ui/glabels-ui.xml.h:40 +msgid "Customize Property Toolbar" +msgstr "Přizpůsobit panel vlastností" + +#: data/ui/glabels-ui.xml.h:41 +msgid "Customize toolbars" +msgstr "Přizpůsobit panely" + +#: data/ui/glabels-ui.xml.h:42 +msgid "Cut" +msgstr "Vyjmout" + +#: data/ui/glabels-ui.xml.h:43 +msgid "Cut the selection" +msgstr "Vyjmout výběr" + +#: data/ui/glabels-ui.xml.h:44 +msgid "Decrease magnification" +msgstr "ZmenÅ¡it" + +#: data/ui/glabels-ui.xml.h:45 +msgid "Delete" +msgstr "Smazat" + +#: data/ui/glabels-ui.xml.h:46 +msgid "Delete the selected objects" +msgstr "Smazat vybrané objekty" + +#: data/ui/glabels-ui.xml.h:47 +msgid "Drawing toolbar" +msgstr "Panl kreslení" + +#: data/ui/glabels-ui.xml.h:48 +msgid "Dump XML" +msgstr "Vypsat XML" + +#: data/ui/glabels-ui.xml.h:49 +msgid "Dump the UI Xml description" +msgstr "Vypsat popis UI v XML" + +#: data/ui/glabels-ui.xml.h:50 +msgid "Edit merge properties" +msgstr "Upravit vlastnosti sloučení" + +#: data/ui/glabels-ui.xml.h:54 +msgid "Flip object horizontally" +msgstr "Převrátit objekt vodorovně" + +#: data/ui/glabels-ui.xml.h:55 +msgid "Flip object vertically" +msgstr "Převrátit objekt svisle" + +#: data/ui/glabels-ui.xml.h:56 +msgid "Font name" +msgstr "Název fontu" + +#: data/ui/glabels-ui.xml.h:57 +msgid "Font selector" +msgstr "Výběr fontu" + +#: data/ui/glabels-ui.xml.h:58 +msgid "Font size" +msgstr "Velikost fontu" + +#: data/ui/glabels-ui.xml.h:59 +msgid "Icon and _Text" +msgstr "Ikony a text" + +#: data/ui/glabels-ui.xml.h:60 +msgid "Increase magnification" +msgstr "ZvětÅ¡it" + +#: data/ui/glabels-ui.xml.h:61 +msgid "Italic" +msgstr "Kurzíva" + +#: data/ui/glabels-ui.xml.h:63 +msgid "Left align" +msgstr "Nalevo" + +#: data/ui/glabels-ui.xml.h:65 +msgid "Line width" +msgstr "Šířka čáry" + +#: data/ui/glabels-ui.xml.h:66 +msgid "Lower object to bottom" +msgstr "Poslat objekt dozadu" + +#: data/ui/glabels-ui.xml.h:67 +msgid "M_arkup" +msgstr "Ohraničení" + +#: data/ui/glabels-ui.xml.h:68 +msgid "Main toolbar" +msgstr "Hlavní panel" + +#: data/ui/glabels-ui.xml.h:69 +msgid "Markup" +msgstr "Ohraničení" + +#: data/ui/glabels-ui.xml.h:70 +msgid "Modify document properties" +msgstr "Upravit vlastnosti dokumentu" + +#: data/ui/glabels-ui.xml.h:71 +msgid "New" +msgstr "Nový" + +#: data/ui/glabels-ui.xml.h:72 +msgid "Object property editor" +msgstr "Editor vlastností objektu" + +#: data/ui/glabels-ui.xml.h:73 +msgid "Only show icons in the main toolbar" +msgstr "Zobraz v hlavním panelu jen ikony" + +#: data/ui/glabels-ui.xml.h:75 +msgid "Open a file" +msgstr "Otevřít soubor" + +#: data/ui/glabels-ui.xml.h:76 +msgid "Open the glabels manual" +msgstr "Otevřít mauál programu" + +#: data/ui/glabels-ui.xml.h:77 +msgid "Paste" +msgstr "Vložit" + +#: data/ui/glabels-ui.xml.h:78 +msgid "Paste the clipboard" +msgstr "Vložit ze schránky" + +#: data/ui/glabels-ui.xml.h:79 +msgid "Pr_eferences..." +msgstr "_Nastavení" + +#: data/ui/glabels-ui.xml.h:80 +msgid "Preferences" +msgstr "Nastavení" + +#: data/ui/glabels-ui.xml.h:82 +msgid "Print the current file" +msgstr "Tisk tohoto souboru" + +#: data/ui/glabels-ui.xml.h:83 +msgid "Proper_ties..." +msgstr "Nas_tavení..." + +#: data/ui/glabels-ui.xml.h:84 +msgid "Properties" +msgstr "Nastavení" + +#: data/ui/glabels-ui.xml.h:85 +msgid "Property toolbar" +msgstr "Panel vlastností" + +#: data/ui/glabels-ui.xml.h:86 +msgid "Quit" +msgstr "Konec" + +#: data/ui/glabels-ui.xml.h:87 +msgid "Quit the program" +msgstr "Ukončit program" + +#: data/ui/glabels-ui.xml.h:88 +msgid "Raise object to top" +msgstr "Vynést objekt dopředu" + +#: data/ui/glabels-ui.xml.h:89 +msgid "Recent _Files" +msgstr "Otevřít nedávné" + +#: data/ui/glabels-ui.xml.h:90 +msgid "Redo" +msgstr "Znovu" + +#: data/ui/glabels-ui.xml.h:91 +msgid "Redo the undone action" +msgstr "Provést znovu vrácenou akci" + +#: data/ui/glabels-ui.xml.h:92 +msgid "Remove all selections" +msgstr "Odstranit vÅ¡echna označení" + +#: data/ui/glabels-ui.xml.h:94 +#, no-c-format +msgid "Restore scale to 100%" +msgstr "Vrátit měřítko na 100%" + +#: data/ui/glabels-ui.xml.h:95 +msgid "Right align" +msgstr "Napravo" + +#: data/ui/glabels-ui.xml.h:98 +msgid "Rotate object 90 clockwise" +msgstr "Otočit objekt o 90° po směru hodinových ručiček" + +#: data/ui/glabels-ui.xml.h:99 +msgid "Rotate object 90 counter-clockwise" +msgstr "Otočit objekt o 90° proti směru hodinových ručiček" + +#: data/ui/glabels-ui.xml.h:100 +msgid "Save" +msgstr "Uložit" + +#: data/ui/glabels-ui.xml.h:101 +msgid "Save As" +msgstr "Uložit jako" + +#: data/ui/glabels-ui.xml.h:102 +msgid "Save _As..." +msgstr "Uložit _jako..." + +#: data/ui/glabels-ui.xml.h:103 +msgid "Save the current file" +msgstr "Uložit tento soubor" + +#: data/ui/glabels-ui.xml.h:104 +msgid "Save the current file with a different name" +msgstr "Uložit tento soubor s jiným jménem" + +#: data/ui/glabels-ui.xml.h:105 +msgid "Select All" +msgstr "Vybrat vÅ¡e" + +#: data/ui/glabels-ui.xml.h:106 +msgid "Select _All" +msgstr "Vybr_at vÅ¡e" + +#: data/ui/glabels-ui.xml.h:107 +msgid "Select all objects" +msgstr "Vybrat vÅ¡echny objekty" + +#: data/ui/glabels-ui.xml.h:108 +msgid "Select, move and modify objects" +msgstr "Označení, posun a změna objektů" + +#: data/ui/glabels-ui.xml.h:110 +msgid "Set main toolbar button style according to desktop default" +msgstr "" +"Nastavit tlačítka na hlavním panelu stejně jako je základní nastavení " +"prostředí" + +#: data/ui/glabels-ui.xml.h:111 +msgid "Show _Tooltips" +msgstr "Ukazovat tipy" + +#: data/ui/glabels-ui.xml.h:112 +msgid "Show both icons and texts in the main toolbar" +msgstr "Zobrazit ikony a popisy v hlavní nástrojové liÅ¡tě" + +#: data/ui/glabels-ui.xml.h:113 +msgid "Show tooltips in the drawing toolbar" +msgstr "Ukazovat tipy v panelu kreslení" + +#: data/ui/glabels-ui.xml.h:114 +msgid "Show tooltips in the main toolbar" +msgstr "Ukazovat tipy v hlavním panelu" + +#: data/ui/glabels-ui.xml.h:115 +msgid "Show tooltips in the property toolbar" +msgstr "Ukazovat tipy v panelu vlastností" + +#: data/ui/glabels-ui.xml.h:116 +msgid "Template Designer" +msgstr "Návrhář Å¡ablon" + +#: data/ui/glabels-ui.xml.h:117 +msgid "Template _Designer..." +msgstr "Návrhář Å¡_ablon..." + +#: data/ui/glabels-ui.xml.h:118 +msgid "Text color" +msgstr "Barva textu" + +#: data/ui/glabels-ui.xml.h:119 +msgid "U_n-select All" +msgstr "Odz_načit vÅ¡e" + +#: data/ui/glabels-ui.xml.h:120 +msgid "Un-select All" +msgstr "Odznačit vÅ¡e" + +#: data/ui/glabels-ui.xml.h:121 +msgid "Undo" +msgstr "Zpět" + +#: data/ui/glabels-ui.xml.h:122 +msgid "Undo the last action" +msgstr "Vrátit o akci zpět" + +#: data/ui/glabels-ui.xml.h:123 +msgid "Zoom _1:1" +msgstr "ZvětÅ¡ení 1:1" + +#: data/ui/glabels-ui.xml.h:124 +msgid "Zoom _In" +msgstr "ZvětÅ¡it" + +#: data/ui/glabels-ui.xml.h:125 +msgid "Zoom _Out" +msgstr "ZmenÅ¡it" + +#: data/ui/glabels-ui.xml.h:126 +msgid "Zoom to _fit" +msgstr "Přizpůsobit velikosti" + +#: data/ui/glabels-ui.xml.h:127 +msgid "Zoom to fit window" +msgstr "Přizpůsobit velikosti okna" + +#: data/ui/glabels-ui.xml.h:128 +msgid "_About..." +msgstr "_O programu..." + +#: data/ui/glabels-ui.xml.h:129 +msgid "_Bottoms" +msgstr "Naspod" + +#: data/ui/glabels-ui.xml.h:132 +msgid "_Close" +msgstr "_Zavřít" + +#: data/ui/glabels-ui.xml.h:133 +msgid "_Contents" +msgstr "_Obsah" + +#: data/ui/glabels-ui.xml.h:134 +msgid "_Copy" +msgstr "_Kopírovat" + +#: data/ui/glabels-ui.xml.h:135 +msgid "_Create Object" +msgstr "_Vytvořit objekt" + +#: data/ui/glabels-ui.xml.h:136 +msgid "_Debug" +msgstr "_Debugování" + +#: data/ui/glabels-ui.xml.h:138 +msgid "_Desktop Default" +msgstr "Přednastavení prostředí" + +#: data/ui/glabels-ui.xml.h:139 +msgid "_Drawing Toolbar" +msgstr "Panel _kreslení" + +#: data/ui/glabels-ui.xml.h:140 +msgid "_Edit" +msgstr "_Upravit" + +#: data/ui/glabels-ui.xml.h:142 +msgid "_File" +msgstr "_Soubor" + +#: data/ui/glabels-ui.xml.h:143 +msgid "_Grid" +msgstr "_Mřížka" + +#: data/ui/glabels-ui.xml.h:144 +msgid "_Help" +msgstr "_Nápověda" + +#: data/ui/glabels-ui.xml.h:145 +msgid "_Icon" +msgstr "_Ikona" + +#: data/ui/glabels-ui.xml.h:149 +msgid "_Main Toolbar" +msgstr "_Hlavní panel" + +#: data/ui/glabels-ui.xml.h:150 +msgid "_Merge Properties..." +msgstr "Nastavení sloučení" + +#: data/ui/glabels-ui.xml.h:151 +msgid "_New" +msgstr "_Nový" + +#: data/ui/glabels-ui.xml.h:152 +msgid "_Objects" +msgstr "_Objekty" + +#: data/ui/glabels-ui.xml.h:153 +msgid "_Open..." +msgstr "_Otevřít" + +#: data/ui/glabels-ui.xml.h:155 +msgid "_Paste" +msgstr "Vl_ožit" + +#: data/ui/glabels-ui.xml.h:156 +msgid "_Print..." +msgstr "_Tisk..." + +#: data/ui/glabels-ui.xml.h:157 +msgid "_Property Toolbar" +msgstr "Panel _vlastností" + +#: data/ui/glabels-ui.xml.h:158 +msgid "_Quit" +msgstr "_Konec" + +#: data/ui/glabels-ui.xml.h:161 +msgid "_Save" +msgstr "_Uložit" + +#: data/ui/glabels-ui.xml.h:165 +msgid "_View" +msgstr "_Zobrazit" + +#: data/glade/prefs-dialog.glade.h:1 +msgid " " +msgstr "" + +#: data/glade/prefs-dialog.glade.h:2 data/glade/object-editor.glade.h:1 +#: data/glade/template-designer.glade.h:5 +msgid "*" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:3 +msgid "Default page size" +msgstr "Výchozí velikost stránky" + +#: data/glade/prefs-dialog.glade.h:4 +msgid "Fill" +msgstr "Výplň" + +#: data/glade/prefs-dialog.glade.h:5 +msgid "Line" +msgstr "Čára" + +#: data/glade/prefs-dialog.glade.h:6 +msgid "Text" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:7 +msgid "Units" +msgstr "Jednotky" + +#: data/glade/prefs-dialog.glade.h:8 data/glade/object-editor.glade.h:4 +msgid "Alignment:" +msgstr "Zarovnání:" + +#: data/glade/prefs-dialog.glade.h:9 data/glade/object-editor.glade.h:8 +msgid "Color:" +msgstr "Barva:" + +#: data/glade/prefs-dialog.glade.h:10 +msgid "Font:" +msgstr "Font:" + +#: data/glade/prefs-dialog.glade.h:11 +msgid "ISO A4" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:12 +msgid "Inches" +msgstr "Palce" + +#: data/glade/prefs-dialog.glade.h:13 data/glade/object-editor.glade.h:19 +msgid "Line Spacing:" +msgstr "Řádkování:" + +#: data/glade/prefs-dialog.glade.h:14 +msgid "Locale" +msgstr "Místní zvyklosti" + +#: data/glade/prefs-dialog.glade.h:15 +msgid "Millimeters" +msgstr "Milimetry" + +#: data/glade/prefs-dialog.glade.h:16 +msgid "Object defaults" +msgstr "Výchozí hodnoty objektu" + +#: data/glade/prefs-dialog.glade.h:17 +msgid "Points" +msgstr "Body" + +#: data/glade/prefs-dialog.glade.h:18 +msgid "Select default properties for new objects." +msgstr "Vyberte výchozí nastavení pro nové objekty" + +#: data/glade/prefs-dialog.glade.h:19 +msgid "Select locale specific behavior." +msgstr "Zvolte specifické chování pro místní zvyklosti." + +#. Most popular (at top of list) +#: data/glade/prefs-dialog.glade.h:20 data/templates/paper-sizes.xml.h:29 +msgid "US Letter" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:21 data/glade/object-editor.glade.h:29 +#: data/glade/template-designer.glade.h:72 +msgid "Width:" +msgstr "Šířka:" + +#: data/glade/object-editor.glade.h:2 +msgid "00000000000 00000" +msgstr "" + +#: data/glade/object-editor.glade.h:3 +msgid "Xxx object properties" +msgstr "Vlastnosti objektu xxx" + +#: data/glade/object-editor.glade.h:5 +msgid "Allow merge to automatically shrink text" +msgstr "Při sloučení povolit automatické smrÅ¡tění textu" + +#: data/glade/object-editor.glade.h:6 +msgid "Angle:" +msgstr "Úhel:" + +#: data/glade/object-editor.glade.h:7 +msgid "Checksum" +msgstr "Kontrolní součet" + +#: data/glade/object-editor.glade.h:10 +msgid "Family:" +msgstr "Rodina:" + +#: data/glade/object-editor.glade.h:12 +msgid "Fill" +msgstr "Výplň" + +#: data/glade/object-editor.glade.h:13 data/glade/template-designer.glade.h:33 +msgid "Height:" +msgstr "Výška:" + +#: data/glade/object-editor.glade.h:14 +msgid "Image" +msgstr "Obrázek" + +#: data/glade/object-editor.glade.h:15 +msgid "Insert merge field" +msgstr "Vložit pole pro sloučení" + +#: data/glade/object-editor.glade.h:17 +msgid "Length:" +msgstr "Délka:" + +#: data/glade/object-editor.glade.h:18 +msgid "Line" +msgstr "Čára" + +#: data/glade/object-editor.glade.h:20 +msgid "Literal:" +msgstr "Písmena:" + +#: data/glade/object-editor.glade.h:21 +msgid "Load image" +msgstr "Načíst obrázek" + +#: data/glade/object-editor.glade.h:22 +msgid "Position" +msgstr "Pozice" + +#: data/glade/object-editor.glade.h:23 +msgid "Reset image size" +msgstr "Resetovat velikost obrázku" + +#: data/glade/object-editor.glade.h:24 +msgid "Size" +msgstr "Velikost" + +#: data/glade/object-editor.glade.h:25 +msgid "Size:" +msgstr "Velikost:" + +#: data/glade/object-editor.glade.h:26 +msgid "Style" +msgstr "Styl" + +#: data/glade/object-editor.glade.h:27 +msgid "Style:" +msgstr "Styl:" + +#: data/glade/object-editor.glade.h:30 +msgid "X:" +msgstr "X:" + +#: data/glade/object-editor.glade.h:31 +msgid "Y:" +msgstr "Y:" + +#: data/glade/object-editor.glade.h:32 +msgid "degrees" +msgstr "stupně" + +#: data/glade/object-editor.glade.h:33 +msgid "dialog1" +msgstr "" + +#: data/glade/object-editor.glade.h:34 +msgid "digits:" +msgstr "číslic:" + +#: data/glade/object-editor.glade.h:35 +msgid "format:" +msgstr "formát:" + +#: data/glade/template-designer.glade.h:1 +msgid " " +msgstr "" + +#: data/glade/template-designer.glade.h:2 +msgid "(e.g., \"Mailing Labels,\" \"Business Cards,\" ...)" +msgstr "(např. \"Adresní Å¡títky,\" \"Vizitky,\" ...)" + +#: data/glade/template-designer.glade.h:3 +msgid "(e.g., 8163A)" +msgstr "(např. 8163A)" + +#: data/glade/template-designer.glade.h:4 +msgid "(e.g., Avery, Acme, ...)" +msgstr "(např. Avery, Acme, ...)" + +#: data/glade/template-designer.glade.h:6 +msgid "1. Outer radius:" +msgstr "1. Vnější poloměr:" + +#: data/glade/template-designer.glade.h:7 +msgid "1. Radius:" +msgstr "1. Poloměr:" + +#: data/glade/template-designer.glade.h:8 +msgid "1. Width:" +msgstr "1. Šířka:" + +#: data/glade/template-designer.glade.h:9 +msgid "2. Height:" +msgstr "2. Výška:" + +#: data/glade/template-designer.glade.h:10 +msgid "2. Inner radius:" +msgstr "2. Vnitřní poloměr:" + +#: data/glade/template-designer.glade.h:11 +msgid "2. Waste (overprint allowed):" +msgstr "2. Odsazení (povolený přetisk):" + +#: data/glade/template-designer.glade.h:12 +msgid "3. Clipping width:" +msgstr "3. Šířka výstřižku:" + +#: data/glade/template-designer.glade.h:13 +msgid "3. Margin" +msgstr "3. Okraj" + +#: data/glade/template-designer.glade.h:14 +msgid "3. Round (radius of corner):" +msgstr "3. Zaoblení (poloměr rohu):" + +#: data/glade/template-designer.glade.h:15 +msgid "4. Clipping height:" +msgstr "4. Výška výstřižku:" + +#: data/glade/template-designer.glade.h:16 +msgid "4. Horiz. waste (overprint allowed):" +msgstr "4. Horizontální odsazení (povolený přetisk):" + +#: data/glade/template-designer.glade.h:17 +msgid "5. Vert. waste (overprint allowed):" +msgstr "5. Vert. odsazení (povolený přetisk):" + +#: data/glade/template-designer.glade.h:18 +msgid "5. Waste (overprint allowed):" +msgstr "5. Odsazení (povolený přetisk):" + +#: data/glade/template-designer.glade.h:19 +msgid "6. Margin" +msgstr "6. Okraj" + +#: data/glade/template-designer.glade.h:20 +msgid "Brand/Manufacturer:" +msgstr "Značka/Výrobce:" + +#: data/glade/template-designer.glade.h:21 +msgid "CD/DVD (including credit card CDs)" +msgstr "CD/DVD (včetně vizitkových CD)" + +#: data/glade/template-designer.glade.h:22 +msgid "" +"Congratulations!\n" +"\n" +"You have completed the gLabels Template Designer.\n" +"If you wish to accept and save your design, click \"Apply.\"\n" +"\n" +"Otherwise, you may click \"Cancel\" to abandon your design\n" +"or \"Back\" to continue editing this design." +msgstr "" +"Gratulujeme!\n" +"\n" +"Dokončili jste návrh Å¡ablony gLabels.\n" +"Pokud si přejete návrh přijmout a uložit, klikněte na \"Použít\".\n" +"\n" +"Jinak klikněte na \"ZruÅ¡it\" pro zahození návrhu či na\n" +"\"Zpět\" pro další úpravy tohoto návrhu." + +#: data/glade/template-designer.glade.h:30 +msgid "Design Completed" +msgstr "Návrh byl dokončen" + +#: data/glade/template-designer.glade.h:31 +msgid "Distance from left edge (x0):" +msgstr "Vzdálenost od levého okraje (x0):" + +#: data/glade/template-designer.glade.h:32 +msgid "Distance from top edge (y0):" +msgstr "Vzdálenost od horního okraje (y0):" + +#: data/glade/template-designer.glade.h:34 +msgid "Horizontal pitch (dx):" +msgstr "Vodorovná rozteč (dx):" + +#: data/glade/template-designer.glade.h:35 +msgid "" +"How many layouts will your template contain? \n" +"\n" +"A layout is a set of labels or cards that can be arranged in a simple grid.\n" +"Most templates only need one layout, as in the first example.\n" +"The second example illustrates when two layouts are needed." +msgstr "" +"Kolik rozvržení obsahuje vaÅ¡e Å¡ablona? \n" +"\n" +"Rozvržení je sada etiket nebo vizitek, které mohou být uspořádány na\n" +"jednoduché mřížce. VětÅ¡ina Å¡ablon potřebuje jedno rozvržení jako v\n" +"prvním příkladu. Druhý příklad ilustruje dvě rozvržení." + +#: data/glade/template-designer.glade.h:40 +msgid "Label Size (CD/DVD)" +msgstr "Velikost etikety (CD/DVD)" + +#: data/glade/template-designer.glade.h:41 +msgid "Label Size (Round)" +msgstr "Velikost etikety (oválná)" + +#: data/glade/template-designer.glade.h:42 +msgid "Label or Card Shape" +msgstr "Tvar etikety či vizitky" + +#: data/glade/template-designer.glade.h:43 +msgid "Label or Card Size (Rectangular)" +msgstr "Velikost etikety či vizitky (obdélníková)" + +#: data/glade/template-designer.glade.h:44 +msgid "Layout #1" +msgstr "Rozvržení #1" + +#: data/glade/template-designer.glade.h:45 +msgid "Layout #2" +msgstr "Rozvržení #2" + +#: data/glade/template-designer.glade.h:46 +msgid "Layout(s)" +msgstr "Rozvržení" + +#: data/glade/template-designer.glade.h:47 +msgid "Name and Description" +msgstr "Název a popis" + +#: data/glade/template-designer.glade.h:48 +msgid "Number across (nx):" +msgstr "Počet napříč (nx):" + +#: data/glade/template-designer.glade.h:49 +msgid "Number down (ny):" +msgstr "Počet dolů (ny):" + +#: data/glade/template-designer.glade.h:50 +msgid "Number of Layouts" +msgstr "Počet rozvržení" + +#: data/glade/template-designer.glade.h:51 +msgid "Number of layouts:" +msgstr "Počet rozvržení:" + +#: data/glade/template-designer.glade.h:52 +msgid "Page Size" +msgstr "Velikost stránky" + +#: data/glade/template-designer.glade.h:54 +msgid "Part #:" +msgstr "Část #:" + +#: data/glade/template-designer.glade.h:55 +msgid "" +"Please enter the following identifying information about the template " +"stationery." +msgstr "" +"Vyplňte, prosím, následující informace o Å¡abloně." + +#: data/glade/template-designer.glade.h:56 +msgid "Please enter the following layout information." +msgstr "Vyplňte, prosím, následující informaci o rozvržení." + +#: data/glade/template-designer.glade.h:57 +msgid "" +"Please enter the following size parameters of a single label in your " +"template." +msgstr "" +"Vyplňte, prosím, následující parametry velikosti jedné etikety ve " +"vaší Å¡abloně." + +#: data/glade/template-designer.glade.h:58 +msgid "" +"Please enter the following size parameters of a single label or card in your " +"template." +msgstr "" +"Vyplňte, prosím, následující parametry velikosti jedné etikety nebo vizitky ve " +"vaší Å¡abloně." + +#: data/glade/template-designer.glade.h:59 +msgid "Please select the basic shape of the labels or cards." +msgstr "Vyberte, prosím, základní tvar etiket nebo vizitek." + +#: data/glade/template-designer.glade.h:60 +msgid "Please select the page size of the template stationery." +msgstr "Vyberte, prosím, velikost stránky Å¡ablony." + +#: data/glade/template-designer.glade.h:61 +msgid "Print test sheet" +msgstr "Vytisknout testovací stránku" + +#: data/glade/template-designer.glade.h:62 +msgid "Rectangular or square (can have rounded corners)" +msgstr "Obdélníkový nebo čtvercový (může mít zaoblené rohy)" + +#: data/glade/template-designer.glade.h:63 +msgid "Round" +msgstr "Oválný" + +#: data/glade/template-designer.glade.h:64 +msgid "" +"Templates needing\n" +"two layouts." +msgstr "" +"Å ablony, které potřebují\n" +"dvě rozvržení." + +#: data/glade/template-designer.glade.h:66 +msgid "" +"Templates needing only\n" +"one layout." +msgstr "" +"Å ablony, které potřebují\n" +"jedno rozvržení." + +#: data/glade/template-designer.glade.h:68 +msgid "Vertical pitch (dy):" +msgstr "Svislá rozteč (dy):" + +#: data/glade/template-designer.glade.h:69 +msgid "" +"Welcome to the gLabels Template Designer.\n" +"\n" +"This dialog will assist you in the creation of a custom gLabels template." +msgstr "" +"Vítejte v Návrháři Å¡ablon programu gLabels.\n" +"\n" +"Tento dialog vám pomůže při vytváření vlastní Å¡ablony gLabels." + +#. Other ISO A series sizes +#: data/templates/paper-sizes.xml.h:2 +msgid "A0" +msgstr "" + +#: data/templates/paper-sizes.xml.h:3 +msgid "A1" +msgstr "" + +#: data/templates/paper-sizes.xml.h:4 +msgid "A10" +msgstr "" + +#: data/templates/paper-sizes.xml.h:5 +msgid "A2" +msgstr "" + +#: data/templates/paper-sizes.xml.h:6 +msgid "A3" +msgstr "" + +#: data/templates/paper-sizes.xml.h:7 +msgid "A4" +msgstr "" + +#: data/templates/paper-sizes.xml.h:8 +msgid "A5" +msgstr "" + +#: data/templates/paper-sizes.xml.h:9 +msgid "A6" +msgstr "" + +#: data/templates/paper-sizes.xml.h:10 +msgid "A7" +msgstr "" + +#: data/templates/paper-sizes.xml.h:11 +msgid "A8" +msgstr "" + +#: data/templates/paper-sizes.xml.h:12 +msgid "A9" +msgstr "" + +#. ISO B series sizes +#: data/templates/paper-sizes.xml.h:14 +msgid "B0" +msgstr "" + +#: data/templates/paper-sizes.xml.h:15 +msgid "B1" +msgstr "" + +#: data/templates/paper-sizes.xml.h:16 +msgid "B10" +msgstr "" + +#: data/templates/paper-sizes.xml.h:17 +msgid "B2" +msgstr "" + +#: data/templates/paper-sizes.xml.h:18 +msgid "B3" +msgstr "" + +#: data/templates/paper-sizes.xml.h:19 +msgid "B4" +msgstr "" + +#: data/templates/paper-sizes.xml.h:20 +msgid "B5" +msgstr "" + +#: data/templates/paper-sizes.xml.h:21 +msgid "B6" +msgstr "" + +#: data/templates/paper-sizes.xml.h:22 +msgid "B7" +msgstr "" + +#: data/templates/paper-sizes.xml.h:23 +msgid "B8" +msgstr "" + +#: data/templates/paper-sizes.xml.h:24 +msgid "B9" +msgstr "" + +#: data/templates/paper-sizes.xml.h:25 +msgid "US Executive" +msgstr "" + +#. Other US paper sizes +#: data/templates/paper-sizes.xml.h:27 +msgid "US Legal" +msgstr "" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:2 +#: data/templates/zweckform-iso-templates.xml.h:2 +msgid "Address Labels" +msgstr "Adresní etikety" + +#. =================================================================== +#. ============================================================ +#. =================================================================== +#. ====================================================== +#: data/templates/avery-us-templates.xml.h:4 +#: data/templates/avery-iso-templates.xml.h:4 +#: data/templates/zweckform-iso-templates.xml.h:6 +#: data/templates/misc-us-templates.xml.h:3 +#: data/templates/misc-iso-templates.xml.h:17 +msgid "Business Cards" +msgstr "Vizitky" + +#: data/templates/avery-us-templates.xml.h:5 +msgid "CD/DVD Labels (Disc Labels)" +msgstr "" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:7 +msgid "Diskette Labels" +msgstr "Disketové etikety" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:9 +msgid "Filing Labels" +msgstr "" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:11 +msgid "Full Sheet Labels" +msgstr "" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:13 +msgid "Large Round Labels" +msgstr "Velké oválné etikety" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:15 +msgid "Name Badge Labels" +msgstr "" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:17 +msgid "Return Address Labels" +msgstr "Zpáteční adresa" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:19 +msgid "Shipping Labels" +msgstr "Dopravní etikety" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:21 +msgid "Small Round Labels" +msgstr "Malé oválné etikety" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:23 +msgid "Square Labels" +msgstr "Čtvercové etikety" + +#: data/templates/avery-us-templates.xml.h:24 +msgid "Video Tape Face Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:25 +msgid "Video Tape Spine Labels" +msgstr "" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:2 +msgid "Address labels" +msgstr "Adresní etikety" + +#. =============================================================== +#: data/templates/avery-iso-templates.xml.h:6 +msgid "CD Booklet" +msgstr "" + +#. =============================================================== +#: data/templates/avery-iso-templates.xml.h:8 +msgid "CD Inlet" +msgstr "" + +#. =============================================================== +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:10 +#: data/templates/zweckform-iso-templates.xml.h:8 +#: data/templates/misc-us-templates.xml.h:5 +#: data/templates/misc-iso-templates.xml.h:21 +msgid "CD/DVD Labels" +msgstr "CD/DVD etikety" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:12 +msgid "Diskette labels" +msgstr "Disketové etikety" + +#. =============================================================== +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:14 +#: data/templates/zweckform-iso-templates.xml.h:14 +#: data/templates/misc-iso-templates.xml.h:35 +msgid "Mailing Labels" +msgstr "PoÅ¡tovní etikety" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:16 +msgid "Mailing labels" +msgstr "PoÅ¡tovní etikety" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:18 +msgid "Mini Address Labels" +msgstr "" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:20 +msgid "Shipping labels" +msgstr "Dopravní etikety" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:4 +msgid "Allround Labels" +msgstr "" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:10 +msgid "Correction and Cover-up Labels" +msgstr "" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:12 +msgid "Lever Arch File Labels" +msgstr "" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:16 +msgid "QSL-Karten Etiketten 70mm x 50,8mm" +msgstr "" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:18 +msgid "Rectangular Copier Labels" +msgstr "" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:20 +#: data/templates/misc-iso-templates.xml.h:44 +msgid "Rectangular Labels" +msgstr "Obdélníkové etikety" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:22 +msgid "Video Labels (back)" +msgstr "Video etikety (zadní strana)" + +#: data/templates/misc-us-templates.xml.h:1 +msgid "Business Card CD" +msgstr "Vizitkové CD" + +#: data/templates/misc-us-templates.xml.h:4 +msgid "CD Template Rectangles" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:6 +msgid "CD/DVD Labels (Face Only)" +msgstr "" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:7 +#: data/templates/misc-iso-templates.xml.h:23 +msgid "CD/DVD Labels (face only)" +msgstr "" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:9 +msgid "Cassette Labels" +msgstr "Kazetové etikety" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:11 +msgid "DLT Labels" +msgstr "DLT etikety" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:13 +msgid "Microtube labels" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:14 +msgid "Mini-CD Labels" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:15 +msgid "PRO CD Labels 2-up (CD spine only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:16 +msgid "PRO CD Labels 2-up (Face only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:17 +#: data/templates/misc-iso-templates.xml.h:42 +msgid "PRO CD Labels 2-up (face only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:18 +msgid "Slimline CD Case (rightside up)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:19 +msgid "Slimline CD Case (upside down)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:1 +msgid "Agipa 119488: Business Cards" +msgstr "Agipa 119488: Vizitky" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:3 +msgid "Allround Labels --24" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:5 +msgid "Allround Labels --44" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:7 +msgid "Allround Labels --64" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:9 +msgid "Allround Labels --65" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:11 +msgid "Arch File Labels" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:13 +msgid "Arch File Labels (large)" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:15 +msgid "Arch File Labels (small)" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:19 +msgid "CD Labels" +msgstr "CD etikety" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:25 +msgid "CD/DVD Labels Standard Format (face only)" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:27 +msgid "Diskette Labels (face only)" +msgstr "Disketové etikety (pouze předek)" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:29 +msgid "EPSON Photo Stickers 16" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:31 +msgid "Etiketten" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:33 +msgid "Fridge Magnet Stickers" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:37 +msgid "Mailing Labels --14" +msgstr "PoÅ¡tovní etikety --14" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:39 +msgid "Mailing Labels-2 columns" +msgstr "PoÅ¡tovní etikety-2 sloupce" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:41 +msgid "Mailing Labels-3 columns" +msgstr "PoÅ¡tovní etikety-3 sloupce" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:46 +msgid "Video Labels (face only)" +msgstr "Video etikety (pouze předek)" + +#: data/desktop/glabels.desktop.in.h:1 +msgid "Create labels, business cards and media covers" +msgstr "Vytvářejte etikety, vizitky a obaly médií" + +#: data/desktop/glabels.desktop.in.h:2 +msgid "gLabels Label Designer" +msgstr "Návrhář etiket gLabels" + +#: data/mime/glabels.keys.in.h:1 data/mime/glabels.xml.in.h:1 +msgid "gLabels Project File" +msgstr "" + +#~ msgid "Only show icons in the drawing toolbar" +#~ msgstr "Zobrazv panelu kreslení jen ikony " + +#~ msgid "Set drawing toolbar button style according to desktop default" +#~ msgstr "" +#~ "Nastavit tlačítka na panelu kreslení stejně jako je základní nastavení " +#~ "prostředí" + +#, fuzzy +#~ msgid "Show both icons and texts in the drawing toolbar" +#~ msgstr "Ukazovat tipy v panelu kreslení" + +#~ msgid "Object _Properties..." +#~ msgstr "Možnosti objektu" + +#~ msgid "Display units" +#~ msgstr "Jednotky zobrazení" + +#~ msgid "Default page size" +#~ msgstr "Standartní velikost stránky" + +#~ msgid "Outline" +#~ msgstr "Obrys" + +#~ msgid "Edit line object properties" +#~ msgstr "Editace nastavení objektu řádky" + +#~ msgid "Edit text object properties" +#~ msgstr "Editace nastavení objektu text" + +#~ msgid "Edit text:" +#~ msgstr "Editace textu:" + +#~ msgid "Maintain current aspect ratio" +#~ msgstr "Udržet současný poměr stran" + +#~ msgid "Open %s" +#~ msgstr "Otevřít %s" diff --git a/glabels2/po/de.po b/glabels2/po/de.po new file mode 100644 index 00000000..87f6841c --- /dev/null +++ b/glabels2/po/de.po @@ -0,0 +1,2659 @@ +# French translation of glabels. +# Copyright (C) 2001 Jim Evins +# Marcus Bauer , 2001. +# +msgid "" +msgstr "" +"Project-Id-Version: glabels HEAD\n" +"POT-Creation-Date: 2004-08-08 00:43-0400\n" +"PO-Revision-Date: 2002-08-29 11:41+0100\n" +"Last-Translator: Christian Neumair \n" +"Language-Team: German \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/glabels.c:55 +msgid "Show view debugging messages." +msgstr "Ansichts-Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:58 +msgid "Show item debugging messages." +msgstr "Objekt-Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:61 +msgid "Show printing debugging messages." +msgstr "Druck-Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:64 +msgid "Show prefs debugging messages." +msgstr "Einstellungen-Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:67 +msgid "Show file debugging messages." +msgstr "Datei-Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:70 +msgid "Show document debugging messages." +msgstr "Dokument-Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:73 +msgid "Show template debugging messages." +msgstr "Vorlagen-Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:76 +#, fuzzy +msgid "Show paper debugging messages." +msgstr "Einstellungen-Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:79 +msgid "Show xml debugging messages." +msgstr "XML-Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:82 +msgid "Show document merge debugging messages." +msgstr "" + +#: src/glabels.c:85 +msgid "Show commands debugging messages." +msgstr "Befehls-Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:88 +msgid "Show undo debugging messages." +msgstr "Fehlerdiagnose-Ausgabe für das Rückgängigmachen aktivieren." + +#: src/glabels.c:91 +msgid "Show recent debugging messages." +msgstr "Fehlerdiagnose-Ausgabe für zuletzt geöffnete Dateien aktivieren." + +#: src/glabels.c:94 +#, fuzzy +msgid "Show window debugging messages." +msgstr "Fehlerdiagnose-Ausgabe für das Rückgängigmachen aktivieren." + +#: src/glabels.c:97 +#, fuzzy +msgid "Show ui debugging messages." +msgstr "MDI Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:100 +#, fuzzy +msgid "Show property_bar debugging messages." +msgstr "Einstellungen-Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:103 +msgid "Show media select widget debugging messages." +msgstr "Medienwahl Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:106 +msgid "Show mini preview widget debugging messages." +msgstr "Miniaturvorschau-Widget Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:109 +#, fuzzy +msgid "Show pixbuf cache debugging messages." +msgstr "Ansichts-Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:112 +msgid "Show widget debugging messages." +msgstr "Widget-Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:115 +#, fuzzy +msgid "Show object editor debugging messages." +msgstr "Fehlerdiagnose-Ausgabe für zuletzt geöffnete Dateien aktivieren." + +#: src/glabels.c:118 +msgid "Turn on all debugging messages." +msgstr "Die gesamte Fehlerdiagnose-Ausgabe aktivieren." + +#: src/glabels.c:187 +msgid "Could not initialize Bonobo!\n" +msgstr "" + +#: src/glabels-batch.c:48 +msgid "print this message" +msgstr "Diese Meldung ausgeben" + +#: src/glabels-batch.c:50 +msgid "print the version of glabels-batch being used" +msgstr "Die verwendete glabels-batch-Version ausgeben" + +#: src/glabels-batch.c:52 +msgid "set output filename (default=\"output.ps\")" +msgstr "Ausgabe-Dateiname (Vorgabe: »output.ps«) festlegen" + +#: src/glabels-batch.c:52 +msgid "filename" +msgstr "Dateiname" + +#: src/glabels-batch.c:54 +msgid "number of sheets (default=1)" +msgstr "Anzahl der Blätter (Vorgabe: 1)" + +#: src/glabels-batch.c:54 +msgid "sheets" +msgstr "Blätter" + +#: src/glabels-batch.c:56 +msgid "number of copies (default=1)" +msgstr "Anzahl der Kopien (Vorgabe: 1)" + +#: src/glabels-batch.c:56 +msgid "copies" +msgstr "Kopien" + +#: src/glabels-batch.c:58 src/print-dialog.c:336 +msgid "print outlines (to test printer alignment)" +msgstr "Begrenzungen drucken (um Druckausrichtung zu testen)" + +#: src/glabels-batch.c:60 src/print-dialog.c:344 +msgid "print in reverse (i.e. a mirror image)" +msgstr "Spiegelbildlich drucken" + +#: src/glabels-batch.c:96 +msgid "[OPTION...] GLABELS_FILE..." +msgstr "[OPTION...] GLABELS_DATEI..." + +#: src/glabels-batch.c:116 +msgid "missing glabels file\n" +msgstr "fehlende glabels-Datei\n" + +#: src/glabels-batch.c:157 +#, c-format +msgid "cannot open glabels file %s\n" +msgstr "glabels-Datei %s kann nicht geöffnet werden\n" + +#: src/window.c:244 +msgid "(none) - gLabels" +msgstr "" + +#: src/window.c:414 +msgid "(modified)" +msgstr "(geändert)" + +#: src/stock.c:65 data/ui/glabels-ui.xml.h:165 +#, fuzzy +msgid "_Select Mode" +msgstr "Markieren" + +#: src/stock.c:66 data/ui/glabels-ui.xml.h:166 +#, fuzzy +msgid "_Text" +msgstr "Text" + +#: src/stock.c:67 data/ui/glabels-ui.xml.h:151 +#, fuzzy +msgid "_Line" +msgstr "Linie" + +#: src/stock.c:68 data/ui/glabels-ui.xml.h:133 +#, fuzzy +msgid "_Box" +msgstr "Rechteck" + +#: src/stock.c:69 data/ui/glabels-ui.xml.h:144 +#, fuzzy +msgid "_Ellipse" +msgstr "Ellipse" + +#: src/stock.c:70 data/ui/glabels-ui.xml.h:149 +#, fuzzy +msgid "_Image" +msgstr "Bild" + +#: src/stock.c:71 data/ui/glabels-ui.xml.h:11 +#, fuzzy +msgid "Bar_code" +msgstr "Barcode" + +#: src/stock.c:72 +#, fuzzy +msgid "_Merge Properties" +msgstr "Barcode-Einstellungen" + +#: src/stock.c:73 +#, fuzzy +msgid "Object _Properties" +msgstr "Rechteck bearbeiten..." + +#: src/stock.c:74 data/ui/glabels-ui.xml.h:13 +#, fuzzy +msgid "Bring to _Front" +msgstr "Ganz nach vorne" + +#: src/stock.c:75 data/ui/glabels-ui.xml.h:110 +#, fuzzy +msgid "Send to _Back" +msgstr "Ganz nach hinten" + +#: src/stock.c:76 data/ui/glabels-ui.xml.h:97 +#, fuzzy +msgid "Rotate _Left" +msgstr "Rotieren" + +#: src/stock.c:77 data/ui/glabels-ui.xml.h:98 +#, fuzzy +msgid "Rotate _Right" +msgstr "Rotieren" + +#: src/stock.c:78 data/ui/glabels-ui.xml.h:52 +msgid "Flip _Horizontally" +msgstr "" + +#: src/stock.c:79 data/ui/glabels-ui.xml.h:53 +msgid "Flip _Vertically" +msgstr "" + +#: src/stock.c:80 data/ui/glabels-ui.xml.h:150 +msgid "_Lefts" +msgstr "" + +#: src/stock.c:81 data/ui/glabels-ui.xml.h:162 +msgid "_Rights" +msgstr "" + +#: src/stock.c:82 data/ui/glabels-ui.xml.h:134 +#, fuzzy +msgid "_Centers" +msgstr "I_nhalt" + +#: src/stock.c:83 data/ui/glabels-ui.xml.h:167 +#, fuzzy +msgid "_Tops" +msgstr "_Werkzeuge" + +#: src/stock.c:84 +msgid "Bottoms" +msgstr "" + +#: src/stock.c:85 +#, fuzzy +msgid "Centers" +msgstr "Inhalt" + +#: src/stock.c:86 src/stock.c:87 data/ui/glabels-ui.xml.h:62 +msgid "Label Ce_nter" +msgstr "" + +#: src/stock.c:88 data/ui/glabels-ui.xml.h:51 +msgid "Fill color" +msgstr "" + +#: src/stock.c:89 data/ui/glabels-ui.xml.h:64 +msgid "Line color" +msgstr "" + +#: src/stock.c:90 src/stock.c:92 +#, fuzzy +msgid "Linked" +msgstr "Linie" + +#: src/stock.c:91 src/stock.c:93 +#, fuzzy +msgid "Not Linked" +msgstr "Keine" + +#: src/ui-property-bar.c:345 src/object-editor.c:499 +#, fuzzy +msgid "Default" +msgstr "Löschen" + +#: src/ui-property-bar.c:360 src/object-editor.c:512 +msgid "No fill" +msgstr "" + +#: src/ui-property-bar.c:375 src/object-editor.c:505 +#, fuzzy +msgid "No line" +msgstr "Keine" + +#: src/ui-sidebar.c:180 +#, fuzzy +msgid "Object properties" +msgstr "Rechteck bearbeiten..." + +#: src/commands.c:385 +msgid "" +"A label and business card creation program for GNOME.\n" +" \n" +"Glabels is free software; you can redistribute it and/or modify it under the " +"terms of the GNU General Public License as published by the Free Software " +"Foundation; either version 2 of the License, or (at your option) any later " +"version.\n" +" \n" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details.\n" +msgstr "" +"Ein GNOME-Programm zur Erstellung von Etiketten und Visitenkarten.\n" +" \n" +"Glabels ist freie Software; Sie können sie weiterverteilen und/oder ändern " +"unter den Bedingungen der GNU General Public License, veröffentlicht von der " +"Free Software Foundation, entweder Version 2 der Lizenz oder (optional) " +"jeder späteren Version.\n" +" \n" +"Dieses Programm wird verteilt in der Hoffnung, dass es nützlich ist, aber " +"OHNE JEDE GARANTIE; Weitere Details in der GNU General Public License.\n" + +#: src/commands.c:399 +#, fuzzy +msgid "See the file AUTHORS for additional credits," +msgstr "Lesen die Datei AUTHORS für zusätzliche Danksagungen," + +#: src/commands.c:400 +#, fuzzy +msgid "or visit http://glabels.sourceforge.net/" +msgstr "oder besuchen Sie http://snaught.com/glabels" + +#: src/commands.c:409 +msgid " " +msgstr "" + +#: src/commands.c:424 +msgid "glabels" +msgstr "glabels" + +#: src/file.c:100 +msgid "New Label or Card" +msgstr "Neues Etikett oder neue Karte" + +#: src/file.c:132 src/file.c:304 +msgid "Media Type" +msgstr "Medientyp" + +#: src/file.c:138 src/file.c:310 +msgid "Label orientation" +msgstr "Ausrichtung des Etiketts" + +#: src/file.c:269 +#, fuzzy +msgid "Label properties" +msgstr "Rechteck bearbeiten..." + +#: src/file.c:452 src/file.c:870 +msgid "All files" +msgstr "" + +#: src/file.c:457 src/file.c:875 +#, fuzzy +msgid "gLabels documents" +msgstr "Einstellungen" + +#: src/file.c:505 src/file.c:617 src/file.c:934 src/file.c:1130 +#, fuzzy +msgid "Empty file name selection" +msgstr "Die Markierung kopieren" + +#: src/file.c:506 src/file.c:520 src/file.c:618 src/file.c:632 +msgid "Please select a file or supply a valid file name" +msgstr "" + +#: src/file.c:519 src/file.c:631 +msgid "File does not exist" +msgstr "" + +#: src/file.c:563 data/ui/glabels-ui.xml.h:75 +msgid "Open" +msgstr "Öffnen" + +#: src/file.c:565 +msgid "Open label" +msgstr "Öffnen Etikett" + +#: src/file.c:707 +#, fuzzy, c-format +msgid "Could not open file \"%s\"" +msgstr "Datei »%s« konnte nicht geöffnet werden" + +#: src/file.c:715 +msgid "Not a supported file format" +msgstr "" + +#: src/file.c:797 src/file.c:979 src/file.c:1174 +#, fuzzy, c-format +msgid "Could not save file \"%s\"" +msgstr "Datei »%s« konnte nicht geöffnet werden" + +#: src/file.c:805 src/file.c:987 src/file.c:1182 +msgid "Error encountered during save. The file is still not saved." +msgstr "" + +#: src/file.c:848 src/file.c:1048 +#, fuzzy, c-format +msgid "Save \"%s\" as" +msgstr "Datei speichern unter" + +#: src/file.c:935 src/file.c:1131 +#, fuzzy +msgid "Please supply a valid file name" +msgstr "Dateinamen angeben" + +#: src/file.c:952 src/file.c:1147 +#, fuzzy, c-format +msgid "Overwrite file \"%s\"?" +msgstr "Fehler beim Schreiben in Datei »%s«" + +#: src/file.c:960 src/file.c:1155 +msgid "File already exists." +msgstr "" + +#: src/file.c:1271 +#, c-format +msgid "Save changes to document \"%s\" before closing?" +msgstr "" + +#: src/file.c:1279 +#, fuzzy +msgid "Your changes will be lost if you don't save them." +msgstr "" +"Wollen Sie die am Dokument »%s« vorgenommenen Änderungen Speichern?\n" +"\n" +"Nicht gespeicherte Änderungen gehen verloren." + +#: src/file.c:1282 +msgid "Close without saving" +msgstr "" + +#. Should not happen +#: src/prefs.c:156 src/prefs.c:163 data/glade/prefs-dialog.glade.h:23 +#: data/glade/object-editor.glade.h:37 +msgid "points" +msgstr "Punkte" + +#: src/prefs.c:158 data/glade/object-editor.glade.h:36 +#: data/glade/template-designer.glade.h:74 +msgid "inches" +msgstr "Inch" + +#: src/prefs.c:160 +msgid "mm" +msgstr "mm" + +#: src/prefs-dialog.c:248 data/glade/prefs-dialog.glade.h:22 +#, fuzzy +msgid "gLabels Preferences" +msgstr "Einstellungen" + +#. +#. * Submenu: Order +#. +#: src/view.c:3570 data/ui/glabels-ui.xml.h:157 +msgid "_Order" +msgstr "" + +#. +#. * Submenu: Rotate/Flip +#. +#: src/view.c:3591 data/ui/glabels-ui.xml.h:163 +#, fuzzy +msgid "_Rotate/Flip" +msgstr "Rotieren" + +#. +#. * Submenu: Align Horizontally +#. +#: src/view.c:3624 +msgid "Align _Horizontally" +msgstr "" + +#. +#. * Submenu: Align Vertically +#. +#: src/view.c:3663 +msgid "Align _Vertically" +msgstr "" + +#: src/view.c:3724 data/ui/glabels-ui.xml.h:140 +msgid "_Delete" +msgstr "_Löschen" + +#. Build editor. +#: src/view-box.c:223 +#, fuzzy +msgid "Box object properties" +msgstr "Rechteck bearbeiten..." + +#. Build editor. +#: src/view-ellipse.c:223 +#, fuzzy +msgid "Ellipse object properties" +msgstr "Ellipse bearbeiten..." + +#. Build editor. +#: src/view-line.c:223 +#, fuzzy +msgid "Line object properties" +msgstr "Rechteck bearbeiten..." + +#. Build editor. +#: src/view-image.c:222 +#, fuzzy +msgid "Image object properties" +msgstr "Bildeinstellungen bearbeiten..." + +#. Build editor. +#: src/view-text.c:250 +#, fuzzy +msgid "Text object properties" +msgstr "Rechteck bearbeiten..." + +#: src/view-text.c:562 data/glade/object-editor.glade.h:28 +msgid "Text" +msgstr "Text" + +#. Build editor. +#: src/view-barcode.c:209 +#, fuzzy +msgid "Barcode object properties" +msgstr "Barcode bearbeiten..." + +#: src/view-barcode.c:579 src/print.c:1088 +#, fuzzy +msgid "Invalid barcode data" +msgstr "Ungültiger Barcode-Wert" + +#: src/merge-properties-dialog.c:231 +msgid "Merge Properties" +msgstr "" + +#. ---- Source section ---- +#: src/merge-properties-dialog.c:237 +msgid "Source" +msgstr "Quelle" + +#: src/merge-properties-dialog.c:245 +msgid "Format:" +msgstr "Format:" + +#. Location line +#: src/merge-properties-dialog.c:273 +msgid "Location:" +msgstr "Ort:" + +#: src/merge-properties-dialog.c:282 src/merge-properties-dialog.c:393 +msgid "Select merge-database source" +msgstr "Wählen Sie die einzumischende Datenquelle" + +#: src/merge-properties-dialog.c:289 src/merge-properties-dialog.c:404 +msgid "N/A" +msgstr "Nicht verfügbar" + +#. ---- Sample Fields section ---- +#: src/merge-properties-dialog.c:300 +msgid "Record selection/preview:" +msgstr "" + +#: src/merge-properties-dialog.c:326 +msgid "Select" +msgstr "Markieren" + +#: src/merge-properties-dialog.c:334 +msgid "Record/Field" +msgstr "" + +#: src/merge-properties-dialog.c:342 data/glade/object-editor.glade.h:9 +msgid "Data" +msgstr "Wert" + +#: src/print-dialog.c:266 data/ui/glabels-ui.xml.h:82 +msgid "Print" +msgstr "Drucken" + +#: src/print-dialog.c:281 +msgid "_Job" +msgstr "_Auftrag" + +#: src/print-dialog.c:286 +msgid "P_rinter" +msgstr "_Drucker" + +#. ----------- Add simple-copies widget ------------ +#: src/print-dialog.c:314 +msgid "Copies" +msgstr "Kopien" + +#. ------- Add merge control widget ------------ +#: src/print-dialog.c:322 +msgid "Document merge control" +msgstr "Kontrolle der Mischung mit Datenquelle (Serienfunktion)" + +#. ----------- Add custom print options area ------------ +#: src/print-dialog.c:330 +msgid "Options" +msgstr "Optionen" + +#: src/print-dialog.c:351 +msgid "print crop marks" +msgstr "" + +#: src/print-dialog.c:553 src/print-dialog.c:592 +msgid "Print preview" +msgstr "Druckvorschau" + +#: src/template-designer.c:409 data/glade/template-designer.glade.h:73 +msgid "gLabels Template Designer" +msgstr "" + +#: src/bc.c:60 +msgid "POSTNET (any)" +msgstr "" + +#: src/bc.c:63 +msgid "POSTNET-5 (ZIP only)" +msgstr "" + +#: src/bc.c:66 +msgid "POSTNET-9 (ZIP+4)" +msgstr "" + +#: src/bc.c:69 +msgid "POSTNET-11 (DPBC)" +msgstr "" + +#: src/bc.c:72 +msgid "EAN (any)" +msgstr "" + +#: src/bc.c:75 +msgid "EAN-8" +msgstr "" + +#: src/bc.c:78 +msgid "EAN-8 +2" +msgstr "" + +#: src/bc.c:81 +msgid "EAN-8 +5" +msgstr "" + +#: src/bc.c:84 +msgid "EAN-13" +msgstr "" + +#: src/bc.c:87 +msgid "EAN-13 +2" +msgstr "" + +#: src/bc.c:90 +msgid "EAN-13 +5" +msgstr "" + +#: src/bc.c:93 +msgid "UPC (UPC-A or UPC-E)" +msgstr "" + +#: src/bc.c:96 +msgid "UPC-A" +msgstr "" + +#: src/bc.c:99 +msgid "UPC-A +2" +msgstr "" + +#: src/bc.c:102 +msgid "UPC-A +5" +msgstr "" + +#: src/bc.c:105 +msgid "UPC-E" +msgstr "" + +#: src/bc.c:108 +msgid "UPC-E +2" +msgstr "" + +#: src/bc.c:111 +msgid "UPC-E +5" +msgstr "" + +#: src/bc.c:114 +msgid "ISBN" +msgstr "" + +#: src/bc.c:117 +msgid "ISBN +5" +msgstr "" + +#: src/bc.c:120 +msgid "Code 39" +msgstr "" + +#: src/bc.c:123 +msgid "Code 128" +msgstr "" + +#: src/bc.c:126 +msgid "Code 128C" +msgstr "" + +#: src/bc.c:129 +msgid "Code 128B" +msgstr "" + +#: src/bc.c:132 +msgid "Interleaved 2 of 5" +msgstr "" + +#: src/bc.c:135 +msgid "Codabar" +msgstr "" + +#: src/bc.c:138 +msgid "MSI" +msgstr "" + +#: src/bc.c:141 +msgid "Plessey" +msgstr "" + +#: src/label.c:569 +msgid "Untitled" +msgstr "Namenlos" + +#: src/xml-label.c:176 src/xml-label.c:213 +msgid "xmlParseFile error" +msgstr "Fehler: xmlParseFile error" + +#: src/xml-label.c:250 +msgid "No document root" +msgstr "Kein document root" + +#: src/xml-label.c:264 +msgid "Importing from glabels 0.1 format" +msgstr "Aus dem glabels 0.1-Format wird importiert" + +#: src/xml-label.c:272 +msgid "Importing from glabels 0.4 format" +msgstr "Aus dem glabels 0.4-Format wird importiert" + +#: src/xml-label.c:279 +#, fuzzy +msgid "Importing from glabels 1.91 format" +msgstr "Aus dem glabels 0.1-Format wird importiert" + +#: src/xml-label.c:282 +msgid "bad document, unknown glabels Namespace" +msgstr "Fehlerhaftes Dokument, unbekannter glabels Namespace" + +#: src/xml-label.c:311 src/xml-label-04.c:75 src/xml-label-191.c:131 +#, c-format +msgid "Bad root node = \"%s\"" +msgstr "Fehlerhafter root node = \"%s\"" + +#: src/xml-label.c:348 src/xml-label-191.c:165 +#, fuzzy, c-format +msgid "bad node in Document node = \"%s\"" +msgstr "Fehlerhafter root node = \"%s\"" + +#: src/xml-label.c:393 src/xml-label-04.c:123 src/xml-label-191.c:197 +#, c-format +msgid "bad node = \"%s\"" +msgstr "fehlerhafter node = \"%s\"" + +#: src/xml-label.c:796 src/xml-label-191.c:605 +#, fuzzy, c-format +msgid "bad node in Data node = \"%s\"" +msgstr "fehlerhafter node = \"%s\"" + +#: src/xml-label.c:962 libglabels/xml-template.c:528 +msgid "Utf8 conversion error." +msgstr "" + +#: src/xml-label.c:969 libglabels/xml-template.c:535 +msgid "Problem saving xml file." +msgstr "Problem beim Speichern der xml-Datei." + +#. This should always be an id, but just in case a name +#. slips by! +#: src/xml-label-191.c:680 libglabels/xml-template.c:192 +#, c-format +msgid "Unknown page size id \"%s\", trying as name" +msgstr "" + +#: src/xml-label-191.c:690 libglabels/xml-template.c:202 +#, c-format +msgid "Unknown page size id or name \"%s\"" +msgstr "" + +#: src/merge.c:172 src/merge.c:213 src/merge.c:399 src/merge.c:402 +msgid "None" +msgstr "Keine" + +#: src/merge-init.c:53 +#, fuzzy +msgid "Text file with comma delimeters (CSV)" +msgstr "Durch Kommas unterteilter Text" + +#: src/merge-init.c:60 +#, fuzzy +msgid "Text file with colon delimeters" +msgstr "Text mit Doppelpunkten als Separatoren" + +#: src/merge-init.c:67 +#, fuzzy +msgid "Text file with tab delimeters" +msgstr "Text mit Tabulatoren als Trennern" + +#: src/wdgt-image-select.c:201 data/glade/object-editor.glade.h:11 +#, fuzzy +msgid "File:" +msgstr "_Datei" + +#: src/wdgt-image-select.c:245 data/glade/object-editor.glade.h:16 +msgid "Key:" +msgstr "Key:" + +#: src/wdgt-print-copies.c:179 +msgid "Sheets:" +msgstr "Seiten:" + +#: src/wdgt-print-copies.c:197 +msgid "Labels" +msgstr "Labels" + +#: src/wdgt-print-copies.c:200 +msgid "from:" +msgstr "von:" + +#: src/wdgt-print-copies.c:207 +msgid "to:" +msgstr "bis:" + +#: src/wdgt-print-merge.c:178 +msgid "Start on label" +msgstr "Start bei Etikett" + +#: src/wdgt-print-merge.c:186 +msgid "on 1st sheet" +msgstr "auf erster Seite" + +#: src/wdgt-print-merge.c:195 +msgid "Copies:" +msgstr "Kopien:" + +#: src/wdgt-print-merge.c:201 +msgid "Collate" +msgstr "Zuordnen" + +#: src/wdgt-media-select.c:269 data/glade/template-designer.glade.h:29 +msgid "Description:" +msgstr "Beschreibung:" + +#: src/wdgt-media-select.c:279 data/glade/template-designer.glade.h:53 +msgid "Page size:" +msgstr "Seitenformat:" + +#: src/wdgt-media-select.c:290 +msgid "Label size:" +msgstr "Etikettenformat:" + +#: src/wdgt-media-select.c:301 +msgid "Layout:" +msgstr "Layout:" + +#: src/wdgt-media-select.c:578 +#, c-format +msgid "%d x %d (%d per sheet)" +msgstr "%d x %d (%d pro Seite)" + +#: src/wdgt-media-select.c:582 +#, fuzzy, c-format +msgid "%d per sheet" +msgstr "%d x %d (%d pro Seite)" + +#: src/wdgt-media-select.c:614 +#, c-format +msgid "%s x %s %s" +msgstr "%s x %s %s" + +#: src/wdgt-media-select.c:619 +#, c-format +msgid "%.5g x %.5g %s" +msgstr "%.5g x %.5g %s" + +#: src/wdgt-media-select.c:630 src/wdgt-media-select.c:644 +#, c-format +msgid "%s %s diameter" +msgstr "" + +#: src/wdgt-media-select.c:634 src/wdgt-media-select.c:648 +#, c-format +msgid "%.5g %s diameter" +msgstr "" + +#: src/wdgt-rotate-label.c:193 +msgid "Rotate" +msgstr "Rotieren" + +#. This is the default custom color +#: src/mygal/color-palette.c:396 +#, fuzzy +msgid "custom" +msgstr "Anpassen" + +#. "Custom" color - we'll pop up a GnomeColorPicker +#: src/mygal/color-palette.c:438 +#, fuzzy +msgid "Custom Color:" +msgstr "Werkzeugleisten anpassen" + +#: src/mygal/color-palette.c:446 +msgid "Choose Custom Color" +msgstr "" + +#: src/mygal/color-palette.c:579 +msgid "black" +msgstr "" + +#: src/mygal/color-palette.c:580 +msgid "light brown" +msgstr "" + +#: src/mygal/color-palette.c:581 +msgid "brown gold" +msgstr "" + +#: src/mygal/color-palette.c:582 +msgid "dark green #2" +msgstr "" + +#: src/mygal/color-palette.c:583 +msgid "navy" +msgstr "" + +#: src/mygal/color-palette.c:584 src/mygal/color-palette.c:640 +msgid "dark blue" +msgstr "" + +#: src/mygal/color-palette.c:585 +msgid "purple #2" +msgstr "" + +#: src/mygal/color-palette.c:586 +msgid "very dark gray" +msgstr "" + +#: src/mygal/color-palette.c:589 src/mygal/color-palette.c:645 +msgid "dark red" +msgstr "" + +#: src/mygal/color-palette.c:590 +msgid "red-orange" +msgstr "" + +#: src/mygal/color-palette.c:591 +msgid "gold" +msgstr "" + +#: src/mygal/color-palette.c:592 +msgid "dark green" +msgstr "" + +#: src/mygal/color-palette.c:593 src/mygal/color-palette.c:646 +msgid "dull blue" +msgstr "" + +#: src/mygal/color-palette.c:594 src/mygal/color-palette.c:647 +msgid "blue" +msgstr "" + +#: src/mygal/color-palette.c:595 +msgid "dull purple" +msgstr "" + +#: src/mygal/color-palette.c:596 +msgid "dark grey" +msgstr "" + +#: src/mygal/color-palette.c:599 +msgid "red" +msgstr "" + +#: src/mygal/color-palette.c:600 +msgid "orange" +msgstr "" + +#: src/mygal/color-palette.c:601 +msgid "lime" +msgstr "" + +#: src/mygal/color-palette.c:602 +msgid "dull green" +msgstr "" + +#: src/mygal/color-palette.c:603 +msgid "dull blue #2" +msgstr "" + +#: src/mygal/color-palette.c:604 +msgid "sky blue #2" +msgstr "" + +#: src/mygal/color-palette.c:605 src/mygal/color-palette.c:644 +msgid "purple" +msgstr "" + +#: src/mygal/color-palette.c:606 +msgid "gray" +msgstr "" + +#: src/mygal/color-palette.c:609 src/mygal/color-palette.c:641 +#, fuzzy +msgid "magenta" +msgstr "Bild" + +#: src/mygal/color-palette.c:610 +msgid "bright orange" +msgstr "" + +#: src/mygal/color-palette.c:611 src/mygal/color-palette.c:642 +msgid "yellow" +msgstr "" + +#: src/mygal/color-palette.c:612 +#, fuzzy +msgid "green" +msgstr "Grad" + +#: src/mygal/color-palette.c:613 src/mygal/color-palette.c:643 +msgid "cyan" +msgstr "" + +#: src/mygal/color-palette.c:614 +msgid "bright blue" +msgstr "" + +#: src/mygal/color-palette.c:615 src/mygal/color-palette.c:632 +msgid "red purple" +msgstr "" + +#: src/mygal/color-palette.c:616 +msgid "light grey" +msgstr "" + +#: src/mygal/color-palette.c:619 src/mygal/color-palette.c:636 +msgid "pink" +msgstr "" + +#: src/mygal/color-palette.c:620 +msgid "light orange" +msgstr "" + +#: src/mygal/color-palette.c:621 src/mygal/color-palette.c:633 +msgid "light yellow" +msgstr "" + +#: src/mygal/color-palette.c:622 +msgid "light green" +msgstr "" + +#: src/mygal/color-palette.c:623 +msgid "light cyan" +msgstr "" + +#: src/mygal/color-palette.c:624 src/mygal/color-palette.c:634 +msgid "light blue" +msgstr "" + +#: src/mygal/color-palette.c:625 src/mygal/color-palette.c:638 +msgid "light purple" +msgstr "" + +#: src/mygal/color-palette.c:626 +msgid "white" +msgstr "" + +#: src/mygal/color-palette.c:631 +msgid "purplish blue" +msgstr "" + +#: src/mygal/color-palette.c:635 +msgid "dark purple" +msgstr "" + +#: src/mygal/color-palette.c:637 +msgid "sky blue" +msgstr "" + +#: libglabels/template.c:848 +#, c-format +msgid "Generic %s full page" +msgstr "" + +#: libglabels/template.c:897 +msgid "No template files found!" +msgstr "Keine Vorlagedateien gefunden!" + +#. Create and append an "Other" entry. +#: libglabels/paper.c:67 +msgid "Other" +msgstr "" + +#: libglabels/paper.c:361 +#, fuzzy +msgid "No paper files found!" +msgstr "Keine Vorlagedateien gefunden!" + +#: data/ui/glabels-ui.xml.h:1 +#, fuzzy +msgid "About glabels" +msgstr "glabels" + +#: data/ui/glabels-ui.xml.h:2 +msgid "About..." +msgstr "Info..." + +#: data/ui/glabels-ui.xml.h:3 +msgid "Align _Horizontal" +msgstr "" + +#: data/ui/glabels-ui.xml.h:4 +msgid "Align _Vertical" +msgstr "" + +#: data/ui/glabels-ui.xml.h:5 +msgid "Align objects to bottoms" +msgstr "" + +#: data/ui/glabels-ui.xml.h:6 +msgid "Align objects to horizontal centers" +msgstr "" + +#: data/ui/glabels-ui.xml.h:7 +msgid "Align objects to left edges" +msgstr "" + +#: data/ui/glabels-ui.xml.h:8 +msgid "Align objects to right edges" +msgstr "" + +#: data/ui/glabels-ui.xml.h:9 +msgid "Align objects to tops" +msgstr "" + +#: data/ui/glabels-ui.xml.h:10 +msgid "Align objects to vertical centers" +msgstr "" + +#: data/ui/glabels-ui.xml.h:12 +msgid "Bold" +msgstr "" + +#: data/ui/glabels-ui.xml.h:14 +#, fuzzy +msgid "Center align" +msgstr "Inhalt" + +#: data/ui/glabels-ui.xml.h:15 +msgid "Center objects to horizontal label center" +msgstr "" + +#: data/ui/glabels-ui.xml.h:16 +msgid "Center objects to vertical label center" +msgstr "" + +#: data/ui/glabels-ui.xml.h:17 +#, fuzzy +msgid "Change the visibility of markup lines in the current window" +msgstr "Die Sichtbarkeit der Werkzeugleiste im aktuellen Fenster ändern" + +#: data/ui/glabels-ui.xml.h:18 +#, fuzzy +msgid "Change the visibility of the drawing toolbar in the current window" +msgstr "Die Sichtbarkeit der Werkzeugleiste im aktuellen Fenster ändern" + +#: data/ui/glabels-ui.xml.h:19 +#, fuzzy +msgid "Change the visibility of the grid in the current window" +msgstr "Die Sichtbarkeit der Werkzeugleiste im aktuellen Fenster ändern" + +#: data/ui/glabels-ui.xml.h:20 +#, fuzzy +msgid "Change the visibility of the main toolbar in the current window" +msgstr "Die Sichtbarkeit der Werkzeugleiste im aktuellen Fenster ändern" + +#: data/ui/glabels-ui.xml.h:21 +#, fuzzy +msgid "Change the visibility of the property toolbar in the current window" +msgstr "Die Sichtbarkeit der Werkzeugleiste im aktuellen Fenster ändern" + +#: data/ui/glabels-ui.xml.h:22 +msgid "Close" +msgstr "Schließen" + +#: data/ui/glabels-ui.xml.h:23 +msgid "Close the current file" +msgstr "Die aktuelle Datei schließen" + +#: data/ui/glabels-ui.xml.h:24 +msgid "Configure the application" +msgstr "Die Anwendung konfigurieren" + +#: data/ui/glabels-ui.xml.h:25 +msgid "Contents" +msgstr "Inhalt" + +#: data/ui/glabels-ui.xml.h:26 +msgid "Copy" +msgstr "Kopieren" + +#: data/ui/glabels-ui.xml.h:27 +msgid "Copy the selection" +msgstr "Die Markierung kopieren" + +#: data/ui/glabels-ui.xml.h:28 +#, fuzzy +msgid "Create a custom template" +msgstr "Ein neues Dokument erstellen" + +#: data/ui/glabels-ui.xml.h:29 +msgid "Create a new document" +msgstr "Ein neues Dokument erstellen" + +#: data/ui/glabels-ui.xml.h:30 +msgid "Create barcode object" +msgstr "Barcodeobjekt erzeugen" + +#: data/ui/glabels-ui.xml.h:31 +msgid "Create box/rectangle object" +msgstr "Rechteck-Objekt erzeugen" + +#: data/ui/glabels-ui.xml.h:32 +msgid "Create ellipse/circle object" +msgstr "Ellipsenobjekt erzeugen" + +#: data/ui/glabels-ui.xml.h:33 +msgid "Create image object" +msgstr "Bildobjekt erzeugen" + +#: data/ui/glabels-ui.xml.h:34 +msgid "Create line object" +msgstr "Linienobjekt erzeugen" + +#: data/ui/glabels-ui.xml.h:35 +msgid "Create text object" +msgstr "Textobjekt erzeugen" + +#: data/ui/glabels-ui.xml.h:36 +msgid "Cu_t" +msgstr "_Ausschneiden" + +#: data/ui/glabels-ui.xml.h:37 +msgid "Customize" +msgstr "Anpassen" + +#: data/ui/glabels-ui.xml.h:38 +#, fuzzy +msgid "Customize Drawing Toolbar" +msgstr "Werkzeugleiste _anpassen" + +#: data/ui/glabels-ui.xml.h:39 +#, fuzzy +msgid "Customize Main Toolbar" +msgstr "Werkzeugleiste _anpassen" + +#: data/ui/glabels-ui.xml.h:40 +#, fuzzy +msgid "Customize Property Toolbar" +msgstr "Werkzeugleisten anpassen" + +#: data/ui/glabels-ui.xml.h:41 +msgid "Customize toolbars" +msgstr "Werkzeugleisten anpassen" + +#: data/ui/glabels-ui.xml.h:42 +msgid "Cut" +msgstr "Ausschneiden" + +#: data/ui/glabels-ui.xml.h:43 +msgid "Cut the selection" +msgstr "Die Markierung ausschneiden" + +#: data/ui/glabels-ui.xml.h:44 +msgid "Decrease magnification" +msgstr "" + +#: data/ui/glabels-ui.xml.h:45 +msgid "Delete" +msgstr "Löschen" + +#: data/ui/glabels-ui.xml.h:46 +msgid "Delete the selected objects" +msgstr "Die markierten Objekte löschen" + +#: data/ui/glabels-ui.xml.h:47 +#, fuzzy +msgid "Drawing toolbar" +msgstr "Haupt-Werkzeugleiste" + +#: data/ui/glabels-ui.xml.h:48 +msgid "Dump XML" +msgstr "XML in Rohform ausgeben" + +#: data/ui/glabels-ui.xml.h:49 +msgid "Dump the UI Xml description" +msgstr "Die XML-Benutzeroberflächenbeschreibung in Rohform ausgeben" + +#: data/ui/glabels-ui.xml.h:50 +msgid "Edit merge properties" +msgstr "" + +#: data/ui/glabels-ui.xml.h:54 +msgid "Flip object horizontally" +msgstr "" + +#: data/ui/glabels-ui.xml.h:55 +msgid "Flip object vertically" +msgstr "" + +#: data/ui/glabels-ui.xml.h:56 +msgid "Font name" +msgstr "" + +#: data/ui/glabels-ui.xml.h:57 +#, fuzzy +msgid "Font selector" +msgstr "Die Markierung kopieren" + +#: data/ui/glabels-ui.xml.h:58 +msgid "Font size" +msgstr "" + +#: data/ui/glabels-ui.xml.h:59 +msgid "Icon and _Text" +msgstr "Icons und _Text" + +#: data/ui/glabels-ui.xml.h:60 +msgid "Increase magnification" +msgstr "" + +#: data/ui/glabels-ui.xml.h:61 +msgid "Italic" +msgstr "" + +#: data/ui/glabels-ui.xml.h:63 +msgid "Left align" +msgstr "" + +#: data/ui/glabels-ui.xml.h:65 +msgid "Line width" +msgstr "" + +#: data/ui/glabels-ui.xml.h:66 +msgid "Lower object to bottom" +msgstr "" + +#: data/ui/glabels-ui.xml.h:67 +msgid "M_arkup" +msgstr "" + +#: data/ui/glabels-ui.xml.h:68 +msgid "Main toolbar" +msgstr "Haupt-Werkzeugleiste" + +#: data/ui/glabels-ui.xml.h:69 +msgid "Markup" +msgstr "" + +#: data/ui/glabels-ui.xml.h:70 +#, fuzzy +msgid "Modify document properties" +msgstr "Rechteck bearbeiten..." + +#: data/ui/glabels-ui.xml.h:71 +msgid "New" +msgstr "Neu" + +#: data/ui/glabels-ui.xml.h:72 +#, fuzzy +msgid "Object property editor" +msgstr "Rechteck bearbeiten..." + +#: data/ui/glabels-ui.xml.h:73 +#, fuzzy +msgid "Only show icons in the drawing toolbar" +msgstr "Nur Icons in der Werkzeugleiste anzeigen" + +#: data/ui/glabels-ui.xml.h:74 +#, fuzzy +msgid "Only show icons in the main toolbar" +msgstr "Nur Icons in der Werkzeugleiste anzeigen" + +#: data/ui/glabels-ui.xml.h:76 +msgid "Open a file" +msgstr "Eine Datei öffnen" + +#: data/ui/glabels-ui.xml.h:77 +#, fuzzy +msgid "Open the glabels manual" +msgstr "Das gedit-Handbuch öffnen" + +#: data/ui/glabels-ui.xml.h:78 +msgid "Paste" +msgstr "Einfügen" + +#: data/ui/glabels-ui.xml.h:79 +msgid "Paste the clipboard" +msgstr "Inhalt der Zwischenablage einfügen" + +#: data/ui/glabels-ui.xml.h:80 +msgid "Pr_eferences..." +msgstr "_Einstellungen..." + +#: data/ui/glabels-ui.xml.h:81 +msgid "Preferences" +msgstr "Einstellungen" + +#: data/ui/glabels-ui.xml.h:83 +msgid "Print the current file" +msgstr "Die aktuelle Datei drucken" + +#: data/ui/glabels-ui.xml.h:84 +#, fuzzy +msgid "Proper_ties..." +msgstr "Barcode-Einstellungen" + +#: data/ui/glabels-ui.xml.h:85 +#, fuzzy +msgid "Properties" +msgstr "Barcode-Einstellungen" + +# CHECK +#: data/ui/glabels-ui.xml.h:86 +#, fuzzy +msgid "Property toolbar" +msgstr "Werkzeugleisten-Werkzeuge" + +#: data/ui/glabels-ui.xml.h:87 +msgid "Quit" +msgstr "Beenden" + +#: data/ui/glabels-ui.xml.h:88 +msgid "Quit the program" +msgstr "Das Programm beenden" + +#: data/ui/glabels-ui.xml.h:89 +msgid "Raise object to top" +msgstr "" + +#: data/ui/glabels-ui.xml.h:90 +msgid "Recent _Files" +msgstr "_Zuletzt geöffnete Dateien" + +#: data/ui/glabels-ui.xml.h:91 +msgid "Redo" +msgstr "Wiederherstellen" + +#: data/ui/glabels-ui.xml.h:92 +msgid "Redo the undone action" +msgstr "Die rückgängig gemachte Aktion wiederherstellen" + +#: data/ui/glabels-ui.xml.h:93 +msgid "Remove all selections" +msgstr "Alle Auswahlen aufheben" + +#: data/ui/glabels-ui.xml.h:95 +#, fuzzy, no-c-format +msgid "Restore scale to 100%" +msgstr "Skalierung auf 100% wiederherstellen" + +#: data/ui/glabels-ui.xml.h:96 +msgid "Right align" +msgstr "" + +#: data/ui/glabels-ui.xml.h:99 +msgid "Rotate object 90 clockwise" +msgstr "" + +#: data/ui/glabels-ui.xml.h:100 +msgid "Rotate object 90 counter-clockwise" +msgstr "" + +#: data/ui/glabels-ui.xml.h:101 +msgid "Save" +msgstr "Speichern" + +#: data/ui/glabels-ui.xml.h:102 +msgid "Save As" +msgstr "Speichern unter..." + +#: data/ui/glabels-ui.xml.h:103 +msgid "Save _As..." +msgstr "Speichern _unter..." + +#: data/ui/glabels-ui.xml.h:104 +msgid "Save the current file" +msgstr "Die aktuelle Datei speichern" + +#: data/ui/glabels-ui.xml.h:105 +msgid "Save the current file with a different name" +msgstr "Die aktuelle Datei unter einem anderen Dateinamen speichern" + +#: data/ui/glabels-ui.xml.h:106 +msgid "Select All" +msgstr "Alles markieren" + +#: data/ui/glabels-ui.xml.h:107 +msgid "Select _All" +msgstr "_Alles markieren" + +#: data/ui/glabels-ui.xml.h:108 +msgid "Select all objects" +msgstr "Alle Objekte markieren" + +#: data/ui/glabels-ui.xml.h:109 +msgid "Select, move and modify objects" +msgstr "Objekte auswählen, bewegen, ändern" + +# CHECK +#: data/ui/glabels-ui.xml.h:111 +#, fuzzy +msgid "Set drawing toolbar button style according to desktop default" +msgstr "" +"Den Knopfstil der Werkzeugleiste der Desktop-Vorgabe entsprechend einstellen" + +# CHECK +#: data/ui/glabels-ui.xml.h:112 +#, fuzzy +msgid "Set main toolbar button style according to desktop default" +msgstr "" +"Den Knopfstil der Werkzeugleiste der Desktop-Vorgabe entsprechend einstellen" + +#: data/ui/glabels-ui.xml.h:113 +msgid "Show _Tooltips" +msgstr "Miniaturhilfen _zeigen" + +#: data/ui/glabels-ui.xml.h:114 +#, fuzzy +msgid "Show both icons and texts in the drawing toolbar" +msgstr "Miniaturhilfen in der Werkzeugleiste zeigen" + +#: data/ui/glabels-ui.xml.h:115 +#, fuzzy +msgid "Show both icons and texts in the main toolbar" +msgstr "Miniaturhilfen in der Werkzeugleiste zeigen" + +#: data/ui/glabels-ui.xml.h:116 +#, fuzzy +msgid "Show tooltips in the drawing toolbar" +msgstr "Miniaturhilfen in der Werkzeugleiste zeigen" + +#: data/ui/glabels-ui.xml.h:117 +#, fuzzy +msgid "Show tooltips in the main toolbar" +msgstr "Miniaturhilfen in der Werkzeugleiste zeigen" + +#: data/ui/glabels-ui.xml.h:118 +#, fuzzy +msgid "Show tooltips in the property toolbar" +msgstr "Miniaturhilfen in der Werkzeugleiste zeigen" + +#: data/ui/glabels-ui.xml.h:119 +msgid "Template Designer" +msgstr "" + +#: data/ui/glabels-ui.xml.h:120 +msgid "Template _Designer..." +msgstr "" + +#: data/ui/glabels-ui.xml.h:121 +msgid "Text color" +msgstr "" + +#: data/ui/glabels-ui.xml.h:122 +msgid "U_n-select All" +msgstr "_Markierung aufheben" + +#: data/ui/glabels-ui.xml.h:123 +msgid "Un-select All" +msgstr "Markierung aufheben" + +#: data/ui/glabels-ui.xml.h:124 +msgid "Undo" +msgstr "Rückgängig" + +#: data/ui/glabels-ui.xml.h:125 +msgid "Undo the last action" +msgstr "Die letzte Aktion rückgängig machen" + +#: data/ui/glabels-ui.xml.h:126 +#, fuzzy +msgid "Zoom _1:1" +msgstr "Zoom 1:1" + +#: data/ui/glabels-ui.xml.h:127 +#, fuzzy +msgid "Zoom _In" +msgstr "Vergrößern" + +#: data/ui/glabels-ui.xml.h:128 +#, fuzzy +msgid "Zoom _Out" +msgstr "Verkleinern" + +#: data/ui/glabels-ui.xml.h:129 +#, fuzzy +msgid "Zoom to _fit" +msgstr "Verkleinern" + +#: data/ui/glabels-ui.xml.h:130 +msgid "Zoom to fit window" +msgstr "" + +#: data/ui/glabels-ui.xml.h:131 +msgid "_About..." +msgstr "_Info..." + +#: data/ui/glabels-ui.xml.h:132 +msgid "_Bottoms" +msgstr "" + +#: data/ui/glabels-ui.xml.h:135 +msgid "_Close" +msgstr "S_chließen" + +#: data/ui/glabels-ui.xml.h:136 +msgid "_Contents" +msgstr "I_nhalt" + +#: data/ui/glabels-ui.xml.h:137 +msgid "_Copy" +msgstr "_Kopieren" + +#: data/ui/glabels-ui.xml.h:138 +#, fuzzy +msgid "_Create Object" +msgstr "Linienobjekt erzeugen" + +#: data/ui/glabels-ui.xml.h:139 +msgid "_Debug" +msgstr "_Fehlerdiagnose" + +#: data/ui/glabels-ui.xml.h:141 +msgid "_Desktop Default" +msgstr "_Desktop-Vorgabe" + +#: data/ui/glabels-ui.xml.h:142 +#, fuzzy +msgid "_Drawing Toolbar" +msgstr "Haupt-Werkzeugleiste" + +#: data/ui/glabels-ui.xml.h:143 +msgid "_Edit" +msgstr "_Bearbeiten" + +#: data/ui/glabels-ui.xml.h:145 +msgid "_File" +msgstr "_Datei" + +#: data/ui/glabels-ui.xml.h:146 +msgid "_Grid" +msgstr "" + +#: data/ui/glabels-ui.xml.h:147 +msgid "_Help" +msgstr "_Hilfe" + +#: data/ui/glabels-ui.xml.h:148 +msgid "_Icon" +msgstr "_Icon" + +#: data/ui/glabels-ui.xml.h:152 +#, fuzzy +msgid "_Main Toolbar" +msgstr "Haupt-Werkzeugleiste" + +#: data/ui/glabels-ui.xml.h:153 +#, fuzzy +msgid "_Merge Properties..." +msgstr "Einstellungen bearbeiten..." + +#: data/ui/glabels-ui.xml.h:154 +msgid "_New" +msgstr "_Neu" + +#: data/ui/glabels-ui.xml.h:155 +#, fuzzy +msgid "_Objects" +msgstr "Objekt-Vorgaben" + +#: data/ui/glabels-ui.xml.h:156 +msgid "_Open..." +msgstr "Ö_ffnen..." + +#: data/ui/glabels-ui.xml.h:158 +msgid "_Paste" +msgstr "_Einfügen" + +#: data/ui/glabels-ui.xml.h:159 +msgid "_Print..." +msgstr "_Drucken..." + +# CHECK +#: data/ui/glabels-ui.xml.h:160 +#, fuzzy +msgid "_Property Toolbar" +msgstr "Werkzeugleisten-Werkzeuge" + +#: data/ui/glabels-ui.xml.h:161 +msgid "_Quit" +msgstr "_Beenden" + +#: data/ui/glabels-ui.xml.h:164 +msgid "_Save" +msgstr "_Speichern" + +#: data/ui/glabels-ui.xml.h:168 +msgid "_View" +msgstr "_Ansicht" + +#: data/glade/prefs-dialog.glade.h:1 +msgid " " +msgstr "" + +#: data/glade/prefs-dialog.glade.h:2 data/glade/object-editor.glade.h:1 +#: data/glade/template-designer.glade.h:5 +msgid "*" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:3 +msgid "Default page size" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:4 +msgid "Fill" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:5 +msgid "Line" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:6 +msgid "Text" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:7 +msgid "Units" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:8 data/glade/object-editor.glade.h:4 +msgid "Alignment:" +msgstr "Ausrichtung:" + +#: data/glade/prefs-dialog.glade.h:9 data/glade/object-editor.glade.h:8 +msgid "Color:" +msgstr "Farbe:" + +#: data/glade/prefs-dialog.glade.h:10 +msgid "Font:" +msgstr "Schrift:" + +#: data/glade/prefs-dialog.glade.h:11 +msgid "ISO A4" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:12 +msgid "Inches" +msgstr "Inch" + +#: data/glade/prefs-dialog.glade.h:13 data/glade/object-editor.glade.h:19 +msgid "Line Spacing:" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:14 +msgid "Locale" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:15 +msgid "Millimeters" +msgstr "Millimeter" + +#: data/glade/prefs-dialog.glade.h:16 +msgid "Object defaults" +msgstr "Objekt-Vorgaben" + +#: data/glade/prefs-dialog.glade.h:17 +msgid "Points" +msgstr "Punkte" + +#: data/glade/prefs-dialog.glade.h:18 +msgid "Select default properties for new objects." +msgstr "Wählen Sie die vorgegebenen Eigenschaften für neue Objekte." + +#: data/glade/prefs-dialog.glade.h:19 +msgid "Select locale specific behavior." +msgstr "" + +#: data/glade/prefs-dialog.glade.h:20 data/templates/paper-sizes.xml.h:25 +msgid "US Letter" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:21 data/glade/object-editor.glade.h:29 +#: data/glade/template-designer.glade.h:72 +msgid "Width:" +msgstr "Breite:" + +#: data/glade/object-editor.glade.h:2 +msgid "00000000000 00000" +msgstr "" + +#: data/glade/object-editor.glade.h:3 +msgid "Xxx object properties" +msgstr "" + +#: data/glade/object-editor.glade.h:5 +msgid "Allow merge to automatically shrink text" +msgstr "" + +#: data/glade/object-editor.glade.h:6 +msgid "Angle:" +msgstr "Winkel:" + +#: data/glade/object-editor.glade.h:7 +msgid "Checksum" +msgstr "" + +#: data/glade/object-editor.glade.h:10 +#, fuzzy +msgid "Family:" +msgstr "_Datei" + +#: data/glade/object-editor.glade.h:12 +msgid "Fill" +msgstr "Füllen" + +#: data/glade/object-editor.glade.h:13 data/glade/template-designer.glade.h:33 +msgid "Height:" +msgstr "Höhe" + +#: data/glade/object-editor.glade.h:14 +msgid "Image" +msgstr "Bild" + +#: data/glade/object-editor.glade.h:15 +msgid "Insert merge field" +msgstr "Datenfeld einfügen" + +#: data/glade/object-editor.glade.h:17 +msgid "Length:" +msgstr "Länge:" + +#: data/glade/object-editor.glade.h:18 +msgid "Line" +msgstr "Linie" + +#: data/glade/object-editor.glade.h:20 +msgid "Literal:" +msgstr "Literale:" + +#: data/glade/object-editor.glade.h:21 +msgid "Load image" +msgstr "" + +#: data/glade/object-editor.glade.h:22 +msgid "Position" +msgstr "Position" + +#: data/glade/object-editor.glade.h:23 +msgid "Reset image size" +msgstr "Reset Bildgröße" + +#: data/glade/object-editor.glade.h:24 +msgid "Size" +msgstr "Breite" + +#: data/glade/object-editor.glade.h:25 +#, fuzzy +msgid "Size:" +msgstr "Breite" + +#: data/glade/object-editor.glade.h:26 +#, fuzzy +msgid "Style" +msgstr "Stil" + +#: data/glade/object-editor.glade.h:27 +#, fuzzy +msgid "Style:" +msgstr "Stil" + +#: data/glade/object-editor.glade.h:30 +msgid "X:" +msgstr "X:" + +#: data/glade/object-editor.glade.h:31 +msgid "Y:" +msgstr "Y:" + +#: data/glade/object-editor.glade.h:32 +msgid "degrees" +msgstr "Grad" + +#: data/glade/object-editor.glade.h:33 +msgid "dialog1" +msgstr "" + +#: data/glade/object-editor.glade.h:34 +msgid "digits:" +msgstr "" + +#: data/glade/object-editor.glade.h:35 +#, fuzzy +msgid "format:" +msgstr "Format:" + +#: data/glade/template-designer.glade.h:1 +msgid " " +msgstr "" + +#: data/glade/template-designer.glade.h:2 +msgid "(e.g., \"Mailing Labels,\" \"Business Cards,\" ...)" +msgstr "" + +#: data/glade/template-designer.glade.h:3 +msgid "(e.g., 8163A)" +msgstr "" + +#: data/glade/template-designer.glade.h:4 +msgid "(e.g., Avery, Acme, ...)" +msgstr "" + +#: data/glade/template-designer.glade.h:6 +msgid "1. Outer radius:" +msgstr "" + +#: data/glade/template-designer.glade.h:7 +msgid "1. Radius:" +msgstr "" + +#: data/glade/template-designer.glade.h:8 +#, fuzzy +msgid "1. Width:" +msgstr "Breite:" + +#: data/glade/template-designer.glade.h:9 +#, fuzzy +msgid "2. Height:" +msgstr "Höhe" + +#: data/glade/template-designer.glade.h:10 +msgid "2. Inner radius:" +msgstr "" + +#: data/glade/template-designer.glade.h:11 +msgid "2. Waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:12 +msgid "3. Clipping width:" +msgstr "" + +#: data/glade/template-designer.glade.h:13 +msgid "3. Margin" +msgstr "" + +#: data/glade/template-designer.glade.h:14 +msgid "3. Round (radius of corner):" +msgstr "" + +#: data/glade/template-designer.glade.h:15 +msgid "4. Clipping height:" +msgstr "" + +#: data/glade/template-designer.glade.h:16 +msgid "4. Horiz. waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:17 +msgid "5. Vert. waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:18 +msgid "5. Waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:19 +msgid "6. Margin" +msgstr "" + +#: data/glade/template-designer.glade.h:20 +msgid "Brand/Manufacturer:" +msgstr "" + +#: data/glade/template-designer.glade.h:21 +msgid "CD/DVD (including credit card CDs)" +msgstr "" + +#: data/glade/template-designer.glade.h:22 +msgid "" +"Congratulations!\n" +"\n" +"You have completed the gLabels Template Designer.\n" +"If you wish to accept and save your design, click \"Apply.\"\n" +"\n" +"Otherwise, you may click \"Cancel\" to abandon your design\n" +"or \"Back\" to continue editing this design." +msgstr "" + +#: data/glade/template-designer.glade.h:30 +msgid "Design Completed" +msgstr "" + +#: data/glade/template-designer.glade.h:31 +msgid "Distance from left edge (x0):" +msgstr "" + +#: data/glade/template-designer.glade.h:32 +msgid "Distance from top edge (y0):" +msgstr "" + +#: data/glade/template-designer.glade.h:34 +msgid "Horizontal pitch (dx):" +msgstr "" + +#: data/glade/template-designer.glade.h:35 +msgid "" +"How many layouts will your template contain? \n" +"\n" +"A layout is a set of labels or cards that can be arranged in a simple grid.\n" +"Most templates only need one layout, as in the first example.\n" +"The second example illustrates when two layouts are needed." +msgstr "" + +#: data/glade/template-designer.glade.h:40 +msgid "Label Size (CD/DVD)" +msgstr "" + +#: data/glade/template-designer.glade.h:41 +#, fuzzy +msgid "Label Size (Round)" +msgstr "Etikettenformat:" + +#: data/glade/template-designer.glade.h:42 +#, fuzzy +msgid "Label or Card Shape" +msgstr "Neues Etikett oder neue Karte" + +#: data/glade/template-designer.glade.h:43 +msgid "Label or Card Size (Rectangular)" +msgstr "" + +#: data/glade/template-designer.glade.h:44 +#, fuzzy +msgid "Layout #1" +msgstr "Layout:" + +#: data/glade/template-designer.glade.h:45 +#, fuzzy +msgid "Layout #2" +msgstr "Layout:" + +#: data/glade/template-designer.glade.h:46 +#, fuzzy +msgid "Layout(s)" +msgstr "Layout:" + +#: data/glade/template-designer.glade.h:47 +#, fuzzy +msgid "Name and Description" +msgstr "Beschreibung:" + +#: data/glade/template-designer.glade.h:48 +msgid "Number across (nx):" +msgstr "" + +#: data/glade/template-designer.glade.h:49 +msgid "Number down (ny):" +msgstr "" + +#: data/glade/template-designer.glade.h:50 +msgid "Number of Layouts" +msgstr "" + +#: data/glade/template-designer.glade.h:51 +msgid "Number of layouts:" +msgstr "" + +#: data/glade/template-designer.glade.h:52 +#, fuzzy +msgid "Page Size" +msgstr "Seitenformat:" + +#: data/glade/template-designer.glade.h:54 +msgid "Part #:" +msgstr "" + +#: data/glade/template-designer.glade.h:55 +msgid "" +"Please enter the following identifying information about the template " +"stationery." +msgstr "" + +#: data/glade/template-designer.glade.h:56 +msgid "Please enter the following layout information." +msgstr "" + +#: data/glade/template-designer.glade.h:57 +msgid "" +"Please enter the following size parameters of a single label in your " +"template." +msgstr "" + +#: data/glade/template-designer.glade.h:58 +msgid "" +"Please enter the following size parameters of a single label or card in your " +"template." +msgstr "" + +#: data/glade/template-designer.glade.h:59 +msgid "Please select the basic shape of the labels or cards." +msgstr "" + +#: data/glade/template-designer.glade.h:60 +msgid "Please select the page size of the template stationery." +msgstr "" + +#: data/glade/template-designer.glade.h:61 +#, fuzzy +msgid "Print test sheet" +msgstr "auf erster Seite" + +#: data/glade/template-designer.glade.h:62 +msgid "Rectangular or square (can have rounded corners)" +msgstr "" + +#: data/glade/template-designer.glade.h:63 +msgid "Round" +msgstr "" + +#: data/glade/template-designer.glade.h:64 +msgid "" +"Templates needing\n" +"two layouts." +msgstr "" + +#: data/glade/template-designer.glade.h:66 +msgid "" +"Templates needing only\n" +"one layout." +msgstr "" + +#: data/glade/template-designer.glade.h:68 +msgid "Vertical pitch (dy):" +msgstr "" + +#: data/glade/template-designer.glade.h:69 +msgid "" +"Welcome to the gLabels Template Designer.\n" +"\n" +"This dialog will assist you in the creation of a custom gLabels template." +msgstr "" + +#: data/templates/paper-sizes.xml.h:1 +msgid "A0" +msgstr "" + +#: data/templates/paper-sizes.xml.h:2 +msgid "A1" +msgstr "" + +#: data/templates/paper-sizes.xml.h:3 +msgid "A10" +msgstr "" + +#: data/templates/paper-sizes.xml.h:4 +msgid "A2" +msgstr "" + +#: data/templates/paper-sizes.xml.h:5 +msgid "A3" +msgstr "" + +#: data/templates/paper-sizes.xml.h:6 +msgid "A4" +msgstr "" + +#: data/templates/paper-sizes.xml.h:7 +msgid "A5" +msgstr "" + +#: data/templates/paper-sizes.xml.h:8 +msgid "A6" +msgstr "" + +#: data/templates/paper-sizes.xml.h:9 +msgid "A7" +msgstr "" + +#: data/templates/paper-sizes.xml.h:10 +msgid "A8" +msgstr "" + +#: data/templates/paper-sizes.xml.h:11 +msgid "A9" +msgstr "" + +#: data/templates/paper-sizes.xml.h:12 +msgid "B0" +msgstr "" + +#: data/templates/paper-sizes.xml.h:13 +msgid "B1" +msgstr "" + +#: data/templates/paper-sizes.xml.h:14 +msgid "B10" +msgstr "" + +#: data/templates/paper-sizes.xml.h:15 +msgid "B2" +msgstr "" + +#: data/templates/paper-sizes.xml.h:16 +msgid "B3" +msgstr "" + +#: data/templates/paper-sizes.xml.h:17 +msgid "B4" +msgstr "" + +#: data/templates/paper-sizes.xml.h:18 +msgid "B5" +msgstr "" + +#: data/templates/paper-sizes.xml.h:19 +msgid "B6" +msgstr "" + +#: data/templates/paper-sizes.xml.h:20 +msgid "B7" +msgstr "" + +#: data/templates/paper-sizes.xml.h:21 +msgid "B8" +msgstr "" + +#: data/templates/paper-sizes.xml.h:22 +msgid "B9" +msgstr "" + +#: data/templates/paper-sizes.xml.h:23 +msgid "US Executive" +msgstr "" + +#: data/templates/paper-sizes.xml.h:24 +msgid "US Legal" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:1 +#: data/templates/zweckform-iso-templates.xml.h:1 +msgid "Address Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:2 +#: data/templates/avery-iso-templates.xml.h:2 +#: data/templates/zweckform-iso-templates.xml.h:3 +#: data/templates/misc-us-templates.xml.h:2 +#: data/templates/misc-iso-templates.xml.h:9 +msgid "Business Cards" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:3 +msgid "CD/DVD Labels (Disc Labels)" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:4 +msgid "Diskette Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:5 +#, fuzzy +msgid "Filing Labels" +msgstr "Labels" + +#: data/templates/avery-us-templates.xml.h:6 +msgid "Full Sheet Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:7 +#, fuzzy +msgid "Large Round Labels" +msgstr "Start bei Etikett" + +#: data/templates/avery-us-templates.xml.h:8 +msgid "Name Badge Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:9 +msgid "Return Address Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:10 +msgid "Shipping Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:11 +#, fuzzy +msgid "Small Round Labels" +msgstr "Start bei Etikett" + +#: data/templates/avery-us-templates.xml.h:12 +#, fuzzy +msgid "Square Labels" +msgstr "Labels" + +#: data/templates/avery-us-templates.xml.h:13 +msgid "Video Tape Face Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:14 +msgid "Video Tape Spine Labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:1 +msgid "Address labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:3 +msgid "CD Booklet" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:4 +msgid "CD Inlet" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:5 +#: data/templates/zweckform-iso-templates.xml.h:4 +#: data/templates/misc-us-templates.xml.h:4 +#: data/templates/misc-iso-templates.xml.h:10 +#, fuzzy +msgid "CD/DVD Labels" +msgstr "Labels" + +#: data/templates/avery-iso-templates.xml.h:6 +#, fuzzy +msgid "Diskette labels" +msgstr "glabels" + +#: data/templates/avery-iso-templates.xml.h:7 +#: data/templates/zweckform-iso-templates.xml.h:7 +#: data/templates/misc-iso-templates.xml.h:17 +msgid "Mailing Labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:8 +#, fuzzy +msgid "Mailing labels" +msgstr "glabels" + +#: data/templates/avery-iso-templates.xml.h:9 +msgid "Mini Address Labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:10 +#, fuzzy +msgid "Shipping labels" +msgstr "Öffnen Etikett" + +#: data/templates/zweckform-iso-templates.xml.h:2 +#, fuzzy +msgid "Allround Labels" +msgstr "glabels" + +#: data/templates/zweckform-iso-templates.xml.h:5 +msgid "Correction and Cover-up Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:6 +msgid "Lever Arch File Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:8 +msgid "QSL-Karten Etiketten 70mm x 50,8mm" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:9 +msgid "Rectangular Copier Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:10 +#: data/templates/misc-iso-templates.xml.h:22 +msgid "Rectangular Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:11 +msgid "Video Labels (back)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:1 +msgid "Business Card CD" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:3 +msgid "CD Template Rectangles" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:5 +msgid "CD/DVD Labels (Face Only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:6 +#: data/templates/misc-iso-templates.xml.h:11 +msgid "CD/DVD Labels (face only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:7 +#, fuzzy +msgid "DLT Labels" +msgstr "Labels" + +#: data/templates/misc-us-templates.xml.h:8 +#, fuzzy +msgid "Microtube labels" +msgstr "glabels" + +#: data/templates/misc-us-templates.xml.h:9 +msgid "Mini-CD Labels" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:10 +msgid "PRO CD Labels 2-up (CD spine only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:11 +msgid "PRO CD Labels 2-up (Face only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:12 +#: data/templates/misc-iso-templates.xml.h:21 +msgid "PRO CD Labels 2-up (face only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:13 +msgid "Slimline CD Case (rightside up)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:14 +msgid "Slimline CD Case (upside down)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:1 +msgid "Agipa 119488: Business Cards" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:2 +msgid "Allround Labels --24" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:3 +msgid "Allround Labels --44" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:4 +msgid "Allround Labels --64" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:5 +msgid "Allround Labels --65" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:6 +msgid "Arch File Labels" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:7 +msgid "Arch File Labels (large)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:8 +msgid "Arch File Labels (small)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:12 +msgid "CD/DVD Labels Standard Format (face only)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:13 +msgid "Diskette Labels (face only)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:14 +msgid "EPSON Photo Stickers 16" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:15 +msgid "Etiketten" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:16 +msgid "Fridge Magnet Stickers" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:18 +msgid "Mailing Labels --14" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:19 +msgid "Mailing Labels-2 columns" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:20 +msgid "Mailing Labels-3 columns" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:23 +msgid "Video Labels (face only)" +msgstr "" + +#: data/desktop/glabels.desktop.in.h:1 +msgid "Create labels, business cards and media covers." +msgstr "" + +#: data/desktop/glabels.desktop.in.h:2 +msgid "gLabels Label Designer" +msgstr "" + +#: data/mime/glabels.keys.in.h:1 data/mime/glabels.xml.in.h:1 +#, fuzzy +msgid "gLabels Project File" +msgstr "Rechteck bearbeiten..." + +#, fuzzy +#~ msgid "Object _Properties..." +#~ msgstr "Einstellungen bearbeiten..." + +#~ msgid "Display units" +#~ msgstr "Maßeinheit" + +#~ msgid "Default page size" +#~ msgstr "Standard Papierformat" + +#~ msgid "Outline" +#~ msgstr "Outline" + +#~ msgid "Edit line object properties" +#~ msgstr "Linienobjekt bearbeiten..." + +#~ msgid "Edit text object properties" +#~ msgstr "Text Objekt bearbeiten" + +#~ msgid "Maintain current aspect ratio" +#~ msgstr "Aktuelles Seitenverhältnis beibehalten" + +#, fuzzy +#~ msgid "CD Labels" +#~ msgstr "Labels" + +#~ msgid "Open %s" +#~ msgstr "%s öffnen" + +#~ msgid "About this application" +#~ msgstr "Info zu dieser Anwendung" + +#~ msgid "Clos_e All" +#~ msgstr "Alle Sch_ließen" + +#~ msgid "Close All" +#~ msgstr "Alle schließen" + +#~ msgid "Close all open files" +#~ msgstr "Alle geöffneten Dateien schließen" + +#~ msgid "_Documents" +#~ msgstr "_Dokumente" + +#~ msgid "_Toolbar" +#~ msgstr "_Werkzeugleiste" + +#~ msgid "Do_n't save" +#~ msgstr "Ni_cht speichern" + +#~ msgid "_Don't quit" +#~ msgstr "_Nicht beenden" + +#~ msgid "_Don't close" +#~ msgstr "Nich_t schließen" + +#~ msgid "Author:" +#~ msgstr "Autor:" + +#~ msgid "Error saving file '%s'" +#~ msgstr "Datei »%s« konnte nicht gespeichert werden " + +#~ msgid "Appearance" +#~ msgstr "Erscheinungsbild" + +#~ msgid "Position/Size" +#~ msgstr "Position/Breite" + +#~ msgid "Barcode data" +#~ msgstr "Barcode-Daten" + +#~ msgid "Fields" +#~ msgstr "Felder" + +#~ msgid "%s %d" +#~ msgstr "%s %d" + +#~ msgid "Column" +#~ msgstr "Spalte" + +#~ msgid "Custom field key" +#~ msgstr "Benutzerdefinierter Feldschlüssel" + +#~ msgid "Sample data" +#~ msgstr "Beispiel Daten" + +#~ msgid "Scale:" +#~ msgstr "Skalierung:" + +#~ msgid "%" +#~ msgstr "%" + +#~ msgid "Show text with barcode" +#~ msgstr "Zeige Text mit Barcode" + +#~ msgid "Activate %s" +#~ msgstr "%s aktivieren" diff --git a/glabels2/po/eo.po b/glabels2/po/eo.po new file mode 100644 index 00000000..cda51cea --- /dev/null +++ b/glabels2/po/eo.po @@ -0,0 +1,2438 @@ +# translation of eo.po to +# Italian translation of glabels. +# Copyright (C) 2003 THE glabels'S COPYRIGHT HOLDER +# This file is distributed under the same license as the glabels package. +# +# Esperanto special letters: ĉŝĝĥĵŭ -- 2244 +# Antonio C. Codazzi "la Filozofo" , 2007. +# +# +msgid "" +msgstr "" +"Project-Id-Version: eo\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-06-19 20:43-0400\n" +"PO-Revision-Date: 2007-06-06 16:48+0200\n" +"Last-Translator: Antonio C. Codazzi \n" +"Language-Team: Esperanto \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.0.2\n" + +#: src/glabels.c:116 +msgid "Could not initialize Bonobo!\n" +msgstr "Estas neeble prepari Bonobon!\n" + +#: src/glabels-batch.c:52 +msgid "print this message" +msgstr "presu tiun ĉi mesaĝon" + +#: src/glabels-batch.c:54 +msgid "print the version of glabels-batch being used" +msgstr "presu version de uzata staplo de glabels" + +#: src/glabels-batch.c:56 +msgid "set output filename (default=\"output.ps\")" +msgstr "agordu dosiernomon de eligo (defaÅ­lte \"output.ps\")" + +#: src/glabels-batch.c:56 src/glabels-batch.c:70 +msgid "filename" +msgstr "dosiernomo" + +#: src/glabels-batch.c:58 +msgid "number of sheets (default=1)" +msgstr "nombro da folioj (defaÅ­lte 1)" + +#: src/glabels-batch.c:58 +msgid "sheets" +msgstr "folioj" + +#: src/glabels-batch.c:60 +msgid "number of copies (default=1)" +msgstr "nombro da ekzempleroj (defaÅ­lte 1)" + +#: src/glabels-batch.c:60 +msgid "copies" +msgstr "ekzempleroj" + +#: src/glabels-batch.c:62 +msgid "first label on first sheet (default=1)" +msgstr "unua etikedo de unua folio (defaÅ­lte 1)" + +#: src/glabels-batch.c:62 +msgid "first" +msgstr "unua" + +#: src/glabels-batch.c:64 src/print-dialog.c:336 +msgid "print outlines (to test printer alignment)" +msgstr "presu konturojn (por testi alliniĝon de la printilo)" + +#: src/glabels-batch.c:66 src/print-dialog.c:344 +msgid "print in reverse (i.e. a mirror image)" +msgstr "presu inverse (ekz. iun spegulitan bildon)" + +#: src/glabels-batch.c:68 src/print-dialog.c:351 +msgid "print crop marks" +msgstr "presu liniojn de tranĉo" + +#: src/glabels-batch.c:70 +msgid "input file for merging" +msgstr "eniga dosiero por kunfandi" + +#: src/glabels-batch.c:107 +msgid "[OPTION...] GLABELS_FILE..." +msgstr "[OPTION...] GLABELS_FILE..." + +#: src/glabels-batch.c:127 +#, c-format +msgid "missing glabels file\n" +msgstr "mankanta dosero de glabels\n" + +#: src/glabels-batch.c:158 +#, c-format +msgid "cannot perform document merge with glabels file %s\n" +msgstr "estas neeble kunfandi dokumentojn kun dosiero de glabels %s\n" + +#: src/glabels-batch.c:182 +#, c-format +msgid "cannot open glabels file %s\n" +msgstr "estas neeble malfermi dosieron de glabels %s\n" + +#: src/window.c:244 +msgid "(none) - gLabels" +msgstr "(nenio) - gLabels" + +#: src/window.c:414 +msgid "(modified)" +msgstr "(modifita)" + +#: src/stock.c:65 data/ui/glabels-ui.xml.h:162 +msgid "_Select Mode" +msgstr "Modu_so de Elektado" + +#: src/stock.c:66 data/ui/glabels-ui.xml.h:163 +msgid "_Text" +msgstr "_Teksto" + +#: src/stock.c:67 data/ui/glabels-ui.xml.h:148 +msgid "_Line" +msgstr "_Linio" + +#: src/stock.c:68 data/ui/glabels-ui.xml.h:130 +msgid "_Box" +msgstr "_Fako" + +#: src/stock.c:69 data/ui/glabels-ui.xml.h:141 +msgid "_Ellipse" +msgstr "_Elipso" + +#: src/stock.c:70 data/ui/glabels-ui.xml.h:146 +msgid "_Image" +msgstr "_Bildo" + +#: src/stock.c:71 data/ui/glabels-ui.xml.h:11 +msgid "Bar_code" +msgstr "Strek_kodo" + +#: src/stock.c:72 +msgid "_Merge Properties" +msgstr "Ecoj de Ku_nfando" + +#: src/stock.c:73 +msgid "Object _Properties" +msgstr "Ecoj de _Objekto" + +#: src/stock.c:74 data/ui/glabels-ui.xml.h:13 +msgid "Bring to _Front" +msgstr "Portu _Fronten" + +#: src/stock.c:75 data/ui/glabels-ui.xml.h:109 +msgid "Send to _Back" +msgstr "_Sendu MalantaÅ­en" + +#: src/stock.c:76 data/ui/glabels-ui.xml.h:96 +msgid "Rotate _Left" +msgstr "Turnu _Maldekstren" + +#: src/stock.c:77 data/ui/glabels-ui.xml.h:97 +msgid "Rotate _Right" +msgstr "Turnu _Dekstren" + +#: src/stock.c:78 data/ui/glabels-ui.xml.h:52 +msgid "Flip _Horizontally" +msgstr "Renversu _Horizontale" + +#: src/stock.c:79 data/ui/glabels-ui.xml.h:53 +msgid "Flip _Vertically" +msgstr "Renversu _Vertikale" + +#: src/stock.c:80 data/ui/glabels-ui.xml.h:147 +msgid "_Lefts" +msgstr "_Maldekstre" + +#: src/stock.c:81 data/ui/glabels-ui.xml.h:159 +msgid "_Rights" +msgstr "_Dekstre" + +#: src/stock.c:82 data/ui/glabels-ui.xml.h:131 +msgid "_Centers" +msgstr "_Centre" + +#: src/stock.c:83 data/ui/glabels-ui.xml.h:164 +msgid "_Tops" +msgstr "_Supre" + +#: src/stock.c:84 +msgid "Bottoms" +msgstr "Sube" + +#: src/stock.c:85 +msgid "Centers" +msgstr "Centre" + +#: src/stock.c:86 src/stock.c:87 data/ui/glabels-ui.xml.h:62 +msgid "Label Ce_nter" +msgstr "Ce_ntrita Etikedo" + +#: src/stock.c:88 data/ui/glabels-ui.xml.h:51 +msgid "Fill color" +msgstr "Koloro de plenigo" + +#: src/stock.c:89 data/ui/glabels-ui.xml.h:64 +msgid "Line color" +msgstr "Koloro de linio" + +#: src/stock.c:90 src/stock.c:92 +msgid "Linked" +msgstr "Kunligita" + +#: src/stock.c:91 src/stock.c:93 +msgid "Not Linked" +msgstr "Neniu Kunligo" + +#: src/ui-property-bar.c:345 src/object-editor.c:499 +msgid "Default" +msgstr "DefaÅ­lto" + +#: src/ui-property-bar.c:360 src/object-editor.c:512 +msgid "No fill" +msgstr "Neniu Plenigo" + +#: src/ui-property-bar.c:375 src/object-editor.c:505 +msgid "No line" +msgstr "Neniu Linio" + +#: src/ui-sidebar.c:180 +msgid "Object properties" +msgstr "Ecoj de objekto" + +#: src/commands.c:385 +msgid "" +"A label and business card creation program for GNOME.\n" +" \n" +"Glabels is free software; you can redistribute it and/or modify it under the " +"terms of the GNU General Public License as published by the Free Software " +"Foundation; either version 2 of the License, or (at your option) any later " +"version.\n" +" \n" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details.\n" +msgstr "" + +#: src/commands.c:399 +msgid "See the file AUTHORS for additional credits," +msgstr "Vidigu la dosieron nomitan AUTHORS por pluaj informoj," + +#: src/commands.c:400 +msgid "or visit http://glabels.sourceforge.net/" +msgstr "aÅ­ vizitu http://glabels.sourceforge.net/" + +#: src/commands.c:409 +msgid " " +msgstr " " + +#: src/commands.c:424 +msgid "glabels" +msgstr "glabels" + +#: src/file.c:100 +msgid "New Label or Card" +msgstr "Nova Etikedo aÅ­ Karto" + +#: src/file.c:132 src/file.c:304 +msgid "Media Type" +msgstr "Speco de plurmedio" + +#: src/file.c:138 src/file.c:310 +msgid "Label orientation" +msgstr "Orientado de etikedo" + +#: src/file.c:269 +msgid "Label properties" +msgstr "Ecoj de etikedo" + +#: src/file.c:452 src/file.c:870 +msgid "All files" +msgstr "Ĉiuj dosieroj" + +#: src/file.c:457 src/file.c:875 +msgid "gLabels documents" +msgstr "Dokumentoj de gLabels" + +#: src/file.c:505 src/file.c:617 src/file.c:934 src/file.c:1130 +msgid "Empty file name selection" +msgstr "Elektado de nomon de vakua dosiero" + +#: src/file.c:506 src/file.c:520 src/file.c:618 src/file.c:632 +msgid "Please select a file or supply a valid file name" +msgstr "Bonvolu indiki dosieron aÅ­ validan dosiernomon" + +#: src/file.c:519 src/file.c:631 +msgid "File does not exist" +msgstr "la dosiero ne ekzistas" + +#: src/file.c:563 data/ui/glabels-ui.xml.h:74 +msgid "Open" +msgstr "Malfermu" + +#: src/file.c:565 +msgid "Open label" +msgstr "Malfermu etikedon" + +#: src/file.c:707 +#, c-format +msgid "Could not open file \"%s\"" +msgstr "Estas neeble malfermi dosieron \"%s\"" + +#: src/file.c:715 +msgid "Not a supported file format" +msgstr "La formato de dosiero ne estas subtenita" + +#: src/file.c:797 src/file.c:979 src/file.c:1174 +#, c-format +msgid "Could not save file \"%s\"" +msgstr "estas neeble konservi dosieron \"%s\"" + +#: src/file.c:805 src/file.c:987 src/file.c:1182 +msgid "Error encountered during save. The file is still not saved." +msgstr "Eraro dum konservado. la dosiero ankoraÅ­ ne estas konservita." + +#: src/file.c:848 src/file.c:1048 +#, c-format +msgid "Save \"%s\" as" +msgstr "Konservu \"%s\" kiel" + +#: src/file.c:935 src/file.c:1131 +msgid "Please supply a valid file name" +msgstr "Bonvolu indiki validan dosiernomon" + +#: src/file.c:952 src/file.c:1147 +#, c-format +msgid "Overwrite file \"%s\"?" +msgstr "Ĉu mi devas anstataÅ­igi dosieron \"%s\"?" + +#: src/file.c:960 src/file.c:1155 +msgid "File already exists." +msgstr "La dosiero jam ekzistas." + +#: src/file.c:1271 +#, c-format +msgid "Save changes to document \"%s\" before closing?" +msgstr "Ĉu mi devas konservi la modifojn de la dokumento \"%s\" antaÅ­ ol fermi?" + +#: src/file.c:1279 +msgid "Your changes will be lost if you don't save them." +msgstr "La modifoj estos perditaj se oni ne konservas ilin." + +#: src/file.c:1282 +msgid "Close without saving" +msgstr "fermu sen konservi" + +#. Should not happen +#: src/prefs.c:156 src/prefs.c:163 data/glade/prefs-dialog.glade.h:23 +#: data/glade/object-editor.glade.h:37 +msgid "points" +msgstr "punktoj" + +#: src/prefs.c:158 data/glade/object-editor.glade.h:36 +#: data/glade/template-designer.glade.h:74 +msgid "inches" +msgstr "coloj" + +#: src/prefs.c:160 +msgid "mm" +msgstr "mm" + +#: src/prefs-dialog.c:248 data/glade/prefs-dialog.glade.h:22 +msgid "gLabels Preferences" +msgstr "Agordoj de gLabels" + +#. +#. * Submenu: Order +#. +#: src/view.c:3574 data/ui/glabels-ui.xml.h:154 +msgid "_Order" +msgstr "_Ordo" + +#. +#. * Submenu: Rotate/Flip +#. +#: src/view.c:3595 data/ui/glabels-ui.xml.h:160 +msgid "_Rotate/Flip" +msgstr "_Rotacio/Renverso" + +#. +#. * Submenu: Align Horizontally +#. +#: src/view.c:3628 +msgid "Align _Horizontally" +msgstr "LaÅ­linnigu _Horizontale" + +#. +#. * Submenu: Align Vertically +#. +#: src/view.c:3667 +msgid "Align _Vertically" +msgstr "LaÅ­linnigu _Verticale" + +#: src/view.c:3728 data/ui/glabels-ui.xml.h:137 +msgid "_Delete" +msgstr "_Forigu" + +#. Build editor. +#: src/view-box.c:224 +msgid "Box object properties" +msgstr "Ecoj de Fako" + +#. Build editor. +#: src/view-ellipse.c:224 +msgid "Ellipse object properties" +msgstr "Ecoj de Elipso" + +#. Build editor. +#: src/view-line.c:224 +msgid "Line object properties" +msgstr "Ecoj de Linio" + +#. Build editor. +#: src/view-image.c:223 +msgid "Image object properties" +msgstr "Ecoj de Bildo" + +#. Build editor. +#: src/view-text.c:251 +msgid "Text object properties" +msgstr "Ecoj de Teksto" + +#: src/view-text.c:563 data/glade/object-editor.glade.h:28 +msgid "Text" +msgstr "Teksto" + +#. Build editor. +#: src/view-barcode.c:210 +msgid "Barcode object properties" +msgstr "Ecoj de Strekkodo" + +#: src/view-barcode.c:580 src/print.c:1089 +msgid "Invalid barcode data" +msgstr "Nevalida strekkodo" + +#: src/merge-properties-dialog.c:231 +msgid "Merge Properties" +msgstr "Ecoj de Kunfando" + +#. ---- Source section ---- +#: src/merge-properties-dialog.c:237 +msgid "Source" +msgstr "Fonto" + +#: src/merge-properties-dialog.c:245 +msgid "Format:" +msgstr "Formato:" + +#. Location line +#: src/merge-properties-dialog.c:273 +msgid "Location:" +msgstr "Lokiĝo:" + +#: src/merge-properties-dialog.c:282 src/merge-properties-dialog.c:393 +msgid "Select merge-database source" +msgstr "Elektu fonton de kunfand-datumbazo" + +#: src/merge-properties-dialog.c:289 src/merge-properties-dialog.c:404 +msgid "N/A" +msgstr "N/A" + +#. ---- Sample Fields section ---- +#: src/merge-properties-dialog.c:300 +msgid "Record selection/preview:" +msgstr "Elektado/AntaÅ­montro de rikordo:" + +#: src/merge-properties-dialog.c:326 +msgid "Select" +msgstr "Elektu" + +#: src/merge-properties-dialog.c:334 +msgid "Record/Field" +msgstr "Rikordo/Kampo" + +#: src/merge-properties-dialog.c:342 data/glade/object-editor.glade.h:9 +msgid "Data" +msgstr "Datumoj" + +#: src/print-dialog.c:266 data/ui/glabels-ui.xml.h:81 +msgid "Print" +msgstr "Presu" + +#: src/print-dialog.c:281 +msgid "_Job" +msgstr "_Laboro" + +#: src/print-dialog.c:286 +msgid "P_rinter" +msgstr "P_rintilo" + +#. ----------- Add simple-copies widget ------------ +#: src/print-dialog.c:314 +msgid "Copies" +msgstr "Ekzempleroj" + +#. ------- Add merge control widget ------------ +#: src/print-dialog.c:322 +msgid "Document merge control" +msgstr "Kontrolo de kunfando de dokumento" + +#. ----------- Add custom print options area ------------ +#: src/print-dialog.c:330 +msgid "Options" +msgstr "Opcioj" + +#: src/print-dialog.c:553 src/print-dialog.c:592 +msgid "Print preview" +msgstr "AntaÅ­montro de presado" + +#: src/template-designer.c:409 data/glade/template-designer.glade.h:73 +msgid "gLabels Template Designer" +msgstr "Desegnilo de modeloj por gLabels" + +#: src/bc.c:60 +msgid "POSTNET (any)" +msgstr "POSTNET (iu ajn)" + +#: src/bc.c:63 +msgid "POSTNET-5 (ZIP only)" +msgstr "POSTNET-5 (nur ZIP/CAP)" + +#: src/bc.c:66 +msgid "POSTNET-9 (ZIP+4)" +msgstr "POSTNET-9 (ZIP/CAP+4)" + +#: src/bc.c:69 +msgid "POSTNET-11 (DPBC)" +msgstr "POSTNET-11 (DPBC)" + +#: src/bc.c:72 +msgid "EAN (any)" +msgstr "EAN (iu ajn)" + +#: src/bc.c:75 +msgid "EAN-8" +msgstr "EAN-8" + +#: src/bc.c:78 +msgid "EAN-8 +2" +msgstr "EAN-8 +2" + +#: src/bc.c:81 +msgid "EAN-8 +5" +msgstr "EAN-8 +5" + +#: src/bc.c:84 +msgid "EAN-13" +msgstr "EAN-13" + +#: src/bc.c:87 +msgid "EAN-13 +2" +msgstr "EAN-13 +2" + +#: src/bc.c:90 +msgid "EAN-13 +5" +msgstr "EAN-13 +5" + +#: src/bc.c:93 +msgid "UPC (UPC-A or UPC-E)" +msgstr "UPC (UPC-A aÅ­ UPC-E)" + +#: src/bc.c:96 +msgid "UPC-A" +msgstr "UPC-A" + +#: src/bc.c:99 +msgid "UPC-A +2" +msgstr "UPC-A +2" + +#: src/bc.c:102 +msgid "UPC-A +5" +msgstr "UPC-A +5" + +#: src/bc.c:105 +msgid "UPC-E" +msgstr "UPC-E" + +#: src/bc.c:108 +msgid "UPC-E +2" +msgstr "UPC-E +2" + +#: src/bc.c:111 +msgid "UPC-E +5" +msgstr "UPC-E +5" + +#: src/bc.c:114 +msgid "ISBN" +msgstr "ISBN" + +#: src/bc.c:117 +msgid "ISBN +5" +msgstr "ISBN +5" + +#: src/bc.c:120 +msgid "Code 39" +msgstr "Kodo 39" + +#: src/bc.c:123 +msgid "Code 128" +msgstr "Kodo 128" + +#: src/bc.c:126 +msgid "Code 128C" +msgstr "Kodo 128C" + +#: src/bc.c:129 +msgid "Code 128B" +msgstr "Kodo 128B" + +#: src/bc.c:132 +msgid "Interleaved 2 of 5" +msgstr "Interleaved 2 of 5" + +#: src/bc.c:135 +msgid "Codabar" +msgstr "Codabar" + +#: src/bc.c:138 +msgid "MSI" +msgstr "MSI" + +#: src/bc.c:141 +msgid "Plessey" +msgstr "Plessey" + +#: src/label.c:569 +msgid "Untitled" +msgstr "Sen nomo" + +#: src/xml-label.c:176 src/xml-label.c:213 +msgid "xmlParseFile error" +msgstr "Eraro de xml-dosiero de sintaksa analizo" + +#: src/xml-label.c:250 +msgid "No document root" +msgstr "Neniu radika dokumento" + +#: src/xml-label.c:264 +msgid "Importing from glabels 0.1 format" +msgstr "Importante el formato de glabels 0.1" + +#: src/xml-label.c:272 +msgid "Importing from glabels 0.4 format" +msgstr "Importante el formato de glabels 0.4" + +#: src/xml-label.c:279 +msgid "Importing from glabels 1.91 format" +msgstr "Importante el formato de glabels 1.91" + +#: src/xml-label.c:282 +msgid "bad document, unknown glabels Namespace" +msgstr "Nekorekta dokumento, nekonata Nomospaco de glabels" + +#: src/xml-label.c:311 src/xml-label-04.c:75 src/xml-label-191.c:131 +#, c-format +msgid "Bad root node = \"%s\"" +msgstr "Nekorekta radika nodo = \"%s\"" + +#: src/xml-label.c:348 src/xml-label-191.c:165 +#, c-format +msgid "bad node in Document node = \"%s\"" +msgstr "nekorekta nodo en nodo de Dokumeto = \"%s\"" + +#: src/xml-label.c:393 src/xml-label-04.c:123 src/xml-label-191.c:197 +#, c-format +msgid "bad node = \"%s\"" +msgstr "nekorekta nodo = \"%s\"" + +#: src/xml-label.c:796 src/xml-label-191.c:605 +#, c-format +msgid "bad node in Data node = \"%s\"" +msgstr "nekorekta nodo en nodo de Datumoj = \"%s\"" + +#: src/xml-label.c:962 libglabels/xml-template.c:535 +msgid "Utf8 conversion error." +msgstr "eraro de konvertado en Utf8." + +#: src/xml-label.c:969 libglabels/xml-template.c:542 +msgid "Problem saving xml file." +msgstr "Problemo laÅ­ konservo de xml-dosiero" + +#. This should always be an id, but just in case a name +#. slips by! +#: src/xml-label-191.c:680 libglabels/xml-template.c:199 +#, c-format +msgid "Unknown page size id \"%s\", trying as name" +msgstr "Nekonata id \"%s\" de grando de paĝo, provante kiel nomo" + +#: src/xml-label-191.c:690 libglabels/xml-template.c:209 +#, c-format +msgid "Unknown page size id or name \"%s\"" +msgstr "Nekonata id de (paĝo)grando aÅ­ de nomo \"%s\"" + +#: src/merge.c:172 src/merge.c:213 src/merge.c:399 src/merge.c:402 +msgid "None" +msgstr "Nenio" + +#: src/merge-init.c:53 +msgid "Text file with comma delimeters (CSV)" +msgstr "Teksta dosiero kun komo kiel disigilo (CSV)" + +#: src/merge-init.c:60 +msgid "Text file with colon delimeters" +msgstr "Teksta dosiero kun komo kiel disigilo" + +#: src/merge-init.c:67 +msgid "Text file with tab delimeters" +msgstr "Teksta dosiero kun TAB kiel disigilo" + +#: src/wdgt-image-select.c:201 data/glade/object-editor.glade.h:11 +msgid "File:" +msgstr "Dosiero:" + +#: src/wdgt-image-select.c:245 data/glade/object-editor.glade.h:16 +msgid "Key:" +msgstr "Ŝlosilo:" + +#: src/wdgt-print-copies.c:179 +msgid "Sheets:" +msgstr "Folioj:" + +#: src/wdgt-print-copies.c:197 +msgid "Labels" +msgstr "Etikedoj" + +#: src/wdgt-print-copies.c:200 +msgid "from:" +msgstr "de:" + +#: src/wdgt-print-copies.c:207 +msgid "to:" +msgstr "ĝis:" + +#: src/wdgt-print-merge.c:178 +msgid "Start on label" +msgstr "Starto en etikedo" + +#: src/wdgt-print-merge.c:186 +msgid "on 1st sheet" +msgstr "en 1a folio" + +#: src/wdgt-print-merge.c:195 +msgid "Copies:" +msgstr "Ekzempleroj:" + +#: src/wdgt-print-merge.c:201 +msgid "Collate" +msgstr "LaÅ­kajere" + +#: src/wdgt-media-select.c:269 data/glade/template-designer.glade.h:29 +msgid "Description:" +msgstr "Priskribo:" + +#: src/wdgt-media-select.c:279 data/glade/template-designer.glade.h:53 +msgid "Page size:" +msgstr "Grando de paĝo:" + +#: src/wdgt-media-select.c:290 +msgid "Label size:" +msgstr "Grando de etikedo:" + +#: src/wdgt-media-select.c:301 +msgid "Layout:" +msgstr "Aspekto:" + +#: src/wdgt-media-select.c:578 +#, c-format +msgid "%d x %d (%d per sheet)" +msgstr "%d x %d (%d por folio)" + +#: src/wdgt-media-select.c:582 +#, c-format +msgid "%d per sheet" +msgstr "%d por folio" + +#: src/wdgt-media-select.c:614 +#, c-format +msgid "%s x %s %s" +msgstr "%s x %s %s" + +#: src/wdgt-media-select.c:619 +#, c-format +msgid "%.5g x %.5g %s" +msgstr "%.5g x %.5g %s" + +#: src/wdgt-media-select.c:630 src/wdgt-media-select.c:644 +#, c-format +msgid "%s %s diameter" +msgstr "%s %s diametro" + +#: src/wdgt-media-select.c:634 src/wdgt-media-select.c:648 +#, c-format +msgid "%.5g %s diameter" +msgstr "%.5g %s diametro" + +#: src/wdgt-rotate-label.c:193 +msgid "Rotate" +msgstr "Rotacio" + +#. This is the default custom color +#: src/mygal/color-palette.c:396 +msgid "custom" +msgstr "personigita" + +#. "Custom" color - we'll pop up a GnomeColorPicker +#: src/mygal/color-palette.c:438 +msgid "Custom Color:" +msgstr "Personigita Koloro:" + +#: src/mygal/color-palette.c:446 +msgid "Choose Custom Color" +msgstr "Elektu personigitan koloron" + +#: src/mygal/color-palette.c:579 +msgid "black" +msgstr "nigro" + +#: src/mygal/color-palette.c:580 +msgid "light brown" +msgstr "hela bruna koloro" + +#: src/mygal/color-palette.c:581 +msgid "brown gold" +msgstr "malhela oro" + +#: src/mygal/color-palette.c:582 +msgid "dark green #2" +msgstr "malhela verdo #2" + +#: src/mygal/color-palette.c:583 +msgid "navy" +msgstr "mararmea bluo" + +#: src/mygal/color-palette.c:584 src/mygal/color-palette.c:640 +msgid "dark blue" +msgstr "malhela bluo" + +#: src/mygal/color-palette.c:585 +msgid "purple #2" +msgstr "viola koloro #2" + +#: src/mygal/color-palette.c:586 +msgid "very dark gray" +msgstr "tre malhela grizo" + +#: src/mygal/color-palette.c:589 src/mygal/color-palette.c:645 +msgid "dark red" +msgstr "malhela ruĝo" + +#: src/mygal/color-palette.c:590 +msgid "red-orange" +msgstr "ruĝ-oranĝo" + +#: src/mygal/color-palette.c:591 +msgid "gold" +msgstr "oro" + +#: src/mygal/color-palette.c:592 +msgid "dark green" +msgstr "malhela verdo" + +#: src/mygal/color-palette.c:593 src/mygal/color-palette.c:646 +msgid "dull blue" +msgstr "nebrila bluo" + +#: src/mygal/color-palette.c:594 src/mygal/color-palette.c:647 +msgid "blue" +msgstr "bluo" + +#: src/mygal/color-palette.c:595 +msgid "dull purple" +msgstr "nebrila violo" + +#: src/mygal/color-palette.c:596 +msgid "dark grey" +msgstr "malhela grizo" + +#: src/mygal/color-palette.c:599 +msgid "red" +msgstr "ruĝo" + +#: src/mygal/color-palette.c:600 +msgid "orange" +msgstr "oranĝa koloro" + +#: src/mygal/color-palette.c:601 +msgid "lime" +msgstr "limeta koloro" + +#: src/mygal/color-palette.c:602 +msgid "dull green" +msgstr "nebrila verdo" + +#: src/mygal/color-palette.c:603 +msgid "dull blue #2" +msgstr "nebrila bluo #2" + +#: src/mygal/color-palette.c:604 +msgid "sky blue #2" +msgstr "ĉielbluo #2" + +#: src/mygal/color-palette.c:605 src/mygal/color-palette.c:644 +msgid "purple" +msgstr "violo" + +#: src/mygal/color-palette.c:606 +msgid "gray" +msgstr "grizo" + +#: src/mygal/color-palette.c:609 src/mygal/color-palette.c:641 +msgid "magenta" +msgstr "intense karmezina" + +#: src/mygal/color-palette.c:610 +msgid "bright orange" +msgstr "brila oranĝo" + +#: src/mygal/color-palette.c:611 src/mygal/color-palette.c:642 +msgid "yellow" +msgstr "flavo" + +#: src/mygal/color-palette.c:612 +msgid "green" +msgstr "verdo" + +#: src/mygal/color-palette.c:613 src/mygal/color-palette.c:643 +msgid "cyan" +msgstr "cejano" + +#: src/mygal/color-palette.c:614 +msgid "bright blue" +msgstr "brila bluo" + +#: src/mygal/color-palette.c:615 src/mygal/color-palette.c:632 +msgid "red purple" +msgstr "ruĝ-violo" + +#: src/mygal/color-palette.c:616 +msgid "light grey" +msgstr "hela grizo" + +#: src/mygal/color-palette.c:619 src/mygal/color-palette.c:636 +msgid "pink" +msgstr "rozkoloro" + +#: src/mygal/color-palette.c:620 +msgid "light orange" +msgstr "hela oranĝo" + +#: src/mygal/color-palette.c:621 src/mygal/color-palette.c:633 +msgid "light yellow" +msgstr "hela flavo" + +#: src/mygal/color-palette.c:622 +msgid "light green" +msgstr "hela verdo" + +#: src/mygal/color-palette.c:623 +msgid "light cyan" +msgstr "hela cejano" + +#: src/mygal/color-palette.c:624 src/mygal/color-palette.c:634 +msgid "light blue" +msgstr "hela bluo" + +#: src/mygal/color-palette.c:625 src/mygal/color-palette.c:638 +msgid "light purple" +msgstr "hela violo" + +#: src/mygal/color-palette.c:626 +msgid "white" +msgstr "blanko" + +#: src/mygal/color-palette.c:631 +msgid "purplish blue" +msgstr "viol-bluo" + +#: src/mygal/color-palette.c:635 +msgid "dark purple" +msgstr "malhela violo" + +#: src/mygal/color-palette.c:637 +msgid "sky blue" +msgstr "ĉielbluo" + +#: libglabels/template.c:848 +#, c-format +msgid "Generic %s full page" +msgstr "Ĝenerala %s plena paĝo" + +#: libglabels/template.c:897 +msgid "No template files found!" +msgstr "Neniu modelo estis trovita!" + +#. Create and append an "Other" entry. +#: libglabels/paper.c:67 +msgid "Other" +msgstr "Aliaĵoj" + +#: libglabels/paper.c:361 +msgid "No paper files found!" +msgstr "Neniu papera dosiero estis trovita!!" + +#: data/ui/glabels-ui.xml.h:1 +msgid "About glabels" +msgstr "Pri glabels" + +#: data/ui/glabels-ui.xml.h:2 +msgid "About..." +msgstr "Pri..." + +#: data/ui/glabels-ui.xml.h:3 +msgid "Align _Horizontal" +msgstr "LaÅ­linnigu _Horizontale" + +#: data/ui/glabels-ui.xml.h:4 +msgid "Align _Vertical" +msgstr "LaÅ­linnigu _Verticale" + +#: data/ui/glabels-ui.xml.h:5 +msgid "Align objects to bottoms" +msgstr "LaÅ­linnigu objektojn sube" + +#: data/ui/glabels-ui.xml.h:6 +msgid "Align objects to horizontal centers" +msgstr "LaÅ­linnigu objektojn laÅ­ horizontala centro" + +#: data/ui/glabels-ui.xml.h:7 +msgid "Align objects to left edges" +msgstr "LaÅ­linnigu objektojn laÅ­ maldekstra rando" + +#: data/ui/glabels-ui.xml.h:8 +msgid "Align objects to right edges" +msgstr "LaÅ­linnigu objektojn laÅ­ dekstra rando" + +#: data/ui/glabels-ui.xml.h:9 +msgid "Align objects to tops" +msgstr "LaÅ­linnigu objektojn supre" + +#: data/ui/glabels-ui.xml.h:10 +msgid "Align objects to vertical centers" +msgstr "LaÅ­liniigu objektojn laÅ­ verticala centro" + +#: data/ui/glabels-ui.xml.h:12 +msgid "Bold" +msgstr "Dika" + +#: data/ui/glabels-ui.xml.h:14 +msgid "Center align" +msgstr "LaÅ­liniiĝu centre" + +#: data/ui/glabels-ui.xml.h:15 +msgid "Center objects to horizontal label center" +msgstr "Centrigu objektojn laÅ­ horizontala centro de etikedo" + +#: data/ui/glabels-ui.xml.h:16 +msgid "Center objects to vertical label center" +msgstr "Centrigu objektojn laÅ­ vertikala centro de etikedo" + +#: data/ui/glabels-ui.xml.h:17 +msgid "Change the visibility of markup lines in the current window" +msgstr "Ŝangu videblecon de linioj de demarkacio en nuna fenestro" + +#: data/ui/glabels-ui.xml.h:18 +msgid "Change the visibility of the drawing toolbar in the current window" +msgstr "Ŝangu videblecon de la ilarstango de desegno en nuna fenestro" + +#: data/ui/glabels-ui.xml.h:19 +msgid "Change the visibility of the grid in the current window" +msgstr "Ŝangu videblecon de la krado en nuna fenestro" + +#: data/ui/glabels-ui.xml.h:20 +msgid "Change the visibility of the main toolbar in the current window" +msgstr "Ŝangu videblecon de la ĉefa ilarstango en nuna fenestro" + +#: data/ui/glabels-ui.xml.h:21 +msgid "Change the visibility of the property toolbar in the current window" +msgstr "Ŝangu videblecon de ilarstango de ecoj en nuna fenestro" + +#: data/ui/glabels-ui.xml.h:22 +msgid "Close" +msgstr "Fermu" + +#: data/ui/glabels-ui.xml.h:23 +msgid "Close the current file" +msgstr "Fermu la nunan dosieron" + +#: data/ui/glabels-ui.xml.h:24 +msgid "Configure the application" +msgstr "Agordu la programon" + +#: data/ui/glabels-ui.xml.h:25 +msgid "Contents" +msgstr "Entenoj" + +#: data/ui/glabels-ui.xml.h:26 +msgid "Copy" +msgstr "Kopiu" + +#: data/ui/glabels-ui.xml.h:27 +msgid "Copy the selection" +msgstr "Kopiu la elektaĵon" + +#: data/ui/glabels-ui.xml.h:28 +msgid "Create a custom template" +msgstr "Kreu personigitan modelon" + +#: data/ui/glabels-ui.xml.h:29 +msgid "Create a new document" +msgstr "Kreu novan dokumenton" + +#: data/ui/glabels-ui.xml.h:30 +msgid "Create barcode object" +msgstr "Keu strekkodan objekton" + +#: data/ui/glabels-ui.xml.h:31 +msgid "Create box/rectangle object" +msgstr "Kreu objekton de areo/rektangulo" + +#: data/ui/glabels-ui.xml.h:32 +msgid "Create ellipse/circle object" +msgstr "Kreu objekton de elipse/circlo" + +#: data/ui/glabels-ui.xml.h:33 +msgid "Create image object" +msgstr "Kreu bildan objekton" + +#: data/ui/glabels-ui.xml.h:34 +msgid "Create line object" +msgstr "Kreu linian objekton" + +#: data/ui/glabels-ui.xml.h:35 +msgid "Create text object" +msgstr "Kreu tekstan objekton" + +#: data/ui/glabels-ui.xml.h:36 +msgid "Cu_t" +msgstr "El_tondu" + +#: data/ui/glabels-ui.xml.h:37 +msgid "Customize" +msgstr "Personigu" + +#: data/ui/glabels-ui.xml.h:38 +msgid "Customize Drawing Toolbar" +msgstr "Personigu ilarstangon de desegno" + +#: data/ui/glabels-ui.xml.h:39 +msgid "Customize Main Toolbar" +msgstr "Personigu ĉefan ilarstangon" + +#: data/ui/glabels-ui.xml.h:40 +msgid "Customize Property Toolbar" +msgstr "Personigu ilarstangon de ecoj" + +#: data/ui/glabels-ui.xml.h:41 +msgid "Customize toolbars" +msgstr "Personigu ilarstangojn" + +#: data/ui/glabels-ui.xml.h:42 +msgid "Cut" +msgstr "Eltondu" + +#: data/ui/glabels-ui.xml.h:43 +msgid "Cut the selection" +msgstr "Eltondu elektaĵon" + +#: data/ui/glabels-ui.xml.h:44 +msgid "Decrease magnification" +msgstr "Malpliigu zomon" + +#: data/ui/glabels-ui.xml.h:45 +msgid "Delete" +msgstr "Forigu" + +#: data/ui/glabels-ui.xml.h:46 +msgid "Delete the selected objects" +msgstr "Forigu elektitajn objektojn" + +#: data/ui/glabels-ui.xml.h:47 +msgid "Drawing toolbar" +msgstr "Ilarstango de desegno" + +#: data/ui/glabels-ui.xml.h:48 +msgid "Dump XML" +msgstr "Ŝutu XML" + +#: data/ui/glabels-ui.xml.h:49 +msgid "Dump the UI Xml description" +msgstr "Ŝutu priskribon de UI xml" + +#: data/ui/glabels-ui.xml.h:50 +msgid "Edit merge properties" +msgstr "Redaktu ecojn de kunfando" + +#: data/ui/glabels-ui.xml.h:54 +msgid "Flip object horizontally" +msgstr "Renversu objekton horizontale" + +#: data/ui/glabels-ui.xml.h:55 +msgid "Flip object vertically" +msgstr "Renversu objekton vertikale" + +#: data/ui/glabels-ui.xml.h:56 +msgid "Font name" +msgstr "Nomo de tiparo" + +#: data/ui/glabels-ui.xml.h:57 +msgid "Font selector" +msgstr "Elektilo de tiparo" + +#: data/ui/glabels-ui.xml.h:58 +msgid "Font size" +msgstr "Tipargrando" + +#: data/ui/glabels-ui.xml.h:59 +msgid "Icon and _Text" +msgstr "Ikono kaj _Teksto" + +#: data/ui/glabels-ui.xml.h:60 +msgid "Increase magnification" +msgstr "Pliigu zomon" + +#: data/ui/glabels-ui.xml.h:61 +msgid "Italic" +msgstr "Kursivo" + +#: data/ui/glabels-ui.xml.h:63 +msgid "Left align" +msgstr "LaÅ­liniigu maldekstren" + +#: data/ui/glabels-ui.xml.h:65 +msgid "Line width" +msgstr "Larĝo de linio" + +#: data/ui/glabels-ui.xml.h:66 +msgid "Lower object to bottom" +msgstr "Subentiru objekton ĝis la fundo" + +#: data/ui/glabels-ui.xml.h:67 +msgid "M_arkup" +msgstr "M_arkado" + +#: data/ui/glabels-ui.xml.h:68 +msgid "Main toolbar" +msgstr "Ĉefa ilarstango" + +#: data/ui/glabels-ui.xml.h:69 +msgid "Markup" +msgstr "Markaĵoj" + +#: data/ui/glabels-ui.xml.h:70 +msgid "Modify document properties" +msgstr "Radaktu ecojn de dokumento" + +#: data/ui/glabels-ui.xml.h:71 +msgid "New" +msgstr "Nova" + +#: data/ui/glabels-ui.xml.h:72 +msgid "Object property editor" +msgstr "Redaktilo de ecoj por objekto" + +#: data/ui/glabels-ui.xml.h:73 +msgid "Only show icons in the main toolbar" +msgstr "Videbligu nur ikonojn en ĉefa ilarstango" + +#: data/ui/glabels-ui.xml.h:75 +msgid "Open a file" +msgstr "Malfermu iun dosieron" + +#: data/ui/glabels-ui.xml.h:76 +msgid "Open the glabels manual" +msgstr "Malfermu manlibron de glabels" + +#: data/ui/glabels-ui.xml.h:77 +msgid "Paste" +msgstr "Enmetu" + +#: data/ui/glabels-ui.xml.h:78 +msgid "Paste the clipboard" +msgstr "Enmetu la poŝon" + +#: data/ui/glabels-ui.xml.h:79 +msgid "Pr_eferences..." +msgstr "A_gordoj..." + +#: data/ui/glabels-ui.xml.h:80 +msgid "Preferences" +msgstr "Agordoj" + +#: data/ui/glabels-ui.xml.h:82 +msgid "Print the current file" +msgstr "Presu la nunan dosieron" + +#: data/ui/glabels-ui.xml.h:83 +msgid "Proper_ties..." +msgstr "E_coj..." + +#: data/ui/glabels-ui.xml.h:84 +msgid "Properties" +msgstr "Ecoj" + +#: data/ui/glabels-ui.xml.h:85 +msgid "Property toolbar" +msgstr "Ilarstango de ecoj" + +#: data/ui/glabels-ui.xml.h:86 +msgid "Quit" +msgstr "Eliro" + +#: data/ui/glabels-ui.xml.h:87 +msgid "Quit the program" +msgstr "Eliru el programo" + +#: data/ui/glabels-ui.xml.h:88 +msgid "Raise object to top" +msgstr "Suprentiru objekton ĝis la pinto" + +#: data/ui/glabels-ui.xml.h:89 +msgid "Recent _Files" +msgstr "Fre_ŝaj Dosieroj" + +#: data/ui/glabels-ui.xml.h:90 +msgid "Redo" +msgstr "Refaru" + +#: data/ui/glabels-ui.xml.h:91 +msgid "Redo the undone action" +msgstr "Refaru la lastan malfaritan agon" + +#: data/ui/glabels-ui.xml.h:92 +msgid "Remove all selections" +msgstr "Formovu ĉiujn elektaĵojn" + +#: data/ui/glabels-ui.xml.h:94 +#, no-c-format +msgid "Restore scale to 100%" +msgstr "Reen 100%" + +#: data/ui/glabels-ui.xml.h:95 +msgid "Right align" +msgstr "laÅ­liniigu dekstren" + +#: data/ui/glabels-ui.xml.h:98 +msgid "Rotate object 90 clockwise" +msgstr "Turnu la objekton je 90° dekstroĝire" + +#: data/ui/glabels-ui.xml.h:99 +msgid "Rotate object 90 counter-clockwise" +msgstr "Turnu la objekton je 90° kontraÅ­montrile" + +#: data/ui/glabels-ui.xml.h:100 +msgid "Save" +msgstr "Konservu" + +#: data/ui/glabels-ui.xml.h:101 +msgid "Save As" +msgstr "Konservu kiel" + +#: data/ui/glabels-ui.xml.h:102 +msgid "Save _As..." +msgstr "Konservu kiel..." + +#: data/ui/glabels-ui.xml.h:103 +msgid "Save the current file" +msgstr "Konservu la nunan dosieron" + +#: data/ui/glabels-ui.xml.h:104 +msgid "Save the current file with a different name" +msgstr "Konservu la nunan dosieron per alia nomo" + +#: data/ui/glabels-ui.xml.h:105 +msgid "Select All" +msgstr "Elektu Ĉion" + +#: data/ui/glabels-ui.xml.h:106 +msgid "Select _All" +msgstr "Elektu _Ĉion" + +#: data/ui/glabels-ui.xml.h:107 +msgid "Select all objects" +msgstr "Elektu ĉiujn objektojn" + +#: data/ui/glabels-ui.xml.h:108 +msgid "Select, move and modify objects" +msgstr "Elektu, movu kaj redaktu objektojn" + +#: data/ui/glabels-ui.xml.h:110 +msgid "Set main toolbar button style according to desktop default" +msgstr "Agordu butonstilon de ĉefa ilarstango laÅ­ defaÅ­lto de labortablo" + +#: data/ui/glabels-ui.xml.h:111 +msgid "Show _Tooltips" +msgstr "Mon_tru Sugestojn" + +#: data/ui/glabels-ui.xml.h:112 +msgid "Show both icons and texts in the main toolbar" +msgstr "Vidigu kaj ikonojn kaj tekstojn en la ĉefa ilarstango" + +#: data/ui/glabels-ui.xml.h:113 +msgid "Show tooltips in the drawing toolbar" +msgstr "Vidigu sugestojn en la ilarstango de desegno" + +#: data/ui/glabels-ui.xml.h:114 +msgid "Show tooltips in the main toolbar" +msgstr "Vidigu sugestojn en la ĉefa ilarstango" + +#: data/ui/glabels-ui.xml.h:115 +msgid "Show tooltips in the property toolbar" +msgstr "Vidigu sugestojn en la ilarstango de ecoj" + +#: data/ui/glabels-ui.xml.h:116 +msgid "Template Designer" +msgstr "Desegnilo de Modeloj" + +#: data/ui/glabels-ui.xml.h:117 +msgid "Template _Designer..." +msgstr "_Desegnilo de Modeloj..." + +#: data/ui/glabels-ui.xml.h:118 +msgid "Text color" +msgstr "Koloro de teksto" + +#: data/ui/glabels-ui.xml.h:119 +msgid "U_n-select All" +msgstr "Malelektu Ĉio_n" + +#: data/ui/glabels-ui.xml.h:120 +msgid "Un-select All" +msgstr "Malelektu Ĉion" + +#: data/ui/glabels-ui.xml.h:121 +msgid "Undo" +msgstr "Malfaru" + +#: data/ui/glabels-ui.xml.h:122 +msgid "Undo the last action" +msgstr "Nuligu lastan agon" + +#: data/ui/glabels-ui.xml.h:123 +msgid "Zoom _1:1" +msgstr "Zomo je _1:1" + +#: data/ui/glabels-ui.xml.h:124 +msgid "Zoom _In" +msgstr "_Zomo" + +#: data/ui/glabels-ui.xml.h:125 +msgid "Zoom _Out" +msgstr "_Malzomo" + +#: data/ui/glabels-ui.xml.h:126 +msgid "Zoom to _fit" +msgstr "Alĝustigu" + +#: data/ui/glabels-ui.xml.h:127 +msgid "Zoom to fit window" +msgstr "Alĝustigu al la fenestro" + +#: data/ui/glabels-ui.xml.h:128 +msgid "_About..." +msgstr "_Pri..." + +#: data/ui/glabels-ui.xml.h:129 +msgid "_Bottoms" +msgstr "Su_be" + +#: data/ui/glabels-ui.xml.h:132 +msgid "_Close" +msgstr "_Fermu" + +#: data/ui/glabels-ui.xml.h:133 +msgid "_Contents" +msgstr "_Entenoj" + +#: data/ui/glabels-ui.xml.h:134 +msgid "_Copy" +msgstr "_Kopiu" + +#: data/ui/glabels-ui.xml.h:135 +msgid "_Create Object" +msgstr "_Kreu Objekton" + +#: data/ui/glabels-ui.xml.h:136 +msgid "_Debug" +msgstr "_Sencimigo" + +#: data/ui/glabels-ui.xml.h:138 +msgid "_Desktop Default" +msgstr "DefaÅ­lto por Labortabulo" + +#: data/ui/glabels-ui.xml.h:139 +msgid "_Drawing Toolbar" +msgstr "Ilarstango de _Desegno" + +#: data/ui/glabels-ui.xml.h:140 +msgid "_Edit" +msgstr "R_edaktu" + +#: data/ui/glabels-ui.xml.h:142 +msgid "_File" +msgstr "_Dosiero" + +#: data/ui/glabels-ui.xml.h:143 +msgid "_Grid" +msgstr "_Krado" + +#: data/ui/glabels-ui.xml.h:144 +msgid "_Help" +msgstr "_Helpilo" + +#: data/ui/glabels-ui.xml.h:145 +msgid "_Icon" +msgstr "_Ikono" + +#: data/ui/glabels-ui.xml.h:149 +msgid "_Main Toolbar" +msgstr "_Ĉefa Ilarstango" + +#: data/ui/glabels-ui.xml.h:150 +msgid "_Merge Properties..." +msgstr "_Kunfandu Ecojn..." + +#: data/ui/glabels-ui.xml.h:151 +msgid "_New" +msgstr "_Nova" + +#: data/ui/glabels-ui.xml.h:152 +msgid "_Objects" +msgstr "_Objektoj" + +#: data/ui/glabels-ui.xml.h:153 +msgid "_Open..." +msgstr "M_alfermu..." + +#: data/ui/glabels-ui.xml.h:155 +msgid "_Paste" +msgstr "_Enmetu" + +#: data/ui/glabels-ui.xml.h:156 +msgid "_Print..." +msgstr "_Presu..." + +#: data/ui/glabels-ui.xml.h:157 +msgid "_Property Toolbar" +msgstr "Ilarstango de Eco_j" + +#: data/ui/glabels-ui.xml.h:158 +msgid "_Quit" +msgstr "_Eliro" + +#: data/ui/glabels-ui.xml.h:161 +msgid "_Save" +msgstr "_Konservu" + +#: data/ui/glabels-ui.xml.h:165 +msgid "_View" +msgstr "_Videbligo" + +#: data/glade/prefs-dialog.glade.h:1 +msgid " " +msgstr " " + +#: data/glade/prefs-dialog.glade.h:2 data/glade/object-editor.glade.h:1 +#: data/glade/template-designer.glade.h:5 +msgid "*" +msgstr "*" + +#: data/glade/prefs-dialog.glade.h:3 +msgid "Default page size" +msgstr "DefaÅ­lta grando de paĝo" + +#: data/glade/prefs-dialog.glade.h:4 +msgid "Fill" +msgstr "Plenigo" + +#: data/glade/prefs-dialog.glade.h:5 +msgid "Line" +msgstr "Linio" + +#: data/glade/prefs-dialog.glade.h:6 +msgid "Text" +msgstr "Teksto" + +#: data/glade/prefs-dialog.glade.h:7 +msgid "Units" +msgstr "Unitoj" + +#: data/glade/prefs-dialog.glade.h:8 data/glade/object-editor.glade.h:4 +msgid "Alignment:" +msgstr "Alliniĝo:" + +#: data/glade/prefs-dialog.glade.h:9 data/glade/object-editor.glade.h:8 +msgid "Color:" +msgstr "Koloro:" + +#: data/glade/prefs-dialog.glade.h:10 +msgid "Font:" +msgstr "Tiparo:" + +#: data/glade/prefs-dialog.glade.h:11 +msgid "ISO A4" +msgstr "ISO A4" + +#: data/glade/prefs-dialog.glade.h:12 +msgid "Inches" +msgstr "Coloj" + +#: data/glade/prefs-dialog.glade.h:13 data/glade/object-editor.glade.h:19 +msgid "Line Spacing:" +msgstr "Interspaco:" + +#: data/glade/prefs-dialog.glade.h:14 +msgid "Locale" +msgstr "Nacia" + +#: data/glade/prefs-dialog.glade.h:15 +msgid "Millimeters" +msgstr "Milimetroj" + +#: data/glade/prefs-dialog.glade.h:16 +msgid "Object defaults" +msgstr "DefaÅ­ltoj de objekto" + +#: data/glade/prefs-dialog.glade.h:17 +msgid "Points" +msgstr "Punktoj" + +#: data/glade/prefs-dialog.glade.h:18 +msgid "Select default properties for new objects." +msgstr "Elektu defaÅ­ltajn ecojn por novaj objektoj." + +#: data/glade/prefs-dialog.glade.h:19 +msgid "Select locale specific behavior." +msgstr "Elektu nacian specifan agmanieron." + +#. Most popular (at top of list) +#: data/glade/prefs-dialog.glade.h:20 data/templates/paper-sizes.xml.h:29 +msgid "US Letter" +msgstr "US·Letero" + +#: data/glade/prefs-dialog.glade.h:21 data/glade/object-editor.glade.h:29 +#: data/glade/template-designer.glade.h:72 +msgid "Width:" +msgstr "Larĝo:" + +#: data/glade/object-editor.glade.h:2 +msgid "00000000000 00000" +msgstr "00000000000 00000" + +#: data/glade/object-editor.glade.h:3 +msgid "Xxx object properties" +msgstr "Xxx ecoj de objekto" + +#: data/glade/object-editor.glade.h:5 +msgid "Allow merge to automatically shrink text" +msgstr "" + +#: data/glade/object-editor.glade.h:6 +msgid "Angle:" +msgstr "Angulo:" + +#: data/glade/object-editor.glade.h:7 +msgid "Checksum" +msgstr "Kontrolsumo" + +#: data/glade/object-editor.glade.h:10 +msgid "Family:" +msgstr "Familio:" + +#: data/glade/object-editor.glade.h:12 +msgid "Fill" +msgstr "Plenigo" + +#: data/glade/object-editor.glade.h:13 data/glade/template-designer.glade.h:33 +msgid "Height:" +msgstr "Alto:" + +#: data/glade/object-editor.glade.h:14 +msgid "Image" +msgstr "Bildo" + +#: data/glade/object-editor.glade.h:15 +msgid "Insert merge field" +msgstr "Enigu campon de kunfando" + +#: data/glade/object-editor.glade.h:17 +msgid "Length:" +msgstr "Longo:" + +#: data/glade/object-editor.glade.h:18 +msgid "Line" +msgstr "Linio" + +#: data/glade/object-editor.glade.h:20 +msgid "Literal:" +msgstr "Literalo:" + +#: data/glade/object-editor.glade.h:21 +msgid "Load image" +msgstr "Ŝargu bildon" + +#: data/glade/object-editor.glade.h:22 +msgid "Position" +msgstr "Lokiĝo" + +#: data/glade/object-editor.glade.h:23 +msgid "Reset image size" +msgstr "Restarigu grandon de bildo" + +#: data/glade/object-editor.glade.h:24 +msgid "Size" +msgstr "Grando" + +#: data/glade/object-editor.glade.h:25 +msgid "Size:" +msgstr "Grando:" + +#: data/glade/object-editor.glade.h:26 +msgid "Style" +msgstr "Stilo" + +#: data/glade/object-editor.glade.h:27 +msgid "Style:" +msgstr "Stilo:" + +#: data/glade/object-editor.glade.h:30 +msgid "X:" +msgstr "X:" + +#: data/glade/object-editor.glade.h:31 +msgid "Y:" +msgstr "Y:" + +#: data/glade/object-editor.glade.h:32 +msgid "degrees" +msgstr "gradoj" + +#: data/glade/object-editor.glade.h:33 +msgid "dialog1" +msgstr "fenestr1" + +#: data/glade/object-editor.glade.h:34 +msgid "digits:" +msgstr "ciferoj:" + +#: data/glade/object-editor.glade.h:35 +msgid "format:" +msgstr "formato:" + +#: data/glade/template-designer.glade.h:1 +msgid " " +msgstr " " + +#: data/glade/template-designer.glade.h:2 +msgid "(e.g., \"Mailing Labels,\" \"Business Cards,\" ...)" +msgstr "(es., \"Etichette di spedizione,\" \"Vizitkartoj,\" ...)" + +#: data/glade/template-designer.glade.h:3 +msgid "(e.g., 8163A)" +msgstr "(es. 8163A)" + +#: data/glade/template-designer.glade.h:4 +msgid "(e.g., Avery, Acme, ...)" +msgstr "(es. Avery, Acme, ...)" + +#: data/glade/template-designer.glade.h:6 +msgid "1. Outer radius:" +msgstr "1. Ekstera radiuso:" + +#: data/glade/template-designer.glade.h:7 +msgid "1. Radius:" +msgstr "1. Radiuso:" + +#: data/glade/template-designer.glade.h:8 +msgid "1. Width:" +msgstr "1. Larĝo:" + +#: data/glade/template-designer.glade.h:9 +msgid "2. Height:" +msgstr "2. Alto:" + +#: data/glade/template-designer.glade.h:10 +msgid "2. Inner radius:" +msgstr "2. Interna radiuso:" + +#: data/glade/template-designer.glade.h:11 +msgid "2. Waste (overprint allowed):" +msgstr "2. Forĵetaĵo (surskrivebla):" + +#: data/glade/template-designer.glade.h:12 +msgid "3. Clipping width:" +msgstr "" + +#: data/glade/template-designer.glade.h:13 +msgid "3. Margin" +msgstr "3. Marĝeno" + +#: data/glade/template-designer.glade.h:14 +msgid "3. Round (radius of corner):" +msgstr "3. Rondo (radiuso de angulo):" + +#: data/glade/template-designer.glade.h:15 +msgid "4. Clipping height:" +msgstr "" + +#: data/glade/template-designer.glade.h:16 +msgid "4. Horiz. waste (overprint allowed):" +msgstr "4. Horiz. forĵetaĵo (surskrivebla):" + +#: data/glade/template-designer.glade.h:17 +msgid "5. Vert. waste (overprint allowed):" +msgstr "5. Vert. forĵetaĵo (surskrivebla):" + +#: data/glade/template-designer.glade.h:18 +msgid "5. Waste (overprint allowed):" +msgstr "5. Forĵetaĵo (surskrivebla):" + +#: data/glade/template-designer.glade.h:19 +msgid "6. Margin" +msgstr "6. Marĝeno" + +#: data/glade/template-designer.glade.h:20 +msgid "Brand/Manufacturer:" +msgstr "Marca/Produttore:" + +#: data/glade/template-designer.glade.h:21 +msgid "CD/DVD (including credit card CDs)" +msgstr "KD/DVD" + +#: data/glade/template-designer.glade.h:22 +msgid "" +"Congratulations!\n" +"\n" +"You have completed the gLabels Template Designer.\n" +"If you wish to accept and save your design, click \"Apply.\"\n" +"\n" +"Otherwise, you may click \"Cancel\" to abandon your design\n" +"or \"Back\" to continue editing this design." +msgstr "" +"Gratulojn!\n" +"\n" +"Vi finis Desegnilon de Modelojn por gLabels.\n" +"Se vi volas konservi tiun ĉi projekton, alklaku sur \"Apliku\".\n" +"\n" +"Male, alklaku sur \"Nuligu\" por nuligi\n" +"vian projekton tutan aÅ­ \"Retroen\" por ankoraÅ­ redakti tiun ĉi desegnon." + +#: data/glade/template-designer.glade.h:30 +msgid "Design Completed" +msgstr "Fino de Projektado" + +#: data/glade/template-designer.glade.h:31 +msgid "Distance from left edge (x0):" +msgstr "Distanco el maldekstra rando (x0):" + +#: data/glade/template-designer.glade.h:32 +msgid "Distance from top edge (y0):" +msgstr "Distanco el supra rando (y0):" + +#: data/glade/template-designer.glade.h:34 +msgid "Horizontal pitch (dx):" +msgstr "Horizontala kvanto (dx):" + +#: data/glade/template-designer.glade.h:35 +msgid "" +"How many layouts will your template contain? \n" +"\n" +"A layout is a set of labels or cards that can be arranged in a simple grid.\n" +"Most templates only need one layout, as in the first example.\n" +"The second example illustrates when two layouts are needed." +msgstr "" + +#: data/glade/template-designer.glade.h:40 +msgid "Label Size (CD/DVD)" +msgstr "Grando de etikedo (KD/DVD)" + +#: data/glade/template-designer.glade.h:41 +msgid "Label Size (Round)" +msgstr "Grando de etikedo (Ronda)" + +#: data/glade/template-designer.glade.h:42 +msgid "Label or Card Shape" +msgstr "Formo de etikedo aÅ­ de karto" + +#: data/glade/template-designer.glade.h:43 +msgid "Label or Card Size (Rectangular)" +msgstr "Formo de etikedo aÅ­ de karto (Rektangula)" + +#: data/glade/template-designer.glade.h:44 +msgid "Layout #1" +msgstr "Aspekto #1" + +#: data/glade/template-designer.glade.h:45 +msgid "Layout #2" +msgstr "Aspekto #2" + +#: data/glade/template-designer.glade.h:46 +msgid "Layout(s)" +msgstr "Aspekto(j)" + +#: data/glade/template-designer.glade.h:47 +msgid "Name and Description" +msgstr "Nomo kaj Priskribo" + +#: data/glade/template-designer.glade.h:48 +msgid "Number across (nx):" +msgstr "Numero transverse (nx):" + +#: data/glade/template-designer.glade.h:49 +msgid "Number down (ny):" +msgstr "Numero sube (ny):" + +#: data/glade/template-designer.glade.h:50 +msgid "Number of Layouts" +msgstr "Nombro da Aspektoj" + +#: data/glade/template-designer.glade.h:51 +msgid "Number of layouts:" +msgstr "Nombro da aspektoj:" + +#: data/glade/template-designer.glade.h:52 +msgid "Page Size" +msgstr "Grando de paĝo" + +#: data/glade/template-designer.glade.h:54 +msgid "Part #:" +msgstr "Parto #:" + +#: data/glade/template-designer.glade.h:55 +msgid "" +"Please enter the following identifying information about the template " +"stationery." +msgstr "" + +#: data/glade/template-designer.glade.h:56 +msgid "Please enter the following layout information." +msgstr "Bonvolu enmeti menditajn informojn." + +#: data/glade/template-designer.glade.h:57 +msgid "" +"Please enter the following size parameters of a single label in your " +"template." +msgstr "" +"Bonvolu enmeti menditajn parametrojn de grando por unu etikedo en " +"la modelo." + +#: data/glade/template-designer.glade.h:58 +msgid "" +"Please enter the following size parameters of a single label or card in your " +"template." +msgstr "" +"Bonvolu enmeti menditajn parametrojn de grando por unu etikedo aÅ­ karto en " +"la modelo." + +#: data/glade/template-designer.glade.h:59 +msgid "Please select the basic shape of the labels or cards." +msgstr "" + +#: data/glade/template-designer.glade.h:60 +msgid "Please select the page size of the template stationery." +msgstr "Bonvolu elekti grandon de paĝo por modelo de skribvaroj." + +#: data/glade/template-designer.glade.h:61 +msgid "Print test sheet" +msgstr "Presu paĝon de elprovo" + +#: data/glade/template-designer.glade.h:62 +msgid "Rectangular or square (can have rounded corners)" +msgstr "Rektangula aÅ­ kvadra (ankaÅ­ kun rondaj anguloj)" + +#: data/glade/template-designer.glade.h:63 +msgid "Round" +msgstr "Ronda" + +#: data/glade/template-designer.glade.h:64 +msgid "" +"Templates needing\n" +"two layouts." +msgstr "" +"Modeloj necesas\n" +"du aspektojn." + +#: data/glade/template-designer.glade.h:66 +msgid "" +"Templates needing only\n" +"one layout." +msgstr "" +"Modeloj necesas nur \n" +"unu aspekton." + +#: data/glade/template-designer.glade.h:68 +msgid "Vertical pitch (dy):" +msgstr "Vertikala kvanto (dy):" + +#: data/glade/template-designer.glade.h:69 +msgid "" +"Welcome to the gLabels Template Designer.\n" +"\n" +"This dialog will assist you in the creation of a custom gLabels template." +msgstr "" +"Bonvenon! Tiu ĉi estas Desegnilo de Modeloj por gLabels.\n" +"\n" +"Tio helpos vin por krei personigitan modelon por gLabels." + +#. Other ISO A series sizes +#: data/templates/paper-sizes.xml.h:2 +msgid "A0" +msgstr "A0" + +#: data/templates/paper-sizes.xml.h:3 +msgid "A1" +msgstr "A1" + +#: data/templates/paper-sizes.xml.h:4 +msgid "A10" +msgstr "A10" + +#: data/templates/paper-sizes.xml.h:5 +msgid "A2" +msgstr "A2" + +#: data/templates/paper-sizes.xml.h:6 +msgid "A3" +msgstr "A3" + +#: data/templates/paper-sizes.xml.h:7 +msgid "A4" +msgstr "A4" + +#: data/templates/paper-sizes.xml.h:8 +msgid "A5" +msgstr "A5" + +#: data/templates/paper-sizes.xml.h:9 +msgid "A6" +msgstr "A6" + +#: data/templates/paper-sizes.xml.h:10 +msgid "A7" +msgstr "A7" + +#: data/templates/paper-sizes.xml.h:11 +msgid "A8" +msgstr "A8" + +#: data/templates/paper-sizes.xml.h:12 +msgid "A9" +msgstr "A9" + +#. ISO B series sizes +#: data/templates/paper-sizes.xml.h:14 +msgid "B0" +msgstr "B0" + +#: data/templates/paper-sizes.xml.h:15 +msgid "B1" +msgstr "B1" + +#: data/templates/paper-sizes.xml.h:16 +msgid "B10" +msgstr "B10" + +#: data/templates/paper-sizes.xml.h:17 +msgid "B2" +msgstr "B2" + +#: data/templates/paper-sizes.xml.h:18 +msgid "B3" +msgstr "B3" + +#: data/templates/paper-sizes.xml.h:19 +msgid "B4" +msgstr "B4" + +#: data/templates/paper-sizes.xml.h:20 +msgid "B5" +msgstr "B5" + +#: data/templates/paper-sizes.xml.h:21 +msgid "B6" +msgstr "B6" + +#: data/templates/paper-sizes.xml.h:22 +msgid "B7" +msgstr "B7" + +#: data/templates/paper-sizes.xml.h:23 +msgid "B8" +msgstr "B8" + +#: data/templates/paper-sizes.xml.h:24 +msgid "B9" +msgstr "B9" + +#: data/templates/paper-sizes.xml.h:25 +msgid "US Executive" +msgstr "US Executive" + +#. Other US paper sizes +#: data/templates/paper-sizes.xml.h:27 +msgid "US Legal" +msgstr "US Legal" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:2 +#: data/templates/zweckform-iso-templates.xml.h:2 +msgid "Address Labels" +msgstr "Etikedo por adreso" + +#. =================================================================== +#. ============================================================ +#. =================================================================== +#. ====================================================== +#: data/templates/avery-us-templates.xml.h:4 +#: data/templates/avery-iso-templates.xml.h:4 +#: data/templates/zweckform-iso-templates.xml.h:6 +#: data/templates/misc-us-templates.xml.h:3 +#: data/templates/misc-iso-templates.xml.h:17 +msgid "Business Cards" +msgstr "Vizitkartoj" + +#: data/templates/avery-us-templates.xml.h:5 +msgid "CD/DVD Labels (Disc Labels)" +msgstr "Etikedoj por KD/DVD (Etikedoj por diskoj)" + +#: data/templates/avery-us-templates.xml.h:6 +msgid "CD/DVD Labels (Spine Labels)" +msgstr "Etikedoj por KD/DVD (Etikedoj por diskoj)" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:8 +msgid "Diskette Labels" +msgstr "Etikedoj por disketoj" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:10 +msgid "Filing Labels" +msgstr "" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:12 +msgid "Full Sheet Labels" +msgstr "Paĝo plena da ekikedoj" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:14 +msgid "Large Round Labels" +msgstr "Grandaj rondigitaj etikedoj" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:16 +msgid "Name Badge Labels" +msgstr "Nomŝildetoj" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:18 +msgid "Return Address Labels" +msgstr "Etikedoj por adreso de sendinto" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:20 +msgid "Shipping Labels" +msgstr "Etikedoj por ekspedo" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:22 +msgid "Small Round Labels" +msgstr "Malgrandaj rondigitaj etikedoj" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:24 +msgid "Square Labels" +msgstr "Kvardaj etikedoj" + +#: data/templates/avery-us-templates.xml.h:25 +msgid "Video Tape Face Labels" +msgstr "Etikedoj por videokasedo (faco)" + +#: data/templates/avery-us-templates.xml.h:26 +msgid "Video Tape Spine Labels" +msgstr "Etikedoj por videokasedo (dorso)" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:2 +msgid "Address labels" +msgstr "Etikedoj por adreso" + +#. =============================================================== +#: data/templates/avery-iso-templates.xml.h:6 +msgid "CD Booklet" +msgstr "CD Booklet" + +#. =============================================================== +#: data/templates/avery-iso-templates.xml.h:8 +msgid "CD Inlet" +msgstr "CD Inlet" + +#. =============================================================== +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:10 +#: data/templates/zweckform-iso-templates.xml.h:8 +#: data/templates/misc-us-templates.xml.h:5 +#: data/templates/misc-iso-templates.xml.h:21 +msgid "CD/DVD Labels" +msgstr "Etikedoj por KD/DVD" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:12 +msgid "Diskette labels" +msgstr "Etikedoj por disketoj" + +#. =============================================================== +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:14 +#: data/templates/zweckform-iso-templates.xml.h:14 +#: data/templates/misc-iso-templates.xml.h:35 +msgid "Mailing Labels" +msgstr "Etikedoj por poŝto" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:16 +msgid "Mailing labels" +msgstr "Etikedoj por poŝto" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:18 +msgid "Mini Address Labels" +msgstr "Eta etikedoj por adreso" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:20 +msgid "Shipping labels" +msgstr "Etikedo por ekspedo" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:4 +msgid "Allround Labels" +msgstr "Plenrondaj etikedoj" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:10 +msgid "Correction and Cover-up Labels" +msgstr "Etikedoj por korektado kaj kovrado" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:12 +msgid "Lever Arch File Labels" +msgstr "Levilaj arkaj etikedoj por dosieroj" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:16 +msgid "QSL-Karten Etiketten 70mm x 50,8mm" +msgstr "QSL-Karten Etiketten 70mm x 50,8mm" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:18 +msgid "Rectangular Copier Labels" +msgstr "Rektangulaj etikedoj por kopiado" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:20 +#: data/templates/misc-iso-templates.xml.h:44 +msgid "Rectangular Labels" +msgstr "Rektangulaj Etikedoj" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:22 +msgid "Video Labels (back)" +msgstr "Etikedo por Video (retro)" + +#: data/templates/misc-us-templates.xml.h:1 +msgid "Business Card CD" +msgstr "Vizitkarto KD" + +#: data/templates/misc-us-templates.xml.h:4 +msgid "CD Template Rectangles" +msgstr "Modelaj Rektanguloj por KD" + +#: data/templates/misc-us-templates.xml.h:6 +msgid "CD/DVD Labels (Face Only)" +msgstr "Etikedoj por KD/DVD (nur faco)" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:7 +#: data/templates/misc-iso-templates.xml.h:23 +msgid "CD/DVD Labels (face only)" +msgstr "Etikedoj por KD/DVD (nur faco)" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:9 +msgid "Cassette Labels" +msgstr "Etikedoj por kasedoj" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:11 +msgid "DLT Labels" +msgstr "Etikedoj DLT" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:13 +msgid "Microtube labels" +msgstr "Mikrotubaj etikedoj" + +#: data/templates/misc-us-templates.xml.h:14 +msgid "Mini-CD Labels" +msgstr "Etikedoj por Mini-KD" + +#: data/templates/misc-us-templates.xml.h:15 +msgid "PRO CD Labels 2-up (CD spine only)" +msgstr "Etikedoj por PRO CD (nur KD-dorso)" + +#: data/templates/misc-us-templates.xml.h:16 +msgid "PRO CD Labels 2-up (Face only)" +msgstr "Etikedoj por PRO CD (nur faco)" + +#: data/templates/misc-us-templates.xml.h:17 +#: data/templates/misc-iso-templates.xml.h:42 +msgid "PRO CD Labels 2-up (face only)" +msgstr "Etikedoj por PRO CD (nur faco)" + +#: data/templates/misc-us-templates.xml.h:18 +msgid "Slimline CD Case (rightside up)" +msgstr "Subtila KD-ujo (dekstrosupra)" + +#: data/templates/misc-us-templates.xml.h:19 +msgid "Slimline CD Case (upside down)" +msgstr "Subtila KD-ujo (kaposuba)" + +#: data/templates/misc-iso-templates.xml.h:1 +msgid "Agipa 119488: Business Cards" +msgstr "Agipa 119488: Vizitkartoj" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:3 +msgid "Allround Labels --24" +msgstr "Plenrondaj etikedoj --24" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:5 +msgid "Allround Labels --44" +msgstr "Plenrondaj etikedoj --44" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:7 +msgid "Allround Labels --64" +msgstr "Plenrondaj etikedoj --64" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:9 +msgid "Allround Labels --65" +msgstr "Plenrondaj etikedoj --65" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:11 +msgid "Arch File Labels" +msgstr "Arkaj etikedoj por dosieroj" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:13 +msgid "Arch File Labels (large)" +msgstr "Arkaj etikedoj por dosieroj (grandaj)" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:15 +msgid "Arch File Labels (small)" +msgstr "Arkaj etikedoj por dosieroj (etaj)" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:19 +msgid "CD Labels" +msgstr "Etikedoj por KD" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:25 +msgid "CD/DVD Labels Standard Format (face only)" +msgstr "Etikedoj kun standarta formato por KD/DVD (nur faco)" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:27 +msgid "Diskette Labels (face only)" +msgstr "Etikedoj por disketoj (nur faco)" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:29 +msgid "EPSON Photo Stickers 16" +msgstr "EPSON Photo Stickers 16" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:31 +msgid "Etiketten" +msgstr "Etiketten" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:33 +msgid "Fridge Magnet Stickers" +msgstr "Magnetaĵoj por fridujo" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:37 +msgid "Mailing Labels --14" +msgstr "Etikedo por poŝto --14" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:39 +msgid "Mailing Labels-2 columns" +msgstr "Etikedo por poŝto kun 2 kolumnoj" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:41 +msgid "Mailing Labels-3 columns" +msgstr "Etikedo por poŝto kun 3 kolumnoj" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:46 +msgid "Video Labels (face only)" +msgstr "Etikedoj por video (nur frontispico)" + +#: data/desktop/glabels.desktop.in.h:1 +msgid "Create labels, business cards and media covers" +msgstr "Kreu etikedojn, vizitkartojn kaj kovrilojn de plurmediaĵoj" + +#: data/desktop/glabels.desktop.in.h:2 +msgid "gLabels Label Designer" +msgstr "gLabels Designer di etichetta" + +#: data/mime/glabels.keys.in.h:1 data/mime/glabels.xml.in.h:1 +msgid "gLabels Project File" +msgstr "Dosiero de Projekto de gLabels" + diff --git a/glabels2/po/es.po b/glabels2/po/es.po new file mode 100644 index 00000000..9dc7ad40 --- /dev/null +++ b/glabels2/po/es.po @@ -0,0 +1,2565 @@ +# Spanish translation of glabels. +# sergio rivadero , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: glabels 2.1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-01-22 14:03-0500\n" +"PO-Revision-Date: 2005-02-12 12:19-0300\n" +"Last-Translator: sergio rivadero \n" +"Language-Team: Spanish/Spain \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/glabels.c:116 +msgid "Could not initialize Bonobo!\n" +msgstr "No se puede inicializar Bonobo!\n" + +#: src/glabels-batch.c:52 +msgid "print this message" +msgstr "imprimir este mensaje" + +#: src/glabels-batch.c:54 +msgid "print the version of glabels-batch being used" +msgstr "imprimir la versión utilizada de glabels-batch" + +#: src/glabels-batch.c:56 +msgid "set output filename (default=\"output.ps\")" +msgstr "establecer nombre de archivo (predeterminado=\"output.ps\")" + +#: src/glabels-batch.c:56 src/glabels-batch.c:70 +msgid "filename" +msgstr "nombre de archivo" + +#: src/glabels-batch.c:58 +msgid "number of sheets (default=1)" +msgstr "número de hojas (predeterminado=1)" + +#: src/glabels-batch.c:58 +msgid "sheets" +msgstr "hojas" + +#: src/glabels-batch.c:60 +msgid "number of copies (default=1)" +msgstr "número de copias (predeterminado=1)" + +#: src/glabels-batch.c:60 +msgid "copies" +msgstr "copias" + +#: src/glabels-batch.c:62 +msgid "first label on first sheet (default=1)" +msgstr "primera etiqueta en primera hoja (predeterminado=1)" + +#: src/glabels-batch.c:62 +msgid "first" +msgstr "primero" + +#: src/glabels-batch.c:64 src/print-dialog.c:336 +msgid "print outlines (to test printer alignment)" +msgstr "imprimir un esbozo (para verificar la alineación de la impresora)" + +#: src/glabels-batch.c:66 src/print-dialog.c:344 +msgid "print in reverse (i.e. a mirror image)" +msgstr "impresión invertida (imagen espejo)" + +#: src/glabels-batch.c:68 src/print-dialog.c:351 +msgid "print crop marks" +msgstr "imprimir marcas de corte" + +#: src/glabels-batch.c:70 +msgid "input file for merging" +msgstr "archivo de entrada para combinar" + +#: src/glabels-batch.c:107 +msgid "[OPTION...] GLABELS_FILE..." +msgstr "[OPCION...] archivo-glabels..." + +#: src/glabels-batch.c:127 +#, c-format +msgid "missing glabels file\n" +msgstr "archivo glabels perdido\n" + +#: src/glabels-batch.c:158 +#, c-format +msgid "cannot perform document merge with glabels file %s\n" +msgstr "No se puede combinar el archivo %s\n" + +#: src/glabels-batch.c:182 +#, c-format +msgid "cannot open glabels file %s\n" +msgstr "No se puede abrir el archivo %s\n" + +#: src/window.c:244 +msgid "(none) - gLabels" +msgstr "(sin nombre) - gLabels" + +#: src/window.c:414 +msgid "(modified)" +msgstr "(modificado)" + +#: src/stock.c:65 data/ui/glabels-ui.xml.h:162 +msgid "_Select Mode" +msgstr "_Modo selección" + +#: src/stock.c:66 data/ui/glabels-ui.xml.h:163 +msgid "_Text" +msgstr "_Texto" + +#: src/stock.c:67 data/ui/glabels-ui.xml.h:148 +msgid "_Line" +msgstr "_Línea" + +#: src/stock.c:68 data/ui/glabels-ui.xml.h:130 +msgid "_Box" +msgstr "_Rectangulo" + +#: src/stock.c:69 data/ui/glabels-ui.xml.h:141 +msgid "_Ellipse" +msgstr "_Elipse" + +#: src/stock.c:70 data/ui/glabels-ui.xml.h:146 +msgid "_Image" +msgstr "_Imagen" + +#: src/stock.c:71 data/ui/glabels-ui.xml.h:11 +msgid "Bar_code" +msgstr "_Código de barras" + +#: src/stock.c:72 +msgid "_Merge Properties" +msgstr "Propiedades de _fusión de datos" + +#: src/stock.c:73 +msgid "Object _Properties" +msgstr "Propiedades del objeto" + +#: src/stock.c:74 data/ui/glabels-ui.xml.h:13 +msgid "Bring to _Front" +msgstr "Traer al _frente" + +#: src/stock.c:75 data/ui/glabels-ui.xml.h:109 +msgid "Send to _Back" +msgstr "Enviar al f_ondo" + +#: src/stock.c:76 data/ui/glabels-ui.xml.h:96 +msgid "Rotate _Left" +msgstr "Rotar a la _izquierda" + +#: src/stock.c:77 data/ui/glabels-ui.xml.h:97 +msgid "Rotate _Right" +msgstr "Rotar a la _derecha" + +#: src/stock.c:78 data/ui/glabels-ui.xml.h:52 +msgid "Flip _Horizontally" +msgstr "Reflejar _horizontalmente" + +#: src/stock.c:79 data/ui/glabels-ui.xml.h:53 +msgid "Flip _Vertically" +msgstr "Reflejar _verticalmente" + +#: src/stock.c:80 data/ui/glabels-ui.xml.h:147 +msgid "_Lefts" +msgstr "A la _izquierda" + +#: src/stock.c:81 data/ui/glabels-ui.xml.h:159 +msgid "_Rights" +msgstr "A la _derecha" + +#: src/stock.c:82 data/ui/glabels-ui.xml.h:131 +msgid "_Centers" +msgstr "_Centrado" + +#: src/stock.c:83 data/ui/glabels-ui.xml.h:164 +msgid "_Tops" +msgstr "_Superior" + +#: src/stock.c:84 +msgid "Bottoms" +msgstr "_Inferior" + +#: src/stock.c:85 +msgid "Centers" +msgstr "_Centrado" + +#: src/stock.c:86 src/stock.c:87 data/ui/glabels-ui.xml.h:62 +msgid "Label Ce_nter" +msgstr "Centro de la _etiqueta" + +#: src/stock.c:88 data/ui/glabels-ui.xml.h:51 +msgid "Fill color" +msgstr "Color de relleno" + +#: src/stock.c:89 data/ui/glabels-ui.xml.h:64 +msgid "Line color" +msgstr "Color de línea" + +#: src/stock.c:90 src/stock.c:92 +msgid "Linked" +msgstr "Enlazado" + +#: src/stock.c:91 src/stock.c:93 +msgid "Not Linked" +msgstr "No enlazado" + +#: src/ui-property-bar.c:345 src/object-editor.c:587 +msgid "Default" +msgstr "Predeterminado" + +#: src/ui-property-bar.c:360 src/object-editor.c:600 +msgid "No fill" +msgstr "Sin relleno" + +#: src/ui-property-bar.c:375 src/object-editor.c:593 +msgid "No line" +msgstr "Sin línea" + +#: src/ui-sidebar.c:180 +msgid "Object properties" +msgstr "Propiedades del objeto" + +#: src/commands.c:385 +msgid "" +"A label and business card creation program for GNOME.\n" +" \n" +"Glabels is free software; you can redistribute it and/or modify it under the " +"terms of the GNU General Public License as published by the Free Software " +"Foundation; either version 2 of the License, or (at your option) any later " +"version.\n" +" \n" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details.\n" +msgstr "" +"Un programa de creación de etiquetas y tarjetas para GNOME.\n" +" \n" +"Glabels es software libre; Puede modificarlo y redistribuirlo bajo los " +"términos de la Licencia Pública General de GNU tal como es publicada por la " +"Free Software Foundation; ya sea la versión 2 de dicha licencia, o (a su " +"opción) cualquier otra versión posterior.\n" +" \n" +"Este programa se distribuye con la esperanza que le será útil, pero SIN " +"NINGUNA GARANTÍA; Para más detalles vea la Licencia Pública General de GNU.\n" + +#: src/commands.c:399 +msgid "See the file AUTHORS for additional credits," +msgstr "Vea el archivo AUTHORS, " + +#: src/commands.c:400 +msgid "or visit http://glabels.sourceforge.net/" +msgstr "o visite http://glabels.sourceforge.net/" + +#: src/commands.c:409 +msgid " " +msgstr " " + +#: src/commands.c:424 +msgid "glabels" +msgstr "glabels" + +#: src/file.c:100 +msgid "New Label or Card" +msgstr "Nueva etiqueta o tarjeta" + +#: src/file.c:132 src/file.c:304 +msgid "Media Type" +msgstr "Tipo de papel" + +#: src/file.c:138 src/file.c:310 +msgid "Label orientation" +msgstr "Orientación de la etiqueta" + +#: src/file.c:269 +msgid "Label properties" +msgstr "Propiedades de la etiqueta" + +#: src/file.c:452 src/file.c:870 +msgid "All files" +msgstr "Todos los archivos" + +#: src/file.c:457 src/file.c:875 +msgid "gLabels documents" +msgstr "Documentos glabels" + +#: src/file.c:505 src/file.c:617 src/file.c:934 src/file.c:1130 +msgid "Empty file name selection" +msgstr "Vaciar selección de nombre de archivo" + +#: src/file.c:506 src/file.c:520 src/file.c:618 src/file.c:632 +msgid "Please select a file or supply a valid file name" +msgstr "Por favor seleccione un archivo o escriba un nombre de archivo válido" + +#: src/file.c:519 src/file.c:631 +msgid "File does not exist" +msgstr "Archivo no existe" + +#: src/file.c:563 data/ui/glabels-ui.xml.h:74 +msgid "Open" +msgstr "Abrir" + +#: src/file.c:565 +msgid "Open label" +msgstr "Abrir etiqueta" + +#: src/file.c:707 +#, c-format +msgid "Could not open file \"%s\"" +msgstr "No se puede abrir el archivo \"%s\"" + +#: src/file.c:715 +msgid "Not a supported file format" +msgstr "Formato de archivo no soportado" + +#: src/file.c:797 src/file.c:979 src/file.c:1174 +#, c-format +msgid "Could not save file \"%s\"" +msgstr "No se puede guardar el archivo \"%s\"" + +#: src/file.c:805 src/file.c:987 src/file.c:1182 +msgid "Error encountered during save. The file is still not saved." +msgstr "Se encontró un error al guardar. El archivo aún no está guardado." + +#: src/file.c:848 src/file.c:1048 +#, c-format +msgid "Save \"%s\" as" +msgstr "Guardar como \"%s\"" + +#: src/file.c:935 src/file.c:1131 +msgid "Please supply a valid file name" +msgstr "Debe proporcionar un nombre de archivo válido" + +#: src/file.c:952 src/file.c:1147 +#, c-format +msgid "Overwrite file \"%s\"?" +msgstr "Sobreescribir el archivo \"%s\"?" + +#: src/file.c:960 src/file.c:1155 +msgid "File already exists." +msgstr "El archivo ya existe." + +#: src/file.c:1271 +#, c-format +msgid "Save changes to document \"%s\" before closing?" +msgstr "Guardar cambios del documento \"%s\" antes de cerrar?" + +#: src/file.c:1279 +msgid "Your changes will be lost if you don't save them." +msgstr "Sus cambios se perderán si no los guarda." + +#: src/file.c:1282 +msgid "Close without saving" +msgstr "Cerrar sin guardar" + +#. Should not happen +#: src/prefs.c:156 src/prefs.c:163 data/glade/prefs-dialog.glade.h:23 +#: data/glade/object-editor.glade.h:37 +msgid "points" +msgstr "puntos" + +#: src/prefs.c:158 data/glade/object-editor.glade.h:36 +#: data/glade/template-designer.glade.h:74 +msgid "inches" +msgstr "pulgadas" + +#: src/prefs.c:160 +msgid "mm" +msgstr "mm" + +#: src/prefs-dialog.c:248 data/glade/prefs-dialog.glade.h:22 +msgid "gLabels Preferences" +msgstr "Preferencias de gLabels" + +#. +#. * Submenu: Order +#. +#: src/view.c:3574 data/ui/glabels-ui.xml.h:154 +msgid "_Order" +msgstr "Or_den" + +#. +#. * Submenu: Rotate/Flip +#. +#: src/view.c:3595 data/ui/glabels-ui.xml.h:160 +msgid "_Rotate/Flip" +msgstr "_Rotar/Reflejar" + +#. +#. * Submenu: Align Horizontally +#. +#: src/view.c:3628 +msgid "Align _Horizontally" +msgstr "Alinear _horizontalmente" + +#. +#. * Submenu: Align Vertically +#. +#: src/view.c:3667 +msgid "Align _Vertically" +msgstr "Alinear _verticalmente" + +#: src/view.c:3728 data/ui/glabels-ui.xml.h:137 +msgid "_Delete" +msgstr "_Borrar" + +#. Build editor. +#: src/view-box.c:236 +msgid "Box object properties" +msgstr "Propiedades del rectángulo" + +#. Build editor. +#: src/view-ellipse.c:236 +msgid "Ellipse object properties" +msgstr "Propiedades del elipse" + +#. Build editor. +#: src/view-line.c:229 +msgid "Line object properties" +msgstr "Propiedades de la línea" + +#. Build editor. +#: src/view-image.c:223 +msgid "Image object properties" +msgstr "Propiedades de la imagen" + +#. Build editor. +#: src/view-text.c:251 +msgid "Text object properties" +msgstr "Propiedades del texto" + +#: src/view-text.c:571 data/glade/object-editor.glade.h:28 +msgid "Text" +msgstr "Texto" + +#. Build editor. +#: src/view-barcode.c:210 +msgid "Barcode object properties" +msgstr "Propiedades del código de barras" + +#: src/view-barcode.c:594 src/print.c:1125 +msgid "Invalid barcode data" +msgstr "Datos de código de barras no válidos" + +#: src/merge-properties-dialog.c:231 +msgid "Merge Properties" +msgstr "Propiedades de combinación de datos" + +#. ---- Source section ---- +#: src/merge-properties-dialog.c:237 +msgid "Source" +msgstr "Fuente" + +#: src/merge-properties-dialog.c:245 +msgid "Format:" +msgstr "Formato:" + +#. Location line +#: src/merge-properties-dialog.c:273 +msgid "Location:" +msgstr "Ubicación:" + +#: src/merge-properties-dialog.c:282 src/merge-properties-dialog.c:393 +msgid "Select merge-database source" +msgstr "Seleccione la fuente de datos para combinar" + +#: src/merge-properties-dialog.c:289 src/merge-properties-dialog.c:404 +msgid "N/A" +msgstr "N/D" + +#. ---- Sample Fields section ---- +#: src/merge-properties-dialog.c:300 +msgid "Record selection/preview:" +msgstr "Selección de registros/Vista previa" + +#: src/merge-properties-dialog.c:326 +msgid "Select" +msgstr "Seleccionar" + +#: src/merge-properties-dialog.c:334 +msgid "Record/Field" +msgstr "Registro/Campo" + +#: src/merge-properties-dialog.c:342 data/glade/object-editor.glade.h:9 +msgid "Data" +msgstr "Datos" + +#: src/print-dialog.c:266 data/ui/glabels-ui.xml.h:81 +msgid "Print" +msgstr "Imprimir" + +#: src/print-dialog.c:281 +msgid "_Job" +msgstr "_Trabajo" + +#: src/print-dialog.c:286 +msgid "P_rinter" +msgstr "_Impresora" + +#. ----------- Add simple-copies widget ------------ +#: src/print-dialog.c:314 +msgid "Copies" +msgstr "Copias" + +#. ------- Add merge control widget ------------ +#: src/print-dialog.c:322 +msgid "Document merge control" +msgstr "Control de combinación de documentos" + +#. ----------- Add custom print options area ------------ +#: src/print-dialog.c:330 +msgid "Options" +msgstr "Opciones" + +#: src/print-dialog.c:553 src/print-dialog.c:592 +msgid "Print preview" +msgstr "Previsualizar la impresión" + +#: src/template-designer.c:409 data/glade/template-designer.glade.h:73 +msgid "gLabels Template Designer" +msgstr "Diseñador de plantillas gLabels" + +#: src/bc.c:60 +msgid "POSTNET (any)" +msgstr "POSTNET (cualquiera)" + +#: src/bc.c:63 +msgid "POSTNET-5 (ZIP only)" +msgstr "POSTNET-5 (solo código postal)" + +#: src/bc.c:66 +msgid "POSTNET-9 (ZIP+4)" +msgstr "POSTNET-9 (código postal+4)" + +#: src/bc.c:69 +msgid "POSTNET-11 (DPBC)" +msgstr "POSTNET-11 (DPBC)" + +#: src/bc.c:72 +msgid "EAN (any)" +msgstr "EAN (cualquiera)" + +#: src/bc.c:75 +msgid "EAN-8" +msgstr "EAN-8" + +#: src/bc.c:78 +msgid "EAN-8 +2" +msgstr "EAN-8 +2" + +#: src/bc.c:81 +msgid "EAN-8 +5" +msgstr "EAN-8 +5" + +#: src/bc.c:84 +msgid "EAN-13" +msgstr "EAN-13" + +#: src/bc.c:87 +msgid "EAN-13 +2" +msgstr "EAN-13 2" + +#: src/bc.c:90 +msgid "EAN-13 +5" +msgstr "EAN-13 +5" + +#: src/bc.c:93 +msgid "UPC (UPC-A or UPC-E)" +msgstr "UPC (UPC-A o UPC-E)" + +#: src/bc.c:96 +msgid "UPC-A" +msgstr "UPC-A" + +#: src/bc.c:99 +msgid "UPC-A +2" +msgstr "UPC-A +2" + +#: src/bc.c:102 +msgid "UPC-A +5" +msgstr "UPC-A +5" + +#: src/bc.c:105 +msgid "UPC-E" +msgstr "UPC-E" + +#: src/bc.c:108 +msgid "UPC-E +2" +msgstr "UPC-E +2" + +#: src/bc.c:111 +msgid "UPC-E +5" +msgstr "UPC-E +5" + +#: src/bc.c:114 +msgid "ISBN" +msgstr "ISBN" + +#: src/bc.c:117 +msgid "ISBN +5" +msgstr "ISBN +5" + +#: src/bc.c:120 +msgid "Code 39" +msgstr "Code 39" + +#: src/bc.c:123 +msgid "Code 128" +msgstr "Code 128" + +#: src/bc.c:126 +msgid "Code 128C" +msgstr "Code 128C" + +#: src/bc.c:129 +msgid "Code 128B" +msgstr "Code 128B" + +#: src/bc.c:132 +msgid "Interleaved 2 of 5" +msgstr "Intercalado 2 de 5" + +#: src/bc.c:135 +msgid "Codabar" +msgstr "Codabar" + +#: src/bc.c:138 +msgid "MSI" +msgstr "MSI" + +#: src/bc.c:141 +msgid "Plessey" +msgstr "Plessey" + +#: src/label.c:569 +msgid "Untitled" +msgstr "Sin título" + +#: src/xml-label.c:176 src/xml-label.c:213 +msgid "xmlParseFile error" +msgstr "error xmlParseFile" + +#: src/xml-label.c:250 +msgid "No document root" +msgstr "No hay documento raíz" + +#: src/xml-label.c:264 +msgid "Importing from glabels 0.1 format" +msgstr "Importando desde formato glabels 0.1" + +#: src/xml-label.c:272 +msgid "Importing from glabels 0.4 format" +msgstr "Importando desde formato glabels 0.4" + +#: src/xml-label.c:279 +msgid "Importing from glabels 1.91 format" +msgstr "Importando desde formato glabels 1.91" + +#: src/xml-label.c:282 +msgid "bad document, unknown glabels Namespace" +msgstr "documento de tipo erróneo, etiquetas glabels no encontradas" + +#: src/xml-label.c:311 src/xml-label-04.c:75 src/xml-label-191.c:131 +#, c-format +msgid "Bad root node = \"%s\"" +msgstr "Nodo raíz erróneo = \"%s\"" + +#: src/xml-label.c:348 src/xml-label-191.c:165 +#, c-format +msgid "bad node in Document node = \"%s\"" +msgstr "Nodo erróneo en sección Document = \"%s\"" + +#: src/xml-label.c:393 src/xml-label-04.c:123 src/xml-label-191.c:197 +#, c-format +msgid "bad node = \"%s\"" +msgstr "Nodo erróneo = \"%s\"" + +#: src/xml-label.c:855 src/xml-label-191.c:624 +#, c-format +msgid "bad node in Data node = \"%s\"" +msgstr "Nodo erróneo en sección Data = \"%s\"" + +#: src/xml-label.c:1030 libglabels/xml-template.c:535 +msgid "Utf8 conversion error." +msgstr "Conversión UTF-8 errónea" + +#: src/xml-label.c:1037 libglabels/xml-template.c:542 +msgid "Problem saving xml file." +msgstr "Problemas al guardar archivo xml" + +#. This should always be an id, but just in case a name +#. slips by! +#: src/xml-label-191.c:699 libglabels/xml-template.c:199 +#, c-format +msgid "Unknown page size id \"%s\", trying as name" +msgstr "Código \"%s\" de tamaño de página desconocido, intentando como nombre." + +#: src/xml-label-191.c:709 libglabels/xml-template.c:209 +#, c-format +msgid "Unknown page size id or name \"%s\"" +msgstr "Código \"%s\" o nombre de página desconocido" + +#: src/merge.c:172 src/merge.c:213 src/merge.c:399 src/merge.c:402 +msgid "None" +msgstr "Ninguno" + +#: src/merge-init.c:53 +msgid "Text file with comma delimeters (CSV)" +msgstr "Texto separado con comas" + +#: src/merge-init.c:60 +msgid "Text file with colon delimeters" +msgstr "Texto separado con dos puntos" + +#: src/merge-init.c:67 +msgid "Text file with tab delimeters" +msgstr "Texto separado con tabuladores" + +#: src/wdgt-image-select.c:201 data/glade/object-editor.glade.h:11 +msgid "File:" +msgstr "Archivo:" + +#: src/wdgt-image-select.c:245 data/glade/object-editor.glade.h:16 +msgid "Key:" +msgstr "Clave:" + +#: src/wdgt-print-copies.c:179 +msgid "Sheets:" +msgstr "Hojas:" + +#: src/wdgt-print-copies.c:197 +msgid "Labels" +msgstr "Etiquetas" + +#: src/wdgt-print-copies.c:200 +msgid "from:" +msgstr "desde:" + +#: src/wdgt-print-copies.c:207 +msgid "to:" +msgstr "hasta:" + +#: src/wdgt-print-merge.c:178 +msgid "Start on label" +msgstr "Comenzar en la etiqueta" + +#: src/wdgt-print-merge.c:186 +msgid "on 1st sheet" +msgstr "en la primera hoja" + +#: src/wdgt-print-merge.c:195 +msgid "Copies:" +msgstr "Copias:" + +#: src/wdgt-print-merge.c:201 +msgid "Collate" +msgstr "Intercalar" + +#: src/wdgt-media-select.c:269 data/glade/template-designer.glade.h:29 +msgid "Description:" +msgstr "Descripción:" + +#: src/wdgt-media-select.c:279 data/glade/template-designer.glade.h:53 +msgid "Page size:" +msgstr "Tamaño de la página:" + +#: src/wdgt-media-select.c:290 +msgid "Label size:" +msgstr "Tamaño de la etiqueta:" + +#: src/wdgt-media-select.c:301 +msgid "Layout:" +msgstr "Disposición:" + +#: src/wdgt-media-select.c:578 +#, c-format +msgid "%d x %d (%d per sheet)" +msgstr "%d x %d (%d por hoja)" + +#: src/wdgt-media-select.c:582 +#, c-format +msgid "%d per sheet" +msgstr "%d por hoja" + +#: src/wdgt-media-select.c:614 +#, c-format +msgid "%s x %s %s" +msgstr "%s x %s %s" + +#: src/wdgt-media-select.c:619 +#, c-format +msgid "%.5g x %.5g %s" +msgstr "%.5g x %.5g %s" + +#: src/wdgt-media-select.c:630 src/wdgt-media-select.c:644 +#, c-format +msgid "%s %s diameter" +msgstr "Diámetro %s %s" + +#: src/wdgt-media-select.c:634 src/wdgt-media-select.c:648 +#, c-format +msgid "%.5g %s diameter" +msgstr "Diámetro %.5g %s" + +#: src/wdgt-rotate-label.c:193 +msgid "Rotate" +msgstr "Rotar" + +#. This is the default custom color +#: src/mygal/color-palette.c:396 +msgid "custom" +msgstr "personalizado" + +#. "Custom" color - we'll pop up a GnomeColorPicker +#: src/mygal/color-palette.c:438 +msgid "Custom Color:" +msgstr "Color personalizado:" + +#: src/mygal/color-palette.c:446 +msgid "Choose Custom Color" +msgstr "Elegir color:" + +#: src/mygal/color-palette.c:579 +msgid "black" +msgstr "negro" + +#: src/mygal/color-palette.c:580 +msgid "light brown" +msgstr "marrón" + +#: src/mygal/color-palette.c:581 +msgid "brown gold" +msgstr "marrón oscuro" + +#: src/mygal/color-palette.c:582 +msgid "dark green #2" +msgstr "verde oscuro #2" + +#: src/mygal/color-palette.c:583 +msgid "navy" +msgstr "azul metalizado" + +#: src/mygal/color-palette.c:584 src/mygal/color-palette.c:640 +msgid "dark blue" +msgstr "azul muy oscuro" + +#: src/mygal/color-palette.c:585 +msgid "purple #2" +msgstr "azul oscuro" + +#: src/mygal/color-palette.c:586 +msgid "very dark gray" +msgstr "verde muy oscuro" + +#: src/mygal/color-palette.c:589 src/mygal/color-palette.c:645 +msgid "dark red" +msgstr "rojo oscuro" + +#: src/mygal/color-palette.c:590 +msgid "red-orange" +msgstr "anaranjado" + +#: src/mygal/color-palette.c:591 +msgid "gold" +msgstr "marrón claro" + +#: src/mygal/color-palette.c:592 +msgid "dark green" +msgstr "verde oscuro" + +#: src/mygal/color-palette.c:593 src/mygal/color-palette.c:646 +msgid "dull blue" +msgstr "verde azulado" + +#: src/mygal/color-palette.c:594 src/mygal/color-palette.c:647 +msgid "blue" +msgstr "azul" + +#: src/mygal/color-palette.c:595 +msgid "dull purple" +msgstr "violeta azulado" + +#: src/mygal/color-palette.c:596 +msgid "dark grey" +msgstr "gris oscuro" + +#: src/mygal/color-palette.c:599 +msgid "red" +msgstr "rojo" + +#: src/mygal/color-palette.c:600 +msgid "orange" +msgstr "naranja" + +#: src/mygal/color-palette.c:601 +msgid "lime" +msgstr "lima" + +#: src/mygal/color-palette.c:602 +msgid "dull green" +msgstr "verde opaco" + +#: src/mygal/color-palette.c:603 +msgid "dull blue #2" +msgstr "cyan" + +#: src/mygal/color-palette.c:604 +msgid "sky blue #2" +msgstr "celeste" + +#: src/mygal/color-palette.c:605 src/mygal/color-palette.c:644 +msgid "purple" +msgstr "violeta" + +#: src/mygal/color-palette.c:606 +msgid "gray" +msgstr "gris" + +#: src/mygal/color-palette.c:609 src/mygal/color-palette.c:641 +msgid "magenta" +msgstr "fucsia" + +#: src/mygal/color-palette.c:610 +msgid "bright orange" +msgstr "naranja claro" + +#: src/mygal/color-palette.c:611 src/mygal/color-palette.c:642 +msgid "yellow" +msgstr "amarillo" + +#: src/mygal/color-palette.c:612 +msgid "green" +msgstr "verde" + +#: src/mygal/color-palette.c:613 src/mygal/color-palette.c:643 +msgid "cyan" +msgstr "turquesa" + +#: src/mygal/color-palette.c:614 +msgid "bright blue" +msgstr "azul claro" + +#: src/mygal/color-palette.c:615 src/mygal/color-palette.c:632 +msgid "red purple" +msgstr "borravino" + +#: src/mygal/color-palette.c:616 +msgid "light grey" +msgstr "gris claro" + +#: src/mygal/color-palette.c:619 src/mygal/color-palette.c:636 +msgid "pink" +msgstr "rosa" + +#: src/mygal/color-palette.c:620 +msgid "light orange" +msgstr "naranja claro" + +#: src/mygal/color-palette.c:621 src/mygal/color-palette.c:633 +msgid "light yellow" +msgstr "amarillo claro" + +#: src/mygal/color-palette.c:622 +msgid "light green" +msgstr "verde claro" + +#: src/mygal/color-palette.c:623 +msgid "light cyan" +msgstr "turquesa claro" + +#: src/mygal/color-palette.c:624 src/mygal/color-palette.c:634 +msgid "light blue" +msgstr "celeste claro" + +#: src/mygal/color-palette.c:625 src/mygal/color-palette.c:638 +msgid "light purple" +msgstr "violeta claro" + +#: src/mygal/color-palette.c:626 +msgid "white" +msgstr "blanco" + +#: src/mygal/color-palette.c:631 +msgid "purplish blue" +msgstr "azul purpurado" + +#: src/mygal/color-palette.c:635 +msgid "dark purple" +msgstr "violeta oscuro" + +#: src/mygal/color-palette.c:637 +msgid "sky blue" +msgstr "celeste" + +#: libglabels/template.c:848 +#, c-format +msgid "Generic %s full page" +msgstr "Página completa genérica %s" + +#: libglabels/template.c:897 +msgid "No template files found!" +msgstr "No se encontraron archivos de plantilla!" + +#. Create and append an "Other" entry. +#: libglabels/paper.c:67 +msgid "Other" +msgstr "Otros" + +#: libglabels/paper.c:361 +msgid "No paper files found!" +msgstr "No se encontró tipo de papel!" + +#: data/ui/glabels-ui.xml.h:1 +msgid "About glabels" +msgstr "Acerca de glabels" + +#: data/ui/glabels-ui.xml.h:2 +msgid "About..." +msgstr "Acerca de..." + +#: data/ui/glabels-ui.xml.h:3 +msgid "Align _Horizontal" +msgstr "Alineado _horizontal" + +#: data/ui/glabels-ui.xml.h:4 +msgid "Align _Vertical" +msgstr "Alineado _vertical" + +#: data/ui/glabels-ui.xml.h:5 +msgid "Align objects to bottoms" +msgstr "Alinear objetos por su parte inferior" + +#: data/ui/glabels-ui.xml.h:6 +msgid "Align objects to horizontal centers" +msgstr "Alinear objetos por su centro" + +#: data/ui/glabels-ui.xml.h:7 +msgid "Align objects to left edges" +msgstr "Alinear objetos por su lado izquierdo" + +#: data/ui/glabels-ui.xml.h:8 +msgid "Align objects to right edges" +msgstr "Alinear objetos por su lado derecho" + +#: data/ui/glabels-ui.xml.h:9 +msgid "Align objects to tops" +msgstr "Alinear objetos por su parte superior" + +#: data/ui/glabels-ui.xml.h:10 +msgid "Align objects to vertical centers" +msgstr "Alinear objetos por su centro" + +#: data/ui/glabels-ui.xml.h:12 +msgid "Bold" +msgstr "Negrita" + +#: data/ui/glabels-ui.xml.h:14 +msgid "Center align" +msgstr "Centrado" + +#: data/ui/glabels-ui.xml.h:15 +msgid "Center objects to horizontal label center" +msgstr "Centrar objetos con el centro horizontal de la etiqueta" + +#: data/ui/glabels-ui.xml.h:16 +msgid "Center objects to vertical label center" +msgstr "Centrar objetos con el centro vertical de la etiqueta" + +#: data/ui/glabels-ui.xml.h:17 +msgid "Change the visibility of markup lines in the current window" +msgstr "Cambiar la visibilidad de los márgenes" + +#: data/ui/glabels-ui.xml.h:18 +msgid "Change the visibility of the drawing toolbar in the current window" +msgstr "Cambiar la visibilidad de la barra de dibujo" + +#: data/ui/glabels-ui.xml.h:19 +msgid "Change the visibility of the grid in the current window" +msgstr "Cambiar la visibilidad de la grilla" + +#: data/ui/glabels-ui.xml.h:20 +msgid "Change the visibility of the main toolbar in the current window" +msgstr "Cambiar la visibilidad de la barra principal" + +#: data/ui/glabels-ui.xml.h:21 +msgid "Change the visibility of the property toolbar in the current window" +msgstr "Cambiar la visibilidad de la barra de propiedades" + +#: data/ui/glabels-ui.xml.h:22 +msgid "Close" +msgstr "Cerrar" + +#: data/ui/glabels-ui.xml.h:23 +msgid "Close the current file" +msgstr "Guardar el archivo en uso" + +#: data/ui/glabels-ui.xml.h:24 +msgid "Configure the application" +msgstr "Configurar aplicación" + +#: data/ui/glabels-ui.xml.h:25 +msgid "Contents" +msgstr "Contenido" + +#: data/ui/glabels-ui.xml.h:26 +msgid "Copy" +msgstr "Copiar" + +#: data/ui/glabels-ui.xml.h:27 +msgid "Copy the selection" +msgstr "Copiar la selección" + +#: data/ui/glabels-ui.xml.h:28 +msgid "Create a custom template" +msgstr "Crear una plantilla personalizada" + +#: data/ui/glabels-ui.xml.h:29 +msgid "Create a new document" +msgstr "Crear un nuevo documento" + +#: data/ui/glabels-ui.xml.h:30 +msgid "Create barcode object" +msgstr "Crear un objeto código de barras" + +#: data/ui/glabels-ui.xml.h:31 +msgid "Create box/rectangle object" +msgstr "Crear un cuadrado o rectángulo" + +#: data/ui/glabels-ui.xml.h:32 +msgid "Create ellipse/circle object" +msgstr "Crear un círculo o elipse" + +#: data/ui/glabels-ui.xml.h:33 +msgid "Create image object" +msgstr "Crear una imagen" + +#: data/ui/glabels-ui.xml.h:34 +msgid "Create line object" +msgstr "Crear una línea" + +#: data/ui/glabels-ui.xml.h:35 +msgid "Create text object" +msgstr "Crear un cuadro de texto" + +#: data/ui/glabels-ui.xml.h:36 +msgid "Cu_t" +msgstr "Cor_tar" + +#: data/ui/glabels-ui.xml.h:37 +msgid "Customize" +msgstr "Personalizar" + +#: data/ui/glabels-ui.xml.h:38 +msgid "Customize Drawing Toolbar" +msgstr "Personalizar barra de dibujo" + +#: data/ui/glabels-ui.xml.h:39 +msgid "Customize Main Toolbar" +msgstr "Personalizar barra principal" + +#: data/ui/glabels-ui.xml.h:40 +msgid "Customize Property Toolbar" +msgstr "Personalizar barra de propiedades" + +#: data/ui/glabels-ui.xml.h:41 +msgid "Customize toolbars" +msgstr "Personalizar barras de herramientas" + +#: data/ui/glabels-ui.xml.h:42 +msgid "Cut" +msgstr "Cortar" + +#: data/ui/glabels-ui.xml.h:43 +msgid "Cut the selection" +msgstr "Cortar la selección" + +#: data/ui/glabels-ui.xml.h:44 +msgid "Decrease magnification" +msgstr "Reducir escala" + +#: data/ui/glabels-ui.xml.h:45 +msgid "Delete" +msgstr "Borrar" + +#: data/ui/glabels-ui.xml.h:46 +msgid "Delete the selected objects" +msgstr "Borrar los objetos seleccionados" + +#: data/ui/glabels-ui.xml.h:47 +msgid "Drawing toolbar" +msgstr "Barra de dibujo" + +#: data/ui/glabels-ui.xml.h:48 +msgid "Dump XML" +msgstr "Volcar XML" + +#: data/ui/glabels-ui.xml.h:49 +msgid "Dump the UI Xml description" +msgstr "Volcar la descripción UI XML" + +#: data/ui/glabels-ui.xml.h:50 +msgid "Edit merge properties" +msgstr "Editar propiedades de combinación de datos" + +#: data/ui/glabels-ui.xml.h:54 +msgid "Flip object horizontally" +msgstr "Reflejar objeto horizontalmente" + +#: data/ui/glabels-ui.xml.h:55 +msgid "Flip object vertically" +msgstr "Reflejar objeto verticalmente" + +#: data/ui/glabels-ui.xml.h:56 +msgid "Font name" +msgstr "Fuente" + +#: data/ui/glabels-ui.xml.h:57 +msgid "Font selector" +msgstr "Selección de fuentes" + +#: data/ui/glabels-ui.xml.h:58 +msgid "Font size" +msgstr "Tamaño de fuente" + +#: data/ui/glabels-ui.xml.h:59 +msgid "Icon and _Text" +msgstr "Icono y _texto" + +#: data/ui/glabels-ui.xml.h:60 +msgid "Increase magnification" +msgstr "Aumentar escala" + +#: data/ui/glabels-ui.xml.h:61 +msgid "Italic" +msgstr "Itálica" + +#: data/ui/glabels-ui.xml.h:63 +msgid "Left align" +msgstr "Alineación izquierda" + +#: data/ui/glabels-ui.xml.h:65 +msgid "Line width" +msgstr "Ancho de línea" + +#: data/ui/glabels-ui.xml.h:66 +msgid "Lower object to bottom" +msgstr "Llevar objeto al fondo" + +#: data/ui/glabels-ui.xml.h:67 +msgid "M_arkup" +msgstr "_Margen" + +#: data/ui/glabels-ui.xml.h:68 +msgid "Main toolbar" +msgstr "Barra principal" + +#: data/ui/glabels-ui.xml.h:69 +msgid "Markup" +msgstr "Margen" + +#: data/ui/glabels-ui.xml.h:70 +msgid "Modify document properties" +msgstr "Modificar las propiedades del documento" + +#: data/ui/glabels-ui.xml.h:71 +msgid "New" +msgstr "Nuevo" + +#: data/ui/glabels-ui.xml.h:72 +msgid "Object property editor" +msgstr "Editor de propiedades de objeto" + +#: data/ui/glabels-ui.xml.h:73 +msgid "Only show icons in the main toolbar" +msgstr "Sólo mostrar iconos en la barra principal" + +#: data/ui/glabels-ui.xml.h:75 +msgid "Open a file" +msgstr "Abrir un archivo" + +#: data/ui/glabels-ui.xml.h:76 +msgid "Open the glabels manual" +msgstr "Abrir el manual de glabels" + +#: data/ui/glabels-ui.xml.h:77 +msgid "Paste" +msgstr "Pegar" + +#: data/ui/glabels-ui.xml.h:78 +msgid "Paste the clipboard" +msgstr "Pegar desde portapapeles" + +#: data/ui/glabels-ui.xml.h:79 +msgid "Pr_eferences..." +msgstr "Pre_ferencias..." + +#: data/ui/glabels-ui.xml.h:80 +msgid "Preferences" +msgstr "Preferencias" + +#: data/ui/glabels-ui.xml.h:82 +msgid "Print the current file" +msgstr "Imprimir el archivo en uso" + +#: data/ui/glabels-ui.xml.h:83 +msgid "Proper_ties..." +msgstr "_Propiedades..." + +#: data/ui/glabels-ui.xml.h:84 +msgid "Properties" +msgstr "Propiedades" + +#: data/ui/glabels-ui.xml.h:85 +msgid "Property toolbar" +msgstr "Barra de propiedades" + +#: data/ui/glabels-ui.xml.h:86 +msgid "Quit" +msgstr "Salir" + +#: data/ui/glabels-ui.xml.h:87 +msgid "Quit the program" +msgstr "Salir del programa" + +#: data/ui/glabels-ui.xml.h:88 +msgid "Raise object to top" +msgstr "Traer al frente" + +#: data/ui/glabels-ui.xml.h:89 +msgid "Recent _Files" +msgstr "Archivos _recientes" + +#: data/ui/glabels-ui.xml.h:90 +msgid "Redo" +msgstr "Rehacer" + +#: data/ui/glabels-ui.xml.h:91 +msgid "Redo the undone action" +msgstr "Repetir la última acción" + +#: data/ui/glabels-ui.xml.h:92 +msgid "Remove all selections" +msgstr "Eliminar todas las selecciones" + +#: data/ui/glabels-ui.xml.h:94 +#, no-c-format +msgid "Restore scale to 100%" +msgstr "Restablecer escala al 100%" + +#: data/ui/glabels-ui.xml.h:95 +msgid "Right align" +msgstr "Alineación derecha" + +#: data/ui/glabels-ui.xml.h:98 +msgid "Rotate object 90 clockwise" +msgstr "Rotar 90 grados a la derecha" + +#: data/ui/glabels-ui.xml.h:99 +msgid "Rotate object 90 counter-clockwise" +msgstr "Rotar 90 grados a la izquierda" + +#: data/ui/glabels-ui.xml.h:100 +msgid "Save" +msgstr "Guardar" + +#: data/ui/glabels-ui.xml.h:101 +msgid "Save As" +msgstr "Guardar como" + +#: data/ui/glabels-ui.xml.h:102 +msgid "Save _As..." +msgstr "Guardar _como..." + +#: data/ui/glabels-ui.xml.h:103 +msgid "Save the current file" +msgstr "Guardar el archivo en uso" + +#: data/ui/glabels-ui.xml.h:104 +msgid "Save the current file with a different name" +msgstr "Guardar archivo con otro nombre" + +#: data/ui/glabels-ui.xml.h:105 +msgid "Select All" +msgstr "_Deseleccionar todo" + +#: data/ui/glabels-ui.xml.h:106 +msgid "Select _All" +msgstr "Seleccionar t_odo" + +#: data/ui/glabels-ui.xml.h:107 +msgid "Select all objects" +msgstr "Seleccionar todos los objetos" + +#: data/ui/glabels-ui.xml.h:108 +msgid "Select, move and modify objects" +msgstr "Seleccionar, mover y modificar objetos" + +#: data/ui/glabels-ui.xml.h:110 +msgid "Set main toolbar button style according to desktop default" +msgstr "" +"Establecer apariencia de la barra principal según estilo predeterminado del " +"escitorio" + +#: data/ui/glabels-ui.xml.h:111 +msgid "Show _Tooltips" +msgstr "Mostrar indicadores" + +#: data/ui/glabels-ui.xml.h:112 +msgid "Show both icons and texts in the main toolbar" +msgstr "Mostrar iconos y texto en la barra principal" + +#: data/ui/glabels-ui.xml.h:113 +msgid "Show tooltips in the drawing toolbar" +msgstr "Mostrar indicadores en la barra de dibujo" + +#: data/ui/glabels-ui.xml.h:114 +msgid "Show tooltips in the main toolbar" +msgstr "Mostrar indicadores en la barra principal" + +#: data/ui/glabels-ui.xml.h:115 +msgid "Show tooltips in the property toolbar" +msgstr "Mostrar indicadores en la barra de propiedades" + +#: data/ui/glabels-ui.xml.h:116 +msgid "Template Designer" +msgstr "Diseñador de plantillas" + +#: data/ui/glabels-ui.xml.h:117 +msgid "Template _Designer..." +msgstr "_Diseñador de plantillas" + +#: data/ui/glabels-ui.xml.h:118 +msgid "Text color" +msgstr "Color de texto" + +#: data/ui/glabels-ui.xml.h:119 +msgid "U_n-select All" +msgstr "_Deseleccionar todo" + +#: data/ui/glabels-ui.xml.h:120 +msgid "Un-select All" +msgstr "Deseleccionar todo" + +#: data/ui/glabels-ui.xml.h:121 +msgid "Undo" +msgstr "Deshacer" + +#: data/ui/glabels-ui.xml.h:122 +msgid "Undo the last action" +msgstr "Deshcar la última acción" + +#: data/ui/glabels-ui.xml.h:123 +msgid "Zoom _1:1" +msgstr "Escala _1:1" + +#: data/ui/glabels-ui.xml.h:124 +msgid "Zoom _In" +msgstr "_Ampliar" + +#: data/ui/glabels-ui.xml.h:125 +msgid "Zoom _Out" +msgstr "_Reducir" + +#: data/ui/glabels-ui.xml.h:126 +msgid "Zoom to _fit" +msgstr "A_justar" + +#: data/ui/glabels-ui.xml.h:127 +msgid "Zoom to fit window" +msgstr "Ampliar hasta ajustar" + +#: data/ui/glabels-ui.xml.h:128 +msgid "_About..." +msgstr "_Acerca de..." + +# REVISAR +#: data/ui/glabels-ui.xml.h:129 +msgid "_Bottoms" +msgstr "" + +#: data/ui/glabels-ui.xml.h:132 +msgid "_Close" +msgstr "_Cerrar" + +#: data/ui/glabels-ui.xml.h:133 +msgid "_Contents" +msgstr "_Contenido" + +#: data/ui/glabels-ui.xml.h:134 +msgid "_Copy" +msgstr "_Copiar" + +#: data/ui/glabels-ui.xml.h:135 +msgid "_Create Object" +msgstr "Crear _objeto" + +#: data/ui/glabels-ui.xml.h:136 +msgid "_Debug" +msgstr "_Depurar" + +#: data/ui/glabels-ui.xml.h:138 +msgid "_Desktop Default" +msgstr "_Predeterminado del escritorio" + +#: data/ui/glabels-ui.xml.h:139 +msgid "_Drawing Toolbar" +msgstr "Barra de dibujo" + +#: data/ui/glabels-ui.xml.h:140 +msgid "_Edit" +msgstr "_Editar" + +#: data/ui/glabels-ui.xml.h:142 +msgid "_File" +msgstr "_Archivo" + +#: data/ui/glabels-ui.xml.h:143 +msgid "_Grid" +msgstr "_Grilla" + +#: data/ui/glabels-ui.xml.h:144 +msgid "_Help" +msgstr "A_yuda" + +#: data/ui/glabels-ui.xml.h:145 +msgid "_Icon" +msgstr "_Icono" + +#: data/ui/glabels-ui.xml.h:149 +msgid "_Main Toolbar" +msgstr "Barra principal" + +#: data/ui/glabels-ui.xml.h:150 +msgid "_Merge Properties..." +msgstr "Propiedades de _combinación de datos" + +#: data/ui/glabels-ui.xml.h:151 +msgid "_New" +msgstr "_Nuevo" + +#: data/ui/glabels-ui.xml.h:152 +msgid "_Objects" +msgstr "_Objetos" + +#: data/ui/glabels-ui.xml.h:153 +msgid "_Open..." +msgstr "_Abrir..." + +#: data/ui/glabels-ui.xml.h:155 +msgid "_Paste" +msgstr "_Pegar" + +#: data/ui/glabels-ui.xml.h:156 +msgid "_Print..." +msgstr "_Imprimir" + +#: data/ui/glabels-ui.xml.h:157 +msgid "_Property Toolbar" +msgstr "Barra de propedades" + +#: data/ui/glabels-ui.xml.h:158 +msgid "_Quit" +msgstr "_Salir" + +#: data/ui/glabels-ui.xml.h:161 +msgid "_Save" +msgstr "_Guardar" + +#: data/ui/glabels-ui.xml.h:165 +msgid "_View" +msgstr "_Ver" + +#: data/glade/prefs-dialog.glade.h:1 +msgid " " +msgstr " " + +#: data/glade/prefs-dialog.glade.h:2 data/glade/object-editor.glade.h:1 +#: data/glade/template-designer.glade.h:5 +msgid "*" +msgstr "*" + +#: data/glade/prefs-dialog.glade.h:3 +msgid "Default page size" +msgstr "Tamaño de página predeterminado" + +#: data/glade/prefs-dialog.glade.h:4 +msgid "Fill" +msgstr "Relleno" + +#: data/glade/prefs-dialog.glade.h:5 +msgid "Line" +msgstr "Línea" + +#: data/glade/prefs-dialog.glade.h:6 +msgid "Text" +msgstr "Texto" + +#: data/glade/prefs-dialog.glade.h:7 +msgid "Units" +msgstr "Medidas" + +#: data/glade/prefs-dialog.glade.h:8 data/glade/object-editor.glade.h:4 +msgid "Alignment:" +msgstr "Alineación:" + +#: data/glade/prefs-dialog.glade.h:9 data/glade/object-editor.glade.h:8 +msgid "Color:" +msgstr "Color:" + +#: data/glade/prefs-dialog.glade.h:10 +msgid "Font:" +msgstr "Fuente:" + +#: data/glade/prefs-dialog.glade.h:11 +msgid "ISO A4" +msgstr "ISO A4" + +#: data/glade/prefs-dialog.glade.h:12 +msgid "Inches" +msgstr "Pulgadas" + +#: data/glade/prefs-dialog.glade.h:13 data/glade/object-editor.glade.h:19 +msgid "Line Spacing:" +msgstr "Espaciado:" + +#: data/glade/prefs-dialog.glade.h:14 +msgid "Locale" +msgstr "Documento" + +#: data/glade/prefs-dialog.glade.h:15 +msgid "Millimeters" +msgstr "Milímetros" + +#: data/glade/prefs-dialog.glade.h:16 +msgid "Object defaults" +msgstr "Objetos" + +#: data/glade/prefs-dialog.glade.h:17 +msgid "Points" +msgstr "Puntos" + +#: data/glade/prefs-dialog.glade.h:18 +msgid "Select default properties for new objects." +msgstr "Seleccione las propiedades predeterminadoas para los nuevos objetos." + +#: data/glade/prefs-dialog.glade.h:19 +msgid "Select locale specific behavior." +msgstr "Seleccione las propiedades del documento." + +#. Most popular (at top of list) +#: data/glade/prefs-dialog.glade.h:20 data/templates/paper-sizes.xml.h:29 +msgid "US Letter" +msgstr "Carta" + +#: data/glade/prefs-dialog.glade.h:21 data/glade/object-editor.glade.h:29 +#: data/glade/template-designer.glade.h:72 +msgid "Width:" +msgstr "Ancho:" + +#: data/glade/object-editor.glade.h:2 +msgid "00000000000 00000" +msgstr "00000000000 00000" + +#: data/glade/object-editor.glade.h:3 +msgid "Xxx object properties" +msgstr "" +"Propiedades de objecto xxx" + +#: data/glade/object-editor.glade.h:5 +msgid "Allow merge to automatically shrink text" +msgstr "Permitir ampliar texto automáticamente" + +#: data/glade/object-editor.glade.h:6 +msgid "Angle:" +msgstr "Ángulo:" + +#: data/glade/object-editor.glade.h:7 +msgid "Checksum" +msgstr "Verificación" + +#: data/glade/object-editor.glade.h:10 +msgid "Family:" +msgstr "Familia:" + +#: data/glade/object-editor.glade.h:12 +msgid "Fill" +msgstr "Relleno" + +#: data/glade/object-editor.glade.h:13 data/glade/template-designer.glade.h:33 +msgid "Height:" +msgstr "Alto:" + +#: data/glade/object-editor.glade.h:14 +msgid "Image" +msgstr "Imagen" + +#: data/glade/object-editor.glade.h:15 +msgid "Insert merge field" +msgstr "Insertar campo para combinar" + +#: data/glade/object-editor.glade.h:17 +msgid "Length:" +msgstr "Longitud:" + +#: data/glade/object-editor.glade.h:18 +msgid "Line" +msgstr "Línea" + +#: data/glade/object-editor.glade.h:20 +msgid "Literal:" +msgstr "Literal:" + +#: data/glade/object-editor.glade.h:21 +msgid "Load image" +msgstr "Cargar imagen" + +#: data/glade/object-editor.glade.h:22 +msgid "Position" +msgstr "Posición" + +#: data/glade/object-editor.glade.h:23 +msgid "Reset image size" +msgstr "Restablecer el tamaño de la imagen" + +#: data/glade/object-editor.glade.h:24 +msgid "Size" +msgstr "Tamaño" + +#: data/glade/object-editor.glade.h:25 +msgid "Size:" +msgstr "Tamaño:" + +#: data/glade/object-editor.glade.h:26 +msgid "Style" +msgstr "Estilo" + +#: data/glade/object-editor.glade.h:27 +msgid "Style:" +msgstr "Estilo:" + +#: data/glade/object-editor.glade.h:30 +msgid "X:" +msgstr "X:" + +#: data/glade/object-editor.glade.h:31 +msgid "Y:" +msgstr "Y:" + +#: data/glade/object-editor.glade.h:32 +msgid "degrees" +msgstr "grados" + +#: data/glade/object-editor.glade.h:33 +msgid "dialog1" +msgstr "dialogo1" + +#: data/glade/object-editor.glade.h:34 +msgid "digits:" +msgstr "dígitos:" + +#: data/glade/object-editor.glade.h:35 +msgid "format:" +msgstr "Formato:" + +#: data/glade/template-designer.glade.h:1 +msgid " " +msgstr " " + +#: data/glade/template-designer.glade.h:2 +msgid "(e.g., \"Mailing Labels,\" \"Business Cards,\" ...)" +msgstr "(por ej., \"Etiquetas para correo,\" \"Tarjetas de negocio,\" ...)" + +#: data/glade/template-designer.glade.h:3 +msgid "(e.g., 8163A)" +msgstr "(por ej., 8163A)" + +#: data/glade/template-designer.glade.h:4 +msgid "(e.g., Avery, Acme, ...)" +msgstr "(por ej., Avery, Acme, ...)" + +#: data/glade/template-designer.glade.h:6 +msgid "1. Outer radius:" +msgstr "1. Radio externo:" + +#: data/glade/template-designer.glade.h:7 +msgid "1. Radius:" +msgstr "1. Radio:" + +#: data/glade/template-designer.glade.h:8 +msgid "1. Width:" +msgstr "1. Ancho:" + +#: data/glade/template-designer.glade.h:9 +msgid "2. Height:" +msgstr "2. Alto:" + +#: data/glade/template-designer.glade.h:10 +msgid "2. Inner radius:" +msgstr "2. Radio interno:" + +#: data/glade/template-designer.glade.h:11 +msgid "2. Waste (overprint allowed):" +msgstr "2. Sobrante (sobreimpresión permitida):" + +#: data/glade/template-designer.glade.h:12 +msgid "3. Clipping width:" +msgstr "3. Ancho de recorte:" + +#: data/glade/template-designer.glade.h:13 +msgid "3. Margin" +msgstr "3. Márgen" + +#: data/glade/template-designer.glade.h:14 +msgid "3. Round (radius of corner):" +msgstr "3. Redondez (radio de las esquinas)" + +#: data/glade/template-designer.glade.h:15 +msgid "4. Clipping height:" +msgstr "4. Alto de recorte:" + +#: data/glade/template-designer.glade.h:16 +msgid "4. Horiz. waste (overprint allowed):" +msgstr "4. Sobrante horizontal (sobreimpresión permitida):" + +#: data/glade/template-designer.glade.h:17 +msgid "5. Vert. waste (overprint allowed):" +msgstr "5. Sobrante vertical (sobreimpresión permitida):" + +#: data/glade/template-designer.glade.h:18 +msgid "5. Waste (overprint allowed):" +msgstr "5. Sobrante (sobreimpresión permitida):" + +#: data/glade/template-designer.glade.h:19 +msgid "6. Margin" +msgstr "6. Margen" + +#: data/glade/template-designer.glade.h:20 +msgid "Brand/Manufacturer:" +msgstr "Marca/Fabricante:" + +#: data/glade/template-designer.glade.h:21 +msgid "CD/DVD (including credit card CDs)" +msgstr "CD/DVD (incluyendo CD-tarjeta)" + +#: data/glade/template-designer.glade.h:22 +msgid "" +"Congratulations!\n" +"\n" +"You have completed the gLabels Template Designer.\n" +"If you wish to accept and save your design, click \"Apply.\"\n" +"\n" +"Otherwise, you may click \"Cancel\" to abandon your design\n" +"or \"Back\" to continue editing this design." +msgstr "" +"Fecilitaciones!\n" +" \n" +"Ha completado la plantilla.\n" +"Si desea guardar su diseño pulse en \"Aplicar\".\n" +" \n" +"Puede pulsar \"Cancelar\" para abandonar su diseño\n" +"o \"Atrás\" para volver a editarlo." + +#: data/glade/template-designer.glade.h:30 +msgid "Design Completed" +msgstr "Diseño completo" + +#: data/glade/template-designer.glade.h:31 +msgid "Distance from left edge (x0):" +msgstr "Distancia desde el borde izquierdo (x0):" + +#: data/glade/template-designer.glade.h:32 +msgid "Distance from top edge (y0):" +msgstr "Distancia desde el borde superior (y0):" + +#: data/glade/template-designer.glade.h:34 +msgid "Horizontal pitch (dx):" +msgstr "Desplazamiento horizontal (dx):" + +#: data/glade/template-designer.glade.h:35 +msgid "" +"How many layouts will your template contain? \n" +"\n" +"A layout is a set of labels or cards that can be arranged in a simple grid.\n" +"Most templates only need one layout, as in the first example.\n" +"The second example illustrates when two layouts are needed." +msgstr "" +"¿Cuantas disposiciones tendrá su plantilla?\n" +"\n" +"Una disposición es un conjunto de etiquetas o tarjetas que se pueden ordenar " +"en una hoja.\n" +"La mayoría de las plantillas necesitan solo una disposición, como en el " +"primer ejemplo.\n" +"El segundo ejemplo muestra dos disposiciones." + +#: data/glade/template-designer.glade.h:40 +msgid "Label Size (CD/DVD)" +msgstr "Tamaño de etiqueta (CD/DVD)" + +#: data/glade/template-designer.glade.h:41 +msgid "Label Size (Round)" +msgstr "Tamaño de etiqueta (Redondeada):" + +#: data/glade/template-designer.glade.h:42 +msgid "Label or Card Shape" +msgstr "Forma de etiqueta o tarjeta" + +#: data/glade/template-designer.glade.h:43 +msgid "Label or Card Size (Rectangular)" +msgstr "Tamaño de etiqueta o tarjeta (rectangular)" + +#: data/glade/template-designer.glade.h:44 +msgid "Layout #1" +msgstr "Disposición 1:" + +#: data/glade/template-designer.glade.h:45 +msgid "Layout #2" +msgstr "Disposición 2:" + +#: data/glade/template-designer.glade.h:46 +msgid "Layout(s)" +msgstr "Disposicion(es):" + +#: data/glade/template-designer.glade.h:47 +msgid "Name and Description" +msgstr "Nombre y descripción:" + +#: data/glade/template-designer.glade.h:48 +msgid "Number across (nx):" +msgstr "Cantidad horizontal (nx):" + +#: data/glade/template-designer.glade.h:49 +msgid "Number down (ny):" +msgstr "Cantidad vertical (ny):" + +#: data/glade/template-designer.glade.h:50 +msgid "Number of Layouts" +msgstr "Cantidad de disposiciones" + +#: data/glade/template-designer.glade.h:51 +msgid "Number of layouts:" +msgstr "Cantidad de disposiciones:" + +#: data/glade/template-designer.glade.h:52 +msgid "Page Size" +msgstr "Tamaño de la página" + +#: data/glade/template-designer.glade.h:54 +msgid "Part #:" +msgstr "Número de parte:" + +#: data/glade/template-designer.glade.h:55 +msgid "" +"Please enter the following identifying information about the template " +"stationery." +msgstr "" +"Por favor ingrese la siguiente información que identifique la plantilla." + +#: data/glade/template-designer.glade.h:56 +msgid "Please enter the following layout information." +msgstr "Por favor ingrese la siguiente información sobre la disposición." + +#: data/glade/template-designer.glade.h:57 +msgid "" +"Please enter the following size parameters of a single label in your " +"template." +msgstr "Por favor ingrese las medidas de cada etiqueta de su plantilla." + +#: data/glade/template-designer.glade.h:58 +msgid "" +"Please enter the following size parameters of a single label or card in your " +"template." +msgstr "" +"Por favor ingrese los siguientes parámetros de tamaño para cada etiqueta en " +"su plantilla." + +#: data/glade/template-designer.glade.h:59 +msgid "Please select the basic shape of the labels or cards." +msgstr "Por favor seleccione la forma básica de las etiquetas o tarjetas." + +#: data/glade/template-designer.glade.h:60 +msgid "Please select the page size of the template stationery." +msgstr "Por favor seleccione el tamaño de la página para la plantilla." + +#: data/glade/template-designer.glade.h:61 +msgid "Print test sheet" +msgstr "Imprimir página de prueba" + +#: data/glade/template-designer.glade.h:62 +msgid "Rectangular or square (can have rounded corners)" +msgstr "Rectangular o cuadrada (puede tener bordes redondeados)" + +#: data/glade/template-designer.glade.h:63 +msgid "Round" +msgstr "Redonda" + +#: data/glade/template-designer.glade.h:64 +msgid "" +"Templates needing\n" +"two layouts." +msgstr "" +"Plantillas que necesitan\n" +"dos disposiciones." + +#: data/glade/template-designer.glade.h:66 +msgid "" +"Templates needing only\n" +"one layout." +msgstr "" +"Plantillas que necesitan\n" +"una disposición." + +#: data/glade/template-designer.glade.h:68 +msgid "Vertical pitch (dy):" +msgstr "Desplazamiento vertical (dy):" + +#: data/glade/template-designer.glade.h:69 +msgid "" +"Welcome to the gLabels Template Designer.\n" +"\n" +"This dialog will assist you in the creation of a custom gLabels template." +msgstr "" +"Bienvenido al diseñador de plantillas de gLabels.\n" +"\n" +"Este diálogo le asistirá en la creación de una plantilla personalizada." + +#. Other ISO A series sizes +#: data/templates/paper-sizes.xml.h:2 +msgid "A0" +msgstr "A0" + +#: data/templates/paper-sizes.xml.h:3 +msgid "A1" +msgstr "A1" + +#: data/templates/paper-sizes.xml.h:4 +msgid "A10" +msgstr "A10" + +#: data/templates/paper-sizes.xml.h:5 +msgid "A2" +msgstr "A2" + +#: data/templates/paper-sizes.xml.h:6 +msgid "A3" +msgstr "A3" + +#: data/templates/paper-sizes.xml.h:7 +msgid "A4" +msgstr "A4" + +#: data/templates/paper-sizes.xml.h:8 +msgid "A5" +msgstr "A5" + +#: data/templates/paper-sizes.xml.h:9 +msgid "A6" +msgstr "A6" + +#: data/templates/paper-sizes.xml.h:10 +msgid "A7" +msgstr "A7" + +#: data/templates/paper-sizes.xml.h:11 +msgid "A8" +msgstr "A8" + +#: data/templates/paper-sizes.xml.h:12 +msgid "A9" +msgstr "A9" + +#. ISO B series sizes +#: data/templates/paper-sizes.xml.h:14 +msgid "B0" +msgstr "B0" + +#: data/templates/paper-sizes.xml.h:15 +msgid "B1" +msgstr "B1" + +#: data/templates/paper-sizes.xml.h:16 +msgid "B10" +msgstr "B10" + +#: data/templates/paper-sizes.xml.h:17 +msgid "B2" +msgstr "B2" + +#: data/templates/paper-sizes.xml.h:18 +msgid "B3" +msgstr "B3" + +#: data/templates/paper-sizes.xml.h:19 +msgid "B4" +msgstr "B4" + +#: data/templates/paper-sizes.xml.h:20 +msgid "B5" +msgstr "B5" + +#: data/templates/paper-sizes.xml.h:21 +msgid "B6" +msgstr "B6" + +#: data/templates/paper-sizes.xml.h:22 +msgid "B7" +msgstr "B7" + +#: data/templates/paper-sizes.xml.h:23 +msgid "B8" +msgstr "B8" + +#: data/templates/paper-sizes.xml.h:24 +msgid "B9" +msgstr "B9" + +#: data/templates/paper-sizes.xml.h:25 +msgid "US Executive" +msgstr "Ejecutivo" + +#. Other US paper sizes +#: data/templates/paper-sizes.xml.h:27 +msgid "US Legal" +msgstr "Legal" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:2 +#: data/templates/zweckform-iso-templates.xml.h:2 +msgid "Address Labels" +msgstr "Etiquetas de dirección" + +#. =================================================================== +#. ============================================================ +#. =================================================================== +#. ====================================================== +#: data/templates/avery-us-templates.xml.h:4 +#: data/templates/avery-iso-templates.xml.h:4 +#: data/templates/zweckform-iso-templates.xml.h:6 +#: data/templates/misc-us-templates.xml.h:3 +#: data/templates/misc-iso-templates.xml.h:17 +msgid "Business Cards" +msgstr "Tarjetas de negocio" + +#: data/templates/avery-us-templates.xml.h:5 +msgid "CD/DVD Labels (Disc Labels)" +msgstr "Etiquetas de CD/DVD" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:7 +msgid "Diskette Labels" +msgstr "Etiquetas de diskettes" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:9 +msgid "Filing Labels" +msgstr "Etiquetas para archivado" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:11 +msgid "Full Sheet Labels" +msgstr "Etiquetas de página completa" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:13 +msgid "Large Round Labels" +msgstr "Etiquetas redondeadas grandes" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:15 +msgid "Name Badge Labels" +msgstr "Etiquetas de distintivos" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:17 +msgid "Return Address Labels" +msgstr "Etiquetas de dirección de remitente" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:19 +msgid "Shipping Labels" +msgstr "Etiquetas de envío" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:21 +msgid "Small Round Labels" +msgstr "Etiquetas redondeadas pequeñas" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:23 +msgid "Square Labels" +msgstr "Etiquetas cuadradas" + +#: data/templates/avery-us-templates.xml.h:24 +msgid "Video Tape Face Labels" +msgstr "Etiquetas de video (frente)" + +#: data/templates/avery-us-templates.xml.h:25 +msgid "Video Tape Spine Labels" +msgstr "Etiquetas de video (lateral)" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:2 +msgid "Address labels" +msgstr "Etiquetas de dirección" + +#. =============================================================== +#: data/templates/avery-iso-templates.xml.h:6 +msgid "CD Booklet" +msgstr "Tapa de CD" + +#. =============================================================== +#: data/templates/avery-iso-templates.xml.h:8 +msgid "CD Inlet" +msgstr "Interior de CD" + +#. =============================================================== +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:10 +#: data/templates/zweckform-iso-templates.xml.h:8 +#: data/templates/misc-us-templates.xml.h:5 +#: data/templates/misc-iso-templates.xml.h:21 +msgid "CD/DVD Labels" +msgstr "Etiquetas de CD/DVD" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:12 +msgid "Diskette labels" +msgstr "Etiquetas de disquette" + +#. =============================================================== +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:14 +#: data/templates/zweckform-iso-templates.xml.h:14 +#: data/templates/misc-iso-templates.xml.h:35 +msgid "Mailing Labels" +msgstr "Etiquetas de correo" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:16 +msgid "Mailing labels" +msgstr "Etiquetas de correo" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:18 +msgid "Mini Address Labels" +msgstr "Etiquetas de dirección pequeñas" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:20 +msgid "Shipping labels" +msgstr "Etiquetas de envío" + +# REVISAR +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:4 +msgid "Allround Labels" +msgstr "" + +# REVISAR +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:10 +msgid "Correction and Cover-up Labels" +msgstr "" + +# REVISAR +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:12 +msgid "Lever Arch File Labels" +msgstr "" + +# REVISAR +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:16 +msgid "QSL-Karten Etiketten 70mm x 50,8mm" +msgstr "" + +# REVISAR +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:18 +msgid "Rectangular Copier Labels" +msgstr "" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:20 +#: data/templates/misc-iso-templates.xml.h:44 +msgid "Rectangular Labels" +msgstr "Etiquetas rectangulares" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:22 +msgid "Video Labels (back)" +msgstr "Etiquetas de video (dorso)" + +#: data/templates/misc-us-templates.xml.h:1 +msgid "Business Card CD" +msgstr "CD-tarjeta" + +# REVISAR +#: data/templates/misc-us-templates.xml.h:4 +msgid "CD Template Rectangles" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:6 +msgid "CD/DVD Labels (Face Only)" +msgstr "Etiquetas CD/DVD (Sólo frente)" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:7 +#: data/templates/misc-iso-templates.xml.h:23 +msgid "CD/DVD Labels (face only)" +msgstr "Etiquetas CD/DVD (sólo frente)" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:9 +msgid "Cassette Labels" +msgstr "Etiquetas de casette" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:11 +msgid "DLT Labels" +msgstr "Etiquetas DLT" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:13 +msgid "Microtube labels" +msgstr "Etiquetas microtubo" + +#: data/templates/misc-us-templates.xml.h:14 +msgid "Mini-CD Labels" +msgstr "Etiquetas Mini-CD" + +# REVISAR +#: data/templates/misc-us-templates.xml.h:15 +msgid "PRO CD Labels 2-up (CD spine only)" +msgstr "" + +# REVISAR +#: data/templates/misc-us-templates.xml.h:16 +msgid "PRO CD Labels 2-up (Face only)" +msgstr "" + +# REVISAR +#: data/templates/misc-us-templates.xml.h:17 +#: data/templates/misc-iso-templates.xml.h:42 +msgid "PRO CD Labels 2-up (face only)" +msgstr "" + +# REVISAR +#: data/templates/misc-us-templates.xml.h:18 +msgid "Slimline CD Case (rightside up)" +msgstr "" + +# REVISAR +#: data/templates/misc-us-templates.xml.h:19 +msgid "Slimline CD Case (upside down)" +msgstr "" + +# REVISAR +#: data/templates/misc-iso-templates.xml.h:1 +msgid "Agipa 119488: Business Cards" +msgstr "" + +# REVISAR +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:3 +msgid "Allround Labels --24" +msgstr "" + +# REVISAR +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:5 +msgid "Allround Labels --44" +msgstr "" + +# REVISAR +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:7 +msgid "Allround Labels --64" +msgstr "" + +# REVISAR +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:9 +msgid "Allround Labels --65" +msgstr "" + +# REVISAR +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:11 +msgid "Arch File Labels" +msgstr "" + +# REVISAR +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:13 +msgid "Arch File Labels (large)" +msgstr "" + +# REVISAR +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:15 +msgid "Arch File Labels (small)" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:19 +msgid "CD Labels" +msgstr "Etiquetas para CD" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:25 +msgid "CD/DVD Labels Standard Format (face only)" +msgstr "Etieuats CD/DVD Formato estándar (sólo frente)" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:27 +msgid "Diskette Labels (face only)" +msgstr "Etiquetas para disquette (sólo cara)" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:29 +msgid "EPSON Photo Stickers 16" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:31 +msgid "Etiketten" +msgstr "Etiketten" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:33 +msgid "Fridge Magnet Stickers" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:37 +msgid "Mailing Labels --14" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:39 +msgid "Mailing Labels-2 columns" +msgstr "Etiquetas de correo - 2 columnas" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:41 +msgid "Mailing Labels-3 columns" +msgstr "Etiquetas de correo - 3 columnas" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:46 +msgid "Video Labels (face only)" +msgstr "Etiqeutas de video (solo frente)" + +#: data/desktop/glabels.desktop.in.h:1 +msgid "Create labels, business cards and media covers" +msgstr "Crear etiquetas, tarjetas de negocios y portadas" + +#: data/desktop/glabels.desktop.in.h:2 +msgid "gLabels Label Designer" +msgstr "Diseñador de etiquetas gLabels" + +#: data/mime/glabels.keys.in.h:1 data/mime/glabels.xml.in.h:1 +msgid "gLabels Project File" +msgstr "Archivo de projecto gLabels" + +#, fuzzy +#~ msgid "Object _Properties..." +#~ msgstr "Propiedades del texto" + +#~ msgid "Display units" +#~ msgstr "Mostrar unidades de medida" + +#~ msgid "Default page size" +#~ msgstr "Tamaño de página por omisión" + +#~ msgid "Outline" +#~ msgstr "Contorno" + +#~ msgid "Edit line object properties" +#~ msgstr "Modificar las propiedades del objeto línea" + +#~ msgid "Edit text object properties" +#~ msgstr "Modificar las propiedades del objeto texto" + +#~ msgid "Maintain current aspect ratio" +#~ msgstr "Mantener la proporción actual del aspecto" + +#, fuzzy +#~ msgid "Open %s" +#~ msgstr "Abrir" + +#~ msgid "Revert to saved copy of %s?" +#~ msgstr "¿ Recuperar la copia salvada de %s ?" + +#~ msgid "Unknown media type. Using default." +#~ msgstr "Tipo de papel desconocido. Utilizando el tipo por omisión." + +#~ msgid "" +#~ "``%s'' has been modified.\n" +#~ "\n" +#~ "Do you wish to save it?" +#~ msgstr "" +#~ "\"%s\" ha sido modificado.\n" +#~ "\n" +#~ "¿ Desea salvarlo ?" + +#~ msgid "Close / Save label as" +#~ msgstr "Cerrar / Salvar etiqueta como" + +#~ msgid "Label no longer valid!" +#~ msgstr "¡ La etiqueta ya no es válida !" + +#~ msgid "Error writing file" +#~ msgstr "Error salvando el archivo" + +#~ msgid "Edit properties..." +#~ msgstr "Modificar propiedades" + +#~ msgid "Appearance" +#~ msgstr "Apariencia" + +#~ msgid "Position/Size" +#~ msgstr "Posición/Tamaño" + +#~ msgid "Image format not currently supported" +#~ msgstr "Formato de imagen no soportado actualmente" + +#~ msgid "Barcode data" +#~ msgstr "Datos del código de barras" + +#~ msgid "%" +#~ msgstr "%" + +#~ msgid "Show text with barcode" +#~ msgstr "Mostrar texto con código de barras" + +#~ msgid "Fields" +#~ msgstr "Campos" + +#~ msgid "Column" +#~ msgstr "Columna" + +#~ msgid "Sample data" +#~ msgstr "Datos de ejemplo" + +#~ msgid "Make a new, empty label" +#~ msgstr "Crear una etiqueta vacía nueva" + +#~ msgid " New " +#~ msgstr "Nuevo" + +#~ msgid "New Label/Card" +#~ msgstr "Nueva tarjeta/etiqueta" + +#~ msgid " Open " +#~ msgstr " Abrir " + +#~ msgid " Save " +#~ msgstr " Guardar " + +#~ msgid " Print " +#~ msgstr " Imprimir " + +#~ msgid "Function is not implemented!" +#~ msgstr "¡ La funcionalidad no está aún implementada !" diff --git a/glabels2/po/fr.po b/glabels2/po/fr.po new file mode 100644 index 00000000..c7476e04 --- /dev/null +++ b/glabels2/po/fr.po @@ -0,0 +1,3311 @@ +# French translation of glabels. +# Copyright (C) 2001 Jim Evins +# Olivier Berger +# Florent Morel , 2001, 2004 +# +msgid "" +msgstr "" +"Project-Id-Version: glabels 2.0.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-06-14 15:22+0200\n" +"PO-Revision-Date: 2007-06-14 16:59+0200\n" +"Last-Translator: Claude Paroz \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" + +#: ../src/glabels.c:76 ../src/glabels-batch.c:70 +msgid "[FILE...]" +msgstr "[FICHIER...]" + +#: ../src/glabels.c:92 +msgid "- gLabels label designer" +msgstr "- créateur de patrons gLabels" + +#: ../src/glabels-batch.c:54 +msgid "set output filename (default=\"output.pdf\")" +msgstr "définit le fichier de sortie (défaut=\"output.pdf\")" + +#: ../src/glabels-batch.c:54 ../src/glabels-batch.c:68 +msgid "filename" +msgstr "nom de fichier" + +#: ../src/glabels-batch.c:56 +msgid "number of sheets (default=1)" +msgstr "nombre de pages (défaut=1)" + +# src/print_copies.c:193 +# src/print_copies.c:193 +# src/print_copies.c:171 +# src/print_copies.c:170 +#: ../src/glabels-batch.c:56 +msgid "sheets" +msgstr "feuilles" + +#: ../src/glabels-batch.c:58 +msgid "number of copies (default=1)" +msgstr "nombre de copies (défaut=1)" + +# src/print.c:153 +# src/print.c:153 +# src/print.c:146 +# src/print_dialog.c:104 +#: ../src/glabels-batch.c:58 +msgid "copies" +msgstr "copies" + +#: ../src/glabels-batch.c:60 +msgid "first label on first sheet (default=1)" +msgstr "première étiquette sur la première page (défaut=1)" + +#: ../src/glabels-batch.c:60 +msgid "first" +msgstr "première" + +# src/print.c:180 +# src/print.c:180 +# src/print.c:196 +# src/print_dialog.c:152 +#: ../src/glabels-batch.c:62 ../data/glade/print-custom-widget.glade.h:6 +msgid "print outlines (to test printer alignment)" +msgstr "imprimer des bordures (pour tester l'alignement de l'imprimante)" + +# src/print_dialog.c:160 +#: ../src/glabels-batch.c:64 ../data/glade/print-custom-widget.glade.h:5 +msgid "print in reverse (i.e. a mirror image)" +msgstr "imprimer à l'envers (i.e. une image miroir)" + +#: ../src/glabels-batch.c:66 ../data/glade/print-custom-widget.glade.h:4 +msgid "print crop marks" +msgstr "imprimer les guides de coupe" + +#: ../src/glabels-batch.c:68 +msgid "input file for merging" +msgstr "fichier d'entrée pour la fusion" + +#: ../src/glabels-batch.c:96 +msgid "- batch process gLabels label files" +msgstr "- traitement par lots de fichiers d'étiquettes gLabels" + +# src/file.c:214 +# src/file.c:214 +# src/file.c:249 +# src/file.c:249 +#: ../src/glabels-batch.c:142 +#, c-format +msgid "cannot perform document merge with glabels file %s\n" +msgstr "impossible d'effectuer une fusion de document avec le fichier glabels %s\n" + +# src/file.c:214 +# src/file.c:214 +# src/file.c:249 +# src/file.c:249 +#: ../src/glabels-batch.c:164 +#, c-format +msgid "cannot open glabels file %s\n" +msgstr "impossible d'ouvrir le fichier glabels %s\n" + +#: ../src/window.c:259 +msgid "(none) - gLabels" +msgstr "(vide) - gLabels" + +#: ../src/window.c:432 +msgid "(modified)" +msgstr "(modifié)" + +# src/display.c:1157 src/display.c:1205 +# src/display.c:1160 src/display.c:1208 +# src/menu.c:94 +# src/menu.c:94 +#: ../src/stock.c:72 +msgid "_Select Mode" +msgstr "Mode _sélection" + +# src/item_text.c:442 src/item_text.c:627 +# src/item_text.c:442 src/item_text.c:627 +# src/item_text.c:460 src/item_text.c:464 src/item_text.c:637 src/menu.c:100 +# src/item_text.c:460 src/item_text.c:464 src/item_text.c:637 src/menu.c:100 +#: ../src/stock.c:73 +msgid "_Text" +msgstr "_Texte" + +# src/item_line.c:271 +# src/item_line.c:271 +# src/item_line.c:256 src/menu.c:106 +# src/item_line.c:256 src/menu.c:106 +#: ../src/stock.c:74 +msgid "_Line" +msgstr "_Ligne" + +# src/menu.c:103 +# src/menu.c:103 +#: ../src/stock.c:75 +msgid "_Box" +msgstr "_Boîte" + +# src/menu.c:109 +# src/menu.c:109 +#: ../src/stock.c:76 +msgid "_Ellipse" +msgstr "_Ellipse" + +# src/item_image.c:283 +# src/item_image.c:283 +# src/item_image.c:268 src/menu.c:113 +# src/item_image.c:268 src/menu.c:113 +#: ../src/stock.c:77 +msgid "_Image" +msgstr "_Image" + +# src/item_barcode.c:316 +# src/item_barcode.c:317 +# src/menu.c:116 +# src/menu.c:116 +#: ../src/stock.c:78 +msgid "Bar_code" +msgstr "_Code-barre" + +# src/item_text.c:467 +# src/item_text.c:467 +# src/menu.c:132 src/menu.c:223 +# src/menu.c:132 src/menu.c:223 +#: ../src/stock.c:79 +msgid "_Merge Properties" +msgstr "Propriétés de _fusion" + +# src/item_text.c:467 +# src/item_text.c:467 +# src/item_text.c:482 +# src/item_text.c:482 +#: ../src/stock.c:80 +msgid "Object _Properties" +msgstr "_Propriétés de l'objet" + +# src/display.c:1167 src/display.c:1215 +# src/display.c:1170 src/display.c:1218 +# src/display.c:1181 src/display.c:1229 +# src/display.c:1196 src/display.c:1244 +#: ../src/stock.c:81 +msgid "Bring to _Front" +msgstr "_Avancer au premier plan" + +# src/display.c:1173 src/display.c:1221 +# src/display.c:1176 src/display.c:1224 +# src/display.c:1187 src/display.c:1235 +# src/display.c:1202 src/display.c:1250 +#: ../src/stock.c:82 +msgid "Send to _Back" +msgstr "_Reculer à l'arrière-plan" + +# src/rotate_select.c:187 +# src/rotate_select.c:187 +# src/rotate_select.c:167 +# src/rotate_select.c:169 +#: ../src/stock.c:83 +msgid "Rotate _Left" +msgstr "Rotation _gauche" + +# src/rotate_select.c:187 +# src/rotate_select.c:187 +# src/rotate_select.c:167 +# src/rotate_select.c:169 +#: ../src/stock.c:84 +msgid "Rotate _Right" +msgstr "Rotation _droite" + +#: ../src/stock.c:85 +msgid "Flip _Horizontally" +msgstr "Retourner _horizontalement" + +#: ../src/stock.c:86 +msgid "Flip _Vertically" +msgstr "Retourner _verticalement" + +#: ../src/stock.c:87 +msgid "_Lefts" +msgstr "_Gauches" + +#: ../src/stock.c:88 +msgid "_Rights" +msgstr "_Droites" + +#: ../src/stock.c:89 +msgid "_Centers" +msgstr "_Centres" + +# src/menu.c:157 +# src/menu.c:157 +#: ../src/stock.c:90 +msgid "_Tops" +msgstr "En _haut" + +#: ../src/stock.c:91 +msgid "Bottoms" +msgstr "En _bas" + +#: ../src/stock.c:92 +msgid "Centers" +msgstr "_Centré" + +#: ../src/stock.c:93 ../src/stock.c:94 +msgid "Label Ce_nter" +msgstr "Centre de l'étiquette" + +#: ../src/stock.c:95 ../data/glade/property-bar.glade.h:3 +msgid "Fill color" +msgstr "Couleur de remplissage" + +#: ../src/stock.c:96 ../data/glade/property-bar.glade.h:8 +msgid "Line color" +msgstr "Couleur de ligne" + +# src/item_line.c:271 +# src/item_line.c:271 +# src/item_line.c:256 src/menu.c:106 +# src/item_line.c:256 src/menu.c:106 +#: ../src/stock.c:97 ../src/stock.c:99 +msgid "Linked" +msgstr "Lié" + +# src/merge.c:80 +# src/merge.c:78 +#: ../src/stock.c:98 ../src/stock.c:100 +msgid "Not Linked" +msgstr "Non lié" + +# src/item_box.c:274 src/item_ellipse.c:279 +# src/item_box.c:274 src/item_ellipse.c:279 +# src/item_box.c:258 src/item_ellipse.c:260 +# src/item_box.c:258 src/item_ellipse.c:260 +#. Menu entries. +#: ../src/ui.c:93 +msgid "_File" +msgstr "_Fichier" + +#: ../src/ui.c:94 +msgid "Open Recent _Files" +msgstr "_Fichiers récents" + +#: ../src/ui.c:95 +msgid "_Edit" +msgstr "É_dition" + +# src/menu.c:50 +# src/menu.c:50 +# src/menu.c:50 +# src/menu.c:50 +#: ../src/ui.c:96 +msgid "_View" +msgstr "_Affichage" + +#: ../src/ui.c:97 +msgid "Customize Main Toolbar" +msgstr "Personnaliser le barre d'outils principale" + +#: ../src/ui.c:98 +msgid "Customize Drawing Toolbar" +msgstr "Personnaliser la barre d'outils dessin" + +#: ../src/ui.c:99 +msgid "Customize Properties Toolbar" +msgstr "Personnaliser la barre d'outils de propriétés" + +#: ../src/ui.c:100 +msgid "_Objects" +msgstr "_Objets" + +#: ../src/ui.c:101 +msgid "_Create" +msgstr "_Créer" + +#: ../src/ui.c:102 +msgid "_Order" +msgstr "_Ordre" + +# src/rotate_select.c:187 +# src/rotate_select.c:187 +# src/rotate_select.c:167 +# src/rotate_select.c:169 +#: ../src/ui.c:103 +msgid "_Rotate/Flip" +msgstr "_Rotation/Renversement" + +#: ../src/ui.c:104 +msgid "Align _Horizontal" +msgstr "Aligner _horizontalement" + +#: ../src/ui.c:105 +msgid "Align _Vertical" +msgstr "Aligner _verticalement" + +#: ../src/ui.c:106 +msgid "_Help" +msgstr "Aid_e" + +#. Popup entries. +#: ../src/ui.c:109 ../src/ui.c:110 +msgid "Context Menu" +msgstr "Menu contextuel" + +# src/menu.c:50 +# src/menu.c:50 +# src/menu.c:50 +# src/menu.c:50 +#: ../src/ui.c:115 +msgid "_New" +msgstr "_Nouveau" + +# src/tools.c:70 +# src/tools.c:70 +# src/menu.c:106 src/menu.c:197 +# src/menu.c:106 src/menu.c:197 +#: ../src/ui.c:117 +msgid "Create a new file" +msgstr "Crée un nouveau document" + +# src/file.c:178 +# src/file.c:178 +# src/file.c:211 +# src/file.c:211 +#: ../src/ui.c:122 +msgid "_Open..." +msgstr "_Ouvrir..." + +# src/menu.c:140 +# src/menu.c:140 +# src/menu.c:170 +# src/menu.c:170 +#: ../src/ui.c:124 +msgid "Open a file" +msgstr "Ouvre un fichier" + +# src/file.c:271 src/mdi.c:660 +# src/file.c:271 src/mdi.c:666 +# src/file.c:311 src/mdi.c:623 +# src/file.c:311 src/mdi.c:623 +#: ../src/ui.c:129 +msgid "_Save" +msgstr "_Enregistrer" + +# src/menu.c:142 +# src/menu.c:142 +# src/menu.c:172 +# src/menu.c:172 +#: ../src/ui.c:131 +msgid "Save current file" +msgstr "Enregistrer le fichier en cours" + +# src/file.c:271 src/mdi.c:660 +# src/file.c:271 src/mdi.c:666 +# src/file.c:311 src/mdi.c:623 +# src/file.c:311 src/mdi.c:623 +#: ../src/ui.c:136 +msgid "Save _As..." +msgstr "Enregistrer _sous..." + +#: ../src/ui.c:138 +msgid "Save the current file to a different name" +msgstr "Enregistre le fichier en cours avec un nom différent" + +# src/print.c:149 +# src/print.c:149 +# src/print.c:141 +# src/print_dialog.c:99 +#: ../src/ui.c:143 +msgid "_Print..." +msgstr "Im_primer..." + +# src/menu.c:145 +# src/menu.c:145 +# src/menu.c:175 +# src/menu.c:175 +#: ../src/ui.c:145 +msgid "Print the current file" +msgstr "Imprime le fichier en cours" + +# src/item_text.c:467 +# src/item_text.c:467 +# src/item_text.c:482 +# src/item_text.c:482 +#: ../src/ui.c:150 +msgid "Properties..." +msgstr "Propriétés..." + +# src/item_box.c:251 +# src/item_box.c:251 +# src/merge_properties.c:82 +# src/merge_properties.c:82 +#: ../src/ui.c:152 +msgid "Modify document properties" +msgstr "Modifier les propriétés du document" + +#: ../src/ui.c:157 +msgid "Template _Designer..." +msgstr "_Créateur de patrons..." + +# src/tools.c:70 +# src/tools.c:70 +# src/menu.c:106 src/menu.c:197 +# src/menu.c:106 src/menu.c:197 +#: ../src/ui.c:159 +msgid "Create a custom template" +msgstr "Créer un patron personnalisé" + +#: ../src/ui.c:164 +msgid "_Close" +msgstr "_Fermer" + +# src/menu.c:142 +# src/menu.c:142 +# src/menu.c:172 +# src/menu.c:172 +#: ../src/ui.c:166 +msgid "Close the current file" +msgstr "Ferme le fichier en cours" + +#: ../src/ui.c:171 +msgid "_Quit" +msgstr "_Quitter" + +#: ../src/ui.c:173 +msgid "Quit the program" +msgstr "Quitte le programme" + +#: ../src/ui.c:180 +msgid "Cut" +msgstr "Couper" + +#: ../src/ui.c:182 +msgid "Cut the selection" +msgstr "Coupe la sélection" + +#: ../src/ui.c:187 +msgid "Copy" +msgstr "Copier" + +# src/menu.c:86 +# src/menu.c:86 +# src/menu.c:86 +# src/menu.c:86 +#: ../src/ui.c:189 +msgid "Copy the selection" +msgstr "Copie la sélection" + +#: ../src/ui.c:194 +msgid "Paste" +msgstr "Coller" + +#: ../src/ui.c:196 +msgid "Paste the clipboard" +msgstr "Colle le presse-papiers" + +# src/display.c:1157 src/display.c:1205 +# src/display.c:1160 src/display.c:1208 +# src/display.c:1171 src/display.c:1219 +# src/display.c:1186 src/display.c:1234 +#: ../src/ui.c:201 +msgid "Delete" +msgstr "Supprimer" + +# src/tools.c:64 +# src/tools.c:64 +# src/menu.c:100 src/menu.c:191 +# src/menu.c:100 src/menu.c:191 +#: ../src/ui.c:203 +msgid "Delete the selected objects" +msgstr "Supprime les objets sélectionnés" + +# src/menu.c:86 +# src/menu.c:86 +# src/menu.c:85 +# src/menu.c:85 +#: ../src/ui.c:208 +msgid "Select All" +msgstr "Tout sélectionner" + +# src/tools.c:59 +# src/tools.c:59 +# src/menu.c:95 src/menu.c:186 +# src/menu.c:95 src/menu.c:186 +#: ../src/ui.c:210 +msgid "Select all objects" +msgstr "Sélectionne tous les objets" + +# src/menu.c:86 +# src/menu.c:86 +# src/menu.c:85 +# src/menu.c:85 +#: ../src/ui.c:215 +msgid "Un-select All" +msgstr "Désélectionner tout" + +# src/menu.c:86 +# src/menu.c:86 +# src/menu.c:86 +# src/menu.c:86 +#: ../src/ui.c:217 +msgid "Remove all selections" +msgstr "Annule toutes les sélections" + +# src/preferences.c:92 +# src/prefs.c:101 +# src/prefs.c:92 +# src/prefs.c:86 +#: ../src/ui.c:222 +msgid "Preferences" +msgstr "Préférences" + +#: ../src/ui.c:224 +msgid "Configure the application" +msgstr "Configure le logiciel" + +# src/tools.c:84 +# src/tools.c:84 +# src/menu.c:121 src/menu.c:211 +# src/menu.c:121 src/menu.c:211 +#: ../src/ui.c:231 +msgid "Zoom in" +msgstr "Zoom avant" + +#: ../src/ui.c:233 +msgid "Increase magnification" +msgstr "Augmente l'agrandissement" + +# src/tools.c:87 +# src/tools.c:87 +# src/menu.c:124 src/menu.c:214 +# src/menu.c:124 src/menu.c:214 +#: ../src/ui.c:238 +msgid "Zoom out" +msgstr "Zoom arrière" + +#: ../src/ui.c:240 +msgid "Decrease magnification" +msgstr "Réduit l'agrandissement" + +# src/tools.c:90 +# src/tools.c:90 +# src/menu.c:127 +# src/menu.c:127 +#: ../src/ui.c:245 +msgid "Zoom 1 to 1" +msgstr "Zoom 1:1" + +#: ../src/ui.c:247 +msgid "Restore scale to 100%" +msgstr "Remet l'échelle à 100%" + +# src/tools.c:90 +# src/tools.c:90 +# src/menu.c:127 src/menu.c:217 +# src/menu.c:127 src/menu.c:217 +#: ../src/ui.c:252 +msgid "Zoom to fit" +msgstr "Adapter le zoom à la taille de la fenêtre" + +#: ../src/ui.c:254 +msgid "Set scale to fit window" +msgstr "Adapte l'échelle à la taille de la fenêtre" + +# src/display.c:1157 src/display.c:1205 +# src/display.c:1160 src/display.c:1208 +# src/menu.c:94 +# src/menu.c:94 +#: ../src/ui.c:261 +msgid "Select Mode" +msgstr "Mode sélection" + +# src/tools.c:59 +# src/tools.c:59 +# src/menu.c:95 src/menu.c:186 +# src/menu.c:95 src/menu.c:186 +#: ../src/ui.c:263 +msgid "Select, move and modify objects" +msgstr "Sélectionne, déplace et modifie les objets" + +# src/item_text.c:442 src/item_text.c:627 +# src/item_text.c:442 src/item_text.c:627 +# src/item_text.c:460 src/item_text.c:464 src/item_text.c:637 src/menu.c:100 +# src/item_text.c:460 src/item_text.c:464 src/item_text.c:637 src/menu.c:100 +#: ../src/ui.c:268 ../src/view-text.c:525 +#: ../data/glade/object-editor.glade.h:32 +msgid "Text" +msgstr "Texte" + +# src/tools.c:64 +# src/tools.c:64 +# src/menu.c:100 src/menu.c:191 +# src/menu.c:100 src/menu.c:191 +#: ../src/ui.c:270 +msgid "Create text object" +msgstr "Crée un objet texte" + +# src/menu.c:103 +# src/menu.c:103 +#: ../src/ui.c:275 +msgid "Box" +msgstr "Boîte" + +# src/tools.c:67 +# src/tools.c:67 +# src/menu.c:103 src/menu.c:194 +# src/menu.c:103 src/menu.c:194 +#: ../src/ui.c:277 +msgid "Create box/rectangle object" +msgstr "Crée un objet boîte/rectangle" + +# src/item_line.c:271 +# src/item_line.c:271 +# src/item_line.c:256 src/menu.c:106 +# src/item_line.c:256 src/menu.c:106 +#: ../src/ui.c:282 ../data/glade/object-editor.glade.h:20 +msgid "Line" +msgstr "Ligne" + +# src/tools.c:70 +# src/tools.c:70 +# src/menu.c:106 src/menu.c:197 +# src/menu.c:106 src/menu.c:197 +#: ../src/ui.c:284 +msgid "Create line object" +msgstr "Crée un objet ligne" + +# src/menu.c:109 +# src/menu.c:109 +#: ../src/ui.c:289 +msgid "Ellipse" +msgstr "Ellipse" + +# src/tools.c:73 +# src/tools.c:73 +# src/menu.c:110 src/menu.c:200 +# src/menu.c:110 src/menu.c:200 +#: ../src/ui.c:291 +msgid "Create ellipse/circle object" +msgstr "Crée un objet ellipse/cercle" + +# src/item_image.c:283 +# src/item_image.c:283 +# src/item_image.c:268 src/menu.c:113 +# src/item_image.c:268 src/menu.c:113 +#: ../src/ui.c:296 ../data/glade/object-editor.glade.h:16 +msgid "Image" +msgstr "Image" + +# src/tools.c:76 +# src/tools.c:76 +# src/menu.c:113 src/menu.c:203 +# src/menu.c:113 src/menu.c:203 +#: ../src/ui.c:298 +msgid "Create image object" +msgstr "Crée un objet image" + +# src/item_barcode.c:316 +# src/item_barcode.c:317 +# src/menu.c:116 +# src/menu.c:116 +#: ../src/ui.c:303 +msgid "Barcode" +msgstr "Code-barre" + +# src/tools.c:79 +# src/tools.c:79 +# src/menu.c:116 src/menu.c:206 +# src/menu.c:116 src/menu.c:206 +#: ../src/ui.c:305 +msgid "Create barcode object" +msgstr "Crée un objet code-barre" + +# src/display.c:1167 src/display.c:1215 +# src/display.c:1170 src/display.c:1218 +# src/display.c:1181 src/display.c:1229 +# src/display.c:1196 src/display.c:1244 +#: ../src/ui.c:310 +msgid "Bring to front" +msgstr "Avancer au premier plan" + +#: ../src/ui.c:312 +msgid "Raise object to top" +msgstr "Remonte l'objet au plus haut niveau" + +# src/display.c:1173 src/display.c:1221 +# src/display.c:1176 src/display.c:1224 +# src/display.c:1187 src/display.c:1235 +# src/display.c:1202 src/display.c:1250 +#: ../src/ui.c:317 +msgid "Send to back" +msgstr "Reculer à l'arrière-plan" + +#: ../src/ui.c:319 +msgid "Lower object to bottom" +msgstr "Descend l'objet à l'arrière-plan" + +# src/rotate_select.c:187 +# src/rotate_select.c:187 +# src/rotate_select.c:167 +# src/rotate_select.c:169 +#: ../src/ui.c:324 +msgid "Rotate left" +msgstr "Rotation gauche" + +#: ../src/ui.c:326 +msgid "Rotate object 90 degrees counter-clockwise" +msgstr "Tourne l'objet de 90 degrés dans le sens inverse des aiguilles d'une montre" + +# src/rotate_select.c:187 +# src/rotate_select.c:187 +# src/rotate_select.c:167 +# src/rotate_select.c:169 +#: ../src/ui.c:331 +msgid "Rotate right" +msgstr "Rotation droite" + +#: ../src/ui.c:333 +msgid "Rotate object 90 degrees clockwise" +msgstr "Tourne l'objet de 90 degrés dans le sens des aiguilles d'une montre" + +#: ../src/ui.c:338 +msgid "Flip horizontally" +msgstr "Retourner horizontalement" + +#: ../src/ui.c:340 +msgid "Flip object horizontally" +msgstr "Retourne l'objet horizontalement" + +#: ../src/ui.c:345 +msgid "Flip vertically" +msgstr "Retourner verticalement" + +#: ../src/ui.c:347 +msgid "Flip object vertically" +msgstr "Retourne l'objet verticalement" + +# src/prop_text.c:277 +# src/prop_text.c:264 +# src/prop_text.c:248 +# src/prop_text.c:248 +#: ../src/ui.c:352 +msgid "Align left" +msgstr "Aligner à gauche" + +#: ../src/ui.c:354 +msgid "Align objects to left edges" +msgstr "Aligne les objets sur leur bordure gauche" + +#: ../src/ui.c:359 +msgid "Align right" +msgstr "Aligner à droite" + +#: ../src/ui.c:361 +msgid "Align objects to right edges" +msgstr "Aligne les objets sur leur bordure droite" + +#: ../src/ui.c:366 +msgid "Align horizontal center" +msgstr "Aligner centré horizontalement" + +#: ../src/ui.c:368 +msgid "Align objects to horizontal centers" +msgstr "Aligne horizontalement le centre des objets" + +#: ../src/ui.c:373 +msgid "Align tops" +msgstr "Aligner au sommet" + +#: ../src/ui.c:375 +msgid "Align objects to top edges" +msgstr "Aligne les objets d'après leur sommet" + +#: ../src/ui.c:380 +msgid "Align bottoms" +msgstr "Aligner à la base" + +#: ../src/ui.c:382 +msgid "Align objects to bottom edges" +msgstr "Aligne les objets d'après leur base" + +#: ../src/ui.c:387 +msgid "Align vertical center" +msgstr "Aligner centré verticalement" + +#: ../src/ui.c:389 +msgid "Align objects to vertical centers" +msgstr "Aligne verticalement le centre des objets" + +#: ../src/ui.c:394 +msgid "Center horizontally" +msgstr "Centrer horizontalement" + +#: ../src/ui.c:396 +msgid "Center objects to horizontal label center" +msgstr "Aligne les objets horizontalement au centre de l'étiquette" + +#: ../src/ui.c:401 +msgid "Center vertically" +msgstr "Centrer verticalement" + +#: ../src/ui.c:403 +msgid "Center objects to vertical label center" +msgstr "Aligne les objets verticalement au centre de l'étiquette" + +# src/item_text.c:467 +# src/item_text.c:467 +# src/menu.c:132 src/menu.c:223 +# src/menu.c:132 src/menu.c:223 +#: ../src/ui.c:408 +msgid "Merge properties" +msgstr "Propriétés de fusion" + +# src/item_image.c:272 +# src/item_image.c:272 +# src/menu.c:133 +# src/menu.c:133 +#: ../src/ui.c:410 +msgid "Edit merge properties" +msgstr "Édite les propriétés de fusion" + +#: ../src/ui.c:417 +msgid "Contents" +msgstr "Sommaire" + +# src/file.c:183 +# src/file.c:183 +# src/file.c:213 +# src/file.c:213 +#: ../src/ui.c:419 +msgid "Open glabels manual" +msgstr "Ouvre le manuel de glabels" + +#: ../src/ui.c:424 +msgid "About..." +msgstr "À propos..." + +#: ../src/ui.c:426 +msgid "About glabels" +msgstr "À propos de glabels" + +#: ../src/ui.c:436 +msgid "Property toolbar" +msgstr "Barre d'outils de propriétés" + +#: ../src/ui.c:438 +msgid "Change the visibility of the property toolbar in the current window" +msgstr "Afficher ou non la barre d'outils de propriétés dans la fenêtre actuelle" + +#: ../src/ui.c:444 ../src/ui.c:489 ../src/ui.c:497 +msgid "Show tooltips" +msgstr "Afficher les infos-bulles" + +#: ../src/ui.c:446 +msgid "Show tooltips for property toolbar" +msgstr "Afficher les info-bulles dans la barre d'outils de propriétés" + +#: ../src/ui.c:452 +msgid "Grid" +msgstr "Grille" + +#: ../src/ui.c:454 +msgid "Change the visibility of the grid in the current window" +msgstr "Afficher ou non la grille dans la fenêtre actuelle" + +# src/preferences.c:213 +#: ../src/ui.c:460 +msgid "Markup" +msgstr "Marges" + +#: ../src/ui.c:462 +msgid "Change the visibility of markup lines in the current window" +msgstr "Afficher ou non les lignes de marges dans la fenêtre actuelle" + +#: ../src/ui.c:473 +msgid "Main toolbar" +msgstr "Barre d'outils principale" + +#: ../src/ui.c:475 +msgid "Change the visibility of the main toolbar in the current window" +msgstr "Afficher ou non la barre d'outils principale dans la fenêtre actuelle" + +#: ../src/ui.c:481 +msgid "Drawing toolbar" +msgstr "Barre d'outils dessin" + +#: ../src/ui.c:483 +msgid "Change the visibility of the drawing toolbar in the current window" +msgstr "Afficher ou non la barre d'outils dessin dans la fenêtre actuelle" + +#: ../src/ui.c:491 +msgid "Show tooltips for main toolbar" +msgstr "Afficher les info-bulles dans la barre d'outils principale" + +#: ../src/ui.c:499 +msgid "Show tooltips for drawing toolbar" +msgstr "Afficher les info-bulles dans la barre d'outils de dessin" + +# src/display.c:1157 src/display.c:1205 +# src/display.c:1160 src/display.c:1208 +# src/display.c:1171 src/display.c:1219 +# src/display.c:1186 src/display.c:1234 +#: ../src/ui-property-bar.c:1235 ../src/object-editor.c:571 +#: ../src/object-editor.c:577 +msgid "Default" +msgstr "Par défaut" + +# src/merge.c:80 +# src/merge.c:78 +#: ../src/ui-property-bar.c:1242 ../src/object-editor.c:583 +msgid "No line" +msgstr "Pas de ligne" + +#: ../src/ui-property-bar.c:1250 ../src/object-editor.c:590 +msgid "No fill" +msgstr "Pas de remplissage" + +# src/item_text.c:467 +# src/item_text.c:467 +# src/item_text.c:482 +# src/item_text.c:482 +#: ../src/ui-sidebar.c:152 +msgid "Object properties" +msgstr "Propriétés de l'objet" + +#: ../src/ui-commands.c:1084 +msgid "Glabels includes contributions from:" +msgstr "Glabels contient des contributions de :" + +#: ../src/ui-commands.c:1090 +msgid "See the file AUTHORS for additional credits," +msgstr "Voir le fichier AUTHORS pour des remerciements supplémentaires," + +#: ../src/ui-commands.c:1091 +msgid "or visit http://glabels.sourceforge.net/" +msgstr "ou visitez http://glabels.sourceforge.net/" + +#: ../src/ui-commands.c:1103 +msgid "A label and business card creation program.\n" +msgstr "Un logiciel de création de cartes de visite et d'étiquettes.\n" + +#: ../src/ui-commands.c:1107 +msgid "translator-credits" +msgstr "" +"Olivier Berger \n" +"Florent Morel , 2001, 2004\n" +"Claude Paroz , 2007" + +# src/menu.c:185 +# src/menu.c:185 +# src/menu.c:290 +# src/menu.c:290 +#: ../src/ui-commands.c:1110 +msgid "" +"Glabels is free software; you can redistribute it and/or modify it\n" +"under the terms of the GNU General Public License as published by\n" +"the Free Software Foundation; either version 2 of the License, or\n" +"(at your option) any later version.\n" +"\n" +"This program is distributed in the hope that it will be useful, but\n" +"WITHOUT ANY WARRANTY; without even the implied warranty of\n" +"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See\n" +"the GNU General Public License for more details.\n" +msgstr "" +"Glabels est un logiciel libre ; vous pouvez le redistribuer et/ou le " +"modifier conformément aux dispositions de la Licence Publique Générale GNU, " +"telle que publiée par la Free Software Foundation ; version 2 de la licence, " +"ou encore (à votre choix) toute version ultérieure.\n" +" \n" +"Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE " +"GARANTIE ; sans même la garantie implicite de COMMERCIALISATION ou " +"D'ADAPTATION A UN OBJET PARTICULIER. Pour plus de détails, voir la Licence " +"Publique Générale GNU.\n" + +# src/print_copies.c:210 +# src/print_copies.c:210 +# src/print_copies.c:188 +# src/print_copies.c:187 +#: ../src/ui-commands.c:1136 +msgid "glabels" +msgstr "glabels" + +# src/file.c:59 +# src/file.c:59 +# src/file.c:72 +# src/file.c:72 +#: ../src/file.c:90 +msgid "New Label or Card" +msgstr "Nouvelle étiquette ou carte" + +# src/item_text.c:467 +# src/item_text.c:467 +# src/item_text.c:482 +# src/item_text.c:482 +#: ../src/file.c:189 +msgid "Label properties" +msgstr "Propriétés de l'étiquette" + +#: ../src/file.c:288 ../src/file.c:574 +msgid "All files" +msgstr "Tous les fichiers" + +# src/preferences.c:92 +# src/prefs.c:101 +# src/prefs.c:92 +# src/prefs.c:86 +#: ../src/file.c:293 ../src/file.c:579 +msgid "gLabels documents" +msgstr "Documents gLabels" + +# src/menu.c:86 +# src/menu.c:86 +# src/menu.c:86 +# src/menu.c:86 +#: ../src/file.c:339 ../src/file.c:636 +msgid "Empty file name selection" +msgstr "Nom de fichier sélectionné vide" + +#: ../src/file.c:342 ../src/file.c:358 +msgid "Please select a file or supply a valid file name" +msgstr "Sélectionnez un fichier ou donnez un nom de fichier valide" + +#: ../src/file.c:355 +msgid "File does not exist" +msgstr "Ce fichier n'existe pas" + +# src/file.c:214 +# src/file.c:214 +# src/file.c:249 +# src/file.c:249 +# c-format +#: ../src/file.c:429 +#, c-format +msgid "Could not open file \"%s\"" +msgstr "Impossible d'ouvrir le fichier « %s »" + +#: ../src/file.c:432 +msgid "Not a supported file format" +msgstr "Format de fichier non pris en charge" + +# src/file.c:248 src/mdi.c:635 +# src/file.c:248 src/mdi.c:641 +# src/file.c:288 src/mdi.c:601 +# src/file.c:288 src/mdi.c:601 +#: ../src/file.c:509 ../src/file.c:686 +#, c-format +msgid "Could not save file \"%s\"" +msgstr "Impossible d'enregistrer « %s »" + +#: ../src/file.c:513 ../src/file.c:690 +msgid "Error encountered during save. The file is still not saved." +msgstr "" +"Erreur rencontrée durant l'enregistrement. Le fichier n'est toujours pas " +"enregistré. " + +# src/file.c:278 +# src/file.c:278 +# src/file.c:316 +# src/file.c:316 +#: ../src/file.c:552 +#, c-format +msgid "Save \"%s\" as" +msgstr "Enregistrer « %s » sous" + +# src/file.c:319 src/mdi.c:729 +# src/file.c:319 src/mdi.c:735 +# src/file.c:362 src/mdi.c:693 +# src/file.c:362 src/mdi.c:693 +#: ../src/file.c:639 +msgid "Please supply a valid file name" +msgstr "Donnez un nom de fichier valide" + +#: ../src/file.c:660 +#, c-format +msgid "Overwrite file \"%s\"?" +msgstr "Écraser le fichier « %s » ?" + +#: ../src/file.c:664 +msgid "File already exists." +msgstr "Ce fichier existe déjà." + +#: ../src/file.c:760 +#, c-format +msgid "Save changes to document \"%s\" before closing?" +msgstr "Enregistrer les changements du document « %s » avant de fermer ?" + +#: ../src/file.c:764 +msgid "Your changes will be lost if you don't save them." +msgstr "Vos changements seront perdus si vous ne les enregistrez pas." + +#: ../src/file.c:767 +msgid "Close without saving" +msgstr "Fermer sans enregistrer" + +# src/print.c:171 +# src/prefs.c:463 src/prefs.c:470 src/prop_line.c:202 +# src/prefs.c:445 src/prefs.c:452 src/prop_line.c:183 +# src/prefs.c:448 src/prefs.c:455 src/prop_line.c:183 +#. Should not happen +#: ../src/prefs.c:158 ../src/prefs.c:165 +#: ../data/glade/object-editor.glade.h:43 +#: ../data/glade/prefs-dialog.glade.h:22 +msgid "points" +msgstr "points" + +# src/item_line.c:271 +# src/prefs.c:465 +# src/prefs.c:447 +# src/prefs.c:450 +#: ../src/prefs.c:160 ../data/glade/object-editor.glade.h:42 +#: ../data/glade/template-designer.glade.h:65 +msgid "inches" +msgstr "pouces" + +# src/prefs.c:467 +# src/prefs.c:449 +# src/prefs.c:452 +#: ../src/prefs.c:162 +msgid "mm" +msgstr "mm" + +# src/preferences.c:92 +# src/prefs.c:101 +# src/prefs.c:92 +# src/prefs.c:86 +#: ../src/prefs-dialog.c:162 ../data/glade/prefs-dialog.glade.h:21 +msgid "gLabels Preferences" +msgstr "Préférences de gLabels" + +# src/item_box.c:251 +# src/item_box.c:251 +# src/item_box.c:235 +# src/item_box.c:235 +#. Build editor. +#: ../src/view-box.c:178 +msgid "Box object properties" +msgstr "Propriétés de l'objet boîte" + +# src/item_ellipse.c:256 +# src/item_ellipse.c:256 +# src/item_ellipse.c:237 +# src/item_ellipse.c:237 +#. Build editor. +#: ../src/view-ellipse.c:178 +msgid "Ellipse object properties" +msgstr "Propriétés de l'objet ellipse" + +# src/item_box.c:251 +# src/item_box.c:251 +# src/item_box.c:235 +# src/item_box.c:235 +#. Build editor. +#: ../src/view-line.c:177 +msgid "Line object properties" +msgstr "Propriétés de l'objet ligne" + +# src/item_image.c:272 +# src/item_image.c:272 +# src/item_image.c:257 +# src/item_image.c:257 +#. Build editor. +#: ../src/view-image.c:177 +msgid "Image object properties" +msgstr "Propriétés de l'objet image" + +# src/item_box.c:251 +# src/item_box.c:251 +# src/item_box.c:235 +# src/item_box.c:235 +#. Build editor. +#: ../src/view-text.c:181 +msgid "Text object properties" +msgstr "Propriétés de l'objet texte" + +# src/item_barcode.c:299 +# src/item_barcode.c:299 +# src/item_barcode.c:287 +# src/item_barcode.c:287 +#. Build editor. +#: ../src/view-barcode.c:177 +msgid "Barcode object properties" +msgstr "Propriétés de l'objet code-barre" + +#: ../src/object-editor-image-page.c:270 +msgid "All Files" +msgstr "Tous les fichiers" + +# src/item_image.c:283 +# src/item_image.c:283 +# src/item_image.c:268 src/menu.c:113 +# src/item_image.c:268 src/menu.c:113 +#: ../src/object-editor-image-page.c:275 +msgid "All Images" +msgstr "Toutes les images" + +#: ../src/object-editor-image-page.c:290 +#, c-format +msgid "%s (*.%s)" +msgstr "%s (*.%s)" + +# src/item_text.c:467 +# src/item_text.c:467 +# src/menu.c:132 src/menu.c:223 +# src/menu.c:132 src/menu.c:223 +#: ../src/merge-properties-dialog.c:263 +msgid "Merge Properties" +msgstr "Propriétés de fusion" + +# src/merge_ui_text.c:170 +# src/merge_ui_text.c:170 +#: ../src/merge-properties-dialog.c:289 ../src/merge-properties-dialog.c:397 +msgid "Select merge-database source" +msgstr "Sélection du fichier de données pour la fusion" + +# src/merge_ui.c:207 src/merge_ui.c:242 src/merge_ui.c:387 src/merge_ui.c:428 +# src/merge_ui.c:207 src/merge_ui.c:242 src/merge_ui.c:387 src/merge_ui.c:428 +#: ../src/merge-properties-dialog.c:298 ../src/merge-properties-dialog.c:417 +msgid "N/A" +msgstr "Non défini" + +# src/display.c:1157 src/display.c:1205 +# src/display.c:1160 src/display.c:1208 +# src/menu.c:94 +# src/menu.c:94 +#: ../src/merge-properties-dialog.c:324 +msgid "Select" +msgstr "Sélectionner" + +#: ../src/merge-properties-dialog.c:332 +msgid "Record/Field" +msgstr "Enregistrements/Champs" + +# src/item_barcode.c:309 +# src/item_barcode.c:308 +# src/item_barcode.c:297 +# src/item_barcode.c:297 +#: ../src/merge-properties-dialog.c:340 ../data/glade/object-editor.glade.h:10 +msgid "Data" +msgstr "Données" + +# src/item_box.c:274 src/item_ellipse.c:279 +# src/item_box.c:274 src/item_ellipse.c:279 +# src/merge_properties.c:168 +# src/merge_properties.c:168 +#: ../src/merge-properties-dialog.c:410 +msgid "Fixed" +msgstr "" + +# src/print_copies.c:210 +# src/print_copies.c:210 +# src/print_copies.c:188 +# src/print_copies.c:187 +#: ../src/print-op.c:231 ../src/wdgt-print-copies.c:171 +msgid "Labels" +msgstr "Étiquettes" + +#: ../src/template-designer.c:357 +msgid "gLabels Template Designer" +msgstr "Créateur de patrons gLabels" + +#: ../src/template-designer.c:418 +msgid "Welcome" +msgstr "Bienvenue" + +# src/media_select.c:216 +# src/media_select.c:242 +# src/media_select.c:222 +# src/media_select.c:222 +#: ../src/template-designer.c:460 +msgid "Name and Description" +msgstr "Nom et description" + +# src/media_select.c:221 +# src/media_select.c:247 +# src/media_select.c:227 +# src/media_select.c:227 +#: ../src/template-designer.c:513 +msgid "Page Size" +msgstr "Taille de page" + +# src/file.c:59 +# src/file.c:59 +# src/file.c:72 +# src/file.c:72 +#: ../src/template-designer.c:584 +msgid "Label or Card Shape" +msgstr "Forme de carte ou d'étiquette" + +# src/file.c:59 +# src/file.c:59 +# src/file.c:72 +# src/file.c:72 +#: ../src/template-designer.c:634 +msgid "Label or Card Size" +msgstr "Taille de carte ou d'étiquette" + +# src/media_select.c:226 +# src/media_select.c:252 +# src/media_select.c:232 +# src/media_select.c:232 +#: ../src/template-designer.c:734 +msgid "Label Size (round)" +msgstr "Taille d'étiquette (ronde)" + +#: ../src/template-designer.c:817 +msgid "Label Size (CD/DVD)" +msgstr "Taille d'étiquette (CD/DVD)" + +#: ../src/template-designer.c:910 +msgid "Number of Layouts" +msgstr "Nombre de dispositions" + +# src/media_select.c:231 +# src/media_select.c:257 +# src/media_select.c:237 +# src/media_select.c:237 +#: ../src/template-designer.c:973 +msgid "Layout(s)" +msgstr "Disposition(s) :" + +#: ../src/template-designer.c:1084 +msgid "Design Completed" +msgstr "Création terminée" + +#: ../src/bc.c:67 +msgid "POSTNET (any)" +msgstr "POSTNET (tous)" + +#: ../src/bc.c:70 +msgid "POSTNET-5 (ZIP only)" +msgstr "POSTNET-5 (seulement ZIP)" + +#: ../src/bc.c:73 +msgid "POSTNET-9 (ZIP+4)" +msgstr "POSTNET-9 (ZIP+4)" + +#: ../src/bc.c:76 +msgid "POSTNET-11 (DPBC)" +msgstr "POSTNET-11 (DPBC)" + +#: ../src/bc.c:79 +msgid "EAN (any)" +msgstr "EAN (tous)" + +#: ../src/bc.c:82 +msgid "EAN-8" +msgstr "EAN-8" + +#: ../src/bc.c:85 +msgid "EAN-8 +2" +msgstr "EAN-8 +2" + +#: ../src/bc.c:88 +msgid "EAN-8 +5" +msgstr "EAN-8 +5" + +#: ../src/bc.c:91 +msgid "EAN-13" +msgstr "EAN-13" + +#: ../src/bc.c:94 +msgid "EAN-13 +2" +msgstr "EAN-13 +2" + +#: ../src/bc.c:97 +msgid "EAN-13 +5" +msgstr "EAN-13 +5" + +#: ../src/bc.c:100 +msgid "UPC (UPC-A or UPC-E)" +msgstr "UPC (UPC-A ou UPC-E)" + +#: ../src/bc.c:103 +msgid "UPC-A" +msgstr "UPC-A" + +#: ../src/bc.c:106 +msgid "UPC-A +2" +msgstr "UPC-A +2" + +#: ../src/bc.c:109 +msgid "UPC-A +5" +msgstr "UPC-A +5" + +#: ../src/bc.c:112 +msgid "UPC-E" +msgstr "UPC-E" + +#: ../src/bc.c:115 +msgid "UPC-E +2" +msgstr "UPC-E +2" + +#: ../src/bc.c:118 +msgid "UPC-E +5" +msgstr "UPC-E +5" + +#: ../src/bc.c:121 +msgid "ISBN" +msgstr "ISBN" + +#: ../src/bc.c:124 +msgid "ISBN +5" +msgstr "ISBN +5" + +#: ../src/bc.c:127 +msgid "Code 39" +msgstr "Code 39" + +#: ../src/bc.c:130 +msgid "Code 128" +msgstr "Code 128" + +#: ../src/bc.c:133 +msgid "Code 128C" +msgstr "Code 128C" + +#: ../src/bc.c:136 +msgid "Code 128B" +msgstr "Code 128B" + +#: ../src/bc.c:139 +msgid "Interleaved 2 of 5" +msgstr "Entrelacé 2 de 5" + +#: ../src/bc.c:142 +msgid "Codabar" +msgstr "Code-barre" + +#: ../src/bc.c:145 +msgid "MSI" +msgstr "MSI" + +#: ../src/bc.c:148 +msgid "Plessey" +msgstr "Plessey" + +#: ../src/bc.c:151 +msgid "IEC16022 (DataMatrix)" +msgstr "IEC16022 (DataMatrix)" + +#: ../src/label.c:513 +msgid "Untitled" +msgstr "Sans titre" + +# src/item_barcode.c:316 +# src/item_barcode.c:317 +# src/item_barcode.c:299 +# src/item_barcode.c:299 +#: ../src/label-barcode.c:415 +msgid "Barcode data empty" +msgstr "Données de code-barre vides" + +# src/item_barcode.c:564 src/item_barcode.c:588 src/print.c:641 +# src/item_barcode.c:570 src/item_barcode.c:594 src/print.c:641 +# src/item_barcode.c:549 src/item_barcode.c:572 src/print.c:799 +# src/item_barcode.c:549 src/item_barcode.c:572 src/print.c:600 +#: ../src/label-barcode.c:419 +msgid "Invalid barcode data" +msgstr "Données de code-barre invalides" + +# src/label.c:186 src/label.c:211 +# src/label.c:186 src/label.c:211 +# src/label.c:170 src/label.c:194 +# src/label.c:168 src/label.c:192 +#: ../src/xml-label.c:188 ../src/xml-label.c:225 +msgid "xmlParseFile error" +msgstr "erreur xmlParseFile" + +# src/label.c:243 +# src/label.c:244 +# src/label.c:225 +# src/label.c:223 +#: ../src/xml-label.c:262 +msgid "No document root" +msgstr "Pas de racine de document" + +#: ../src/xml-label.c:276 +msgid "Importing from glabels 0.1 format" +msgstr "Import depuis le format glabels 0.1" + +#: ../src/xml-label.c:284 +msgid "Importing from glabels 0.4 format" +msgstr "Import depuis le format glabels 0.4" + +# src/label.c:248 +# src/label.c:249 +# src/label.c:236 +# src/label.c:234 +#: ../src/xml-label.c:287 +msgid "bad document, unknown glabels Namespace" +msgstr "document de type erroné, espace de noms glabels inconnu" + +# src/label.c:253 +# src/label.c:254 +# src/label.c:241 +# src/label.c:239 +#: ../src/xml-label.c:315 ../src/xml-label-04.c:78 +#, c-format +msgid "Bad root node = \"%s\"" +msgstr "Mauvais noeud racine = \"%s\"" + +# src/label.c:253 +# src/label.c:254 +# src/label.c:241 +# src/label.c:239 +#: ../src/xml-label.c:352 +#, c-format +msgid "bad node in Document node = \"%s\"" +msgstr "Mauvais noeud racine = \"%s\"" + +# src/label.c:298 +# src/label.c:301 +# src/label.c:294 +# src/label.c:290 +#: ../src/xml-label.c:397 ../src/xml-label-04.c:126 +#, c-format +msgid "bad node = \"%s\"" +msgstr "mauvais noeud = \"%s\"" + +# src/label.c:298 +# src/label.c:301 +# src/label.c:294 +# src/label.c:290 +#: ../src/xml-label.c:836 +#, c-format +msgid "bad node in Data node = \"%s\"" +msgstr "mauvais noeud de données = \"%s\"" + +#: ../src/xml-label.c:1073 ../libglabels/xml-template.c:585 +msgid "Utf8 conversion error." +msgstr "Erreur de conversion Utf8" + +# src/label.c:487 +# src/label.c:493 +# src/label.c:589 +# src/label.c:587 +#: ../src/xml-label.c:1080 ../libglabels/xml-template.c:592 +msgid "Problem saving xml file." +msgstr "Problème de sauvegarde du fichier xml." + +# src/merge.c:80 +# src/merge.c:78 +#: ../src/merge.c:170 ../src/merge.c:211 ../src/merge.c:375 ../src/merge.c:378 +msgid "None" +msgstr "Aucun" + +# src/merge.c:98 +# src/merge.c:94 +#: ../src/merge-init.c:59 +msgid "Text file with comma delimeters (CSV)" +msgstr "Texte séparé par des virgules (CSV)" + +# src/merge.c:107 +# src/merge.c:102 +#: ../src/merge-init.c:66 +msgid "Text file with colon delimeters" +msgstr "Texte séparé par des deux-points" + +# src/merge.c:89 +# src/merge.c:86 +#: ../src/merge-init.c:73 +msgid "Text file with tab delimeters" +msgstr "Texte avec séparateurs de tabulation" + +#: ../src/merge-init.c:82 +msgid "Data from default Evolution Addressbook" +msgstr "Données du carnet d'adresses Evolution par défaut" + +#: ../src/merge-init.c:88 +msgid "Data from a file containing VCards" +msgstr "Données d'un fichier de VCards" + +#: ../src/merge-evolution.c:278 +msgid "Couldn't construct query" +msgstr "Impossible de construire la requête" + +# src/file.c:214 +# src/file.c:214 +# src/file.c:249 +# src/file.c:249 +# c-format +#: ../src/merge-evolution.c:284 ../src/merge-evolution.c:291 +#, c-format +msgid "Couldn't open addressbook: %s" +msgstr "Impossible d'ouvrir le carnet d'adresses : %s" + +# src/file.c:248 src/mdi.c:635 +# src/file.c:248 src/mdi.c:641 +# src/file.c:288 src/mdi.c:601 +# src/file.c:288 src/mdi.c:601 +#: ../src/merge-evolution.c:303 +#, c-format +msgid "Couldn't list available fields: %s" +msgstr "Impossible d'énumérer les champs disponibles : %s" + +#: ../src/merge-evolution.c:335 +#, c-format +msgid "Couldn't get contacts: %s" +msgstr "Impossible d'obtenir les contacts : %s" + +# src/print_copies.c:193 +# src/print_copies.c:193 +# src/print_copies.c:171 +# src/print_copies.c:170 +#: ../src/wdgt-print-copies.c:153 +msgid "Sheets:" +msgstr "Feuilles :" + +# src/print_copies.c:213 +# src/print_copies.c:213 +# src/print_copies.c:191 +# src/print_copies.c:190 +#: ../src/wdgt-print-copies.c:173 +msgid "from:" +msgstr "de :" + +# src/print_copies.c:221 +# src/print_copies.c:221 +# src/print_copies.c:199 +# src/print_copies.c:198 +#: ../src/wdgt-print-copies.c:179 +msgid "to:" +msgstr "à :" + +# src/print_copies_merge.c:197 +# src/print_merge.c:170 +#: ../src/wdgt-print-merge.c:154 +msgid "Start on label" +msgstr "Commencer par l'étiquette" + +# src/print_copies_merge.c:206 +# src/print_merge.c:179 +#: ../src/wdgt-print-merge.c:162 +msgid "on 1st sheet" +msgstr "en 1ère page" + +# src/print.c:153 +# src/print.c:153 +# src/print_copies_merge.c:173 +# src/print_merge.c:195 +#: ../src/wdgt-print-merge.c:171 +msgid "Copies:" +msgstr "Copies :" + +# src/rotate_select.c:187 +# src/rotate_select.c:187 +# src/print_copies_merge.c:186 +# src/print_merge.c:188 +#: ../src/wdgt-print-merge.c:177 +msgid "Collate" +msgstr "Assembler" + +#: ../src/wdgt-media-select.c:229 ../src/wdgt-media-select.c:238 +#: ../src/wdgt-media-select.c:241 ../src/wdgt-media-select.c:465 +#: ../src/wdgt-media-select.c:474 +msgid "Any" +msgstr "Tous" + +# src/media_select.c:515 +# src/media_select.c:481 +# src/media_select.c:353 +#: ../src/wdgt-media-select.c:499 +#, c-format +msgid "%d per sheet" +msgstr "%d par feuille" + +# src/media_select.c:522 +# src/media_select.c:488 +# src/media_select.c:367 +#: ../src/wdgt-media-select.c:529 +#, c-format +msgid "%s x %s %s" +msgstr "%s x %s %s" + +# src/media_select.c:522 +# src/media_select.c:488 +# src/media_select.c:372 +#: ../src/wdgt-media-select.c:534 +#, c-format +msgid "%.5g x %.5g %s" +msgstr "%.5g x %.5g %s" + +#: ../src/wdgt-media-select.c:545 ../src/wdgt-media-select.c:559 +#, c-format +msgid "%s %s diameter" +msgstr "%s %s diamètre" + +#: ../src/wdgt-media-select.c:549 ../src/wdgt-media-select.c:563 +#, c-format +msgid "%.5g %s diameter" +msgstr "%.5g %s diamètre" + +#: ../src/wdgt-media-select.c:638 +msgid "No match." +msgstr "Aucune correspondance." + +#: ../src/wdgt-media-select.c:639 +msgid "Try selecting a different page size or category." +msgstr "Essayez de sélectionner une taille ou une catégorie de page différente." + +# src/merge_ui_text.c:334 +# src/merge_ui_text.c:334 +#. This is the default custom color +#: ../src/mygal/color-palette.c:389 +msgid "custom" +msgstr "personnalisé" + +# src/prop_bc.c:204 src/prop_fill.c:186 src/prop_line.c:203 +# src/prop_text.c:263 +# src/prop_bc.c:210 src/prop_fill.c:184 src/prop_line.c:209 +# src/prop_text.c:247 +# src/prop_bc.c:188 src/prop_fill.c:166 src/prop_line.c:189 +# src/prop_text.c:234 +# src/prop_bc.c:188 src/prop_fill.c:166 src/prop_line.c:189 +# src/prop_text.c:234 +#. "Custom" color - we'll pop up a GtkColorButton +#: ../src/mygal/color-palette.c:431 +msgid "Custom Color:" +msgstr "Couleur personnalisée :" + +#: ../src/mygal/color-palette.c:439 +msgid "Choose Custom Color" +msgstr "Choisir une couleur personnalisée" + +#: ../src/mygal/color-palette.c:572 +msgid "black" +msgstr "noir" + +#: ../src/mygal/color-palette.c:573 +msgid "light brown" +msgstr "brun clair" + +#: ../src/mygal/color-palette.c:574 +msgid "brown gold" +msgstr "brun jaune" + +#: ../src/mygal/color-palette.c:575 +msgid "dark green #2" +msgstr "vert foncé n°2" + +#: ../src/mygal/color-palette.c:576 +msgid "navy" +msgstr "bleu marine" + +#: ../src/mygal/color-palette.c:577 ../src/mygal/color-palette.c:633 +msgid "dark blue" +msgstr "bleu foncé" + +#: ../src/mygal/color-palette.c:578 +msgid "purple #2" +msgstr "violet n°2" + +#: ../src/mygal/color-palette.c:579 +msgid "very dark gray" +msgstr "gris très foncé" + +#: ../src/mygal/color-palette.c:582 ../src/mygal/color-palette.c:638 +msgid "dark red" +msgstr "rouge foncé" + +#: ../src/mygal/color-palette.c:583 +msgid "red-orange" +msgstr "rouge orange" + +#: ../src/mygal/color-palette.c:584 +msgid "gold" +msgstr "jaune" + +#: ../src/mygal/color-palette.c:585 +msgid "dark green" +msgstr "vert foncé" + +#: ../src/mygal/color-palette.c:586 ../src/mygal/color-palette.c:639 +msgid "dull blue" +msgstr "bleu pâle" + +#: ../src/mygal/color-palette.c:587 ../src/mygal/color-palette.c:640 +msgid "blue" +msgstr "bleu" + +#: ../src/mygal/color-palette.c:588 +msgid "dull purple" +msgstr "violet pâle" + +#: ../src/mygal/color-palette.c:589 +msgid "dark grey" +msgstr "gris foncé" + +#: ../src/mygal/color-palette.c:592 +msgid "red" +msgstr "rouge" + +#: ../src/mygal/color-palette.c:593 +msgid "orange" +msgstr "orange" + +#: ../src/mygal/color-palette.c:594 +msgid "lime" +msgstr "tilleul" + +#: ../src/mygal/color-palette.c:595 +msgid "dull green" +msgstr "vert pâle" + +#: ../src/mygal/color-palette.c:596 +msgid "dull blue #2" +msgstr "bleu pâle n°2" + +#: ../src/mygal/color-palette.c:597 +msgid "sky blue #2" +msgstr "bleu ciel n°2" + +#: ../src/mygal/color-palette.c:598 ../src/mygal/color-palette.c:637 +msgid "purple" +msgstr "violet" + +#: ../src/mygal/color-palette.c:599 +msgid "gray" +msgstr "gris" + +# src/item_image.c:283 +# src/item_image.c:283 +# src/item_image.c:268 src/menu.c:113 +# src/item_image.c:268 src/menu.c:113 +#: ../src/mygal/color-palette.c:602 ../src/mygal/color-palette.c:634 +msgid "magenta" +msgstr "magenta" + +#: ../src/mygal/color-palette.c:603 +msgid "bright orange" +msgstr "orange vif" + +#: ../src/mygal/color-palette.c:604 ../src/mygal/color-palette.c:635 +msgid "yellow" +msgstr "jaune" + +# src/prop_vector.c:245 +# src/prop_vector.c:224 +# src/prop_vector.c:224 +#: ../src/mygal/color-palette.c:605 +msgid "green" +msgstr "vert" + +#: ../src/mygal/color-palette.c:606 ../src/mygal/color-palette.c:636 +msgid "cyan" +msgstr "cyan" + +#: ../src/mygal/color-palette.c:607 +msgid "bright blue" +msgstr "bleu vif" + +#: ../src/mygal/color-palette.c:608 ../src/mygal/color-palette.c:625 +msgid "red purple" +msgstr "rouge violet" + +#: ../src/mygal/color-palette.c:609 +msgid "light grey" +msgstr "gris clair" + +#: ../src/mygal/color-palette.c:612 ../src/mygal/color-palette.c:629 +msgid "pink" +msgstr "rose" + +#: ../src/mygal/color-palette.c:613 +msgid "light orange" +msgstr "orange clair" + +#: ../src/mygal/color-palette.c:614 ../src/mygal/color-palette.c:626 +msgid "light yellow" +msgstr "jaune clair" + +#: ../src/mygal/color-palette.c:615 +msgid "light green" +msgstr "vert clair" + +#: ../src/mygal/color-palette.c:616 +msgid "light cyan" +msgstr "cyan clair" + +#: ../src/mygal/color-palette.c:617 ../src/mygal/color-palette.c:627 +msgid "light blue" +msgstr "bleu clair" + +#: ../src/mygal/color-palette.c:618 ../src/mygal/color-palette.c:631 +msgid "light purple" +msgstr "violet clair" + +#: ../src/mygal/color-palette.c:619 +msgid "white" +msgstr "blanc" + +#: ../src/mygal/color-palette.c:624 +msgid "purplish blue" +msgstr "bleu violacé" + +#: ../src/mygal/color-palette.c:628 +msgid "dark purple" +msgstr "violet foncé" + +#: ../src/mygal/color-palette.c:630 +msgid "sky blue" +msgstr "bleu ciel" + +#: ../src/critical-error-handler.c:73 +msgid "gLabels Fatal Error!" +msgstr "Erreur fatale de gLabels !" + +# src/preferences.c:92 +# src/prefs.c:101 +# src/prefs.c:92 +# src/prefs.c:86 +#: ../src/warning-handler.c:73 +msgid "gLabels Error!" +msgstr "Erreur de gLabels !" + +#: ../libglabels/category.c:352 +msgid "" +"Unable to locate category definitions. Libglabels may not be installed " +"correctly!" +msgstr "Impossible de trouver les définitions de catégorie. Il se peut que Libglabels ne soit pas correctement installé." + +#: ../libglabels/template.c:940 +#, c-format +msgid "Generic %s full page" +msgstr "Page entière générique %s" + +#: ../libglabels/template.c:989 +msgid "" +"Unable to locate any template files. Libglabels may not be installed " +"correctly!" +msgstr "Impossible de trouver les fichiers modèles. Il se peut que Libglabels ne soit pas correctement installé." + +#. Create and append an "Other" entry. +#: ../libglabels/paper.c:76 +msgid "Other" +msgstr "Autre" + +#: ../libglabels/paper.c:461 +msgid "" +"Unable to locate paper size definitions. Libglabels may not be installed " +"correctly!" +msgstr "Impossible de trouver les définitions de tailles de papier. Il se peut que Libglabels ne soit pas correctement installé." + +#. This should always be an id, but just in case a name +#. slips by! +#: ../libglabels/xml-template.c:217 +#, c-format +msgid "Unknown page size id \"%s\", trying as name" +msgstr "Taille de papier avec id « %s » inconnue, essai avec le nom" + +#: ../libglabels/xml-template.c:227 +#, c-format +msgid "Unknown page size id or name \"%s\"" +msgstr "Identifiant ou nom de taille de papier « %s » inconnu" + +#: ../data/glade/merge-properties-dialog.glade.h:1 +msgid "Record selection/preview" +msgstr "Sélection/Aperçu des enregistrements" + +# src/merge_properties.c:131 +# src/merge_properties.c:131 +#: ../data/glade/merge-properties-dialog.glade.h:2 +msgid "Source" +msgstr "Source" + +# src/prop_text.c:214 +# src/prop_text.c:199 +# src/merge_properties.c:143 +# src/merge_properties.c:143 +#: ../data/glade/merge-properties-dialog.glade.h:3 +msgid "Format:" +msgstr "Format :" + +# src/merge_properties.c:158 +# src/merge_properties.c:158 +#: ../data/glade/merge-properties-dialog.glade.h:4 +msgid "Location:" +msgstr "Emplacement :" + +# src/menu.c:86 +# src/menu.c:86 +# src/menu.c:85 +# src/menu.c:85 +#: ../data/glade/merge-properties-dialog.glade.h:5 +msgid "Select all" +msgstr "Tout sélectionner" + +# src/menu.c:86 +# src/menu.c:86 +# src/menu.c:85 +# src/menu.c:85 +#: ../data/glade/merge-properties-dialog.glade.h:6 +msgid "Unselect all" +msgstr "Désélectionner tout" + +#: ../data/glade/merge-properties-dialog.glade.h:7 +#: ../data/glade/object-editor.glade.h:39 +msgid "dialog1" +msgstr "dialog1" + +# src/file.c:98 +# src/file.c:98 +# src/file.c:109 +# src/file.c:109 +#: ../data/glade/new-label-dialog.glade.h:1 +msgid "Label orientation" +msgstr "Orientation de l'étiquette" + +# src/file.c:87 +# src/file.c:87 +# src/file.c:98 +# src/file.c:98 +#: ../data/glade/new-label-dialog.glade.h:2 +msgid "Media type" +msgstr "Type de média" + +# src/prop_bc.c:202 +# src/prop_bc.c:182 +# src/prop_bc.c:182 +#: ../data/glade/object-editor.glade.h:2 +#, no-c-format +msgid "%" +msgstr "%" + +#: ../data/glade/object-editor.glade.h:3 +msgid "00000000000 00000" +msgstr "00000000000 00000" + +#: ../data/glade/object-editor.glade.h:4 +msgid "Xxx object properties" +msgstr "Xxx Propriétés de l'objet" + +# src/prop_text.c:277 +# src/prop_text.c:264 +# src/prop_text.c:248 +# src/prop_text.c:248 +#: ../data/glade/object-editor.glade.h:5 ../data/glade/prefs-dialog.glade.h:7 +msgid "Alignment:" +msgstr "Alignement :" + +#: ../data/glade/object-editor.glade.h:6 +msgid "Allow merge to automatically shrink text" +msgstr "Permettre à la fusion de diminuer automatiquement la taille du texte" + +# src/prop_vector.c:207 +# src/prop_vector.c:228 +# src/prop_vector.c:207 +# src/prop_vector.c:207 +#: ../data/glade/object-editor.glade.h:7 +msgid "Angle:" +msgstr "Angle :" + +#: ../data/glade/object-editor.glade.h:8 +msgid "Checksum" +msgstr "Somme de contrôle" + +# src/prop_bc.c:204 src/prop_fill.c:186 src/prop_line.c:203 +# src/prop_text.c:263 +# src/prop_bc.c:210 src/prop_fill.c:184 src/prop_line.c:209 +# src/prop_text.c:247 +# src/prop_bc.c:188 src/prop_fill.c:166 src/prop_line.c:189 +# src/prop_text.c:234 +# src/prop_bc.c:188 src/prop_fill.c:166 src/prop_line.c:189 +# src/prop_text.c:234 +#: ../data/glade/object-editor.glade.h:9 ../data/glade/prefs-dialog.glade.h:8 +msgid "Color:" +msgstr "Couleur :" + +#: ../data/glade/object-editor.glade.h:11 +msgid "Enable shadow" +msgstr "Activer l'ombrage" + +# src/item_box.c:274 src/item_ellipse.c:279 +# src/item_box.c:274 src/item_ellipse.c:279 +# src/item_box.c:258 src/item_ellipse.c:260 +# src/item_box.c:258 src/item_ellipse.c:260 +#: ../data/glade/object-editor.glade.h:12 +msgid "Family:" +msgstr "Famille :" + +# src/item_box.c:274 src/item_ellipse.c:279 +# src/item_box.c:274 src/item_ellipse.c:279 +# src/item_box.c:258 src/item_ellipse.c:260 +# src/item_box.c:258 src/item_ellipse.c:260 +#: ../data/glade/object-editor.glade.h:13 +msgid "File:" +msgstr "Fichier :" + +# src/item_box.c:274 src/item_ellipse.c:279 +# src/item_box.c:274 src/item_ellipse.c:279 +# src/item_box.c:258 src/item_ellipse.c:260 +# src/item_box.c:258 src/item_ellipse.c:260 +#: ../data/glade/object-editor.glade.h:14 +msgid "Fill" +msgstr "Remplissage" + +# src/prop_size.c:220 +# src/prop_size.c:198 +# src/prop_size.c:198 +#: ../data/glade/object-editor.glade.h:15 +#: ../data/glade/template-designer.glade.h:31 +msgid "Height:" +msgstr "Hauteur :" + +# src/prop_text_entry.c:196 +# src/prop_text_entry.c:196 +#: ../data/glade/object-editor.glade.h:17 +msgid "Insert merge field" +msgstr "Insérer un champ de fusion" + +# src/prop_bc_data.c:196 src/prop_text_entry.c:180 +# src/prop_bc_data.c:196 src/prop_text_entry.c:180 +#: ../data/glade/object-editor.glade.h:18 +msgid "Key:" +msgstr "Clé :" + +# src/prop_vector.c:196 +# src/prop_vector.c:202 +# src/prop_vector.c:183 +# src/prop_vector.c:183 +#: ../data/glade/object-editor.glade.h:19 +msgid "Length:" +msgstr "Longueur :" + +#: ../data/glade/object-editor.glade.h:21 +#: ../data/glade/prefs-dialog.glade.h:12 +msgid "Line Spacing:" +msgstr "Espacement :" + +# src/prop_bc_data.c:176 +# src/prop_bc_data.c:176 +#: ../data/glade/object-editor.glade.h:22 +msgid "Literal:" +msgstr "Littéral :" + +#: ../data/glade/object-editor.glade.h:23 +msgid "Opacity:" +msgstr "Opacité :" + +# src/item_barcode.c:362 src/item_barcode.c:365 src/item_box.c:291 +# src/item_ellipse.c:296 src/item_image.c:315 src/item_line.c:289 +# src/item_text.c:487 src/item_text.c:490 +# src/item_barcode.c:368 src/item_barcode.c:371 src/item_box.c:291 +# src/item_ellipse.c:296 src/item_image.c:315 src/item_line.c:289 +# src/item_text.c:487 src/item_text.c:490 +# src/item_barcode.c:345 src/item_barcode.c:348 src/item_box.c:275 +# src/item_ellipse.c:277 src/item_image.c:318 src/item_line.c:274 +# src/item_text.c:500 src/item_text.c:503 +# src/item_barcode.c:345 src/item_barcode.c:348 src/item_box.c:275 +# src/item_ellipse.c:277 src/item_image.c:318 src/item_line.c:274 +# src/item_text.c:500 src/item_text.c:503 +#: ../data/glade/object-editor.glade.h:24 +msgid "Position" +msgstr "Position" + +# src/item_image.c:341 +# src/item_image.c:340 +# src/item_image.c:342 +# src/item_image.c:342 +#: ../data/glade/object-editor.glade.h:25 +msgid "Reset image size" +msgstr "Restaurer la taille d'image" + +# src/menu.c:86 +# src/menu.c:86 +# src/menu.c:85 +# src/menu.c:85 +#: ../data/glade/object-editor.glade.h:26 +msgid "Select A File" +msgstr "Sélectionner un fichier" + +#: ../data/glade/object-editor.glade.h:27 +msgid "Shadow" +msgstr "Ombre" + +# src/item_box.c:302 src/item_ellipse.c:307 src/item_image.c:326 +# src/item_line.c:300 +# src/item_box.c:302 src/item_ellipse.c:307 src/item_image.c:326 +# src/item_line.c:300 +# src/item_box.c:286 src/item_ellipse.c:288 src/item_image.c:329 +# src/item_line.c:285 +# src/item_box.c:286 src/item_ellipse.c:288 src/item_image.c:329 +# src/item_line.c:285 +#: ../data/glade/object-editor.glade.h:28 +msgid "Size" +msgstr "Taille" + +# src/item_box.c:302 src/item_ellipse.c:307 src/item_image.c:326 +# src/item_line.c:300 +# src/item_box.c:302 src/item_ellipse.c:307 src/item_image.c:326 +# src/item_line.c:300 +# src/item_box.c:286 src/item_ellipse.c:288 src/item_image.c:329 +# src/item_line.c:285 +# src/item_box.c:286 src/item_ellipse.c:288 src/item_image.c:329 +# src/item_line.c:285 +#: ../data/glade/object-editor.glade.h:29 +msgid "Size:" +msgstr "Taille :" + +# src/item_barcode.c:347 +# src/item_barcode.c:353 +# src/item_barcode.c:330 +# src/item_barcode.c:330 +#: ../data/glade/object-editor.glade.h:30 +msgid "Style" +msgstr "Style" + +# src/item_barcode.c:347 +# src/item_barcode.c:353 +# src/item_barcode.c:330 +# src/item_barcode.c:330 +#: ../data/glade/object-editor.glade.h:31 +msgid "Style:" +msgstr "Style :" + +# src/prop_line.c:188 +# src/prop_line.c:187 src/prop_size.c:202 +# src/prop_line.c:169 src/prop_size.c:182 +# src/prop_line.c:169 src/prop_size.c:182 +#: ../data/glade/object-editor.glade.h:33 +#: ../data/glade/prefs-dialog.glade.h:20 +#: ../data/glade/template-designer.glade.h:62 +msgid "Width:" +msgstr "Largeur :" + +#: ../data/glade/object-editor.glade.h:34 +msgid "X Offset:" +msgstr "Décalage X :" + +# src/prop_position.c:192 +# src/prop_position.c:173 +# src/prop_position.c:173 +#: ../data/glade/object-editor.glade.h:35 +msgid "X:" +msgstr "X :" + +#: ../data/glade/object-editor.glade.h:36 +msgid "Y Offset:" +msgstr "Décalage Y :" + +# src/prop_position.c:212 +# src/prop_position.c:191 +# src/prop_position.c:191 +#: ../data/glade/object-editor.glade.h:37 +msgid "Y:" +msgstr "Y :" + +# src/prop_vector.c:245 +# src/prop_vector.c:224 +# src/prop_vector.c:224 +#: ../data/glade/object-editor.glade.h:38 +msgid "degrees" +msgstr "degrés" + +#: ../data/glade/object-editor.glade.h:40 +msgid "digits:" +msgstr "" + +# src/prop_text.c:214 +# src/prop_text.c:199 +# src/merge_properties.c:143 +# src/merge_properties.c:143 +#: ../data/glade/object-editor.glade.h:41 +msgid "format:" +msgstr "format :" + +#: ../data/glade/prefs-dialog.glade.h:1 +msgid " " +msgstr " " + +#: ../data/glade/prefs-dialog.glade.h:2 +msgid "Default page size" +msgstr "Taille de page par défaut" + +#: ../data/glade/prefs-dialog.glade.h:3 +msgid "Fill" +msgstr "Remplissage" + +#: ../data/glade/prefs-dialog.glade.h:4 +msgid "Line" +msgstr "Ligne" + +#: ../data/glade/prefs-dialog.glade.h:5 +msgid "Text" +msgstr "Texte" + +#: ../data/glade/prefs-dialog.glade.h:6 +msgid "Units" +msgstr "Unités" + +# src/prop_text.c:214 +# src/prop_text.c:199 +# src/prop_text.c:181 +# src/prop_text.c:181 +#: ../data/glade/prefs-dialog.glade.h:9 +msgid "Font:" +msgstr "Police :" + +#: ../data/glade/prefs-dialog.glade.h:10 +msgid "ISO A4" +msgstr "ISO A4" + +# src/prefs.c:265 +# src/prefs.c:243 +# src/prefs.c:237 +#: ../data/glade/prefs-dialog.glade.h:11 +msgid "Inches" +msgstr "Pouces" + +# src/prop_bc.c:189 +# src/prop_bc.c:187 +# src/prop_bc.c:168 +# src/prop_bc.c:168 +#: ../data/glade/prefs-dialog.glade.h:13 +msgid "Locale" +msgstr "Localisation" + +# src/prefs.c:271 +# src/prefs.c:250 +# src/prefs.c:244 +#: ../data/glade/prefs-dialog.glade.h:14 +msgid "Millimeters" +msgstr "Millimètres" + +#: ../data/glade/prefs-dialog.glade.h:15 +msgid "Object defaults" +msgstr "Paramètres par défaut pour les objets" + +# src/print.c:149 +# src/prefs.c:259 +# src/prefs.c:237 +# src/prefs.c:231 +#: ../data/glade/prefs-dialog.glade.h:16 +msgid "Points" +msgstr "Points" + +#: ../data/glade/prefs-dialog.glade.h:17 +msgid "Select default properties for new objects." +msgstr "Sélectionner les propriétés par défaut pour les nouveaux objets." + +#: ../data/glade/prefs-dialog.glade.h:18 +msgid "Select locale specific behavior." +msgstr "Sélectionnez les paramètres de localisation" + +#. Most popular (at top of list) +#: ../data/glade/prefs-dialog.glade.h:19 +#: ../data/templates/paper-sizes.xml.h:29 +msgid "US Letter" +msgstr "Letter US" + +# src/print.c:171 +# src/print.c:171 +# src/print.c:186 +# src/print_dialog.c:141 +#: ../data/glade/print-custom-widget.glade.h:1 +msgid "Options" +msgstr "Options" + +#: ../data/glade/print-custom-widget.glade.h:2 +msgid "Print control (Merge)" +msgstr "Contrôle d'impression (fusion)" + +#: ../data/glade/print-custom-widget.glade.h:3 +msgid "Print control (Simple)" +msgstr "Contrôle d'impression (simple)" + +#: ../data/glade/property-bar.glade.h:1 +msgid "Bold" +msgstr "Gras" + +# src/item_barcode.c:337 +# src/item_barcode.c:343 src/prefs.c:243 +# src/item_barcode.c:320 src/prefs.c:221 +# src/item_barcode.c:320 src/prefs.c:215 +#: ../data/glade/property-bar.glade.h:2 +msgid "Center align" +msgstr "Centrer" + +# src/mdi.c:482 +# src/mdi.c:488 +# src/mdi.c:459 +# src/mdi.c:459 +#: ../data/glade/property-bar.glade.h:4 +msgid "Font family" +msgstr "Famille de police" + +# src/mdi.c:482 +# src/mdi.c:488 +# src/mdi.c:459 +# src/mdi.c:459 +#: ../data/glade/property-bar.glade.h:5 +msgid "Font size" +msgstr "Taille de police" + +#: ../data/glade/property-bar.glade.h:6 +msgid "Italic" +msgstr "Italique" + +#: ../data/glade/property-bar.glade.h:7 +msgid "Left align" +msgstr "Aligner à gauche" + +#: ../data/glade/property-bar.glade.h:9 +msgid "Line width" +msgstr "Largeur de la ligne" + +#: ../data/glade/property-bar.glade.h:10 +msgid "Right align" +msgstr "Aligner à droite" + +#: ../data/glade/property-bar.glade.h:11 +msgid "Text Color" +msgstr "Couleur du texte" + +#: ../data/glade/property-bar.glade.h:12 +msgid "Text color" +msgstr "Couleur du texte" + +#: ../data/glade/template-designer.glade.h:1 +msgid " " +msgstr " " + +#: ../data/glade/template-designer.glade.h:2 +msgid "(e.g., \"Mailing Labels,\" \"Business Cards,\" ...)" +msgstr "(ex : « Étiquettes de publipostage », « Cartes de visite », ...)" + +#: ../data/glade/template-designer.glade.h:3 +msgid "(e.g., 8163A)" +msgstr "(ex : 8163A)" + +#: ../data/glade/template-designer.glade.h:4 +msgid "(e.g., Avery, Acme, ...)" +msgstr "(ex : Avery, Acme, ...)" + +#: ../data/glade/template-designer.glade.h:5 +msgid "1. Outer radius:" +msgstr "1. Rayon extérieur :" + +#: ../data/glade/template-designer.glade.h:6 +msgid "1. Radius:" +msgstr "1. Rayon :" + +# src/prop_line.c:188 +# src/prop_line.c:187 src/prop_size.c:202 +# src/prop_line.c:169 src/prop_size.c:182 +# src/prop_line.c:169 src/prop_size.c:182 +#: ../data/glade/template-designer.glade.h:7 +msgid "1. Width:" +msgstr "1. Largeur :" + +# src/prop_size.c:220 +# src/prop_size.c:198 +# src/prop_size.c:198 +#: ../data/glade/template-designer.glade.h:8 +msgid "2. Height:" +msgstr "2. Hauteur :" + +#: ../data/glade/template-designer.glade.h:9 +msgid "2. Inner radius:" +msgstr "2. Rayon Intérieur :" + +#: ../data/glade/template-designer.glade.h:10 +msgid "2. Waste (overprint allowed):" +msgstr "2. Déchet (impression en surcharge autorisée) :" + +#: ../data/glade/template-designer.glade.h:11 +msgid "3. Clipping width:" +msgstr "3. Largeur de rognure :" + +#: ../data/glade/template-designer.glade.h:12 +msgid "3. Margin" +msgstr "3. Marge" + +#: ../data/glade/template-designer.glade.h:13 +msgid "3. Round (radius of corner):" +msgstr "3. Arrondi (rayon du coin) :" + +#: ../data/glade/template-designer.glade.h:14 +msgid "4. Clipping height:" +msgstr "4. Hauteur de rognure :" + +#: ../data/glade/template-designer.glade.h:15 +msgid "4. Horiz. waste (overprint allowed):" +msgstr "4. Déchet horiz. (impression en surcharge autorisée) :" + +#: ../data/glade/template-designer.glade.h:16 +msgid "5. Vert. waste (overprint allowed):" +msgstr "5. Déchet vert. (impression en surcharge autorisée) :" + +#: ../data/glade/template-designer.glade.h:17 +msgid "5. Waste (overprint allowed):" +msgstr "5. Déchet (impression en surcharge autorisée) :" + +#: ../data/glade/template-designer.glade.h:18 +msgid "6. Margin" +msgstr "6. Marge" + +#: ../data/glade/template-designer.glade.h:19 +msgid "Brand/Manufacturer:" +msgstr "Marque/Fabricant :" + +#: ../data/glade/template-designer.glade.h:20 +msgid "CD/DVD (including credit card CDs)" +msgstr "CD/DVD (y compris CD au format carte de crédit)" + +#: ../data/glade/template-designer.glade.h:21 +msgid "" +"Congratulations!\n" +"\n" +"You have completed the gLabels Template Designer.\n" +"If you wish to accept and save your design, click \"Apply.\"\n" +"\n" +"Otherwise, you may click \"Cancel\" to abandon your design\n" +"or \"Back\" to continue editing this design." +msgstr "" +"Félicitations !\n" +"Vous avez terminé la création d'un patron gLabels.\n" +"Si vous voulez accepter et sauver votre création, cliquez sur « Appliquer ».\n" +"\n" +"Dans le cas contraire, vous pouvez cliquer sur « Annuler » pour abandonner " +"votre création ou « Précédent » pour continuer d'éditer cette création." + +# src/media_select.c:216 +# src/media_select.c:242 +# src/media_select.c:222 +# src/media_select.c:222 +#: ../data/glade/template-designer.glade.h:28 +msgid "Description:" +msgstr "Description :" + +#: ../data/glade/template-designer.glade.h:29 +msgid "Distance from left edge (x0):" +msgstr "Distance par rapport au bord gauche (x0) :" + +#: ../data/glade/template-designer.glade.h:30 +msgid "Distance from top edge (y0):" +msgstr "Distance pas rapport au bord haut (y0) :" + +#: ../data/glade/template-designer.glade.h:32 +msgid "Horizontal pitch (dx):" +msgstr "Espacement horizontal (dx) :" + +#: ../data/glade/template-designer.glade.h:33 +msgid "" +"How many layouts will your template contain? \n" +"\n" +"A layout is a set of labels or cards that can be arranged in a simple grid.\n" +"Most templates only need one layout, as in the first example.\n" +"The second example illustrates when two layouts are needed." +msgstr "" +"Combien de dispositions votre patron contiendra-t-il ?\n" +"\n" +"Une disposition est un ensemble d'étiquettes ou de cartes qui peuvent être " +"rangés sur une simple grille.\n" +"La plupart des patrons n'ont besoin que d'une disposition, comme pour le " +"premier exemple.\n" +"Le deuxième exemple illustre le cas où deux dispositions sont nécessaires." + +# src/media_select.c:231 +# src/media_select.c:257 +# src/media_select.c:237 +# src/media_select.c:237 +#: ../data/glade/template-designer.glade.h:38 +msgid "Layout #1" +msgstr "Disposition n°1" + +# src/media_select.c:231 +# src/media_select.c:257 +# src/media_select.c:237 +# src/media_select.c:237 +#: ../data/glade/template-designer.glade.h:39 +msgid "Layout #2" +msgstr "Disposition n°2" + +#: ../data/glade/template-designer.glade.h:40 +msgid "Number across (nx):" +msgstr "Nombre horizontalement (nx) :" + +#: ../data/glade/template-designer.glade.h:41 +msgid "Number down (ny):" +msgstr "Nombre verticalement (ny) :" + +#: ../data/glade/template-designer.glade.h:42 +msgid "Number of layouts:" +msgstr "Nombre de dispositions :" + +# src/media_select.c:221 +# src/media_select.c:247 +# src/media_select.c:227 +# src/media_select.c:227 +#: ../data/glade/template-designer.glade.h:43 +#: ../data/glade/wdgt-media-select.glade.h:2 +msgid "Page size:" +msgstr "Taille de page :" + +#: ../data/glade/template-designer.glade.h:44 +msgid "Part #:" +msgstr "N° Ref :" + +#: ../data/glade/template-designer.glade.h:45 +msgid "" +"Please enter the following identifying information about the template " +"stationery." +msgstr "Entrez les informations suivantes à propos du fabricant de papier." + +#: ../data/glade/template-designer.glade.h:46 +msgid "Please enter the following layout information." +msgstr "Entrez les informations suivantes sur la disposition." + +#: ../data/glade/template-designer.glade.h:47 +msgid "" +"Please enter the following size parameters of a single label in your " +"template." +msgstr "Entrez les paramètres de taille suivants pour une étiquette." + +#: ../data/glade/template-designer.glade.h:48 +msgid "" +"Please enter the following size parameters of a single label or card in your " +"template." +msgstr "Entrez les paramètres de taille suivant pour une carte ou une étiquette." + +#: ../data/glade/template-designer.glade.h:49 +msgid "Please select the basic shape of the labels or cards." +msgstr "Sélectionnez la forme de base des cartes ou des étiquettes." + +#: ../data/glade/template-designer.glade.h:50 +msgid "Please select the page size of the template stationery." +msgstr "Sélectionnez la taille du papier." + +# src/print_copies_merge.c:206 +# src/print_merge.c:179 +#: ../data/glade/template-designer.glade.h:51 +msgid "Print test sheet" +msgstr "Imprimer une page de tests" + +#: ../data/glade/template-designer.glade.h:52 +msgid "Rectangular or square (can have rounded corners)" +msgstr "Rectangulaire ou carré (éventuellement à bords arrondis)" + +#: ../data/glade/template-designer.glade.h:53 +msgid "Round" +msgstr "Rond" + +#: ../data/glade/template-designer.glade.h:54 +msgid "" +"Templates needing\n" +"two layouts." +msgstr "" +"Patron nécessitant\n" +"deux dispositions." + +#: ../data/glade/template-designer.glade.h:56 +msgid "" +"Templates needing only\n" +"one layout." +msgstr "" +"Patron nécessitant\n" +"une disposition." + +#: ../data/glade/template-designer.glade.h:58 +msgid "Vertical pitch (dy):" +msgstr "Espacement vertical (dy) :" + +#: ../data/glade/template-designer.glade.h:59 +msgid "" +"Welcome to the gLabels Template Designer.\n" +"\n" +"This dialog will assist you in the creation of a custom gLabels template." +msgstr "" +"Bienvenue dans le créateur de patrons de gLabels.\n" +"Ce questionnaire va vous aider à créer un patron personnalisé pour glabels." + +#: ../data/glade/template-designer.glade.h:63 +msgid "cd_size_page" +msgstr "cd_size_page" + +#: ../data/glade/template-designer.glade.h:64 +msgid "finish_page" +msgstr "finish_page" + +#: ../data/glade/template-designer.glade.h:66 +msgid "layout_page" +msgstr "layout_page" + +#: ../data/glade/template-designer.glade.h:67 +msgid "name_page" +msgstr "name_page" + +#: ../data/glade/template-designer.glade.h:68 +msgid "nlayouts_page" +msgstr "nlayouts_page" + +#: ../data/glade/template-designer.glade.h:69 +msgid "pg_size_page" +msgstr "pg_size_page" + +#: ../data/glade/template-designer.glade.h:70 +msgid "rect_size_page" +msgstr "rect_size_page" + +#: ../data/glade/template-designer.glade.h:71 +msgid "round_size_page" +msgstr "round_size_page" + +#: ../data/glade/template-designer.glade.h:72 +msgid "shape_page" +msgstr "shape_page" + +#: ../data/glade/template-designer.glade.h:73 +msgid "start_page" +msgstr "start_page" + +#: ../data/glade/wdgt-media-select.glade.h:1 +msgid "Category:" +msgstr "Catégorie :" + +# src/rotate_select.c:187 +# src/rotate_select.c:187 +# src/rotate_select.c:167 +# src/rotate_select.c:169 +#: ../data/glade/wdgt-rotate-label.glade.h:1 +msgid "Rotate" +msgstr "Rotation" + +#. Other ISO A series sizes +#: ../data/templates/paper-sizes.xml.h:2 +msgid "A0" +msgstr "A0" + +#: ../data/templates/paper-sizes.xml.h:3 +msgid "A1" +msgstr "A1" + +#: ../data/templates/paper-sizes.xml.h:4 +msgid "A10" +msgstr "A10" + +#: ../data/templates/paper-sizes.xml.h:5 +msgid "A2" +msgstr "A2" + +#: ../data/templates/paper-sizes.xml.h:6 +msgid "A3" +msgstr "A3" + +#: ../data/templates/paper-sizes.xml.h:7 +msgid "A4" +msgstr "A4" + +#: ../data/templates/paper-sizes.xml.h:8 +msgid "A5" +msgstr "A5" + +#: ../data/templates/paper-sizes.xml.h:9 +msgid "A6" +msgstr "A6" + +#: ../data/templates/paper-sizes.xml.h:10 +msgid "A7" +msgstr "A7" + +#: ../data/templates/paper-sizes.xml.h:11 +msgid "A8" +msgstr "A8" + +#: ../data/templates/paper-sizes.xml.h:12 +msgid "A9" +msgstr "A9" + +#. ISO B series sizes +#: ../data/templates/paper-sizes.xml.h:14 +msgid "B0" +msgstr "B0" + +#: ../data/templates/paper-sizes.xml.h:15 +msgid "B1" +msgstr "B1" + +#: ../data/templates/paper-sizes.xml.h:16 +msgid "B10" +msgstr "B10" + +#: ../data/templates/paper-sizes.xml.h:17 +msgid "B2" +msgstr "B2" + +#: ../data/templates/paper-sizes.xml.h:18 +msgid "B3" +msgstr "B3" + +#: ../data/templates/paper-sizes.xml.h:19 +msgid "B4" +msgstr "B4" + +#: ../data/templates/paper-sizes.xml.h:20 +msgid "B5" +msgstr "B5" + +#: ../data/templates/paper-sizes.xml.h:21 +msgid "B6" +msgstr "B6" + +#: ../data/templates/paper-sizes.xml.h:22 +msgid "B7" +msgstr "B7" + +#: ../data/templates/paper-sizes.xml.h:23 +msgid "B8" +msgstr "B8" + +#: ../data/templates/paper-sizes.xml.h:24 +msgid "B9" +msgstr "B9" + +#: ../data/templates/paper-sizes.xml.h:25 +msgid "US Executive" +msgstr "Exécutif US" + +#. Other US paper sizes +#: ../data/templates/paper-sizes.xml.h:27 +msgid "US Legal" +msgstr "Légal US" + +#. =================================================================== +#: ../data/templates/avery-us-templates.xml.h:2 +#: ../data/templates/zweckform-iso-templates.xml.h:2 +msgid "Address Labels" +msgstr "Étiquettes d'adresses" + +#. =================================================================== +#. ============================================================ +#. =================================================================== +#. ====================================================== +#: ../data/templates/avery-us-templates.xml.h:4 +#: ../data/templates/avery-iso-templates.xml.h:4 +#: ../data/templates/zweckform-iso-templates.xml.h:6 +#: ../data/templates/misc-us-templates.xml.h:4 +#: ../data/templates/misc-iso-templates.xml.h:12 +msgid "Business Cards" +msgstr "Cartes de visite" + +# src/print_copies.c:210 +# src/print_copies.c:210 +# src/print_copies.c:188 +# src/print_copies.c:187 +#. =================================================================== +#. =============================================================== +#. =================================================================== +#: ../data/templates/avery-us-templates.xml.h:6 +#: ../data/templates/avery-iso-templates.xml.h:10 +#: ../data/templates/zweckform-iso-templates.xml.h:8 +#: ../data/templates/misc-us-templates.xml.h:8 +#: ../data/templates/misc-iso-templates.xml.h:16 +msgid "CD/DVD Labels" +msgstr "Étiquettes de CD/DVD" + +#. =================================================================== +#: ../data/templates/avery-us-templates.xml.h:8 +msgid "CD/DVD Labels (Disc Labels)" +msgstr "Étiquettes de CD/DVD (étiquettes de disque)" + +#. =================================================================== +#: ../data/templates/avery-us-templates.xml.h:10 +msgid "CD/DVD Labels (Spine Labels)" +msgstr "Étiquettes de CD/DVD (étiquettes de boîtier)" + +#. =================================================================== +#: ../data/templates/avery-us-templates.xml.h:12 +msgid "Diskette Labels" +msgstr "Étiquettes de disquette" + +# src/print_copies.c:210 +# src/print_copies.c:210 +# src/print_copies.c:188 +# src/print_copies.c:187 +#. =================================================================== +#: ../data/templates/avery-us-templates.xml.h:14 +msgid "Filing Labels" +msgstr "" + +#. =================================================================== +#: ../data/templates/avery-us-templates.xml.h:16 +msgid "Full Sheet Labels" +msgstr "" + +# src/print_copies_merge.c:197 +# src/print_merge.c:170 +#. =================================================================== +#: ../data/templates/avery-us-templates.xml.h:18 +msgid "Large Round Labels" +msgstr "" + +#. =================================================================== +#: ../data/templates/avery-us-templates.xml.h:20 +msgid "Name Badge Labels" +msgstr "" + +#. =================================================================== +#: ../data/templates/avery-us-templates.xml.h:22 +msgid "Return Address Labels" +msgstr "Étiquettes d'adresse de retour" + +#. =================================================================== +#: ../data/templates/avery-us-templates.xml.h:24 +msgid "Shipping Labels" +msgstr "Étiquettes postales" + +# src/print_copies_merge.c:197 +# src/print_merge.c:170 +#. =================================================================== +#: ../data/templates/avery-us-templates.xml.h:26 +msgid "Small Round Labels" +msgstr "" + +# src/print_copies.c:210 +# src/print_copies.c:210 +# src/print_copies.c:188 +# src/print_copies.c:187 +#. =================================================================== +#: ../data/templates/avery-us-templates.xml.h:28 +msgid "Square Labels" +msgstr "Étiquettes carrées" + +#. =================================================================== +#: ../data/templates/avery-us-templates.xml.h:30 +msgid "Video Tape Face Labels" +msgstr "Étiquettes de face de cassette vidéo" + +#. =================================================================== +#: ../data/templates/avery-us-templates.xml.h:32 +msgid "Video Tape Spine Labels" +msgstr "Étiquettes de dos de cassette vidéo" + +#. =================================================================== +#: ../data/templates/avery-iso-templates.xml.h:2 +msgid "Address labels" +msgstr "Étiquettes d'adresse" + +#. =============================================================== +#: ../data/templates/avery-iso-templates.xml.h:6 +msgid "CD Booklet" +msgstr "Livret de CD" + +#. =============================================================== +#: ../data/templates/avery-iso-templates.xml.h:8 +msgid "CD Inlet" +msgstr "" + +#. =================================================================== +#: ../data/templates/avery-iso-templates.xml.h:12 +msgid "Diskette labels" +msgstr "Étiquettes de disquette" + +#. =============================================================== +#. =================================================================== +#: ../data/templates/avery-iso-templates.xml.h:14 +#: ../data/templates/zweckform-iso-templates.xml.h:14 +#: ../data/templates/misc-iso-templates.xml.h:30 +msgid "Mailing Labels" +msgstr "Étiquettes de publipostage" + +# src/print_copies.c:210 +# src/print_copies.c:210 +# src/print_copies.c:188 +# src/print_copies.c:187 +#. =================================================================== +#: ../data/templates/avery-iso-templates.xml.h:16 +msgid "Mailing labels" +msgstr "Étiquettes de publipostage" + +#. =================================================================== +#: ../data/templates/avery-iso-templates.xml.h:18 +msgid "Mini Address Labels" +msgstr "Étiquettes de mini-adresse" + +# src/file.c:183 +# src/file.c:183 +# src/file.c:213 +# src/file.c:213 +#. =================================================================== +#: ../data/templates/avery-iso-templates.xml.h:20 +msgid "Shipping labels" +msgstr "Étiquettes postales" + +#: ../data/templates/categories.xml.h:1 +msgid "Any card" +msgstr "Toute carte" + +# src/file.c:183 +# src/file.c:183 +# src/file.c:213 +# src/file.c:213 +#: ../data/templates/categories.xml.h:2 +msgid "Any label" +msgstr "Toute étiquette" + +#: ../data/templates/categories.xml.h:3 +msgid "Business cards" +msgstr "Cartes de visite" + +#: ../data/templates/categories.xml.h:4 +msgid "CD/DVD or other media" +msgstr "CD/DVD ou autre support" + +#: ../data/templates/categories.xml.h:5 +msgid "Mailing/shipping products" +msgstr "Produits d'expédition" + +#: ../data/templates/categories.xml.h:6 +msgid "Rectangular labels" +msgstr "Étiquettes rectangulaires" + +#: ../data/templates/categories.xml.h:7 +msgid "Round labels" +msgstr "Étiquettes arrondies" + +# src/print_copies_merge.c:197 +# src/print_merge.c:170 +#: ../data/templates/categories.xml.h:8 +msgid "Square labels" +msgstr "Étiquettes carrées" + +#. =================================================================== +#: ../data/templates/zweckform-iso-templates.xml.h:4 +#: ../data/templates/misc-iso-templates.xml.h:4 +msgid "Allround Labels" +msgstr "Étiquettes Allround" + +#. =================================================================== +#: ../data/templates/zweckform-iso-templates.xml.h:10 +msgid "Correction and Cover-up Labels" +msgstr "Étiquettes de correction et de recouvrement" + +#. =================================================================== +#: ../data/templates/zweckform-iso-templates.xml.h:12 +msgid "Lever Arch File Labels" +msgstr "" + +#. =================================================================== +#: ../data/templates/zweckform-iso-templates.xml.h:16 +msgid "QSL-Karten Etiketten 70mm x 50,8mm" +msgstr "Étiquettes de cartes QSL 70mm x 50,8mm" + +#. =================================================================== +#: ../data/templates/zweckform-iso-templates.xml.h:18 +msgid "Rectangular Copier Labels" +msgstr "" + +#. =================================================================== +#: ../data/templates/zweckform-iso-templates.xml.h:20 +#: ../data/templates/misc-iso-templates.xml.h:38 +msgid "Rectangular Labels" +msgstr "Étiquettes rectangulaires" + +#. =================================================================== +#: ../data/templates/zweckform-iso-templates.xml.h:22 +msgid "Video Labels (back)" +msgstr "Étiquettes vidéo (dos)" + +#. =================================================================== +#: ../data/templates/misc-us-templates.xml.h:2 +msgid "Business Card CD" +msgstr "CD carte de visite" + +#. =================================================================== +#: ../data/templates/misc-us-templates.xml.h:6 +msgid "CD Template Rectangles" +msgstr "" + +#. =================================================================== +#: ../data/templates/misc-us-templates.xml.h:10 +msgid "CD/DVD Labels (Face Only)" +msgstr "Étiquettes de CD/DVD (face uniquement)" + +#. =================================================================== +#: ../data/templates/misc-us-templates.xml.h:12 +#: ../data/templates/misc-iso-templates.xml.h:18 +msgid "CD/DVD Labels (face only)" +msgstr "Étiquettes de CD/DVD (face uniquement)" + +# src/print_copies.c:210 +# src/print_copies.c:210 +# src/print_copies.c:188 +# src/print_copies.c:187 +#. =================================================================== +#: ../data/templates/misc-us-templates.xml.h:14 +msgid "Cassette Labels" +msgstr "Étiquettes de cassette" + +# src/print_copies.c:210 +# src/print_copies.c:210 +# src/print_copies.c:188 +# src/print_copies.c:187 +#. =================================================================== +#: ../data/templates/misc-us-templates.xml.h:16 +msgid "DLT Labels" +msgstr "Étiquettes DLT" + +#. =================================================================== +#: ../data/templates/misc-us-templates.xml.h:18 +msgid "Microtube labels" +msgstr "Étiquettes microtube" + +#. =================================================================== +#: ../data/templates/misc-us-templates.xml.h:20 +msgid "Mini-CD Labels" +msgstr "Étiquettes mini-CD" + +#: ../data/templates/misc-us-templates.xml.h:21 +msgid "PRO CD Labels 2-up (CD spine only)" +msgstr "" + +#: ../data/templates/misc-us-templates.xml.h:22 +msgid "PRO CD Labels 2-up (Face only)" +msgstr "" + +#. =================================================================== +#: ../data/templates/misc-us-templates.xml.h:24 +#: ../data/templates/misc-iso-templates.xml.h:36 +msgid "PRO CD Labels 2-up (face only)" +msgstr "" + +#. =================================================================== +#: ../data/templates/misc-us-templates.xml.h:26 +msgid "Slimline CD Case (rightside up)" +msgstr "" + +#: ../data/templates/misc-us-templates.xml.h:27 +msgid "Slimline CD Case (upside down)" +msgstr "" + +#. =================================================================== +#: ../data/templates/misc-iso-templates.xml.h:2 +msgid "Agipa 119488: Business Cards" +msgstr "Agipa 119488 : Cartes de visite" + +#. =================================================================== +#: ../data/templates/misc-iso-templates.xml.h:6 +msgid "Arch File Labels" +msgstr "Étiquettes de dossier d'archives" + +#. =================================================================== +#: ../data/templates/misc-iso-templates.xml.h:8 +msgid "Arch File Labels (large)" +msgstr "Étiquettes de dossier d'archives (grandes)" + +#. =================================================================== +#: ../data/templates/misc-iso-templates.xml.h:10 +msgid "Arch File Labels (small)" +msgstr "Étiquettes de dossier d'archives (petites)" + +# src/print_copies.c:210 +# src/print_copies.c:210 +# src/print_copies.c:188 +# src/print_copies.c:187 +#. =================================================================== +#: ../data/templates/misc-iso-templates.xml.h:14 +msgid "CD Labels" +msgstr "Étiquettes de CD" + +#. =================================================================== +#: ../data/templates/misc-iso-templates.xml.h:20 +msgid "CD/DVD Labels Standard Format (face only)" +msgstr "Format standard d'étiquettes de CD/DVD (face uniquement)" + +#. =================================================================== +#: ../data/templates/misc-iso-templates.xml.h:22 +msgid "Diskette Labels (face only)" +msgstr "Étiquettes de disquette (face uniquement)" + +#. =================================================================== +#: ../data/templates/misc-iso-templates.xml.h:24 +msgid "EPSON Photo Stickers 16" +msgstr "Autocollants EPSON Photo 16" + +#. =================================================================== +#: ../data/templates/misc-iso-templates.xml.h:26 +msgid "Etiketten" +msgstr "Étiquettes" + +#. =================================================================== +#: ../data/templates/misc-iso-templates.xml.h:28 +msgid "Fridge Magnet Stickers" +msgstr "Autocollants magnétiques" + +#. =================================================================== +#: ../data/templates/misc-iso-templates.xml.h:32 +msgid "Mailing Labels-2 columns" +msgstr "Étiquettes de publipostage (2 colonnes)" + +#. =================================================================== +#: ../data/templates/misc-iso-templates.xml.h:34 +msgid "Mailing Labels-3 columns" +msgstr "Étiquettes de publipostage (3 colonnes)" + +#. =================================================================== +#: ../data/templates/misc-iso-templates.xml.h:40 +msgid "Video Labels (face only)" +msgstr "Étiquettes de vidéos (face uniquement)" + +#: ../data/desktop/glabels.desktop.in.h:1 +msgid "Create labels, business cards and media covers" +msgstr "Crée des étiquettes et des cartes de visite" + +#: ../data/desktop/glabels.desktop.in.h:2 +msgid "gLabels Label Designer" +msgstr "Créateur d'étiquettes gLabels" + +# src/item_text.c:467 +# src/item_text.c:467 +# src/item_text.c:482 +# src/item_text.c:482 +#: ../data/mime/glabels.keys.in.h:1 ../data/mime/glabels.xml.in.h:1 +msgid "gLabels Project File" +msgstr "Fichier de projet gLabels" + +#: ../barcode-0.98/compat/getopt.c:583 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s : l'option « %s » ambiguë\n" + +#: ../barcode-0.98/compat/getopt.c:607 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s : l'option « --%s » n'autorise pas d'argument\n" + +#: ../barcode-0.98/compat/getopt.c:612 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s : l'option « %c%s » n'autorise pas d'argument\n" + +#: ../barcode-0.98/compat/getopt.c:629 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s : l'option « %s » exige un argument\n" + +#. --option +#: ../barcode-0.98/compat/getopt.c:658 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s : option « --%s » inconnue\n" + +#. +option or -option +#: ../barcode-0.98/compat/getopt.c:662 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s : option « %c%s » inconnue\n" + +#. 1003.2 specifies the format of this message. +#: ../barcode-0.98/compat/getopt.c:688 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s : option -- %c non autorisée\n" + +#: ../barcode-0.98/compat/getopt.c:691 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s : option -- %c non valide\n" + +#: ../barcode-0.98/compat/getopt.c:727 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s : l'option exige un argument -- %c\n" + diff --git a/glabels2/po/it.po b/glabels2/po/it.po new file mode 100644 index 00000000..09e23b7e --- /dev/null +++ b/glabels2/po/it.po @@ -0,0 +1,2427 @@ +# translation of it.po to Italian +# Italian translation of glabels. +# Copyright (C) 2003 THE glabels'S COPYRIGHT HOLDER +# This file is distributed under the same license as the glabels package. +# Andrea , 2003. +# Daniele Medri , 2005. +# +# +msgid "" +msgstr "" +"Project-Id-Version: it\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-06-19 20:43-0400\n" +"PO-Revision-Date: 2005-06-27 09:34+0200\n" +"Last-Translator: Daniele Medri \n" +"Language-Team: Italian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit" + +#: src/glabels.c:116 +msgid "Could not initialize Bonobo!\n" +msgstr "Non è possibile inizializzare Bonobo!\n" + +#: src/glabels-batch.c:52 +msgid "print this message" +msgstr "stampa questo messaggio" + +#: src/glabels-batch.c:54 +msgid "print the version of glabels-batch being used" +msgstr "stampa la versione di glabels batch utilizzata" + +#: src/glabels-batch.c:56 +msgid "set output filename (default=\"output.ps\")" +msgstr "imposta il nome del file di output (default=\"output.ps\")" + +#: src/glabels-batch.c:56 src/glabels-batch.c:70 +msgid "filename" +msgstr "nome file" + +#: src/glabels-batch.c:58 +msgid "number of sheets (default=1)" +msgstr "numero di fogli (default=1)" + +#: src/glabels-batch.c:58 +msgid "sheets" +msgstr "fogli" + +#: src/glabels-batch.c:60 +msgid "number of copies (default=1)" +msgstr "numero di copie (default=1)" + +#: src/glabels-batch.c:60 +msgid "copies" +msgstr "copie" + +#: src/glabels-batch.c:62 +msgid "first label on first sheet (default=1)" +msgstr "prima etichetta del primo foglio (default=1)" + +#: src/glabels-batch.c:62 +msgid "first" +msgstr "primo" + +#: src/glabels-batch.c:64 src/print-dialog.c:336 +msgid "print outlines (to test printer alignment)" +msgstr "stampa bordi (per provare l'allineamento della stampante)" + +#: src/glabels-batch.c:66 src/print-dialog.c:344 +msgid "print in reverse (i.e. a mirror image)" +msgstr "stampa al contrario (es. un'immagine riflessa)" + +#: src/glabels-batch.c:68 src/print-dialog.c:351 +msgid "print crop marks" +msgstr "stampa segni di taglio" + +#: src/glabels-batch.c:70 +msgid "input file for merging" +msgstr "file per la stampa unione" + +#: src/glabels-batch.c:107 +msgid "[OPTION...] GLABELS_FILE..." +msgstr "[OPTION...] GLABELS_FILE..." + +#: src/glabels-batch.c:127 +#, c-format +msgid "missing glabels file\n" +msgstr "file di glabels mancante\n" + +#: src/glabels-batch.c:158 +#, c-format +msgid "cannot perform document merge with glabels file %s\n" +msgstr "non è possibile unire i documenti con il file glabels %s\n" + +#: src/glabels-batch.c:182 +#, c-format +msgid "cannot open glabels file %s\n" +msgstr "non è possibile aprire il file glabels %s\n" + +#: src/window.c:244 +msgid "(none) - gLabels" +msgstr "(niente) - gLabels" + +#: src/window.c:414 +msgid "(modified)" +msgstr "(modificato)" + +#: src/stock.c:65 data/ui/glabels-ui.xml.h:162 +msgid "_Select Mode" +msgstr "Modalità di _selezione" + +#: src/stock.c:66 data/ui/glabels-ui.xml.h:163 +msgid "_Text" +msgstr "_Testo" + +#: src/stock.c:67 data/ui/glabels-ui.xml.h:148 +msgid "_Line" +msgstr "_Linea" + +#: src/stock.c:68 data/ui/glabels-ui.xml.h:130 +msgid "_Box" +msgstr "_Area" + +#: src/stock.c:69 data/ui/glabels-ui.xml.h:141 +msgid "_Ellipse" +msgstr "_Ellisse" + +#: src/stock.c:70 data/ui/glabels-ui.xml.h:146 +msgid "_Image" +msgstr "_Immagine" + +#: src/stock.c:71 data/ui/glabels-ui.xml.h:11 +msgid "Bar_code" +msgstr "_Codice a barre" + +#: src/stock.c:72 +msgid "_Merge Properties" +msgstr "Proprietà di _unione" + +#: src/stock.c:73 +msgid "Object _Properties" +msgstr "_Proprietà·Oggetto" + +#: src/stock.c:74 data/ui/glabels-ui.xml.h:13 +msgid "Bring to _Front" +msgstr "Porta in _primo piano" + +#: src/stock.c:75 data/ui/glabels-ui.xml.h:109 +msgid "Send to _Back" +msgstr "Porta in _secondo piano" + +#: src/stock.c:76 data/ui/glabels-ui.xml.h:96 +msgid "Rotate _Left" +msgstr "Ruota a sinistra" + +#: src/stock.c:77 data/ui/glabels-ui.xml.h:97 +msgid "Rotate _Right" +msgstr "Ruota a destra" + +#: src/stock.c:78 data/ui/glabels-ui.xml.h:52 +msgid "Flip _Horizontally" +msgstr "Capovolgi _orizzontalmente" + +#: src/stock.c:79 data/ui/glabels-ui.xml.h:53 +msgid "Flip _Vertically" +msgstr "Capovolgi _verticalmente" + +#: src/stock.c:80 data/ui/glabels-ui.xml.h:147 +msgid "_Lefts" +msgstr "_Sinistra" + +#: src/stock.c:81 data/ui/glabels-ui.xml.h:159 +msgid "_Rights" +msgstr "_Destra" + +#: src/stock.c:82 data/ui/glabels-ui.xml.h:131 +msgid "_Centers" +msgstr "_Centro" + +#: src/stock.c:83 data/ui/glabels-ui.xml.h:164 +msgid "_Tops" +msgstr "_In alto" + +#: src/stock.c:84 +msgid "Bottoms" +msgstr "In basso" + +#: src/stock.c:85 +msgid "Centers" +msgstr "Centrato" + +#: src/stock.c:86 src/stock.c:87 data/ui/glabels-ui.xml.h:62 +msgid "Label Ce_nter" +msgstr "Etichetta ce_ntrata" + +#: src/stock.c:88 data/ui/glabels-ui.xml.h:51 +msgid "Fill color" +msgstr "Colore di riempimento" + +#: src/stock.c:89 data/ui/glabels-ui.xml.h:64 +msgid "Line color" +msgstr "Colore Linea" + +#: src/stock.c:90 src/stock.c:92 +msgid "Linked" +msgstr "Collegato" + +#: src/stock.c:91 src/stock.c:93 +msgid "Not Linked" +msgstr "Nessun collegamento" + +#: src/ui-property-bar.c:345 src/object-editor.c:499 +msgid "Default" +msgstr "Predefinito" + +#: src/ui-property-bar.c:360 src/object-editor.c:512 +msgid "No fill" +msgstr "Nessun riempimento" + +#: src/ui-property-bar.c:375 src/object-editor.c:505 +msgid "No line" +msgstr "Nessuna linea" + +#: src/ui-sidebar.c:180 +msgid "Object properties" +msgstr "Proprietà oggetto" + +#: src/commands.c:385 +msgid "" +"A label and business card creation program for GNOME.\n" +" \n" +"Glabels is free software; you can redistribute it and/or modify it under the " +"terms of the GNU General Public License as published by the Free Software " +"Foundation; either version 2 of the License, or (at your option) any later " +"version.\n" +" \n" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details.\n" +msgstr "" + +#: src/commands.c:399 +msgid "See the file AUTHORS for additional credits," +msgstr "Visualizza il file AUTHORS per informazioni aggiuntive." + +#: src/commands.c:400 +msgid "or visit http://glabels.sourceforge.net/" +msgstr "oppure visita http://glabels.sourceforge.net/" + +#: src/commands.c:409 +msgid " " +msgstr " " + +#: src/commands.c:424 +msgid "glabels" +msgstr "glabels" + +#: src/file.c:100 +msgid "New Label or Card" +msgstr "Nuova etichetta o scheda" + +#: src/file.c:132 src/file.c:304 +msgid "Media Type" +msgstr "Tipo media" + +#: src/file.c:138 src/file.c:310 +msgid "Label orientation" +msgstr "Orientazione etichetta" + +#: src/file.c:269 +msgid "Label properties" +msgstr "Proprietà etichetta" + +#: src/file.c:452 src/file.c:870 +msgid "All files" +msgstr "Tutti i file" + +#: src/file.c:457 src/file.c:875 +msgid "gLabels documents" +msgstr "Documenti di gLabels" + +#: src/file.c:505 src/file.c:617 src/file.c:934 src/file.c:1130 +msgid "Empty file name selection" +msgstr "Selezione di un nome file vuoto" + +#: src/file.c:506 src/file.c:520 src/file.c:618 src/file.c:632 +msgid "Please select a file or supply a valid file name" +msgstr "Per piacere, indica un file o un nome valido" + +#: src/file.c:519 src/file.c:631 +msgid "File does not exist" +msgstr "Il file non esiste" + +#: src/file.c:563 data/ui/glabels-ui.xml.h:74 +msgid "Open" +msgstr "Apri" + +#: src/file.c:565 +msgid "Open label" +msgstr "Apri etichetta" + +#: src/file.c:707 +#, c-format +msgid "Could not open file \"%s\"" +msgstr "Non riesco ad aprire il file \"%s\"" + +#: src/file.c:715 +msgid "Not a supported file format" +msgstr "Non è un formato file supportato" + +#: src/file.c:797 src/file.c:979 src/file.c:1174 +#, c-format +msgid "Could not save file \"%s\"" +msgstr "Non riesco a salvare il file \"%s\"" + +#: src/file.c:805 src/file.c:987 src/file.c:1182 +msgid "Error encountered during save. The file is still not saved." +msgstr "" + +#: src/file.c:848 src/file.c:1048 +#, c-format +msgid "Save \"%s\" as" +msgstr "Salva \"%s\" come" + +#: src/file.c:935 src/file.c:1131 +msgid "Please supply a valid file name" +msgstr "Per piacere, indica un nome file valido" + +#: src/file.c:952 src/file.c:1147 +#, c-format +msgid "Overwrite file \"%s\"?" +msgstr "Sovrascrivi il file \"%s\"?" + +#: src/file.c:960 src/file.c:1155 +msgid "File already exists." +msgstr "File già esistente." + +#: src/file.c:1271 +#, c-format +msgid "Save changes to document \"%s\" before closing?" +msgstr "Salva i cambiamenti al documento \"%s\" prima di chiudere?" + +#: src/file.c:1279 +msgid "Your changes will be lost if you don't save them." +msgstr "I tuoi cambiamenti andranno persi se non salvi." + +#: src/file.c:1282 +msgid "Close without saving" +msgstr "Chiudi senza salvare" + +#. Should not happen +#: src/prefs.c:156 src/prefs.c:163 data/glade/prefs-dialog.glade.h:23 +#: data/glade/object-editor.glade.h:37 +msgid "points" +msgstr "punti" + +#: src/prefs.c:158 data/glade/object-editor.glade.h:36 +#: data/glade/template-designer.glade.h:74 +msgid "inches" +msgstr "pollici" + +#: src/prefs.c:160 +msgid "mm" +msgstr "mm" + +#: src/prefs-dialog.c:248 data/glade/prefs-dialog.glade.h:22 +msgid "gLabels Preferences" +msgstr "Preferenze gLabels" + +#. +#. * Submenu: Order +#. +#: src/view.c:3574 data/ui/glabels-ui.xml.h:154 +msgid "_Order" +msgstr "_Ordine" + +#. +#. * Submenu: Rotate/Flip +#. +#: src/view.c:3595 data/ui/glabels-ui.xml.h:160 +msgid "_Rotate/Flip" +msgstr "_Ruota/capovolgi" + +#. +#. * Submenu: Align Horizontally +#. +#: src/view.c:3628 +msgid "Align _Horizontally" +msgstr "Allineamento _orizzontale" + +#. +#. * Submenu: Align Vertically +#. +#: src/view.c:3667 +msgid "Align _Vertically" +msgstr "Allineamento _verticale" + +#: src/view.c:3728 data/ui/glabels-ui.xml.h:137 +msgid "_Delete" +msgstr "Cancella" + +#. Build editor. +#: src/view-box.c:224 +msgid "Box object properties" +msgstr "Proprietà dell'oggetto area" + +#. Build editor. +#: src/view-ellipse.c:224 +msgid "Ellipse object properties" +msgstr "Proprietà dell'oggetto Ellisse" + +#. Build editor. +#: src/view-line.c:224 +msgid "Line object properties" +msgstr "Proprietà dell'oggetto Linea" + +#. Build editor. +#: src/view-image.c:223 +msgid "Image object properties" +msgstr "Proprietà dell'oggetto Immagine" + +#. Build editor. +#: src/view-text.c:251 +msgid "Text object properties" +msgstr "Proprietà dell'oggetto Testo" + +#: src/view-text.c:563 data/glade/object-editor.glade.h:28 +msgid "Text" +msgstr "Testo" + +#. Build editor. +#: src/view-barcode.c:210 +msgid "Barcode object properties" +msgstr "Proprietà dell'oggetto Codice a barre" + +#: src/view-barcode.c:580 src/print.c:1089 +msgid "Invalid barcode data" +msgstr "Codice a barre non valido" + +#: src/merge-properties-dialog.c:231 +msgid "Merge Properties" +msgstr "Proprietà di unione" + +#. ---- Source section ---- +#: src/merge-properties-dialog.c:237 +msgid "Source" +msgstr "Sorgente" + +#: src/merge-properties-dialog.c:245 +msgid "Format:" +msgstr "Formato:" + +#. Location line +#: src/merge-properties-dialog.c:273 +msgid "Location:" +msgstr "Posizione:" + +#: src/merge-properties-dialog.c:282 src/merge-properties-dialog.c:393 +msgid "Select merge-database source" +msgstr "Seleziona sorgente unione-database" + +#: src/merge-properties-dialog.c:289 src/merge-properties-dialog.c:404 +msgid "N/A" +msgstr "N/A" + +#. ---- Sample Fields section ---- +#: src/merge-properties-dialog.c:300 +msgid "Record selection/preview:" +msgstr "Selezione/anteprima record:" + +#: src/merge-properties-dialog.c:326 +msgid "Select" +msgstr "Seleziona" + +#: src/merge-properties-dialog.c:334 +msgid "Record/Field" +msgstr "Record/campo" + +#: src/merge-properties-dialog.c:342 data/glade/object-editor.glade.h:9 +msgid "Data" +msgstr "Dati" + +#: src/print-dialog.c:266 data/ui/glabels-ui.xml.h:81 +msgid "Print" +msgstr "Stampa" + +#: src/print-dialog.c:281 +msgid "_Job" +msgstr "Lavoro" + +#: src/print-dialog.c:286 +msgid "P_rinter" +msgstr "Stampante" + +#. ----------- Add simple-copies widget ------------ +#: src/print-dialog.c:314 +msgid "Copies" +msgstr "Copie" + +#. ------- Add merge control widget ------------ +#: src/print-dialog.c:322 +msgid "Document merge control" +msgstr "" + +#. ----------- Add custom print options area ------------ +#: src/print-dialog.c:330 +msgid "Options" +msgstr "Opzioni" + +#: src/print-dialog.c:553 src/print-dialog.c:592 +msgid "Print preview" +msgstr "Anteprima di stampa" + +#: src/template-designer.c:409 data/glade/template-designer.glade.h:73 +msgid "gLabels Template Designer" +msgstr "Progettazione di modelli per gLabels" + +#: src/bc.c:60 +msgid "POSTNET (any)" +msgstr "POSTNET (qualsiasi)" + +#: src/bc.c:63 +msgid "POSTNET-5 (ZIP only)" +msgstr "POSTNET-5 (solo ZIP/CAP)" + +#: src/bc.c:66 +msgid "POSTNET-9 (ZIP+4)" +msgstr "POSTNET-9 (ZIP/CAP+4)" + +#: src/bc.c:69 +msgid "POSTNET-11 (DPBC)" +msgstr "POSTNET-11 (DPBC)" + +#: src/bc.c:72 +msgid "EAN (any)" +msgstr "EAN (qualsiasi)" + +#: src/bc.c:75 +msgid "EAN-8" +msgstr "EAN-8" + +#: src/bc.c:78 +msgid "EAN-8 +2" +msgstr "EAN-8 +2" + +#: src/bc.c:81 +msgid "EAN-8 +5" +msgstr "EAN-8 +5" + +#: src/bc.c:84 +msgid "EAN-13" +msgstr "EAN-13" + +#: src/bc.c:87 +msgid "EAN-13 +2" +msgstr "EAN-13 +2" + +#: src/bc.c:90 +msgid "EAN-13 +5" +msgstr "EAN-13 +5" + +#: src/bc.c:93 +msgid "UPC (UPC-A or UPC-E)" +msgstr "UPC (UPC-A o UPC-E)" + +#: src/bc.c:96 +msgid "UPC-A" +msgstr "UPC-A" + +#: src/bc.c:99 +msgid "UPC-A +2" +msgstr "UPC-A +2" + +#: src/bc.c:102 +msgid "UPC-A +5" +msgstr "UPC-A +5" + +#: src/bc.c:105 +msgid "UPC-E" +msgstr "UPC-E" + +#: src/bc.c:108 +msgid "UPC-E +2" +msgstr "UPC-E +2" + +#: src/bc.c:111 +msgid "UPC-E +5" +msgstr "UPC-E +5" + +#: src/bc.c:114 +msgid "ISBN" +msgstr "ISBN" + +#: src/bc.c:117 +msgid "ISBN +5" +msgstr "ISBN +5" + +#: src/bc.c:120 +msgid "Code 39" +msgstr "Code 39" + +#: src/bc.c:123 +msgid "Code 128" +msgstr "Code 128" + +#: src/bc.c:126 +msgid "Code 128C" +msgstr "Code 128C" + +#: src/bc.c:129 +msgid "Code 128B" +msgstr "Code 128B" + +#: src/bc.c:132 +msgid "Interleaved 2 of 5" +msgstr "" + +#: src/bc.c:135 +msgid "Codabar" +msgstr "Codabar" + +#: src/bc.c:138 +msgid "MSI" +msgstr "MSI" + +#: src/bc.c:141 +msgid "Plessey" +msgstr "Plessey" + +#: src/label.c:569 +msgid "Untitled" +msgstr "Senza nome" + +#: src/xml-label.c:176 src/xml-label.c:213 +msgid "xmlParseFile error" +msgstr "" + +#: src/xml-label.c:250 +msgid "No document root" +msgstr "Nessun documento radice" + +#: src/xml-label.c:264 +msgid "Importing from glabels 0.1 format" +msgstr "" + +#: src/xml-label.c:272 +msgid "Importing from glabels 0.4 format" +msgstr "" + +#: src/xml-label.c:279 +msgid "Importing from glabels 1.91 format" +msgstr "" + +#: src/xml-label.c:282 +msgid "bad document, unknown glabels Namespace" +msgstr "" + +#: src/xml-label.c:311 src/xml-label-04.c:75 src/xml-label-191.c:131 +#, c-format +msgid "Bad root node = \"%s\"" +msgstr "" + +#: src/xml-label.c:348 src/xml-label-191.c:165 +#, c-format +msgid "bad node in Document node = \"%s\"" +msgstr "" + +#: src/xml-label.c:393 src/xml-label-04.c:123 src/xml-label-191.c:197 +#, c-format +msgid "bad node = \"%s\"" +msgstr "" + +#: src/xml-label.c:796 src/xml-label-191.c:605 +#, c-format +msgid "bad node in Data node = \"%s\"" +msgstr "" + +#: src/xml-label.c:962 libglabels/xml-template.c:535 +msgid "Utf8 conversion error." +msgstr "Conversione di errore Utf8." + +#: src/xml-label.c:969 libglabels/xml-template.c:542 +msgid "Problem saving xml file." +msgstr "Problema nel salvataggio del file xml" + +#. This should always be an id, but just in case a name +#. slips by! +#: src/xml-label-191.c:680 libglabels/xml-template.c:199 +#, c-format +msgid "Unknown page size id \"%s\", trying as name" +msgstr "" + +#: src/xml-label-191.c:690 libglabels/xml-template.c:209 +#, c-format +msgid "Unknown page size id or name \"%s\"" +msgstr "" + +#: src/merge.c:172 src/merge.c:213 src/merge.c:399 src/merge.c:402 +msgid "None" +msgstr "Nessuno" + +#: src/merge-init.c:53 +msgid "Text file with comma delimeters (CSV)" +msgstr "" + +#: src/merge-init.c:60 +msgid "Text file with colon delimeters" +msgstr "" + +#: src/merge-init.c:67 +msgid "Text file with tab delimeters" +msgstr "" + +#: src/wdgt-image-select.c:201 data/glade/object-editor.glade.h:11 +msgid "File:" +msgstr "File:" + +#: src/wdgt-image-select.c:245 data/glade/object-editor.glade.h:16 +msgid "Key:" +msgstr "Chiave:" + +#: src/wdgt-print-copies.c:179 +msgid "Sheets:" +msgstr "Fogli:" + +#: src/wdgt-print-copies.c:197 +msgid "Labels" +msgstr "Etichette" + +#: src/wdgt-print-copies.c:200 +msgid "from:" +msgstr "da:" + +#: src/wdgt-print-copies.c:207 +msgid "to:" +msgstr "a:" + +#: src/wdgt-print-merge.c:178 +msgid "Start on label" +msgstr "" + +#: src/wdgt-print-merge.c:186 +msgid "on 1st sheet" +msgstr "nel 1° foglio" + +#: src/wdgt-print-merge.c:195 +msgid "Copies:" +msgstr "Copie:" + +#: src/wdgt-print-merge.c:201 +msgid "Collate" +msgstr "Fascicoli" + +#: src/wdgt-media-select.c:269 data/glade/template-designer.glade.h:29 +msgid "Description:" +msgstr "Descrizione:" + +#: src/wdgt-media-select.c:279 data/glade/template-designer.glade.h:53 +msgid "Page size:" +msgstr "Dimensioni·pagina:" + +#: src/wdgt-media-select.c:290 +msgid "Label size:" +msgstr "Dimensioni etichetta:" + +#: src/wdgt-media-select.c:301 +msgid "Layout:" +msgstr "Layout:" + +#: src/wdgt-media-select.c:578 +#, c-format +msgid "%d x %d (%d per sheet)" +msgstr "%d x %d (%d per foglio)" + +#: src/wdgt-media-select.c:582 +#, c-format +msgid "%d per sheet" +msgstr "%d per foglio" + +#: src/wdgt-media-select.c:614 +#, c-format +msgid "%s x %s %s" +msgstr "%s x %s %s" + +#: src/wdgt-media-select.c:619 +#, c-format +msgid "%.5g x %.5g %s" +msgstr "%.5g x %.5g %s" + +#: src/wdgt-media-select.c:630 src/wdgt-media-select.c:644 +#, c-format +msgid "%s %s diameter" +msgstr "%s %s diametro" + +#: src/wdgt-media-select.c:634 src/wdgt-media-select.c:648 +#, c-format +msgid "%.5g %s diameter" +msgstr "%.5g %s diametro" + +#: src/wdgt-rotate-label.c:193 +msgid "Rotate" +msgstr "Girare" + +#. This is the default custom color +#: src/mygal/color-palette.c:396 +msgid "custom" +msgstr "personalizzato" + +#. "Custom" color - we'll pop up a GnomeColorPicker +#: src/mygal/color-palette.c:438 +msgid "Custom Color:" +msgstr "Colore personalizzato:" + +#: src/mygal/color-palette.c:446 +msgid "Choose Custom Color" +msgstr "Scegli colore personalizzato" + +#: src/mygal/color-palette.c:579 +msgid "black" +msgstr "nero" + +#: src/mygal/color-palette.c:580 +msgid "light brown" +msgstr "Marrone chiaro" + +#: src/mygal/color-palette.c:581 +msgid "brown gold" +msgstr "" + +#: src/mygal/color-palette.c:582 +msgid "dark green #2" +msgstr "verde scuro #2" + +#: src/mygal/color-palette.c:583 +msgid "navy" +msgstr "" + +#: src/mygal/color-palette.c:584 src/mygal/color-palette.c:640 +msgid "dark blue" +msgstr "blu scuro" + +#: src/mygal/color-palette.c:585 +msgid "purple #2" +msgstr "" + +#: src/mygal/color-palette.c:586 +msgid "very dark gray" +msgstr "" + +#: src/mygal/color-palette.c:589 src/mygal/color-palette.c:645 +msgid "dark red" +msgstr "rosso scuro" + +#: src/mygal/color-palette.c:590 +msgid "red-orange" +msgstr "" + +#: src/mygal/color-palette.c:591 +msgid "gold" +msgstr "oro" + +#: src/mygal/color-palette.c:592 +msgid "dark green" +msgstr "verde scuro" + +#: src/mygal/color-palette.c:593 src/mygal/color-palette.c:646 +msgid "dull blue" +msgstr "" + +#: src/mygal/color-palette.c:594 src/mygal/color-palette.c:647 +msgid "blue" +msgstr "blu" + +#: src/mygal/color-palette.c:595 +msgid "dull purple" +msgstr "" + +#: src/mygal/color-palette.c:596 +msgid "dark grey" +msgstr "" + +#: src/mygal/color-palette.c:599 +msgid "red" +msgstr "rosso" + +#: src/mygal/color-palette.c:600 +msgid "orange" +msgstr "arancione" + +#: src/mygal/color-palette.c:601 +msgid "lime" +msgstr "tiglio" + +#: src/mygal/color-palette.c:602 +msgid "dull green" +msgstr "" + +#: src/mygal/color-palette.c:603 +msgid "dull blue #2" +msgstr "" + +#: src/mygal/color-palette.c:604 +msgid "sky blue #2" +msgstr "" + +#: src/mygal/color-palette.c:605 src/mygal/color-palette.c:644 +msgid "purple" +msgstr "viola" + +#: src/mygal/color-palette.c:606 +msgid "gray" +msgstr "grigio" + +#: src/mygal/color-palette.c:609 src/mygal/color-palette.c:641 +msgid "magenta" +msgstr "" + +#: src/mygal/color-palette.c:610 +msgid "bright orange" +msgstr "" + +#: src/mygal/color-palette.c:611 src/mygal/color-palette.c:642 +msgid "yellow" +msgstr "giallo" + +#: src/mygal/color-palette.c:612 +msgid "green" +msgstr "verde" + +#: src/mygal/color-palette.c:613 src/mygal/color-palette.c:643 +msgid "cyan" +msgstr "" + +#: src/mygal/color-palette.c:614 +msgid "bright blue" +msgstr "" + +#: src/mygal/color-palette.c:615 src/mygal/color-palette.c:632 +msgid "red purple" +msgstr "" + +#: src/mygal/color-palette.c:616 +msgid "light grey" +msgstr "" + +#: src/mygal/color-palette.c:619 src/mygal/color-palette.c:636 +msgid "pink" +msgstr "rosa" + +#: src/mygal/color-palette.c:620 +msgid "light orange" +msgstr "" + +#: src/mygal/color-palette.c:621 src/mygal/color-palette.c:633 +msgid "light yellow" +msgstr "" + +#: src/mygal/color-palette.c:622 +msgid "light green" +msgstr "" + +#: src/mygal/color-palette.c:623 +msgid "light cyan" +msgstr "" + +#: src/mygal/color-palette.c:624 src/mygal/color-palette.c:634 +msgid "light blue" +msgstr "blu chiaro" + +#: src/mygal/color-palette.c:625 src/mygal/color-palette.c:638 +msgid "light purple" +msgstr "" + +#: src/mygal/color-palette.c:626 +msgid "white" +msgstr "bianco" + +#: src/mygal/color-palette.c:631 +msgid "purplish blue" +msgstr "" + +#: src/mygal/color-palette.c:635 +msgid "dark purple" +msgstr "" + +#: src/mygal/color-palette.c:637 +msgid "sky blue" +msgstr "" + +#: libglabels/template.c:848 +#, c-format +msgid "Generic %s full page" +msgstr "" + +#: libglabels/template.c:897 +msgid "No template files found!" +msgstr "Nessun modello trovato!" + +#. Create and append an "Other" entry. +#: libglabels/paper.c:67 +msgid "Other" +msgstr "Altro" + +#: libglabels/paper.c:361 +msgid "No paper files found!" +msgstr "Nessun file paper trovato!" + +#: data/ui/glabels-ui.xml.h:1 +msgid "About glabels" +msgstr "Informazioni su glabels" + +#: data/ui/glabels-ui.xml.h:2 +msgid "About..." +msgstr "Informazioni..." + +#: data/ui/glabels-ui.xml.h:3 +msgid "Align _Horizontal" +msgstr "Allineamento orizzontale" + +#: data/ui/glabels-ui.xml.h:4 +msgid "Align _Vertical" +msgstr "Allineamento _verticale" + +#: data/ui/glabels-ui.xml.h:5 +msgid "Align objects to bottoms" +msgstr "Allinea gli oggetti in basso" + +#: data/ui/glabels-ui.xml.h:6 +msgid "Align objects to horizontal centers" +msgstr "Allinea gli oggetti nel centro orizzontale" + +#: data/ui/glabels-ui.xml.h:7 +msgid "Align objects to left edges" +msgstr "" + +#: data/ui/glabels-ui.xml.h:8 +msgid "Align objects to right edges" +msgstr "" + +#: data/ui/glabels-ui.xml.h:9 +msgid "Align objects to tops" +msgstr "" + +#: data/ui/glabels-ui.xml.h:10 +msgid "Align objects to vertical centers" +msgstr "Allinea gli oggetti al centro verticale" + +#: data/ui/glabels-ui.xml.h:12 +msgid "Bold" +msgstr "Grassetto" + +#: data/ui/glabels-ui.xml.h:14 +msgid "Center align" +msgstr "Allineamento centrato" + +#: data/ui/glabels-ui.xml.h:15 +msgid "Center objects to horizontal label center" +msgstr "" + +#: data/ui/glabels-ui.xml.h:16 +msgid "Center objects to vertical label center" +msgstr "" + +#: data/ui/glabels-ui.xml.h:17 +msgid "Change the visibility of markup lines in the current window" +msgstr "" +"Cambia la visibilità delle linee di demarcazione nella finestra corrente" + +#: data/ui/glabels-ui.xml.h:18 +msgid "Change the visibility of the drawing toolbar in the current window" +msgstr "Cambia la visibilità della barra degli strumenti di disegno nella finestra corrente" + +#: data/ui/glabels-ui.xml.h:19 +msgid "Change the visibility of the grid in the current window" +msgstr "Cambia la visibilità della griglia nella finestra corrente" + +#: data/ui/glabels-ui.xml.h:20 +msgid "Change the visibility of the main toolbar in the current window" +msgstr "Cambia la visibilità della barra degli strumenti principale nella finestra corrente" + +#: data/ui/glabels-ui.xml.h:21 +msgid "Change the visibility of the property toolbar in the current window" +msgstr "" +"Cambia la visibilità della barra degli strumenti principale nella finestra " +"corrente" + +#: data/ui/glabels-ui.xml.h:22 +msgid "Close" +msgstr "Chiudi" + +#: data/ui/glabels-ui.xml.h:23 +msgid "Close the current file" +msgstr "Chiudi il file corrente" + +#: data/ui/glabels-ui.xml.h:24 +msgid "Configure the application" +msgstr "Configura l'applicazione" + +#: data/ui/glabels-ui.xml.h:25 +msgid "Contents" +msgstr "Contenuti" + +#: data/ui/glabels-ui.xml.h:26 +msgid "Copy" +msgstr "Copia" + +#: data/ui/glabels-ui.xml.h:27 +msgid "Copy the selection" +msgstr "Copia la selezione" + +#: data/ui/glabels-ui.xml.h:28 +msgid "Create a custom template" +msgstr "Crea un modello personalizzato" + +#: data/ui/glabels-ui.xml.h:29 +msgid "Create a new document" +msgstr "Crea un nuovo documento" + +#: data/ui/glabels-ui.xml.h:30 +msgid "Create barcode object" +msgstr "Crea oggetto codice a barre" + +#: data/ui/glabels-ui.xml.h:31 +msgid "Create box/rectangle object" +msgstr "Crea oggetto area/rettangolo" + +#: data/ui/glabels-ui.xml.h:32 +msgid "Create ellipse/circle object" +msgstr "Crea oggetto ellisse/cerchio" + +#: data/ui/glabels-ui.xml.h:33 +msgid "Create image object" +msgstr "Crea oggetto immagine" + +#: data/ui/glabels-ui.xml.h:34 +msgid "Create line object" +msgstr "Crea oggetto linea" + +#: data/ui/glabels-ui.xml.h:35 +msgid "Create text object" +msgstr "Crea oggeto testo" + +#: data/ui/glabels-ui.xml.h:36 +msgid "Cu_t" +msgstr "_Taglia" + +#: data/ui/glabels-ui.xml.h:37 +msgid "Customize" +msgstr "Personalizza" + +#: data/ui/glabels-ui.xml.h:38 +msgid "Customize Drawing Toolbar" +msgstr "Personalizza la barra degli strumenti di disegno" + +#: data/ui/glabels-ui.xml.h:39 +msgid "Customize Main Toolbar" +msgstr "Personalizza la barra degli strumenti principale" + +#: data/ui/glabels-ui.xml.h:40 +msgid "Customize Property Toolbar" +msgstr "Personalizza barra degli strumenti proprietà" + +#: data/ui/glabels-ui.xml.h:41 +msgid "Customize toolbars" +msgstr "Personalizza·le·barre degli strumenti" + +#: data/ui/glabels-ui.xml.h:42 +msgid "Cut" +msgstr "Taglia" + +#: data/ui/glabels-ui.xml.h:43 +msgid "Cut the selection" +msgstr "Taglia la selezione" + +#: data/ui/glabels-ui.xml.h:44 +msgid "Decrease magnification" +msgstr "Decrementa ingrandimento" + +#: data/ui/glabels-ui.xml.h:45 +msgid "Delete" +msgstr "Cancella" + +#: data/ui/glabels-ui.xml.h:46 +msgid "Delete the selected objects" +msgstr "Cancella gli oggetti selezionati" + +#: data/ui/glabels-ui.xml.h:47 +msgid "Drawing toolbar" +msgstr "Barra degli strumenti di disegno" + +#: data/ui/glabels-ui.xml.h:48 +msgid "Dump XML" +msgstr "Scarica XML" + +#: data/ui/glabels-ui.xml.h:49 +msgid "Dump the UI Xml description" +msgstr "" + +#: data/ui/glabels-ui.xml.h:50 +msgid "Edit merge properties" +msgstr "Modifica proprietà di unione" + +#: data/ui/glabels-ui.xml.h:54 +msgid "Flip object horizontally" +msgstr "Capovolgi oggetto orizzontalmente" + +#: data/ui/glabels-ui.xml.h:55 +msgid "Flip object vertically" +msgstr "Capovolgi oggetto verticalmente" + +#: data/ui/glabels-ui.xml.h:56 +msgid "Font name" +msgstr "Nome font" + +#: data/ui/glabels-ui.xml.h:57 +msgid "Font selector" +msgstr "Selettore font" + +#: data/ui/glabels-ui.xml.h:58 +msgid "Font size" +msgstr "Dimesione·font" + +#: data/ui/glabels-ui.xml.h:59 +msgid "Icon and _Text" +msgstr "Icone e _Testo" + +#: data/ui/glabels-ui.xml.h:60 +msgid "Increase magnification" +msgstr "Incrementa ingradimento" + +#: data/ui/glabels-ui.xml.h:61 +msgid "Italic" +msgstr "Corsivo" + +#: data/ui/glabels-ui.xml.h:63 +msgid "Left align" +msgstr "Allinea·a·sinistra" + +#: data/ui/glabels-ui.xml.h:65 +msgid "Line width" +msgstr "Larghezza linea" + +#: data/ui/glabels-ui.xml.h:66 +msgid "Lower object to bottom" +msgstr "" + +#: data/ui/glabels-ui.xml.h:67 +msgid "M_arkup" +msgstr "" + +#: data/ui/glabels-ui.xml.h:68 +msgid "Main toolbar" +msgstr "Barra degli strumenti principale" + +#: data/ui/glabels-ui.xml.h:69 +msgid "Markup" +msgstr "Marcatori" + +#: data/ui/glabels-ui.xml.h:70 +msgid "Modify document properties" +msgstr "Modifica le proprietà del documento" + +#: data/ui/glabels-ui.xml.h:71 +msgid "New" +msgstr "Nuovo" + +#: data/ui/glabels-ui.xml.h:72 +msgid "Object property editor" +msgstr "Editor delle proprietà per l'oggetto" + +#: data/ui/glabels-ui.xml.h:73 +msgid "Only show icons in the main toolbar" +msgstr "Visualizza solo le icone nella barra degli strumenti principale" + +#: data/ui/glabels-ui.xml.h:75 +msgid "Open a file" +msgstr "Apri un file" + +#: data/ui/glabels-ui.xml.h:76 +msgid "Open the glabels manual" +msgstr "Apri il manuale di glabels" + +#: data/ui/glabels-ui.xml.h:77 +msgid "Paste" +msgstr "Incolla" + +#: data/ui/glabels-ui.xml.h:78 +msgid "Paste the clipboard" +msgstr "Incolla gli appunti" + +#: data/ui/glabels-ui.xml.h:79 +msgid "Pr_eferences..." +msgstr "Pr_eferenze..." + +#: data/ui/glabels-ui.xml.h:80 +msgid "Preferences" +msgstr "Preferenze" + +#: data/ui/glabels-ui.xml.h:82 +msgid "Print the current file" +msgstr "Stampa il file corrente" + +#: data/ui/glabels-ui.xml.h:83 +msgid "Proper_ties..." +msgstr "Proprie_tà..." + +#: data/ui/glabels-ui.xml.h:84 +msgid "Properties" +msgstr "Proprietà" + +#: data/ui/glabels-ui.xml.h:85 +msgid "Property toolbar" +msgstr "Proprietà della barra degli strumenti" + +#: data/ui/glabels-ui.xml.h:86 +msgid "Quit" +msgstr "Esci" + +#: data/ui/glabels-ui.xml.h:87 +msgid "Quit the program" +msgstr "Esci dal programma" + +#: data/ui/glabels-ui.xml.h:88 +msgid "Raise object to top" +msgstr "" + +#: data/ui/glabels-ui.xml.h:89 +msgid "Recent _Files" +msgstr "_File Recenti" + +#: data/ui/glabels-ui.xml.h:90 +msgid "Redo" +msgstr "Ripeti" + +#: data/ui/glabels-ui.xml.h:91 +msgid "Redo the undone action" +msgstr "" + +#: data/ui/glabels-ui.xml.h:92 +msgid "Remove all selections" +msgstr "Rimuovi tutte le selezioni" + +#: data/ui/glabels-ui.xml.h:94 +#, no-c-format +msgid "Restore scale to 100%" +msgstr "Ripristina la scala al 100%" + +#: data/ui/glabels-ui.xml.h:95 +msgid "Right align" +msgstr "Allineamento a destra" + +#: data/ui/glabels-ui.xml.h:98 +msgid "Rotate object 90 clockwise" +msgstr "Ruota l'oggetto di 90° in verso orario" + +#: data/ui/glabels-ui.xml.h:99 +msgid "Rotate object 90 counter-clockwise" +msgstr "Ruota l'oggetto di 90° in verso antiorario" + +#: data/ui/glabels-ui.xml.h:100 +msgid "Save" +msgstr "Salva" + +#: data/ui/glabels-ui.xml.h:101 +msgid "Save As" +msgstr "Salva con nome" + +#: data/ui/glabels-ui.xml.h:102 +msgid "Save _As..." +msgstr "Salva _con nome..." + +#: data/ui/glabels-ui.xml.h:103 +msgid "Save the current file" +msgstr "Salva il file corrente" + +#: data/ui/glabels-ui.xml.h:104 +msgid "Save the current file with a different name" +msgstr "Salva il file corrente con un nome differente" + +#: data/ui/glabels-ui.xml.h:105 +msgid "Select All" +msgstr "Seleziona tutto" + +#: data/ui/glabels-ui.xml.h:106 +msgid "Select _All" +msgstr "Seleziona tutto" + +#: data/ui/glabels-ui.xml.h:107 +msgid "Select all objects" +msgstr "Seleziona tutti gli oggetti" + +#: data/ui/glabels-ui.xml.h:108 +msgid "Select, move and modify objects" +msgstr "Seleziona, muovi e modifica oggetti" + +#: data/ui/glabels-ui.xml.h:110 +msgid "Set main toolbar button style according to desktop default" +msgstr "" + +#: data/ui/glabels-ui.xml.h:111 +msgid "Show _Tooltips" +msgstr "Mostra suggerimenti" + +#: data/ui/glabels-ui.xml.h:112 +msgid "Show both icons and texts in the main toolbar" +msgstr "Mostra icone e testo nella barra degli strumenti principale" + +#: data/ui/glabels-ui.xml.h:113 +msgid "Show tooltips in the drawing toolbar" +msgstr "Mostra suggerimenti nella barra degli strumenti di disegno" + +#: data/ui/glabels-ui.xml.h:114 +msgid "Show tooltips in the main toolbar" +msgstr "Mostra suggerimenti nella barra degli strumenti principale" + +#: data/ui/glabels-ui.xml.h:115 +msgid "Show tooltips in the property toolbar" +msgstr "Mostra suggerimenti nella barra degli strumenti principale" + +#: data/ui/glabels-ui.xml.h:116 +msgid "Template Designer" +msgstr "Progettazione modelli" + +#: data/ui/glabels-ui.xml.h:117 +msgid "Template _Designer..." +msgstr "" + +#: data/ui/glabels-ui.xml.h:118 +msgid "Text color" +msgstr "Colore testo" + +#: data/ui/glabels-ui.xml.h:119 +msgid "U_n-select All" +msgstr "Deseleziona tutto" + +#: data/ui/glabels-ui.xml.h:120 +msgid "Un-select All" +msgstr "Deseleziona·tutto" + +#: data/ui/glabels-ui.xml.h:121 +msgid "Undo" +msgstr "Annulla" + +#: data/ui/glabels-ui.xml.h:122 +msgid "Undo the last action" +msgstr "Annulla l'ultima azione" + +#: data/ui/glabels-ui.xml.h:123 +msgid "Zoom _1:1" +msgstr "Zoom _1:1" + +#: data/ui/glabels-ui.xml.h:124 +msgid "Zoom _In" +msgstr "Zoom _in avanti" + +#: data/ui/glabels-ui.xml.h:125 +msgid "Zoom _Out" +msgstr "Zo_om indietro" + +#: data/ui/glabels-ui.xml.h:126 +msgid "Zoom to _fit" +msgstr "Adatta" + +#: data/ui/glabels-ui.xml.h:127 +msgid "Zoom to fit window" +msgstr "Adatta alla finestra" + +#: data/ui/glabels-ui.xml.h:128 +msgid "_About..." +msgstr "Informazioni..." + +#: data/ui/glabels-ui.xml.h:129 +msgid "_Bottoms" +msgstr "In basso" + +#: data/ui/glabels-ui.xml.h:132 +msgid "_Close" +msgstr "_Chiudi" + +#: data/ui/glabels-ui.xml.h:133 +msgid "_Contents" +msgstr "_Contenuti" + +#: data/ui/glabels-ui.xml.h:134 +msgid "_Copy" +msgstr "_Copia" + +#: data/ui/glabels-ui.xml.h:135 +msgid "_Create Object" +msgstr "_Crea Oggetto" + +#: data/ui/glabels-ui.xml.h:136 +msgid "_Debug" +msgstr "_Debug" + +#: data/ui/glabels-ui.xml.h:138 +msgid "_Desktop Default" +msgstr "Predefinito del desktop" + +#: data/ui/glabels-ui.xml.h:139 +msgid "_Drawing Toolbar" +msgstr "Barra degli strumenti di disegno" + +#: data/ui/glabels-ui.xml.h:140 +msgid "_Edit" +msgstr "_Modifica" + +#: data/ui/glabels-ui.xml.h:142 +msgid "_File" +msgstr "_File" + +#: data/ui/glabels-ui.xml.h:143 +msgid "_Grid" +msgstr "_Griglia" + +#: data/ui/glabels-ui.xml.h:144 +msgid "_Help" +msgstr "_Aiuto" + +#: data/ui/glabels-ui.xml.h:145 +msgid "_Icon" +msgstr "_Icone" + +#: data/ui/glabels-ui.xml.h:149 +msgid "_Main Toolbar" +msgstr "Barra degli stru_menti principale" + +#: data/ui/glabels-ui.xml.h:150 +msgid "_Merge Properties..." +msgstr "Proprietà di unione..." + +#: data/ui/glabels-ui.xml.h:151 +msgid "_New" +msgstr "_Nuovo" + +#: data/ui/glabels-ui.xml.h:152 +msgid "_Objects" +msgstr "_Oggetti" + +#: data/ui/glabels-ui.xml.h:153 +msgid "_Open..." +msgstr "_Apri..." + +#: data/ui/glabels-ui.xml.h:155 +msgid "_Paste" +msgstr "Incolla" + +#: data/ui/glabels-ui.xml.h:156 +msgid "_Print..." +msgstr "Stampa..." + +#: data/ui/glabels-ui.xml.h:157 +msgid "_Property Toolbar" +msgstr "Barra degli strumenti _proprietà" + +#: data/ui/glabels-ui.xml.h:158 +msgid "_Quit" +msgstr "_Esci" + +#: data/ui/glabels-ui.xml.h:161 +msgid "_Save" +msgstr "_Salva" + +#: data/ui/glabels-ui.xml.h:165 +msgid "_View" +msgstr "_Visualizza" + +#: data/glade/prefs-dialog.glade.h:1 +msgid " " +msgstr "" + +#: data/glade/prefs-dialog.glade.h:2 data/glade/object-editor.glade.h:1 +#: data/glade/template-designer.glade.h:5 +msgid "*" +msgstr "*" + +#: data/glade/prefs-dialog.glade.h:3 +msgid "Default page size" +msgstr "Dimensione pagina predefinita" + +#: data/glade/prefs-dialog.glade.h:4 +msgid "Fill" +msgstr "Riempimento" + +#: data/glade/prefs-dialog.glade.h:5 +msgid "Line" +msgstr "Linea" + +#: data/glade/prefs-dialog.glade.h:6 +msgid "Text" +msgstr "Testo" + +#: data/glade/prefs-dialog.glade.h:7 +msgid "Units" +msgstr "Unità" + +#: data/glade/prefs-dialog.glade.h:8 data/glade/object-editor.glade.h:4 +msgid "Alignment:" +msgstr "Allineamento:" + +#: data/glade/prefs-dialog.glade.h:9 data/glade/object-editor.glade.h:8 +msgid "Color:" +msgstr "Colore:" + +#: data/glade/prefs-dialog.glade.h:10 +msgid "Font:" +msgstr "Carattere:" + +#: data/glade/prefs-dialog.glade.h:11 +msgid "ISO A4" +msgstr "ISO A4" + +#: data/glade/prefs-dialog.glade.h:12 +msgid "Inches" +msgstr "Pollici" + +#: data/glade/prefs-dialog.glade.h:13 data/glade/object-editor.glade.h:19 +msgid "Line Spacing:" +msgstr "Spaziatura:" + +#: data/glade/prefs-dialog.glade.h:14 +msgid "Locale" +msgstr "Impostazioni nazionali" + +#: data/glade/prefs-dialog.glade.h:15 +msgid "Millimeters" +msgstr "Millimetri" + +#: data/glade/prefs-dialog.glade.h:16 +msgid "Object defaults" +msgstr "Proprietà oggetto" + +#: data/glade/prefs-dialog.glade.h:17 +msgid "Points" +msgstr "Punti" + +#: data/glade/prefs-dialog.glade.h:18 +msgid "Select default properties for new objects." +msgstr "Seleziona le proprietà predefinite per i nuovi oggetti." + +#: data/glade/prefs-dialog.glade.h:19 +msgid "Select locale specific behavior." +msgstr "" + +#. Most popular (at top of list) +#: data/glade/prefs-dialog.glade.h:20 data/templates/paper-sizes.xml.h:29 +msgid "US Letter" +msgstr "US·Letter" + +#: data/glade/prefs-dialog.glade.h:21 data/glade/object-editor.glade.h:29 +#: data/glade/template-designer.glade.h:72 +msgid "Width:" +msgstr "Larghezza:" + +#: data/glade/object-editor.glade.h:2 +msgid "00000000000 00000" +msgstr "" + +#: data/glade/object-editor.glade.h:3 +msgid "Xxx object properties" +msgstr "" + +#: data/glade/object-editor.glade.h:5 +msgid "Allow merge to automatically shrink text" +msgstr "" + +#: data/glade/object-editor.glade.h:6 +msgid "Angle:" +msgstr "Angolo:" + +#: data/glade/object-editor.glade.h:7 +msgid "Checksum" +msgstr "Checksum" + +#: data/glade/object-editor.glade.h:10 +msgid "Family:" +msgstr "Famiglia:" + +#: data/glade/object-editor.glade.h:12 +msgid "Fill" +msgstr "Riempimento" + +#: data/glade/object-editor.glade.h:13 data/glade/template-designer.glade.h:33 +msgid "Height:" +msgstr "Altezza:" + +#: data/glade/object-editor.glade.h:14 +msgid "Image" +msgstr "Immagine" + +#: data/glade/object-editor.glade.h:15 +msgid "Insert merge field" +msgstr "Inserisci campo unione" + +#: data/glade/object-editor.glade.h:17 +msgid "Length:" +msgstr "Lunghezza:" + +#: data/glade/object-editor.glade.h:18 +msgid "Line" +msgstr "Linea" + +#: data/glade/object-editor.glade.h:20 +msgid "Literal:" +msgstr "Letterale:" + +#: data/glade/object-editor.glade.h:21 +msgid "Load image" +msgstr "Carica immagine" + +#: data/glade/object-editor.glade.h:22 +msgid "Position" +msgstr "Posizione" + +#: data/glade/object-editor.glade.h:23 +msgid "Reset image size" +msgstr "Ripristina dimensioni immagine" + +#: data/glade/object-editor.glade.h:24 +msgid "Size" +msgstr "Dimensioni" + +#: data/glade/object-editor.glade.h:25 +msgid "Size:" +msgstr "Dimensione:" + +#: data/glade/object-editor.glade.h:26 +msgid "Style" +msgstr "Stile" + +#: data/glade/object-editor.glade.h:27 +msgid "Style:" +msgstr "Stile:" + +#: data/glade/object-editor.glade.h:30 +msgid "X:" +msgstr "X:" + +#: data/glade/object-editor.glade.h:31 +msgid "Y:" +msgstr "Y:" + +#: data/glade/object-editor.glade.h:32 +msgid "degrees" +msgstr "gradi" + +#: data/glade/object-editor.glade.h:33 +msgid "dialog1" +msgstr "" + +#: data/glade/object-editor.glade.h:34 +msgid "digits:" +msgstr "cifre:" + +#: data/glade/object-editor.glade.h:35 +msgid "format:" +msgstr "formato:" + +#: data/glade/template-designer.glade.h:1 +msgid " " +msgstr "" + +#: data/glade/template-designer.glade.h:2 +msgid "(e.g., \"Mailing Labels,\" \"Business Cards,\" ...)" +msgstr "(es., \"Etichette di spedizione,\" \"Biglietti da visita,\" ...)" + +#: data/glade/template-designer.glade.h:3 +msgid "(e.g., 8163A)" +msgstr "(es. 8163A)" + +#: data/glade/template-designer.glade.h:4 +msgid "(e.g., Avery, Acme, ...)" +msgstr "(es. Avery, Acme, ...)" + +#: data/glade/template-designer.glade.h:6 +msgid "1. Outer radius:" +msgstr "1. raggio esterno:" + +#: data/glade/template-designer.glade.h:7 +msgid "1. Radius:" +msgstr "Raggio:" + +#: data/glade/template-designer.glade.h:8 +msgid "1. Width:" +msgstr "1. Larghezza:" + +#: data/glade/template-designer.glade.h:9 +msgid "2. Height:" +msgstr "2. Altezza:" + +#: data/glade/template-designer.glade.h:10 +msgid "2. Inner radius:" +msgstr "2. raggio interno:" + +#: data/glade/template-designer.glade.h:11 +msgid "2. Waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:12 +msgid "3. Clipping width:" +msgstr "" + +#: data/glade/template-designer.glade.h:13 +msgid "3. Margin" +msgstr "3. Margine" + +#: data/glade/template-designer.glade.h:14 +msgid "3. Round (radius of corner):" +msgstr "" + +#: data/glade/template-designer.glade.h:15 +msgid "4. Clipping height:" +msgstr "" + +#: data/glade/template-designer.glade.h:16 +msgid "4. Horiz. waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:17 +msgid "5. Vert. waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:18 +msgid "5. Waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:19 +msgid "6. Margin" +msgstr "6. Margine" + +#: data/glade/template-designer.glade.h:20 +msgid "Brand/Manufacturer:" +msgstr "Marca/Produttore:" + +#: data/glade/template-designer.glade.h:21 +msgid "CD/DVD (including credit card CDs)" +msgstr "CD/DVD (inclusa copertina dei ringraziamenti)" + +#: data/glade/template-designer.glade.h:22 +msgid "" +"Congratulations!\n" +"\n" +"You have completed the gLabels Template Designer.\n" +"If you wish to accept and save your design, click \"Apply.\"\n" +"\n" +"Otherwise, you may click \"Cancel\" to abandon your design\n" +"or \"Back\" to continue editing this design." +msgstr "Congratulazioni!\n" +"\n" +"Hai completato il gLabels Template Designer.\n" +"Se vuoi salvare il tuo progetto fai clic su \"Applica\".\n" +"\n" +"In caso contrario, fai clic su \"Cancella\" per abbandonare\n" +"il tuo progetto o \"Indietro\" per continuare la progettazione." + +#: data/glade/template-designer.glade.h:30 +msgid "Design Completed" +msgstr "Progettazione completata" + +#: data/glade/template-designer.glade.h:31 +msgid "Distance from left edge (x0):" +msgstr "Distanza dal bordo sinistro (x0):" + +#: data/glade/template-designer.glade.h:32 +msgid "Distance from top edge (y0):" +msgstr "Distanza dal bordo in alto (y0):" + +#: data/glade/template-designer.glade.h:34 +msgid "Horizontal pitch (dx):" +msgstr "" + +#: data/glade/template-designer.glade.h:35 +msgid "" +"How many layouts will your template contain? \n" +"\n" +"A layout is a set of labels or cards that can be arranged in a simple grid.\n" +"Most templates only need one layout, as in the first example.\n" +"The second example illustrates when two layouts are needed." +msgstr "" + +#: data/glade/template-designer.glade.h:40 +msgid "Label Size (CD/DVD)" +msgstr "Dimensione etichetta (CD/DVD)" + +#: data/glade/template-designer.glade.h:41 +msgid "Label Size (Round)" +msgstr "Dimensioni etichetta" + +#: data/glade/template-designer.glade.h:42 +msgid "Label or Card Shape" +msgstr "Forma dell'etichetta o della scheda" + +#: data/glade/template-designer.glade.h:43 +msgid "Label or Card Size (Rectangular)" +msgstr "" + +#: data/glade/template-designer.glade.h:44 +msgid "Layout #1" +msgstr "Layout #1" + +#: data/glade/template-designer.glade.h:45 +msgid "Layout #2" +msgstr "Layout #2" + +#: data/glade/template-designer.glade.h:46 +msgid "Layout(s)" +msgstr "Layout" + +#: data/glade/template-designer.glade.h:47 +msgid "Name and Description" +msgstr "Nome e descrizione" + +#: data/glade/template-designer.glade.h:48 +msgid "Number across (nx):" +msgstr "" + +#: data/glade/template-designer.glade.h:49 +msgid "Number down (ny):" +msgstr "" + +#: data/glade/template-designer.glade.h:50 +msgid "Number of Layouts" +msgstr "Numero di layout" + +#: data/glade/template-designer.glade.h:51 +msgid "Number of layouts:" +msgstr "Numero di layout:" + +#: data/glade/template-designer.glade.h:52 +msgid "Page Size" +msgstr "Dimensione pagina" + +#: data/glade/template-designer.glade.h:54 +msgid "Part #:" +msgstr "Parte #:" + +#: data/glade/template-designer.glade.h:55 +msgid "" +"Please enter the following identifying information about the template " +"stationery." +msgstr "" + +#: data/glade/template-designer.glade.h:56 +msgid "Please enter the following layout information." +msgstr "Per piacere, inserisci le seguenti informazioni." + +#: data/glade/template-designer.glade.h:57 +msgid "" +"Please enter the following size parameters of a single label in your " +"template." +msgstr "" + +#: data/glade/template-designer.glade.h:58 +msgid "" +"Please enter the following size parameters of a single label or card in your " +"template." +msgstr "" + +#: data/glade/template-designer.glade.h:59 +msgid "Please select the basic shape of the labels or cards." +msgstr "" + +#: data/glade/template-designer.glade.h:60 +msgid "Please select the page size of the template stationery." +msgstr "" + +#: data/glade/template-designer.glade.h:61 +msgid "Print test sheet" +msgstr "Stampa foglio di prova" + +#: data/glade/template-designer.glade.h:62 +msgid "Rectangular or square (can have rounded corners)" +msgstr "" + +#: data/glade/template-designer.glade.h:63 +msgid "Round" +msgstr "Rotonda" + +#: data/glade/template-designer.glade.h:64 +msgid "" +"Templates needing\n" +"two layouts." +msgstr "" + +#: data/glade/template-designer.glade.h:66 +msgid "" +"Templates needing only\n" +"one layout." +msgstr "" + +#: data/glade/template-designer.glade.h:68 +msgid "Vertical pitch (dy):" +msgstr "" + +#: data/glade/template-designer.glade.h:69 +msgid "" +"Welcome to the gLabels Template Designer.\n" +"\n" +"This dialog will assist you in the creation of a custom gLabels template." +msgstr "" + +#. Other ISO A series sizes +#: data/templates/paper-sizes.xml.h:2 +msgid "A0" +msgstr "A0" + +#: data/templates/paper-sizes.xml.h:3 +msgid "A1" +msgstr "A1" + +#: data/templates/paper-sizes.xml.h:4 +msgid "A10" +msgstr "A10" + +#: data/templates/paper-sizes.xml.h:5 +msgid "A2" +msgstr "A2" + +#: data/templates/paper-sizes.xml.h:6 +msgid "A3" +msgstr "A3" + +#: data/templates/paper-sizes.xml.h:7 +msgid "A4" +msgstr "A4" + +#: data/templates/paper-sizes.xml.h:8 +msgid "A5" +msgstr "A5" + +#: data/templates/paper-sizes.xml.h:9 +msgid "A6" +msgstr "A6" + +#: data/templates/paper-sizes.xml.h:10 +msgid "A7" +msgstr "A7" + +#: data/templates/paper-sizes.xml.h:11 +msgid "A8" +msgstr "A8" + +#: data/templates/paper-sizes.xml.h:12 +msgid "A9" +msgstr "A9" + +#. ISO B series sizes +#: data/templates/paper-sizes.xml.h:14 +msgid "B0" +msgstr "B0" + +#: data/templates/paper-sizes.xml.h:15 +msgid "B1" +msgstr "B1" + +#: data/templates/paper-sizes.xml.h:16 +msgid "B10" +msgstr "B10" + +#: data/templates/paper-sizes.xml.h:17 +msgid "B2" +msgstr "B2" + +#: data/templates/paper-sizes.xml.h:18 +msgid "B3" +msgstr "B3" + +#: data/templates/paper-sizes.xml.h:19 +msgid "B4" +msgstr "B4" + +#: data/templates/paper-sizes.xml.h:20 +msgid "B5" +msgstr "B5" + +#: data/templates/paper-sizes.xml.h:21 +msgid "B6" +msgstr "B6" + +#: data/templates/paper-sizes.xml.h:22 +msgid "B7" +msgstr "B7" + +#: data/templates/paper-sizes.xml.h:23 +msgid "B8" +msgstr "B8" + +#: data/templates/paper-sizes.xml.h:24 +msgid "B9" +msgstr "B9" + +#: data/templates/paper-sizes.xml.h:25 +msgid "US Executive" +msgstr "US Executive" + +#. Other US paper sizes +#: data/templates/paper-sizes.xml.h:27 +msgid "US Legal" +msgstr "US Legale" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:2 +#: data/templates/zweckform-iso-templates.xml.h:2 +msgid "Address Labels" +msgstr "Etichette di indirizzo" + +#. =================================================================== +#. ============================================================ +#. =================================================================== +#. ====================================================== +#: data/templates/avery-us-templates.xml.h:4 +#: data/templates/avery-iso-templates.xml.h:4 +#: data/templates/zweckform-iso-templates.xml.h:6 +#: data/templates/misc-us-templates.xml.h:3 +#: data/templates/misc-iso-templates.xml.h:17 +msgid "Business Cards" +msgstr "Biglietti da visita" + +#: data/templates/avery-us-templates.xml.h:5 +msgid "CD/DVD Labels (Disc Labels)" +msgstr "Etichette CD/DVD (Etichette Dischi)" + +#: data/templates/avery-us-templates.xml.h:6 +msgid "CD/DVD Labels (Spine Labels)" +msgstr "Etichette CD/DVD (Etichette dischi)" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:8 +msgid "Diskette Labels" +msgstr "Etichette per floppy" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:10 +msgid "Filing Labels" +msgstr "" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:12 +msgid "Full Sheet Labels" +msgstr "Pagina piena di etichette" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:14 +msgid "Large Round Labels" +msgstr "Etichetta con bordi arrotondati" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:16 +msgid "Name Badge Labels" +msgstr "" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:18 +msgid "Return Address Labels" +msgstr "Etichette con indirizzo del mittente" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:20 +msgid "Shipping Labels" +msgstr "Etichette di spedizione" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:22 +msgid "Small Round Labels" +msgstr "Etichette piccole con bordi arrotondati" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:24 +msgid "Square Labels" +msgstr "Etichette quadrate" + +#: data/templates/avery-us-templates.xml.h:25 +msgid "Video Tape Face Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:26 +msgid "Video Tape Spine Labels" +msgstr "" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:2 +msgid "Address labels" +msgstr "Etichette per indirizzo" + +#. =============================================================== +#: data/templates/avery-iso-templates.xml.h:6 +msgid "CD Booklet" +msgstr "CD Booklet" + +#. =============================================================== +#: data/templates/avery-iso-templates.xml.h:8 +msgid "CD Inlet" +msgstr "CD Inlet" + +#. =============================================================== +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:10 +#: data/templates/zweckform-iso-templates.xml.h:8 +#: data/templates/misc-us-templates.xml.h:5 +#: data/templates/misc-iso-templates.xml.h:21 +msgid "CD/DVD Labels" +msgstr "Etichette CD/DVD" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:12 +msgid "Diskette labels" +msgstr "" + +#. =============================================================== +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:14 +#: data/templates/zweckform-iso-templates.xml.h:14 +#: data/templates/misc-iso-templates.xml.h:35 +msgid "Mailing Labels" +msgstr "Etichette di spedizione" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:16 +msgid "Mailing labels" +msgstr "" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:18 +msgid "Mini Address Labels" +msgstr "Etichette Mini-indirizzo" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:20 +msgid "Shipping labels" +msgstr "" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:4 +msgid "Allround Labels" +msgstr "" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:10 +msgid "Correction and Cover-up Labels" +msgstr "" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:12 +msgid "Lever Arch File Labels" +msgstr "" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:16 +msgid "QSL-Karten Etiketten 70mm x 50,8mm" +msgstr "" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:18 +msgid "Rectangular Copier Labels" +msgstr "" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:20 +#: data/templates/misc-iso-templates.xml.h:44 +msgid "Rectangular Labels" +msgstr "" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:22 +msgid "Video Labels (back)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:1 +msgid "Business Card CD" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:4 +msgid "CD Template Rectangles" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:6 +msgid "CD/DVD Labels (Face Only)" +msgstr "" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:7 +#: data/templates/misc-iso-templates.xml.h:23 +msgid "CD/DVD Labels (face only)" +msgstr "" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:9 +msgid "Cassette Labels" +msgstr "Etichette per cassette" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:11 +msgid "DLT Labels" +msgstr "Etichette DLT" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:13 +msgid "Microtube labels" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:14 +msgid "Mini-CD Labels" +msgstr "Etichette Mini-CD" + +#: data/templates/misc-us-templates.xml.h:15 +msgid "PRO CD Labels 2-up (CD spine only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:16 +msgid "PRO CD Labels 2-up (Face only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:17 +#: data/templates/misc-iso-templates.xml.h:42 +msgid "PRO CD Labels 2-up (face only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:18 +msgid "Slimline CD Case (rightside up)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:19 +msgid "Slimline CD Case (upside down)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:1 +msgid "Agipa 119488: Business Cards" +msgstr "Agipa 119488: biglietti da visita" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:3 +msgid "Allround Labels --24" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:5 +msgid "Allround Labels --44" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:7 +msgid "Allround Labels --64" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:9 +msgid "Allround Labels --65" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:11 +msgid "Arch File Labels" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:13 +msgid "Arch File Labels (large)" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:15 +msgid "Arch File Labels (small)" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:19 +msgid "CD Labels" +msgstr "Etichette CD" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:25 +msgid "CD/DVD Labels Standard Format (face only)" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:27 +msgid "Diskette Labels (face only)" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:29 +msgid "EPSON Photo Stickers 16" +msgstr "EPSON Photo Stickers 16" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:31 +msgid "Etiketten" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:33 +msgid "Fridge Magnet Stickers" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:37 +msgid "Mailing Labels --14" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:39 +msgid "Mailing Labels-2 columns" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:41 +msgid "Mailing Labels-3 columns" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:46 +msgid "Video Labels (face only)" +msgstr "Etichette video (solo frontespizio)" + +#: data/desktop/glabels.desktop.in.h:1 +msgid "Create labels, business cards and media covers" +msgstr "Crea etichette, biglietti da visita e copertine" + +#: data/desktop/glabels.desktop.in.h:2 +msgid "gLabels Label Designer" +msgstr "gLabels Designer di etichetta" + +#: data/mime/glabels.keys.in.h:1 data/mime/glabels.xml.in.h:1 +msgid "gLabels Project File" +msgstr "File di progetto di gLabels" + diff --git a/glabels2/po/ja.po b/glabels2/po/ja.po new file mode 100644 index 00000000..08b6b3d1 --- /dev/null +++ b/glabels2/po/ja.po @@ -0,0 +1,2457 @@ +# glabels ja.po +# Copyright (C) 2001-2004 Free Software Foundation, Inc. +# Takeshi Aihana , 2001-2004. +# +msgid "" +msgstr "" +"Project-Id-Version: glabels 2.0.0\n" +"POT-Creation-Date: 2004-08-15 18:13-0400\n" +"PO-Revision-Date: 2004-08-11 08:44+0900\n" +"Last-Translator: Takeshi AIHANA \n" +"Language-Team: Japanese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/glabels.c:55 +msgid "Show view debugging messages." +msgstr "表示のデバッグ・メッセージを表示する" + +#: src/glabels.c:58 +msgid "Show item debugging messages." +msgstr "アイテムのデバッグ・メッセージを表示する" + +#: src/glabels.c:61 +msgid "Show printing debugging messages." +msgstr "印刷のデバッグ・メッセージを表示する" + +#: src/glabels.c:64 +msgid "Show prefs debugging messages." +msgstr "設定のデバッグ・メッセージを表示する" + +#: src/glabels.c:67 +msgid "Show file debugging messages." +msgstr "ファイルのデバッグ・メッセージを表示する" + +#: src/glabels.c:70 +msgid "Show document debugging messages." +msgstr "ドキュメントのデバッグ・メッセージを表示する" + +#: src/glabels.c:73 +msgid "Show template debugging messages." +msgstr "テンプレートのデバッグ・メッセージを表示する" + +#: src/glabels.c:76 +msgid "Show paper debugging messages." +msgstr "設定の用紙のデバッグ・メッセージを表示する" + +#: src/glabels.c:79 +msgid "Show xml debugging messages." +msgstr "XML のデバッグ・メッセージを表示する" + +#: src/glabels.c:82 +msgid "Show document merge debugging messages." +msgstr "ドキュメント結合のデバッグ・メッセージを表示する" + +#: src/glabels.c:85 +msgid "Show commands debugging messages." +msgstr "コマンドのデバッグ・メッセージを表示する" + +#: src/glabels.c:88 +msgid "Show undo debugging messages." +msgstr "Undo のデバッグ・メッセージを表示する" + +#: src/glabels.c:91 +msgid "Show recent debugging messages." +msgstr "最近開いたファイルのデバッグ・メッセージを表示する" + +#: src/glabels.c:94 +msgid "Show window debugging messages." +msgstr "ウィンドウのデバッグ・メッセージを表示する" + +#: src/glabels.c:97 +msgid "Show ui debugging messages." +msgstr "GUI のデバッグ・メッセージを表示する" + +#: src/glabels.c:100 +msgid "Show property_bar debugging messages." +msgstr "設定バーのデバッグ・メッセージを表示する" + +#: src/glabels.c:103 +msgid "Show media select widget debugging messages." +msgstr "メディア選択ウィジットのデバッグ・メッセージを表示する" + +#: src/glabels.c:106 +msgid "Show mini preview widget debugging messages." +msgstr "プレビュー・ウィジットのデバッグ・メッセージを表示する" + +#: src/glabels.c:109 +msgid "Show pixbuf cache debugging messages." +msgstr "pixbuf cache のデバッグ・メッセージを表示する" + +#: src/glabels.c:112 +msgid "Show widget debugging messages." +msgstr "ウィジットのデバッグ・メッセージを表示する" + +#: src/glabels.c:115 +msgid "Show object editor debugging messages." +msgstr "オブジェクト・エディタのデバッグメッセージを表示する" + +#: src/glabels.c:118 +msgid "Turn on all debugging messages." +msgstr "全てのデバッグ・メッセージを表示する" + +#: src/glabels.c:187 +msgid "Could not initialize Bonobo!\n" +msgstr "Bonobo を初期化することができませんでした!\n" + +#: src/glabels-batch.c:48 +msgid "print this message" +msgstr "このメッセージを表示する" + +#: src/glabels-batch.c:50 +msgid "print the version of glabels-batch being used" +msgstr "使用している gLabel のバージョンを表示する" + +#: src/glabels-batch.c:52 +msgid "set output filename (default=\"output.ps\")" +msgstr "出力するファイル名を指定する (デフォルト = \"output.ps\")" + +#: src/glabels-batch.c:52 +msgid "filename" +msgstr "ファイル名" + +#: src/glabels-batch.c:54 +msgid "number of sheets (default=1)" +msgstr "用紙の数 (デフォルト = 1)" + +#: src/glabels-batch.c:54 +msgid "sheets" +msgstr "用紙の数" + +#: src/glabels-batch.c:56 +msgid "number of copies (default=1)" +msgstr "コピーの数 (デフォルト = 1)" + +#: src/glabels-batch.c:56 +msgid "copies" +msgstr "コピーの数" + +#: src/glabels-batch.c:58 src/print-dialog.c:336 +msgid "print outlines (to test printer alignment)" +msgstr "アウトラインを印刷する (印刷時の配置を確認するため)" + +#: src/glabels-batch.c:60 src/print-dialog.c:344 +msgid "print in reverse (i.e. a mirror image)" +msgstr "(画像をミラーするように) 反転して印刷する" + +#: src/glabels-batch.c:96 +msgid "[OPTION...] GLABELS_FILE..." +msgstr "[オプション...] ファイル名..." + +#: src/glabels-batch.c:116 +#, c-format +msgid "missing glabels file\n" +msgstr "gLabel で使用するファイルがありません\n" + +#: src/glabels-batch.c:157 +#, c-format +msgid "cannot open glabels file %s\n" +msgstr "gLabel で使用するファイル %s が開けません\n" + +#: src/window.c:244 +msgid "(none) - gLabels" +msgstr "(なし) - gLabels" + +#: src/window.c:414 +msgid "(modified)" +msgstr "(変更済み)" + +#: src/stock.c:65 data/ui/glabels-ui.xml.h:165 +msgid "_Select Mode" +msgstr "選択モード(_S)" + +#: src/stock.c:66 data/ui/glabels-ui.xml.h:166 +msgid "_Text" +msgstr "文字(_T)" + +#: src/stock.c:67 data/ui/glabels-ui.xml.h:151 +msgid "_Line" +msgstr "直線(_L)" + +#: src/stock.c:68 data/ui/glabels-ui.xml.h:133 +msgid "_Box" +msgstr "矩形(_B)" + +#: src/stock.c:69 data/ui/glabels-ui.xml.h:144 +msgid "_Ellipse" +msgstr "楕円(_E)" + +#: src/stock.c:70 data/ui/glabels-ui.xml.h:149 +msgid "_Image" +msgstr "画像(_I)" + +#: src/stock.c:71 data/ui/glabels-ui.xml.h:11 +msgid "Bar_code" +msgstr "バーコード(_C)" + +#: src/stock.c:72 +msgid "_Merge Properties" +msgstr "結合プロパティ(_M)" + +#: src/stock.c:73 +msgid "Object _Properties" +msgstr "オブジェクトのプロパティ(_P)" + +#: src/stock.c:74 data/ui/glabels-ui.xml.h:13 +msgid "Bring to _Front" +msgstr "前に持ってくる(_F)" + +#: src/stock.c:75 data/ui/glabels-ui.xml.h:110 +msgid "Send to _Back" +msgstr "後ろにまわす(_B)" + +#: src/stock.c:76 data/ui/glabels-ui.xml.h:97 +msgid "Rotate _Left" +msgstr "左に回転(_L)" + +#: src/stock.c:77 data/ui/glabels-ui.xml.h:98 +msgid "Rotate _Right" +msgstr "右に回転(_R)" + +#: src/stock.c:78 data/ui/glabels-ui.xml.h:52 +msgid "Flip _Horizontally" +msgstr "水平方向にフリップ(_H)" + +#: src/stock.c:79 data/ui/glabels-ui.xml.h:53 +msgid "Flip _Vertically" +msgstr "垂直方向にフリップ(_V)" + +#: src/stock.c:80 data/ui/glabels-ui.xml.h:150 +msgid "_Lefts" +msgstr "左端(_L)" + +#: src/stock.c:81 data/ui/glabels-ui.xml.h:162 +msgid "_Rights" +msgstr "右端(_R)" + +#: src/stock.c:82 data/ui/glabels-ui.xml.h:134 +msgid "_Centers" +msgstr "中央(_C)" + +#: src/stock.c:83 data/ui/glabels-ui.xml.h:167 +msgid "_Tops" +msgstr "上端(_T)" + +#: src/stock.c:84 +msgid "Bottoms" +msgstr "下部" + +#: src/stock.c:85 +msgid "Centers" +msgstr "中央" + +#: src/stock.c:86 src/stock.c:87 data/ui/glabels-ui.xml.h:62 +msgid "Label Ce_nter" +msgstr "ラベルの中心(_N)" + +#: src/stock.c:88 data/ui/glabels-ui.xml.h:51 +msgid "Fill color" +msgstr "色で塗りつぶします" + +#: src/stock.c:89 data/ui/glabels-ui.xml.h:64 +msgid "Line color" +msgstr "線の色を選択します" + +#: src/stock.c:90 src/stock.c:92 +msgid "Linked" +msgstr "結合済" + +#: src/stock.c:91 src/stock.c:93 +msgid "Not Linked" +msgstr "結合なし" + +#: src/ui-property-bar.c:345 src/object-editor.c:499 +msgid "Default" +msgstr "デフォルト" + +#: src/ui-property-bar.c:360 src/object-editor.c:512 +msgid "No fill" +msgstr "塗りつぶさない" + +#: src/ui-property-bar.c:375 src/object-editor.c:505 +msgid "No line" +msgstr "線を消す" + +#: src/ui-sidebar.c:180 +msgid "Object properties" +msgstr "オブジェクトのプロパティ" + +#: src/commands.c:385 +msgid "" +"A label and business card creation program for GNOME.\n" +" \n" +"Glabels is free software; you can redistribute it and/or modify it under the " +"terms of the GNU General Public License as published by the Free Software " +"Foundation; either version 2 of the License, or (at your option) any later " +"version.\n" +" \n" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details.\n" +msgstr "" +"GNOME 向けのラベル/ビジネスカードの作成プログラムです。\n" +"\n" +"Glabels はフリーソフトです。フリーソフトウェア財団が定める GNU 一般公有使用許" +"諾契約書の第2版もしくはそれ以降のバージョンの下で複製、改編、再配布が認められ" +"ています。\n" +"\n" +"このプログラムが役に立つことを望む中で配布されていますが、完全無保証です。販" +"売目的または商用目的の保証はありません。詳細については GNU 一般公有使用許諾契" +"約書を参照して下さい。\n" + +#: src/commands.c:399 +msgid "See the file AUTHORS for additional credits," +msgstr "補足のクレジットについては AUTHORS ファイルをご覧になるか、" + +#: src/commands.c:400 +msgid "or visit http://glabels.sourceforge.net/" +msgstr "または http://glabels.sourceforge.net/ を訪れてみて下さい。" + +#: src/commands.c:409 +msgid " " +msgstr " " + +#: src/commands.c:424 +msgid "glabels" +msgstr "gLabels" + +#: src/file.c:100 +msgid "New Label or Card" +msgstr "新規ラベルまたはカード" + +#: src/file.c:132 src/file.c:304 +msgid "Media Type" +msgstr "メディアの種類" + +#: src/file.c:138 src/file.c:310 +msgid "Label orientation" +msgstr "ラベルの向き" + +#: src/file.c:269 +msgid "Label properties" +msgstr "ラベルのプロパティ" + +#: src/file.c:452 src/file.c:870 +msgid "All files" +msgstr "全てのファイル" + +#: src/file.c:457 src/file.c:875 +msgid "gLabels documents" +msgstr "gLabels のドキュメント" + +#: src/file.c:505 src/file.c:617 src/file.c:934 src/file.c:1130 +msgid "Empty file name selection" +msgstr "ファイル名の入力欄が空です" + +#: src/file.c:506 src/file.c:520 src/file.c:618 src/file.c:632 +msgid "Please select a file or supply a valid file name" +msgstr "既存のファイルを選択するか、または正しいファイル名を指定して下さい。" + +#: src/file.c:519 src/file.c:631 +msgid "File does not exist" +msgstr "ファイルがありません。" + +#: src/file.c:563 data/ui/glabels-ui.xml.h:75 +msgid "Open" +msgstr "開く" + +#: src/file.c:565 +msgid "Open label" +msgstr "ラベルを開きます" + +#: src/file.c:707 +#, c-format +msgid "Could not open file \"%s\"" +msgstr "ファイル \"%s\" が開けませんでした" + +#: src/file.c:715 +msgid "Not a supported file format" +msgstr "サポートしていないファイル形式です。" + +#: src/file.c:797 src/file.c:979 src/file.c:1174 +#, c-format +msgid "Could not save file \"%s\"" +msgstr "ファイル \"%s\" を保存できませんでした" + +#: src/file.c:805 src/file.c:987 src/file.c:1182 +msgid "Error encountered during save. The file is still not saved." +msgstr "データ保存中にエラーが発生しました。データはまだ保存されていません。" + +#: src/file.c:848 src/file.c:1048 +#, c-format +msgid "Save \"%s\" as" +msgstr "\"%s\" に名前を付けて保存" + +#: src/file.c:935 src/file.c:1131 +msgid "Please supply a valid file name" +msgstr "正しいファイル名を指定して下さい" + +#: src/file.c:952 src/file.c:1147 +#, c-format +msgid "Overwrite file \"%s\"?" +msgstr "ファイル \"%s\" に上書きしますか?" + +#: src/file.c:960 src/file.c:1155 +msgid "File already exists." +msgstr "ファイルが既に存在します。" + +#: src/file.c:1271 +#, c-format +msgid "Save changes to document \"%s\" before closing?" +msgstr "終了する前にドキュメント \"%s\" に対する変更を保存しますか?" + +#: src/file.c:1279 +msgid "Your changes will be lost if you don't save them." +msgstr "保存しないと変更したデータを失うことになります。" + +#: src/file.c:1282 +msgid "Close without saving" +msgstr "保存せずに閉じる" + +#. Should not happen +#: src/prefs.c:156 src/prefs.c:163 data/glade/prefs-dialog.glade.h:23 +#: data/glade/object-editor.glade.h:37 +msgid "points" +msgstr "ポイント" + +#: src/prefs.c:158 data/glade/object-editor.glade.h:36 +#: data/glade/template-designer.glade.h:74 +msgid "inches" +msgstr "[インチ]" + +#: src/prefs.c:160 +msgid "mm" +msgstr "[ミリ]" + +#: src/prefs-dialog.c:248 data/glade/prefs-dialog.glade.h:22 +msgid "gLabels Preferences" +msgstr "gLabels の設定" + +#. +#. * Submenu: Order +#. +#: src/view.c:3570 data/ui/glabels-ui.xml.h:157 +msgid "_Order" +msgstr "順序(_O)" + +#. +#. * Submenu: Rotate/Flip +#. +#: src/view.c:3591 data/ui/glabels-ui.xml.h:163 +msgid "_Rotate/Flip" +msgstr "回転/フリップ(_R)" + +#. +#. * Submenu: Align Horizontally +#. +#: src/view.c:3624 +msgid "Align _Horizontally" +msgstr "水平方向に配置(_H)" + +#. +#. * Submenu: Align Vertically +#. +#: src/view.c:3663 +msgid "Align _Vertically" +msgstr "垂直方向に配置(_V)" + +#: src/view.c:3724 data/ui/glabels-ui.xml.h:140 +msgid "_Delete" +msgstr "削除(_D)" + +#. Build editor. +#: src/view-box.c:223 +msgid "Box object properties" +msgstr "矩形オブジェクトのプロパティ" + +#. Build editor. +#: src/view-ellipse.c:223 +msgid "Ellipse object properties" +msgstr "楕円オブジェクトのプロパティ" + +#. Build editor. +#: src/view-line.c:223 +msgid "Line object properties" +msgstr "直線オブジェクトのプロパティ" + +#. Build editor. +#: src/view-image.c:222 +msgid "Image object properties" +msgstr "画像オブジェクトのプロパティ" + +#. Build editor. +#: src/view-text.c:250 +msgid "Text object properties" +msgstr "文字オブジェクトのプロパティ" + +#: src/view-text.c:562 data/glade/object-editor.glade.h:28 +msgid "Text" +msgstr "文字" + +#. Build editor. +#: src/view-barcode.c:209 +msgid "Barcode object properties" +msgstr "バーコード・オブジェクトのプロパティ" + +#: src/view-barcode.c:579 src/print.c:1088 +msgid "Invalid barcode data" +msgstr "おかしなバーコード・データ" + +#: src/merge-properties-dialog.c:231 +msgid "Merge Properties" +msgstr "結合プロパティ" + +#. ---- Source section ---- +#: src/merge-properties-dialog.c:237 +msgid "Source" +msgstr "ソース" + +#: src/merge-properties-dialog.c:245 +msgid "Format:" +msgstr "書式:" + +#. Location line +#: src/merge-properties-dialog.c:273 +msgid "Location:" +msgstr "場所:" + +#: src/merge-properties-dialog.c:282 src/merge-properties-dialog.c:393 +msgid "Select merge-database source" +msgstr "結合データベース・ソースの選択" + +#: src/merge-properties-dialog.c:289 src/merge-properties-dialog.c:404 +msgid "N/A" +msgstr "N/A" + +#. ---- Sample Fields section ---- +#: src/merge-properties-dialog.c:300 +msgid "Record selection/preview:" +msgstr "選択範囲/プレビューの記録:" + +#: src/merge-properties-dialog.c:326 +msgid "Select" +msgstr "選択" + +#: src/merge-properties-dialog.c:334 +msgid "Record/Field" +msgstr "レコード/フィールド" + +#: src/merge-properties-dialog.c:342 data/glade/object-editor.glade.h:9 +msgid "Data" +msgstr "データ" + +#: src/print-dialog.c:266 data/ui/glabels-ui.xml.h:82 +msgid "Print" +msgstr "印刷" + +#: src/print-dialog.c:281 +msgid "_Job" +msgstr "ジョブ(_J)" + +#: src/print-dialog.c:286 +msgid "P_rinter" +msgstr "プリンタ(_R)" + +#. ----------- Add simple-copies widget ------------ +#: src/print-dialog.c:314 +msgid "Copies" +msgstr "コピー" + +#. ------- Add merge control widget ------------ +#: src/print-dialog.c:322 +msgid "Document merge control" +msgstr "ドキュメントをコントロールにマージする" + +#. ----------- Add custom print options area ------------ +#: src/print-dialog.c:330 +msgid "Options" +msgstr "オプション" + +#: src/print-dialog.c:351 +msgid "print crop marks" +msgstr "端のマークを揃えて印刷する" + +#: src/print-dialog.c:553 src/print-dialog.c:592 +msgid "Print preview" +msgstr "印刷プレビュー" + +#: src/template-designer.c:409 data/glade/template-designer.glade.h:73 +msgid "gLabels Template Designer" +msgstr "gLabels テンプレート・デザイナ" + +#: src/bc.c:60 +msgid "POSTNET (any)" +msgstr "POSTNET (何でも)" + +#: src/bc.c:63 +msgid "POSTNET-5 (ZIP only)" +msgstr "POSTNET-5 (ZIP のみ)" + +#: src/bc.c:66 +msgid "POSTNET-9 (ZIP+4)" +msgstr "POSTNET-9 (ZIP+4)" + +#: src/bc.c:69 +msgid "POSTNET-11 (DPBC)" +msgstr "POSTNET-11 (DPBC)" + +#: src/bc.c:72 +msgid "EAN (any)" +msgstr "EAN (何でも)" + +#: src/bc.c:75 +msgid "EAN-8" +msgstr "EAN-8" + +#: src/bc.c:78 +msgid "EAN-8 +2" +msgstr "EAN-8 +2" + +#: src/bc.c:81 +msgid "EAN-8 +5" +msgstr "EAN-8 +5" + +#: src/bc.c:84 +msgid "EAN-13" +msgstr "EAN-13" + +#: src/bc.c:87 +msgid "EAN-13 +2" +msgstr "EAN-13 +2" + +#: src/bc.c:90 +msgid "EAN-13 +5" +msgstr "EAN-13 +5" + +#: src/bc.c:93 +msgid "UPC (UPC-A or UPC-E)" +msgstr "UPC (UPC-A または UPC-E)" + +#: src/bc.c:96 +msgid "UPC-A" +msgstr "UPC-A" + +#: src/bc.c:99 +msgid "UPC-A +2" +msgstr "UPC-A +2" + +#: src/bc.c:102 +msgid "UPC-A +5" +msgstr "UPC-A +5" + +#: src/bc.c:105 +msgid "UPC-E" +msgstr "UPC-E" + +#: src/bc.c:108 +msgid "UPC-E +2" +msgstr "UPC-E +2" + +#: src/bc.c:111 +msgid "UPC-E +5" +msgstr "UPC-E +5" + +#: src/bc.c:114 +msgid "ISBN" +msgstr "ISBN" + +#: src/bc.c:117 +msgid "ISBN +5" +msgstr "ISBN +5" + +#: src/bc.c:120 +msgid "Code 39" +msgstr "Code 39" + +#: src/bc.c:123 +msgid "Code 128" +msgstr "Code 128" + +#: src/bc.c:126 +msgid "Code 128C" +msgstr "Code 128C" + +#: src/bc.c:129 +msgid "Code 128B" +msgstr "Code 128B" + +#: src/bc.c:132 +msgid "Interleaved 2 of 5" +msgstr "綴じ込み 2/5" + +#: src/bc.c:135 +msgid "Codabar" +msgstr "Codabar" + +#: src/bc.c:138 +msgid "MSI" +msgstr "MSI" + +#: src/bc.c:141 +msgid "Plessey" +msgstr "Plessey" + +#: src/label.c:569 +msgid "Untitled" +msgstr "タイトルなし" + +#: src/xml-label.c:176 src/xml-label.c:213 +msgid "xmlParseFile error" +msgstr "xmlParseFile エラー" + +#: src/xml-label.c:250 +msgid "No document root" +msgstr "root ドキュメントではありません" + +#: src/xml-label.c:264 +msgid "Importing from glabels 0.1 format" +msgstr "gLabels 0.1 形式からインポートする" + +#: src/xml-label.c:272 +msgid "Importing from glabels 0.4 format" +msgstr "gLabels 0.4 形式からインポートする" + +#: src/xml-label.c:279 +msgid "Importing from glabels 1.91 format" +msgstr "gLabels 1.91 形式からインポートする" + +#: src/xml-label.c:282 +msgid "bad document, unknown glabels Namespace" +msgstr "ドキュメントの種類が間違っています。Glabels 名前空間が見つかりません。" + +#: src/xml-label.c:311 src/xml-label-04.c:75 src/xml-label-191.c:131 +#, c-format +msgid "Bad root node = \"%s\"" +msgstr "おかしな root のノード = \"%s\"" + +#: src/xml-label.c:348 src/xml-label-191.c:165 +#, c-format +msgid "bad node in Document node = \"%s\"" +msgstr "Document ノードにおかしな root のノード = \"%s\"" + +#: src/xml-label.c:393 src/xml-label-04.c:123 src/xml-label-191.c:197 +#, c-format +msgid "bad node = \"%s\"" +msgstr "おかしなノード = \"%s\"" + +#: src/xml-label.c:796 src/xml-label-191.c:605 +#, c-format +msgid "bad node in Data node = \"%s\"" +msgstr "Data ノードにおかしなノード = \"%s\"" + +#: src/xml-label.c:962 libglabels/xml-template.c:535 +msgid "Utf8 conversion error." +msgstr "Utf8 変換エラーです。" + +#: src/xml-label.c:969 libglabels/xml-template.c:542 +msgid "Problem saving xml file." +msgstr "XML ファイルの保存で問題があります" + +#. This should always be an id, but just in case a name +#. slips by! +#: src/xml-label-191.c:680 libglabels/xml-template.c:199 +#, c-format +msgid "Unknown page size id \"%s\", trying as name" +msgstr "不明なページ・サイズの ID \"%s\" です。名前として扱います。" + +#: src/xml-label-191.c:690 libglabels/xml-template.c:209 +#, c-format +msgid "Unknown page size id or name \"%s\"" +msgstr "不明なページ・サイズの ID または名前 \"%s\" です。" + +#: src/merge.c:172 src/merge.c:213 src/merge.c:399 src/merge.c:402 +msgid "None" +msgstr "なし" + +#: src/merge-init.c:53 +msgid "Text file with comma delimeters (CSV)" +msgstr "コンマで区切ったテキスト・ファイル (CSV)" + +#: src/merge-init.c:60 +msgid "Text file with colon delimeters" +msgstr "コロンで区切ったテキスト・ファイル" + +#: src/merge-init.c:67 +msgid "Text file with tab delimeters" +msgstr "タブで区切ったテキスト・ファイル" + +#: src/wdgt-image-select.c:201 data/glade/object-editor.glade.h:11 +msgid "File:" +msgstr "ファイル:" + +#: src/wdgt-image-select.c:245 data/glade/object-editor.glade.h:16 +msgid "Key:" +msgstr "キー:" + +#: src/wdgt-print-copies.c:179 +msgid "Sheets:" +msgstr "用紙:" + +#: src/wdgt-print-copies.c:197 +msgid "Labels" +msgstr "ラベル" + +#: src/wdgt-print-copies.c:200 +msgid "from:" +msgstr "開始:" + +#: src/wdgt-print-copies.c:207 +msgid "to:" +msgstr "終了:" + +#: src/wdgt-print-merge.c:178 +msgid "Start on label" +msgstr "ラベルの開始" + +#: src/wdgt-print-merge.c:186 +msgid "on 1st sheet" +msgstr "(最初のシート)" + +#: src/wdgt-print-merge.c:195 +msgid "Copies:" +msgstr "コピー:" + +#: src/wdgt-print-merge.c:201 +msgid "Collate" +msgstr "製本" + +#: src/wdgt-media-select.c:269 data/glade/template-designer.glade.h:29 +msgid "Description:" +msgstr "説明:" + +#: src/wdgt-media-select.c:279 data/glade/template-designer.glade.h:53 +msgid "Page size:" +msgstr "用紙のサイズ:" + +#: src/wdgt-media-select.c:290 +msgid "Label size:" +msgstr "ラベルのサイズ:" + +#: src/wdgt-media-select.c:301 +msgid "Layout:" +msgstr "レイアウト:" + +#: src/wdgt-media-select.c:578 +#, c-format +msgid "%d x %d (%d per sheet)" +msgstr "%d x %d (%d 個/シート)" + +#: src/wdgt-media-select.c:582 +#, c-format +msgid "%d per sheet" +msgstr "%d /シート" + +#: src/wdgt-media-select.c:614 +#, c-format +msgid "%s x %s %s" +msgstr "%s x %s %s" + +#: src/wdgt-media-select.c:619 +#, c-format +msgid "%.5g x %.5g %s" +msgstr "%.5g x %.5g %s" + +#: src/wdgt-media-select.c:630 src/wdgt-media-select.c:644 +#, c-format +msgid "%s %s diameter" +msgstr "%s %s 倍率" + +#: src/wdgt-media-select.c:634 src/wdgt-media-select.c:648 +#, c-format +msgid "%.5g %s diameter" +msgstr "%.5g %s 倍率" + +#: src/wdgt-rotate-label.c:193 +msgid "Rotate" +msgstr "回転させる" + +#. This is the default custom color +#: src/mygal/color-palette.c:396 +msgid "custom" +msgstr "カスタム" + +#. "Custom" color - we'll pop up a GnomeColorPicker +#: src/mygal/color-palette.c:438 +msgid "Custom Color:" +msgstr "カスタム色:" + +#: src/mygal/color-palette.c:446 +msgid "Choose Custom Color" +msgstr "カスタム・カラーの選択" + +#: src/mygal/color-palette.c:579 +msgid "black" +msgstr "黒" + +#: src/mygal/color-palette.c:580 +msgid "light brown" +msgstr "淡い茶" + +#: src/mygal/color-palette.c:581 +msgid "brown gold" +msgstr "茶銀" + +#: src/mygal/color-palette.c:582 +msgid "dark green #2" +msgstr "暗い緑 #2" + +#: src/mygal/color-palette.c:583 +msgid "navy" +msgstr "ネービー" + +#: src/mygal/color-palette.c:584 src/mygal/color-palette.c:640 +msgid "dark blue" +msgstr "暗い青" + +#: src/mygal/color-palette.c:585 +msgid "purple #2" +msgstr "ç´« #2" + +#: src/mygal/color-palette.c:586 +msgid "very dark gray" +msgstr "とても暗い灰" + +#: src/mygal/color-palette.c:589 src/mygal/color-palette.c:645 +msgid "dark red" +msgstr "暗い赤" + +#: src/mygal/color-palette.c:590 +msgid "red-orange" +msgstr "赤みの橙" + +#: src/mygal/color-palette.c:591 +msgid "gold" +msgstr "金" + +#: src/mygal/color-palette.c:592 +msgid "dark green" +msgstr "暗い緑" + +#: src/mygal/color-palette.c:593 src/mygal/color-palette.c:646 +msgid "dull blue" +msgstr "くすんだ青" + +#: src/mygal/color-palette.c:594 src/mygal/color-palette.c:647 +msgid "blue" +msgstr "青" + +#: src/mygal/color-palette.c:595 +msgid "dull purple" +msgstr "くすんだ紫" + +#: src/mygal/color-palette.c:596 +msgid "dark grey" +msgstr "暗い灰" + +#: src/mygal/color-palette.c:599 +msgid "red" +msgstr "赤" + +#: src/mygal/color-palette.c:600 +msgid "orange" +msgstr "橙" + +#: src/mygal/color-palette.c:601 +msgid "lime" +msgstr "ライム" + +#: src/mygal/color-palette.c:602 +msgid "dull green" +msgstr "くすんだ緑" + +#: src/mygal/color-palette.c:603 +msgid "dull blue #2" +msgstr "くすんだ青 #2" + +#: src/mygal/color-palette.c:604 +msgid "sky blue #2" +msgstr "スカイブルー #2" + +#: src/mygal/color-palette.c:605 src/mygal/color-palette.c:644 +msgid "purple" +msgstr "ç´«" + +#: src/mygal/color-palette.c:606 +msgid "gray" +msgstr "灰" + +#: src/mygal/color-palette.c:609 src/mygal/color-palette.c:641 +msgid "magenta" +msgstr "マゼンタ" + +#: src/mygal/color-palette.c:610 +msgid "bright orange" +msgstr "明るい橙" + +#: src/mygal/color-palette.c:611 src/mygal/color-palette.c:642 +msgid "yellow" +msgstr "黄" + +#: src/mygal/color-palette.c:612 +msgid "green" +msgstr "緑" + +#: src/mygal/color-palette.c:613 src/mygal/color-palette.c:643 +msgid "cyan" +msgstr "シアン" + +#: src/mygal/color-palette.c:614 +msgid "bright blue" +msgstr "明るい青" + +#: src/mygal/color-palette.c:615 src/mygal/color-palette.c:632 +msgid "red purple" +msgstr "赤紫" + +#: src/mygal/color-palette.c:616 +msgid "light grey" +msgstr "淡い灰" + +#: src/mygal/color-palette.c:619 src/mygal/color-palette.c:636 +msgid "pink" +msgstr "ピンク" + +#: src/mygal/color-palette.c:620 +msgid "light orange" +msgstr "淡い橙" + +#: src/mygal/color-palette.c:621 src/mygal/color-palette.c:633 +msgid "light yellow" +msgstr "淡い黄" + +#: src/mygal/color-palette.c:622 +msgid "light green" +msgstr "淡い緑" + +#: src/mygal/color-palette.c:623 +msgid "light cyan" +msgstr "淡いシアン" + +#: src/mygal/color-palette.c:624 src/mygal/color-palette.c:634 +msgid "light blue" +msgstr "淡い青" + +#: src/mygal/color-palette.c:625 src/mygal/color-palette.c:638 +msgid "light purple" +msgstr "淡い紫" + +#: src/mygal/color-palette.c:626 +msgid "white" +msgstr "白" + +#: src/mygal/color-palette.c:631 +msgid "purplish blue" +msgstr "紫みの青" + +#: src/mygal/color-palette.c:635 +msgid "dark purple" +msgstr "暗い紫" + +#: src/mygal/color-palette.c:637 +msgid "sky blue" +msgstr "スカイブルー" + +#: libglabels/template.c:848 +#, c-format +msgid "Generic %s full page" +msgstr "Generic %s フル・ページ" + +#: libglabels/template.c:897 +msgid "No template files found!" +msgstr "テンプレート・ファイルが見つかりません!" + +#. Create and append an "Other" entry. +#: libglabels/paper.c:67 +msgid "Other" +msgstr "その他" + +#: libglabels/paper.c:361 +msgid "No paper files found!" +msgstr "用紙ふぃあるが見つかりません!" + +#: data/ui/glabels-ui.xml.h:1 +msgid "About glabels" +msgstr "gLabels について" + +#: data/ui/glabels-ui.xml.h:2 +msgid "About..." +msgstr "情報..." + +#: data/ui/glabels-ui.xml.h:3 +msgid "Align _Horizontal" +msgstr "水平方向に配置(_H)" + +#: data/ui/glabels-ui.xml.h:4 +msgid "Align _Vertical" +msgstr "垂直方向に配置(_V)" + +#: data/ui/glabels-ui.xml.h:5 +msgid "Align objects to bottoms" +msgstr "オブジェクトを下端に配置します" + +#: data/ui/glabels-ui.xml.h:6 +msgid "Align objects to horizontal centers" +msgstr "オブジェクトを水平方向の中心に配置します" + +#: data/ui/glabels-ui.xml.h:7 +msgid "Align objects to left edges" +msgstr "オブジェクトを左端に配置します" + +#: data/ui/glabels-ui.xml.h:8 +msgid "Align objects to right edges" +msgstr "オブジェクトを右端に配置します" + +#: data/ui/glabels-ui.xml.h:9 +msgid "Align objects to tops" +msgstr "オブジェクトを上端に配置します" + +#: data/ui/glabels-ui.xml.h:10 +msgid "Align objects to vertical centers" +msgstr "オブジェクトを垂直方向の中心に配置します" + +#: data/ui/glabels-ui.xml.h:12 +msgid "Bold" +msgstr "文字を太字にします" + +#: data/ui/glabels-ui.xml.h:14 +msgid "Center align" +msgstr "中央に揃えます" + +#: data/ui/glabels-ui.xml.h:15 +msgid "Center objects to horizontal label center" +msgstr "オブジェクトをラベルの中心に水平移動します" + +#: data/ui/glabels-ui.xml.h:16 +msgid "Center objects to vertical label center" +msgstr "オブジェクトをラベルの中心に垂直移動します" + +#: data/ui/glabels-ui.xml.h:17 +msgid "Change the visibility of markup lines in the current window" +msgstr "ラベルの外枠線の表示/非表示を変更します" + +#: data/ui/glabels-ui.xml.h:18 +msgid "Change the visibility of the drawing toolbar in the current window" +msgstr "ツールバーの表示/非表示を変更します" + +#: data/ui/glabels-ui.xml.h:19 +msgid "Change the visibility of the grid in the current window" +msgstr "ラベルのグリッド (格子線) の表示/非表示を変更します" + +#: data/ui/glabels-ui.xml.h:20 +msgid "Change the visibility of the main toolbar in the current window" +msgstr "メイン・ツールバーの表示/非表示を変更します" + +#: data/ui/glabels-ui.xml.h:21 +msgid "Change the visibility of the property toolbar in the current window" +msgstr "プロパティ・ツールバーの表示/非表示を変更します" + +#: data/ui/glabels-ui.xml.h:22 +msgid "Close" +msgstr "閉じる" + +#: data/ui/glabels-ui.xml.h:23 +msgid "Close the current file" +msgstr "このファイルを閉じます" + +#: data/ui/glabels-ui.xml.h:24 +msgid "Configure the application" +msgstr "gLabel の設定を変更します" + +#: data/ui/glabels-ui.xml.h:25 +msgid "Contents" +msgstr "目次" + +#: data/ui/glabels-ui.xml.h:26 +msgid "Copy" +msgstr "コピー" + +#: data/ui/glabels-ui.xml.h:27 +msgid "Copy the selection" +msgstr "選択範囲をコピーします" + +#: data/ui/glabels-ui.xml.h:28 +msgid "Create a custom template" +msgstr "カスタム・テンプレートを生成します" + +#: data/ui/glabels-ui.xml.h:29 +msgid "Create a new document" +msgstr "新しいドキュメントを作成します" + +#: data/ui/glabels-ui.xml.h:30 +msgid "Create barcode object" +msgstr "バーコード・オブジェクトを作成します" + +#: data/ui/glabels-ui.xml.h:31 +msgid "Create box/rectangle object" +msgstr "四角/三角のオブジェクトを作成します" + +#: data/ui/glabels-ui.xml.h:32 +msgid "Create ellipse/circle object" +msgstr "楕円/円オブジェクトを作成します" + +#: data/ui/glabels-ui.xml.h:33 +msgid "Create image object" +msgstr "画像オブジェクトを作成します" + +#: data/ui/glabels-ui.xml.h:34 +msgid "Create line object" +msgstr "直線オブジェクトを作成します" + +#: data/ui/glabels-ui.xml.h:35 +msgid "Create text object" +msgstr "文字オブジェクトを作成します" + +#: data/ui/glabels-ui.xml.h:36 +msgid "Cu_t" +msgstr "切り取り(_T)" + +#: data/ui/glabels-ui.xml.h:37 +msgid "Customize" +msgstr "カスタマイズ" + +#: data/ui/glabels-ui.xml.h:38 +msgid "Customize Drawing Toolbar" +msgstr "ツールバー" + +#: data/ui/glabels-ui.xml.h:39 +msgid "Customize Main Toolbar" +msgstr "メイン・ツールバー" + +#: data/ui/glabels-ui.xml.h:40 +msgid "Customize Property Toolbar" +msgstr "プロパティ・ツールバー" + +#: data/ui/glabels-ui.xml.h:41 +msgid "Customize toolbars" +msgstr "ツールバーのカスタマイズ" + +#: data/ui/glabels-ui.xml.h:42 +msgid "Cut" +msgstr "切り取り" + +#: data/ui/glabels-ui.xml.h:43 +msgid "Cut the selection" +msgstr "選択範囲を切り取ります" + +#: data/ui/glabels-ui.xml.h:44 +msgid "Decrease magnification" +msgstr "拡大率を下げます" + +#: data/ui/glabels-ui.xml.h:45 +msgid "Delete" +msgstr "削除" + +#: data/ui/glabels-ui.xml.h:46 +msgid "Delete the selected objects" +msgstr "選択したオブジェクトを削除します" + +#: data/ui/glabels-ui.xml.h:47 +msgid "Drawing toolbar" +msgstr "ツールバーの表示方法" + +#: data/ui/glabels-ui.xml.h:48 +msgid "Dump XML" +msgstr "XML のダンプ" + +#: data/ui/glabels-ui.xml.h:49 +msgid "Dump the UI Xml description" +msgstr "GUI の XML 記述をダンプ表示します" + +#: data/ui/glabels-ui.xml.h:50 +msgid "Edit merge properties" +msgstr "結合プロパティを編集します" + +#: data/ui/glabels-ui.xml.h:54 +msgid "Flip object horizontally" +msgstr "オブジェクトを水平方向にひっくり返します" + +#: data/ui/glabels-ui.xml.h:55 +msgid "Flip object vertically" +msgstr "オブジェクトを垂直方向にひっくり返します" + +#: data/ui/glabels-ui.xml.h:56 +msgid "Font name" +msgstr "フォント名です" + +#: data/ui/glabels-ui.xml.h:57 +msgid "Font selector" +msgstr "フォント・セレクタ" + +#: data/ui/glabels-ui.xml.h:58 +msgid "Font size" +msgstr "フォント・サイズです" + +#: data/ui/glabels-ui.xml.h:59 +msgid "Icon and _Text" +msgstr "アイコンとラベル(_T)" + +#: data/ui/glabels-ui.xml.h:60 +msgid "Increase magnification" +msgstr "拡大率を上げます" + +#: data/ui/glabels-ui.xml.h:61 +msgid "Italic" +msgstr "文字を斜体にします" + +#: data/ui/glabels-ui.xml.h:63 +msgid "Left align" +msgstr "左に寄せませす" + +#: data/ui/glabels-ui.xml.h:65 +msgid "Line width" +msgstr "線の幅を選択します" + +#: data/ui/glabels-ui.xml.h:66 +msgid "Lower object to bottom" +msgstr "オブジェクトを後ろに回します" + +#: data/ui/glabels-ui.xml.h:67 +msgid "M_arkup" +msgstr "マークアップ(_A)" + +#: data/ui/glabels-ui.xml.h:68 +msgid "Main toolbar" +msgstr "メイン・ツールバー" + +#: data/ui/glabels-ui.xml.h:69 +msgid "Markup" +msgstr "マークアップ" + +#: data/ui/glabels-ui.xml.h:70 +msgid "Modify document properties" +msgstr "ドキュメントのプロパティを修正します" + +#: data/ui/glabels-ui.xml.h:71 +msgid "New" +msgstr "新規" + +#: data/ui/glabels-ui.xml.h:72 +msgid "Object property editor" +msgstr "オブジェクト・プロパティのエディタ" + +#: data/ui/glabels-ui.xml.h:73 +msgid "Only show icons in the drawing toolbar" +msgstr "ツールバーの中にアイコンのみ表示します" + +#: data/ui/glabels-ui.xml.h:74 +msgid "Only show icons in the main toolbar" +msgstr "メイン・ツールバーの中にアイコンのみ表示します" + +#: data/ui/glabels-ui.xml.h:76 +msgid "Open a file" +msgstr "ファイルを開きます" + +#: data/ui/glabels-ui.xml.h:77 +msgid "Open the glabels manual" +msgstr "gLabeles のマニュアルを開きます" + +#: data/ui/glabels-ui.xml.h:78 +msgid "Paste" +msgstr "貼り付け" + +#: data/ui/glabels-ui.xml.h:79 +msgid "Paste the clipboard" +msgstr "クリップボードの内容を貼り付けます" + +#: data/ui/glabels-ui.xml.h:80 +msgid "Pr_eferences..." +msgstr "設定(_E)..." + +#: data/ui/glabels-ui.xml.h:81 +msgid "Preferences" +msgstr "gLabel の設定" + +#: data/ui/glabels-ui.xml.h:83 +msgid "Print the current file" +msgstr "このファイルを印刷します" + +#: data/ui/glabels-ui.xml.h:84 +msgid "Proper_ties..." +msgstr "プロパティ(_T)..." + +#: data/ui/glabels-ui.xml.h:85 +msgid "Properties" +msgstr "プロパティ" + +#: data/ui/glabels-ui.xml.h:86 +msgid "Property toolbar" +msgstr "プロパティのツールバー" + +#: data/ui/glabels-ui.xml.h:87 +msgid "Quit" +msgstr "終了" + +#: data/ui/glabels-ui.xml.h:88 +msgid "Quit the program" +msgstr "gLabels を終了します" + +#: data/ui/glabels-ui.xml.h:89 +msgid "Raise object to top" +msgstr "オブジェクトを前に持ってきます" + +#: data/ui/glabels-ui.xml.h:90 +msgid "Recent _Files" +msgstr "最近開いたファイル(_F)" + +#: data/ui/glabels-ui.xml.h:91 +msgid "Redo" +msgstr "やり直し" + +#: data/ui/glabels-ui.xml.h:92 +msgid "Redo the undone action" +msgstr "完了していない操作をやり直します" + +#: data/ui/glabels-ui.xml.h:93 +msgid "Remove all selections" +msgstr "選択範囲を解除します" + +#: data/ui/glabels-ui.xml.h:95 +#, no-c-format +msgid "Restore scale to 100%" +msgstr "拡大率を 100% に戻します" + +#: data/ui/glabels-ui.xml.h:96 +msgid "Right align" +msgstr "右に寄せます" + +#: data/ui/glabels-ui.xml.h:99 +msgid "Rotate object 90 clockwise" +msgstr "オブジェクトを時計回りに 90°回転させます" + +#: data/ui/glabels-ui.xml.h:100 +msgid "Rotate object 90 counter-clockwise" +msgstr "オブジェクトを反時計回りに 90°回転させます" + +#: data/ui/glabels-ui.xml.h:101 +msgid "Save" +msgstr "保存" + +#: data/ui/glabels-ui.xml.h:102 +msgid "Save As" +msgstr "名前を付けて保存" + +#: data/ui/glabels-ui.xml.h:103 +msgid "Save _As..." +msgstr "別名で保存(_A)..." + +#: data/ui/glabels-ui.xml.h:104 +msgid "Save the current file" +msgstr "このファイルを保存します" + +#: data/ui/glabels-ui.xml.h:105 +msgid "Save the current file with a different name" +msgstr "このデータに別の名前を付けて保存します" + +#: data/ui/glabels-ui.xml.h:106 +msgid "Select All" +msgstr "全て選択" + +#: data/ui/glabels-ui.xml.h:107 +msgid "Select _All" +msgstr "全て選択(_A)" + +#: data/ui/glabels-ui.xml.h:108 +msgid "Select all objects" +msgstr "全てのオブジェクトを選択します" + +#: data/ui/glabels-ui.xml.h:109 +msgid "Select, move and modify objects" +msgstr "オブジェクトの選択、移動、編集を行います" + +#: data/ui/glabels-ui.xml.h:111 +msgid "Set drawing toolbar button style according to desktop default" +msgstr "デスクトップの設定に従ってツールバーを表示します" + +#: data/ui/glabels-ui.xml.h:112 +msgid "Set main toolbar button style according to desktop default" +msgstr "デスクトップの設定に従ってメイン・ツールバーを表示します" + +#: data/ui/glabels-ui.xml.h:113 +msgid "Show _Tooltips" +msgstr "ツールチップの表示(_T)" + +#: data/ui/glabels-ui.xml.h:114 +msgid "Show both icons and texts in the drawing toolbar" +msgstr "ツールバーにアイコンとラベルの両方を表示します" + +#: data/ui/glabels-ui.xml.h:115 +msgid "Show both icons and texts in the main toolbar" +msgstr "メイン・ツールバーにアイコンとラベルの両方を表示します" + +#: data/ui/glabels-ui.xml.h:116 +msgid "Show tooltips in the drawing toolbar" +msgstr "ツールバーにツールチップを表示します" + +#: data/ui/glabels-ui.xml.h:117 +msgid "Show tooltips in the main toolbar" +msgstr "メイン・ツールバーにツールチップを表示します" + +#: data/ui/glabels-ui.xml.h:118 +msgid "Show tooltips in the property toolbar" +msgstr "プロパティ・ツールバーにツールチップを表示します" + +#: data/ui/glabels-ui.xml.h:119 +msgid "Template Designer" +msgstr "テンプレート・デザイナ" + +#: data/ui/glabels-ui.xml.h:120 +msgid "Template _Designer..." +msgstr "テンプレート・デザイナ(_D)..." + +#: data/ui/glabels-ui.xml.h:121 +msgid "Text color" +msgstr "文字の色を選択します" + +#: data/ui/glabels-ui.xml.h:122 +msgid "U_n-select All" +msgstr "全て選択解除(_N)" + +#: data/ui/glabels-ui.xml.h:123 +msgid "Un-select All" +msgstr "全て選択解除" + +#: data/ui/glabels-ui.xml.h:124 +msgid "Undo" +msgstr "元に戻す" + +#: data/ui/glabels-ui.xml.h:125 +msgid "Undo the last action" +msgstr "最後の操作を取り消します" + +#: data/ui/glabels-ui.xml.h:126 +msgid "Zoom _1:1" +msgstr "拡大率 1:1(_1)" + +#: data/ui/glabels-ui.xml.h:127 +msgid "Zoom _In" +msgstr "拡大(_I)" + +#: data/ui/glabels-ui.xml.h:128 +msgid "Zoom _Out" +msgstr "縮小(_O)" + +#: data/ui/glabels-ui.xml.h:129 +msgid "Zoom to _fit" +msgstr "ウィンドウにあわせる(_F)" + +#: data/ui/glabels-ui.xml.h:130 +msgid "Zoom to fit window" +msgstr "ウィンドウのサイズに合わせます" + +#: data/ui/glabels-ui.xml.h:131 +msgid "_About..." +msgstr "情報(_A)..." + +#: data/ui/glabels-ui.xml.h:132 +msgid "_Bottoms" +msgstr "下部(_B)" + +#: data/ui/glabels-ui.xml.h:135 +msgid "_Close" +msgstr "閉じる(_C)" + +#: data/ui/glabels-ui.xml.h:136 +msgid "_Contents" +msgstr "目次(_C)" + +#: data/ui/glabels-ui.xml.h:137 +msgid "_Copy" +msgstr "複写(_C)" + +#: data/ui/glabels-ui.xml.h:138 +msgid "_Create Object" +msgstr "オブジェクトの生成(_C)" + +#: data/ui/glabels-ui.xml.h:139 +msgid "_Debug" +msgstr "デバッグ(_D)" + +#: data/ui/glabels-ui.xml.h:141 +msgid "_Desktop Default" +msgstr "デスクトップ設定(_D)" + +#: data/ui/glabels-ui.xml.h:142 +msgid "_Drawing Toolbar" +msgstr "ツールバー(_D)" + +#: data/ui/glabels-ui.xml.h:143 +msgid "_Edit" +msgstr "編集(_E)" + +#: data/ui/glabels-ui.xml.h:145 +msgid "_File" +msgstr "ファイル(_F)" + +#: data/ui/glabels-ui.xml.h:146 +msgid "_Grid" +msgstr "グリッド(_G)" + +#: data/ui/glabels-ui.xml.h:147 +msgid "_Help" +msgstr "ヘルプ(_H)" + +#: data/ui/glabels-ui.xml.h:148 +msgid "_Icon" +msgstr "アイコン(_I)" + +#: data/ui/glabels-ui.xml.h:152 +msgid "_Main Toolbar" +msgstr "メイン・ツールバー(_M)" + +#: data/ui/glabels-ui.xml.h:153 +msgid "_Merge Properties..." +msgstr "結合プロパティ(_M)..." + +#: data/ui/glabels-ui.xml.h:154 +msgid "_New" +msgstr "新規(_N)" + +#: data/ui/glabels-ui.xml.h:155 +msgid "_Objects" +msgstr "オブジェクト(_O)" + +#: data/ui/glabels-ui.xml.h:156 +msgid "_Open..." +msgstr "開く(_O)..." + +#: data/ui/glabels-ui.xml.h:158 +msgid "_Paste" +msgstr "貼り付け(_P)" + +#: data/ui/glabels-ui.xml.h:159 +msgid "_Print..." +msgstr "印刷(_P)..." + +#: data/ui/glabels-ui.xml.h:160 +msgid "_Property Toolbar" +msgstr "プロパティ・ツールバー(_P)" + +#: data/ui/glabels-ui.xml.h:161 +msgid "_Quit" +msgstr "終了(_Q)" + +#: data/ui/glabels-ui.xml.h:164 +msgid "_Save" +msgstr "保存(_S)" + +#: data/ui/glabels-ui.xml.h:168 +msgid "_View" +msgstr "表示(_V)" + +#: data/glade/prefs-dialog.glade.h:1 +msgid " " +msgstr " " + +#: data/glade/prefs-dialog.glade.h:2 data/glade/object-editor.glade.h:1 +#: data/glade/template-designer.glade.h:5 +msgid "*" +msgstr "*" + +#: data/glade/prefs-dialog.glade.h:3 +msgid "Default page size" +msgstr "ページ・サイズの初期値" + +#: data/glade/prefs-dialog.glade.h:4 +msgid "Fill" +msgstr "塗りつぶし" + +#: data/glade/prefs-dialog.glade.h:5 +msgid "Line" +msgstr "線" + +#: data/glade/prefs-dialog.glade.h:6 +msgid "Text" +msgstr "文字" + +#: data/glade/prefs-dialog.glade.h:7 +msgid "Units" +msgstr "単位" + +#: data/glade/prefs-dialog.glade.h:8 data/glade/object-editor.glade.h:4 +msgid "Alignment:" +msgstr "位置:" + +#: data/glade/prefs-dialog.glade.h:9 data/glade/object-editor.glade.h:8 +msgid "Color:" +msgstr "色:" + +#: data/glade/prefs-dialog.glade.h:10 +msgid "Font:" +msgstr "フォント:" + +#: data/glade/prefs-dialog.glade.h:11 +msgid "ISO A4" +msgstr "ISO A4 版" + +#: data/glade/prefs-dialog.glade.h:12 +msgid "Inches" +msgstr "インチ" + +#: data/glade/prefs-dialog.glade.h:13 data/glade/object-editor.glade.h:19 +msgid "Line Spacing:" +msgstr "行間:" + +#: data/glade/prefs-dialog.glade.h:14 +msgid "Locale" +msgstr "ローケル" + +#: data/glade/prefs-dialog.glade.h:15 +msgid "Millimeters" +msgstr "ミリ" + +#: data/glade/prefs-dialog.glade.h:16 +msgid "Object defaults" +msgstr "オブジェクトのデフォルト" + +#: data/glade/prefs-dialog.glade.h:17 +msgid "Points" +msgstr "ポイント" + +#: data/glade/prefs-dialog.glade.h:18 +msgid "Select default properties for new objects." +msgstr "新規に作成するオブジェクトのデフォルト値を選択して下さい。" + +#: data/glade/prefs-dialog.glade.h:19 +msgid "Select locale specific behavior." +msgstr "利用する言語 (ロケール) に依存する動作を選択して下さい。" + +#: data/glade/prefs-dialog.glade.h:20 data/templates/paper-sizes.xml.h:25 +msgid "US Letter" +msgstr "US レター" + +#: data/glade/prefs-dialog.glade.h:21 data/glade/object-editor.glade.h:29 +#: data/glade/template-designer.glade.h:72 +msgid "Width:" +msgstr "幅:" + +#: data/glade/object-editor.glade.h:2 +msgid "00000000000 00000" +msgstr "00000000000 00000" + +#: data/glade/object-editor.glade.h:3 +msgid "Xxx object properties" +msgstr "" +"Xxx オブジェクトのプロパティ" + +#: data/glade/object-editor.glade.h:5 +msgid "Allow merge to automatically shrink text" +msgstr "自動的に文字を小さくして結合できるようにする" + +#: data/glade/object-editor.glade.h:6 +msgid "Angle:" +msgstr "角度:" + +#: data/glade/object-editor.glade.h:7 +msgid "Checksum" +msgstr "チェックサム" + +#: data/glade/object-editor.glade.h:10 +msgid "Family:" +msgstr "ファミリ:" + +#: data/glade/object-editor.glade.h:12 +msgid "Fill" +msgstr "塗りつぶし" + +#: data/glade/object-editor.glade.h:13 data/glade/template-designer.glade.h:33 +msgid "Height:" +msgstr "高さ:" + +#: data/glade/object-editor.glade.h:14 +msgid "Image" +msgstr "画像" + +#: data/glade/object-editor.glade.h:15 +msgid "Insert merge field" +msgstr "結合フィールドの挿入" + +#: data/glade/object-editor.glade.h:17 +msgid "Length:" +msgstr "長さ:" + +#: data/glade/object-editor.glade.h:18 +msgid "Line" +msgstr "直線" + +#: data/glade/object-editor.glade.h:20 +msgid "Literal:" +msgstr "リテラル:" + +#: data/glade/object-editor.glade.h:21 +msgid "Load image" +msgstr "画像の読み込み" + +#: data/glade/object-editor.glade.h:22 +msgid "Position" +msgstr "位置" + +#: data/glade/object-editor.glade.h:23 +msgid "Reset image size" +msgstr "画像サイズのリセット" + +#: data/glade/object-editor.glade.h:24 +msgid "Size" +msgstr "サイズ" + +#: data/glade/object-editor.glade.h:25 +msgid "Size:" +msgstr "サイズ:" + +#: data/glade/object-editor.glade.h:26 +msgid "Style" +msgstr "スタイル" + +#: data/glade/object-editor.glade.h:27 +msgid "Style:" +msgstr "スタイル:" + +#: data/glade/object-editor.glade.h:30 +msgid "X:" +msgstr "X:" + +#: data/glade/object-editor.glade.h:31 +msgid "Y:" +msgstr "Y:" + +#: data/glade/object-editor.glade.h:32 +msgid "degrees" +msgstr "度" + +#: data/glade/object-editor.glade.h:33 +msgid "dialog1" +msgstr "dialog1" + +#: data/glade/object-editor.glade.h:34 +msgid "digits:" +msgstr "桁数:" + +#: data/glade/object-editor.glade.h:35 +msgid "format:" +msgstr "書式:" + +#: data/glade/template-designer.glade.h:1 +msgid " " +msgstr " " + +#: data/glade/template-designer.glade.h:2 +msgid "(e.g., \"Mailing Labels,\" \"Business Cards,\" ...)" +msgstr "(例: \"封筒のラベル\", \"名刺\", ...)" + +#: data/glade/template-designer.glade.h:3 +msgid "(e.g., 8163A)" +msgstr "(例: 8163A)" + +#: data/glade/template-designer.glade.h:4 +msgid "(e.g., Avery, Acme, ...)" +msgstr "(例: Avery, Acme, ...)" + +#: data/glade/template-designer.glade.h:6 +msgid "1. Outer radius:" +msgstr "1. 外径:" + +#: data/glade/template-designer.glade.h:7 +msgid "1. Radius:" +msgstr "1. 半径:" + +#: data/glade/template-designer.glade.h:8 +msgid "1. Width:" +msgstr "1. 幅:" + +#: data/glade/template-designer.glade.h:9 +msgid "2. Height:" +msgstr "2. 高さ:" + +#: data/glade/template-designer.glade.h:10 +msgid "2. Inner radius:" +msgstr "2. インナーの半径:" + +#: data/glade/template-designer.glade.h:11 +msgid "2. Waste (overprint allowed):" +msgstr "2. 余分な部分 (重ね刷り可):" + +#: data/glade/template-designer.glade.h:12 +msgid "3. Clipping width:" +msgstr "3. クリッピングの幅:" + +#: data/glade/template-designer.glade.h:13 +msgid "3. Margin" +msgstr "3. 余白" + +#: data/glade/template-designer.glade.h:14 +msgid "3. Round (radius of corner):" +msgstr "3. コーナー (角度):" + +#: data/glade/template-designer.glade.h:15 +msgid "4. Clipping height:" +msgstr "4. クリッピングの高さ:" + +#: data/glade/template-designer.glade.h:16 +msgid "4. Horiz. waste (overprint allowed):" +msgstr "4. 水平方向の余分な部分 (重ね刷り可):" + +#: data/glade/template-designer.glade.h:17 +msgid "5. Vert. waste (overprint allowed):" +msgstr "5. 垂直方向の余分な部分 (重ね刷り可):" + +#: data/glade/template-designer.glade.h:18 +msgid "5. Waste (overprint allowed):" +msgstr "5. 余分な部分 (重ね刷り可):" + +#: data/glade/template-designer.glade.h:19 +msgid "6. Margin" +msgstr "6. 余白" + +#: data/glade/template-designer.glade.h:20 +msgid "Brand/Manufacturer:" +msgstr "ブランド/製造元:" + +#: data/glade/template-designer.glade.h:21 +msgid "CD/DVD (including credit card CDs)" +msgstr "CD/DVD の形 (含むクレジット・カード CD)" + +#: data/glade/template-designer.glade.h:22 +msgid "" +"Congratulations!\n" +"\n" +"You have completed the gLabels Template Designer.\n" +"If you wish to accept and save your design, click \"Apply.\"\n" +"\n" +"Otherwise, you may click \"Cancel\" to abandon your design\n" +"or \"Back\" to continue editing this design." +msgstr "" +"おめでとうございます!\n" +"\n" +"gLabels テンプレートの生成が完了しました。\n" +"このデザインを採用し保存する場合は、[適用] をクリックして下さい。\n" +"\n" +"[キャンセル] をクリックするとデザインを破棄することができます。\n" +"または [戻る] をクリックするとやり直すことが可能です。" + +#: data/glade/template-designer.glade.h:30 +msgid "Design Completed" +msgstr "デザインが完了しました" + +#: data/glade/template-designer.glade.h:31 +msgid "Distance from left edge (x0):" +msgstr "左上隅からの距離 (x0):" + +#: data/glade/template-designer.glade.h:32 +msgid "Distance from top edge (y0):" +msgstr "左上隅からの距離 (y0):" + +#: data/glade/template-designer.glade.h:34 +msgid "Horizontal pitch (dx):" +msgstr "水平方向のピッチ (dx):" + +#: data/glade/template-designer.glade.h:35 +msgid "" +"How many layouts will your template contain? \n" +"\n" +"A layout is a set of labels or cards that can be arranged in a simple grid.\n" +"Most templates only need one layout, as in the first example.\n" +"The second example illustrates when two layouts are needed." +msgstr "" +"何個のラベルをテンプレートの中に作成しますか?\n" +"\n" +"レイアウトはラベルまたはカードの集まりで、それらを格子状に配置することができ" +"ます。\n" +"最初のサンプルのように、ほとんどのテンプレートではレイアウトは一つで十分で" +"す。\n" +"二番目のサンプルでは、二つのレイアウトが必要な場合を図にしたものです。" + +#: data/glade/template-designer.glade.h:40 +msgid "Label Size (CD/DVD)" +msgstr "ラベルのサイズ (CD/DVD)" + +#: data/glade/template-designer.glade.h:41 +msgid "Label Size (Round)" +msgstr "ラベルのサイズ (円)" + +#: data/glade/template-designer.glade.h:42 +msgid "Label or Card Shape" +msgstr "ラベルまたはカードの形状" + +#: data/glade/template-designer.glade.h:43 +msgid "Label or Card Size (Rectangular)" +msgstr "ラベルまたはカードのサイズ (長方形)" + +#: data/glade/template-designer.glade.h:44 +msgid "Layout #1" +msgstr "レイアウト #1:" + +#: data/glade/template-designer.glade.h:45 +msgid "Layout #2" +msgstr "レイアウト #2:" + +#: data/glade/template-designer.glade.h:46 +msgid "Layout(s)" +msgstr "レイアウト" + +#: data/glade/template-designer.glade.h:47 +msgid "Name and Description" +msgstr "名前と説明" + +#: data/glade/template-designer.glade.h:48 +msgid "Number across (nx):" +msgstr "横方向の数 (nx):" + +#: data/glade/template-designer.glade.h:49 +msgid "Number down (ny):" +msgstr "縦方向の数 (ny):" + +#: data/glade/template-designer.glade.h:50 +msgid "Number of Layouts" +msgstr "レイアウトの数" + +#: data/glade/template-designer.glade.h:51 +msgid "Number of layouts:" +msgstr "レイアウトの数:" + +#: data/glade/template-designer.glade.h:52 +msgid "Page Size" +msgstr "用紙のサイズ" + +#: data/glade/template-designer.glade.h:54 +msgid "Part #:" +msgstr "パート番号" + +#: data/glade/template-designer.glade.h:55 +msgid "" +"Please enter the following identifying information about the template " +"stationery." +msgstr "テンプレートの識別情報を入力して下さい。" + +#: data/glade/template-designer.glade.h:56 +msgid "Please enter the following layout information." +msgstr "レイアウト情報を入力して下さい。" + +#: data/glade/template-designer.glade.h:57 +msgid "" +"Please enter the following size parameters of a single label in your " +"template." +msgstr "テンプレートのラベル単体のサイズをそれぞれ入力して下さい。" + +#: data/glade/template-designer.glade.h:58 +msgid "" +"Please enter the following size parameters of a single label or card in your " +"template." +msgstr "テンプレートのラベルまたはカード単体のサイズをそれぞれ入力して下さい。" + +#: data/glade/template-designer.glade.h:59 +msgid "Please select the basic shape of the labels or cards." +msgstr "ラベルまたはカードの基本的な形状を選択して下さい。" + +#: data/glade/template-designer.glade.h:60 +msgid "Please select the page size of the template stationery." +msgstr "テンプレート用紙のサイズを選択して下さい。" + +#: data/glade/template-designer.glade.h:61 +msgid "Print test sheet" +msgstr "用紙のテスト印刷" + +#: data/glade/template-designer.glade.h:62 +msgid "Rectangular or square (can have rounded corners)" +msgstr "長方形または正方形 (コーナーを丸くすることも可)" + +#: data/glade/template-designer.glade.h:63 +msgid "Round" +msgstr "円" + +#: data/glade/template-designer.glade.h:64 +msgid "" +"Templates needing\n" +"two layouts." +msgstr "" +"レイアウトが二つ必要な\n" +"テンプレート" + +#: data/glade/template-designer.glade.h:66 +msgid "" +"Templates needing only\n" +"one layout." +msgstr "" +"レイアウトが一つだけで\n" +"十分なレイアウト" + +#: data/glade/template-designer.glade.h:68 +msgid "Vertical pitch (dy):" +msgstr "垂直方向のピッチ (dy):" + +#: data/glade/template-designer.glade.h:69 +msgid "" +"Welcome to the gLabels Template Designer.\n" +"\n" +"This dialog will assist you in the creation of a custom gLabels template." +msgstr "" +"gLabels のテンプレート・デザイナへようこそ。\n" +"\n" +"このデザイナでは gLabels のカスタム・テンプレートの作成をお手伝いします。" + +#: data/templates/paper-sizes.xml.h:1 +msgid "A0" +msgstr "A0版" + +#: data/templates/paper-sizes.xml.h:2 +msgid "A1" +msgstr "A1版" + +#: data/templates/paper-sizes.xml.h:3 +msgid "A10" +msgstr "A10版" + +#: data/templates/paper-sizes.xml.h:4 +msgid "A2" +msgstr "A2版" + +#: data/templates/paper-sizes.xml.h:5 +msgid "A3" +msgstr "A3版" + +#: data/templates/paper-sizes.xml.h:6 +msgid "A4" +msgstr "A4版" + +#: data/templates/paper-sizes.xml.h:7 +msgid "A5" +msgstr "A5版" + +#: data/templates/paper-sizes.xml.h:8 +msgid "A6" +msgstr "A6版" + +#: data/templates/paper-sizes.xml.h:9 +msgid "A7" +msgstr "A7版" + +#: data/templates/paper-sizes.xml.h:10 +msgid "A8" +msgstr "A8版" + +#: data/templates/paper-sizes.xml.h:11 +msgid "A9" +msgstr "A9版" + +#: data/templates/paper-sizes.xml.h:12 +msgid "B0" +msgstr "B0版" + +#: data/templates/paper-sizes.xml.h:13 +msgid "B1" +msgstr "B1版" + +#: data/templates/paper-sizes.xml.h:14 +msgid "B10" +msgstr "B10版" + +#: data/templates/paper-sizes.xml.h:15 +msgid "B2" +msgstr "B2版" + +#: data/templates/paper-sizes.xml.h:16 +msgid "B3" +msgstr "B3版" + +#: data/templates/paper-sizes.xml.h:17 +msgid "B4" +msgstr "B4版" + +#: data/templates/paper-sizes.xml.h:18 +msgid "B5" +msgstr "B5版" + +#: data/templates/paper-sizes.xml.h:19 +msgid "B6" +msgstr "B6版" + +#: data/templates/paper-sizes.xml.h:20 +msgid "B7" +msgstr "B7版" + +#: data/templates/paper-sizes.xml.h:21 +msgid "B8" +msgstr "B8版" + +#: data/templates/paper-sizes.xml.h:22 +msgid "B9" +msgstr "B9版" + +#: data/templates/paper-sizes.xml.h:23 +msgid "US Executive" +msgstr "US エグゼクティブ" + +#: data/templates/paper-sizes.xml.h:24 +msgid "US Legal" +msgstr "US リーガル" + +#: data/templates/avery-us-templates.xml.h:1 +#: data/templates/zweckform-iso-templates.xml.h:1 +msgid "Address Labels" +msgstr "宛名のラベル" + +#: data/templates/avery-us-templates.xml.h:2 +#: data/templates/avery-iso-templates.xml.h:2 +#: data/templates/zweckform-iso-templates.xml.h:3 +#: data/templates/misc-us-templates.xml.h:2 +#: data/templates/misc-iso-templates.xml.h:9 +msgid "Business Cards" +msgstr "名刺" + +#: data/templates/avery-us-templates.xml.h:3 +msgid "CD/DVD Labels (Disc Labels)" +msgstr "CD/DVD のラベル (Disc ラベル)" + +#: data/templates/avery-us-templates.xml.h:4 +msgid "Diskette Labels" +msgstr "フロッピーのラベル" + +#: data/templates/avery-us-templates.xml.h:5 +msgid "Filing Labels" +msgstr "ファイル・バインダーのラベル" + +#: data/templates/avery-us-templates.xml.h:6 +msgid "Full Sheet Labels" +msgstr "全用紙のラベル" + +#: data/templates/avery-us-templates.xml.h:7 +msgid "Large Round Labels" +msgstr "大きな矩形のラベル" + +#: data/templates/avery-us-templates.xml.h:8 +msgid "Name Badge Labels" +msgstr "名前つきバッジのラベル" + +#: data/templates/avery-us-templates.xml.h:9 +msgid "Return Address Labels" +msgstr "返信用宛名のラベル" + +#: data/templates/avery-us-templates.xml.h:10 +msgid "Shipping Labels" +msgstr "出荷ラベル" + +#: data/templates/avery-us-templates.xml.h:11 +msgid "Small Round Labels" +msgstr "小さな矩形のラベル" + +#: data/templates/avery-us-templates.xml.h:12 +msgid "Square Labels" +msgstr "矩形のラベル" + +#: data/templates/avery-us-templates.xml.h:13 +msgid "Video Tape Face Labels" +msgstr "ビデオ・テープの表面ラベル" + +#: data/templates/avery-us-templates.xml.h:14 +msgid "Video Tape Spine Labels" +msgstr "ビデオ・テープの背面ラベル" + +#: data/templates/avery-iso-templates.xml.h:1 +msgid "Address labels" +msgstr "宛名のラベル" + +#: data/templates/avery-iso-templates.xml.h:3 +msgid "CD Booklet" +msgstr "CD の小冊子" + +#: data/templates/avery-iso-templates.xml.h:4 +msgid "CD Inlet" +msgstr "CD のインレット" + +#: data/templates/avery-iso-templates.xml.h:5 +#: data/templates/zweckform-iso-templates.xml.h:4 +#: data/templates/misc-us-templates.xml.h:4 +#: data/templates/misc-iso-templates.xml.h:10 +msgid "CD/DVD Labels" +msgstr "CD/DVD のラベル" + +#: data/templates/avery-iso-templates.xml.h:6 +msgid "Diskette labels" +msgstr "フロッピーのラベル" + +#: data/templates/avery-iso-templates.xml.h:7 +#: data/templates/zweckform-iso-templates.xml.h:7 +#: data/templates/misc-iso-templates.xml.h:17 +msgid "Mailing Labels" +msgstr "封筒のラベル" + +#: data/templates/avery-iso-templates.xml.h:8 +msgid "Mailing labels" +msgstr "封筒のラベル" + +#: data/templates/avery-iso-templates.xml.h:9 +msgid "Mini Address Labels" +msgstr "小さな宛名のラベル" + +#: data/templates/avery-iso-templates.xml.h:10 +msgid "Shipping labels" +msgstr "出荷ラベル" + +#: data/templates/zweckform-iso-templates.xml.h:2 +msgid "Allround Labels" +msgstr "汎用的なラベル" + +#: data/templates/zweckform-iso-templates.xml.h:5 +msgid "Correction and Cover-up Labels" +msgstr "コレクションとカバーのラベル" + +#: data/templates/zweckform-iso-templates.xml.h:6 +msgid "Lever Arch File Labels" +msgstr "レバー・アーチ・ファイルのラベル" + +#: data/templates/zweckform-iso-templates.xml.h:8 +msgid "QSL-Karten Etiketten 70mm x 50,8mm" +msgstr "QSL-Karten Etiketten (70mm x 50.8mm)" + +#: data/templates/zweckform-iso-templates.xml.h:9 +msgid "Rectangular Copier Labels" +msgstr "長方形のコピー機のラベル" + +#: data/templates/zweckform-iso-templates.xml.h:10 +#: data/templates/misc-iso-templates.xml.h:22 +msgid "Rectangular Labels" +msgstr "長方形のラベル" + +#: data/templates/zweckform-iso-templates.xml.h:11 +msgid "Video Labels (back)" +msgstr "ビデオのラベル (裏側)" + +#: data/templates/misc-us-templates.xml.h:1 +msgid "Business Card CD" +msgstr "名刺 CD" + +#: data/templates/misc-us-templates.xml.h:3 +msgid "CD Template Rectangles" +msgstr "CD テンプレート (長方形)" + +#: data/templates/misc-us-templates.xml.h:5 +msgid "CD/DVD Labels (Face Only)" +msgstr "CD/DVD のラベル (外側のみ)" + +#: data/templates/misc-us-templates.xml.h:6 +#: data/templates/misc-iso-templates.xml.h:11 +msgid "CD/DVD Labels (face only)" +msgstr "CD/DVD のラベル (外側のみ)" + +#: data/templates/misc-us-templates.xml.h:7 +msgid "DLT Labels" +msgstr "DLT のラベル" + +#: data/templates/misc-us-templates.xml.h:8 +msgid "Microtube labels" +msgstr "マイクロチューブのラベル" + +#: data/templates/misc-us-templates.xml.h:9 +msgid "Mini-CD Labels" +msgstr "ミニ CD のラベル" + +#: data/templates/misc-us-templates.xml.h:10 +msgid "PRO CD Labels 2-up (CD spine only)" +msgstr "PRO CD のラベル二枚 (CD 格納ケースのみ)" + +#: data/templates/misc-us-templates.xml.h:11 +msgid "PRO CD Labels 2-up (Face only)" +msgstr "PRO CD ラベル二枚 (外側のみ)" + +#: data/templates/misc-us-templates.xml.h:12 +#: data/templates/misc-iso-templates.xml.h:21 +msgid "PRO CD Labels 2-up (face only)" +msgstr "PRO CD ラベル二枚 (外側のみ)" + +#: data/templates/misc-us-templates.xml.h:13 +msgid "Slimline CD Case (rightside up)" +msgstr "薄い CD フォルダ (右側)" + +#: data/templates/misc-us-templates.xml.h:14 +msgid "Slimline CD Case (upside down)" +msgstr "薄い CD フォルダ (上側)" + +#: data/templates/misc-iso-templates.xml.h:1 +msgid "Agipa 119488: Business Cards" +msgstr "Agipa 119488: 名刺" + +#: data/templates/misc-iso-templates.xml.h:2 +msgid "Allround Labels --24" +msgstr "汎用的なラベル --24" + +#: data/templates/misc-iso-templates.xml.h:3 +msgid "Allround Labels --44" +msgstr "汎用的なラベル --44" + +#: data/templates/misc-iso-templates.xml.h:4 +msgid "Allround Labels --64" +msgstr "汎用的なラベル --64" + +#: data/templates/misc-iso-templates.xml.h:5 +msgid "Allround Labels --65" +msgstr "汎用的なラベル --65" + +#: data/templates/misc-iso-templates.xml.h:6 +msgid "Arch File Labels" +msgstr "アーチ・ファイルのラベル" + +#: data/templates/misc-iso-templates.xml.h:7 +msgid "Arch File Labels (large)" +msgstr "アーチ・ファイルのラベル (大)" + +#: data/templates/misc-iso-templates.xml.h:8 +msgid "Arch File Labels (small)" +msgstr "アーチ・ファイルのラベル (小)" + +#: data/templates/misc-iso-templates.xml.h:12 +msgid "CD/DVD Labels Standard Format (face only)" +msgstr "CD/DVD のラベル標準書式 (外側のみ)" + +#: data/templates/misc-iso-templates.xml.h:13 +msgid "Diskette Labels (face only)" +msgstr "フロッピーのラベル (外側のみ)" + +#: data/templates/misc-iso-templates.xml.h:14 +msgid "EPSON Photo Stickers 16" +msgstr "EPSON フォト・ステッカー 16" + +#: data/templates/misc-iso-templates.xml.h:15 +msgid "Etiketten" +msgstr "Etiketten" + +#: data/templates/misc-iso-templates.xml.h:16 +msgid "Fridge Magnet Stickers" +msgstr "冷蔵庫に貼る磁気ステッカ" + +#: data/templates/misc-iso-templates.xml.h:18 +msgid "Mailing Labels --14" +msgstr "封筒のラベル --14" + +#: data/templates/misc-iso-templates.xml.h:19 +msgid "Mailing Labels-2 columns" +msgstr "封筒のラベル (二列)" + +#: data/templates/misc-iso-templates.xml.h:20 +msgid "Mailing Labels-3 columns" +msgstr "封筒のラベル (三列)" + +#: data/templates/misc-iso-templates.xml.h:23 +msgid "Video Labels (face only)" +msgstr "ビデオのラベル (外側のみ)" + +#: data/desktop/glabels.desktop.in.h:1 +msgid "Create labels, business cards and media covers" +msgstr "ラベルや名刺、メディアのカバーを生成します" + +#: data/desktop/glabels.desktop.in.h:2 +msgid "gLabels Label Designer" +msgstr "gLabels ラベル・デザイナ" + +#: data/mime/glabels.keys.in.h:1 data/mime/glabels.xml.in.h:1 +msgid "gLabels Project File" +msgstr "gLabels のプロジェクト・ファイル" diff --git a/glabels2/po/pl.po b/glabels2/po/pl.po new file mode 100644 index 00000000..d67a9065 --- /dev/null +++ b/glabels2/po/pl.po @@ -0,0 +1,2650 @@ +# Polish translation for gLabels +# Copyright (C) 2002 Free Software Foundation, Inc. +# Arkadiusz Lipiec , 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: gLabels\n" +"POT-Creation-Date: 2004-08-08 00:43-0400\n" +"PO-Revision-Date: 2002-07-23 11:43+0100\n" +"Last-Translator: Arkadiusz Lipiec \n" +"Language-Team: Polish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-2\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/glabels.c:55 +msgid "Show view debugging messages." +msgstr "" + +#: src/glabels.c:58 +msgid "Show item debugging messages." +msgstr "" + +#: src/glabels.c:61 +msgid "Show printing debugging messages." +msgstr "" + +#: src/glabels.c:64 +msgid "Show prefs debugging messages." +msgstr "" + +#: src/glabels.c:67 +msgid "Show file debugging messages." +msgstr "" + +#: src/glabels.c:70 +msgid "Show document debugging messages." +msgstr "" + +#: src/glabels.c:73 +msgid "Show template debugging messages." +msgstr "" + +#: src/glabels.c:76 +msgid "Show paper debugging messages." +msgstr "" + +#: src/glabels.c:79 +msgid "Show xml debugging messages." +msgstr "" + +#: src/glabels.c:82 +msgid "Show document merge debugging messages." +msgstr "" + +#: src/glabels.c:85 +msgid "Show commands debugging messages." +msgstr "" + +#: src/glabels.c:88 +msgid "Show undo debugging messages." +msgstr "" + +#: src/glabels.c:91 +msgid "Show recent debugging messages." +msgstr "" + +#: src/glabels.c:94 +msgid "Show window debugging messages." +msgstr "" + +#: src/glabels.c:97 +msgid "Show ui debugging messages." +msgstr "" + +#: src/glabels.c:100 +msgid "Show property_bar debugging messages." +msgstr "" + +#: src/glabels.c:103 +msgid "Show media select widget debugging messages." +msgstr "" + +#: src/glabels.c:106 +msgid "Show mini preview widget debugging messages." +msgstr "" + +#: src/glabels.c:109 +msgid "Show pixbuf cache debugging messages." +msgstr "" + +#: src/glabels.c:112 +msgid "Show widget debugging messages." +msgstr "" + +#: src/glabels.c:115 +msgid "Show object editor debugging messages." +msgstr "" + +#: src/glabels.c:118 +msgid "Turn on all debugging messages." +msgstr "" + +#: src/glabels.c:187 +msgid "Could not initialize Bonobo!\n" +msgstr "" + +#: src/glabels-batch.c:48 +msgid "print this message" +msgstr "wy¶wietla ten komunikat" + +#: src/glabels-batch.c:50 +msgid "print the version of glabels-batch being used" +msgstr "wy¶wietla aktualnie u¿ywan± wersjê glabel-batch" + +#: src/glabels-batch.c:52 +msgid "set output filename (default=\"output.ps\")" +msgstr "okre¶l nazwê pliku wyj¶ciowego (domy¶lnie=\"output.ps\")" + +#: src/glabels-batch.c:52 +msgid "filename" +msgstr "nazwa pliku" + +#: src/glabels-batch.c:54 +msgid "number of sheets (default=1)" +msgstr "liczba arkuszy (domy¶lnie=1)" + +#: src/glabels-batch.c:54 +msgid "sheets" +msgstr "arkusz(e/y)" + +#: src/glabels-batch.c:56 +msgid "number of copies (default=1)" +msgstr "liczba kopii (domy¶lnie=1)" + +#: src/glabels-batch.c:56 +msgid "copies" +msgstr "kopi(a/e/i)" + +#: src/glabels-batch.c:58 src/print-dialog.c:336 +msgid "print outlines (to test printer alignment)" +msgstr "drukowanie ramek (w celu przetestowania wyrównania)" + +#: src/glabels-batch.c:60 src/print-dialog.c:344 +msgid "print in reverse (i.e. a mirror image)" +msgstr "drukowanie odwrócone (np. odbicie zwierciadlane)" + +#: src/glabels-batch.c:96 +msgid "[OPTION...] GLABELS_FILE..." +msgstr "[OPCJA...] PLIK_GLABELS..." + +#: src/glabels-batch.c:116 +msgid "missing glabels file\n" +msgstr "brak pliku glabels\n" + +#: src/glabels-batch.c:157 +#, c-format +msgid "cannot open glabels file %s\n" +msgstr "nie mo¿na otworzyæ pliku glabels o nazwie %s\n" + +#: src/window.c:244 +msgid "(none) - gLabels" +msgstr "" + +#: src/window.c:414 +msgid "(modified)" +msgstr "" + +#: src/stock.c:65 data/ui/glabels-ui.xml.h:165 +#, fuzzy +msgid "_Select Mode" +msgstr "Wybierz" + +#: src/stock.c:66 data/ui/glabels-ui.xml.h:166 +#, fuzzy +msgid "_Text" +msgstr "Tekst" + +#: src/stock.c:67 data/ui/glabels-ui.xml.h:151 +#, fuzzy +msgid "_Line" +msgstr "Linia" + +#: src/stock.c:68 data/ui/glabels-ui.xml.h:133 +#, fuzzy +msgid "_Box" +msgstr "Skrzynka" + +#: src/stock.c:69 data/ui/glabels-ui.xml.h:144 +#, fuzzy +msgid "_Ellipse" +msgstr "Elipsa" + +#: src/stock.c:70 data/ui/glabels-ui.xml.h:149 +#, fuzzy +msgid "_Image" +msgstr "Obraz" + +#: src/stock.c:71 data/ui/glabels-ui.xml.h:11 +#, fuzzy +msgid "Bar_code" +msgstr "Kod paskowy" + +#: src/stock.c:72 +#, fuzzy +msgid "_Merge Properties" +msgstr "W³a¶ciwo¶ci z³±czania" + +#: src/stock.c:73 +#, fuzzy +msgid "Object _Properties" +msgstr "W³a¶ciwo¶ci tekstu" + +#: src/stock.c:74 data/ui/glabels-ui.xml.h:13 +#, fuzzy +msgid "Bring to _Front" +msgstr "Przesun na wierzch" + +#: src/stock.c:75 data/ui/glabels-ui.xml.h:110 +#, fuzzy +msgid "Send to _Back" +msgstr "Przesuñ w dó³" + +#: src/stock.c:76 data/ui/glabels-ui.xml.h:97 +#, fuzzy +msgid "Rotate _Left" +msgstr "Obróæ" + +#: src/stock.c:77 data/ui/glabels-ui.xml.h:98 +#, fuzzy +msgid "Rotate _Right" +msgstr "Obróæ" + +#: src/stock.c:78 data/ui/glabels-ui.xml.h:52 +msgid "Flip _Horizontally" +msgstr "" + +#: src/stock.c:79 data/ui/glabels-ui.xml.h:53 +msgid "Flip _Vertically" +msgstr "" + +#: src/stock.c:80 data/ui/glabels-ui.xml.h:150 +msgid "_Lefts" +msgstr "" + +#: src/stock.c:81 data/ui/glabels-ui.xml.h:162 +msgid "_Rights" +msgstr "" + +#: src/stock.c:82 data/ui/glabels-ui.xml.h:134 +msgid "_Centers" +msgstr "" + +#: src/stock.c:83 data/ui/glabels-ui.xml.h:167 +#, fuzzy +msgid "_Tops" +msgstr "_Narzêdzia" + +#: src/stock.c:84 +msgid "Bottoms" +msgstr "" + +#: src/stock.c:85 +msgid "Centers" +msgstr "" + +#: src/stock.c:86 src/stock.c:87 data/ui/glabels-ui.xml.h:62 +msgid "Label Ce_nter" +msgstr "" + +#: src/stock.c:88 data/ui/glabels-ui.xml.h:51 +msgid "Fill color" +msgstr "" + +#: src/stock.c:89 data/ui/glabels-ui.xml.h:64 +msgid "Line color" +msgstr "" + +#: src/stock.c:90 src/stock.c:92 +#, fuzzy +msgid "Linked" +msgstr "Linia" + +#: src/stock.c:91 src/stock.c:93 +#, fuzzy +msgid "Not Linked" +msgstr "Brak" + +#: src/ui-property-bar.c:345 src/object-editor.c:499 +#, fuzzy +msgid "Default" +msgstr "Usuñ" + +#: src/ui-property-bar.c:360 src/object-editor.c:512 +msgid "No fill" +msgstr "" + +#: src/ui-property-bar.c:375 src/object-editor.c:505 +#, fuzzy +msgid "No line" +msgstr "Brak" + +#: src/ui-sidebar.c:180 +#, fuzzy +msgid "Object properties" +msgstr "W³a¶ciwo¶ci tekstu" + +#: src/commands.c:385 +msgid "" +"A label and business card creation program for GNOME.\n" +" \n" +"Glabels is free software; you can redistribute it and/or modify it under the " +"terms of the GNU General Public License as published by the Free Software " +"Foundation; either version 2 of the License, or (at your option) any later " +"version.\n" +" \n" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details.\n" +msgstr "" +"Program do tworzenia etykiet i wizytówek dla GNOME.\n" +"\n" +"Glabels jest oprogramowaniem wolnodostêpnym, mo¿na rozpowszechniaæ go lub/" +"imodyfikowaæ na zasadach Licencji Publicznej GNU opublikowanej przez Free " +"Software Foundation; zarówno w wersji 2 tej licencji, jak (do wyboru) i " +"dowolnej pó¼niejszej wersji.\n" +"\n" +"Ten program jest rozpowszechniany w nadziei u¿yteczno¶ci, lecz BEZ ¯ADNEJ " +"GWARANCJI; nawet wynikaj±cej z RÊKOJMI lub U¯YWANIA W OKRE¦LONYM CELU. " +"Zajrzyj do Licencji Publicznej GNU aby uzyskaæ wiêcej szczegó³ów.\n" + +#: src/commands.c:399 +msgid "See the file AUTHORS for additional credits," +msgstr "" + +#: src/commands.c:400 +msgid "or visit http://glabels.sourceforge.net/" +msgstr "" + +#: src/commands.c:409 +msgid " " +msgstr "" + +#: src/commands.c:424 +#, fuzzy +msgid "glabels" +msgstr "Etykiety" + +#: src/file.c:100 +msgid "New Label or Card" +msgstr "Nowa etykieta lub karta" + +#: src/file.c:132 src/file.c:304 +msgid "Media Type" +msgstr "Typ no¶nika" + +#: src/file.c:138 src/file.c:310 +msgid "Label orientation" +msgstr "U³o¿enie etykiety" + +#: src/file.c:269 +#, fuzzy +msgid "Label properties" +msgstr "W³a¶ciwo¶ci tekstu" + +#: src/file.c:452 src/file.c:870 +msgid "All files" +msgstr "" + +#: src/file.c:457 src/file.c:875 +#, fuzzy +msgid "gLabels documents" +msgstr "Glabels: Preferencje" + +#: src/file.c:505 src/file.c:617 src/file.c:934 src/file.c:1130 +#, fuzzy +msgid "Empty file name selection" +msgstr "Usuwa wszelkie zaznaczenia" + +#: src/file.c:506 src/file.c:520 src/file.c:618 src/file.c:632 +msgid "Please select a file or supply a valid file name" +msgstr "" + +#: src/file.c:519 src/file.c:631 +msgid "File does not exist" +msgstr "" + +#: src/file.c:563 data/ui/glabels-ui.xml.h:75 +msgid "Open" +msgstr "Otwórz" + +#: src/file.c:565 +msgid "Open label" +msgstr "Otwórz etykietê" + +#: src/file.c:707 +#, fuzzy, c-format +msgid "Could not open file \"%s\"" +msgstr "Nie mo¿na otworzyæ pliku" + +#: src/file.c:715 +msgid "Not a supported file format" +msgstr "" + +#: src/file.c:797 src/file.c:979 src/file.c:1174 +#, fuzzy, c-format +msgid "Could not save file \"%s\"" +msgstr "Nie mo¿na zapisaæ pliku" + +#: src/file.c:805 src/file.c:987 src/file.c:1182 +msgid "Error encountered during save. The file is still not saved." +msgstr "" + +#: src/file.c:848 src/file.c:1048 +#, fuzzy, c-format +msgid "Save \"%s\" as" +msgstr "Zapisz etykietê jako" + +#: src/file.c:935 src/file.c:1131 +#, fuzzy +msgid "Please supply a valid file name" +msgstr "Nale¿y podaæ nazwê pliku" + +#: src/file.c:952 src/file.c:1147 +#, c-format +msgid "Overwrite file \"%s\"?" +msgstr "" + +#: src/file.c:960 src/file.c:1155 +msgid "File already exists." +msgstr "" + +#: src/file.c:1271 +#, c-format +msgid "Save changes to document \"%s\" before closing?" +msgstr "" + +#: src/file.c:1279 +msgid "Your changes will be lost if you don't save them." +msgstr "" + +#: src/file.c:1282 +msgid "Close without saving" +msgstr "" + +#. Should not happen +#: src/prefs.c:156 src/prefs.c:163 data/glade/prefs-dialog.glade.h:23 +#: data/glade/object-editor.glade.h:37 +msgid "points" +msgstr "punkty(-ów)" + +#: src/prefs.c:158 data/glade/object-editor.glade.h:36 +#: data/glade/template-designer.glade.h:74 +msgid "inches" +msgstr "cali" + +#: src/prefs.c:160 +msgid "mm" +msgstr "mm" + +#: src/prefs-dialog.c:248 data/glade/prefs-dialog.glade.h:22 +#, fuzzy +msgid "gLabels Preferences" +msgstr "Glabels: Preferencje" + +#. +#. * Submenu: Order +#. +#: src/view.c:3570 data/ui/glabels-ui.xml.h:157 +msgid "_Order" +msgstr "" + +#. +#. * Submenu: Rotate/Flip +#. +#: src/view.c:3591 data/ui/glabels-ui.xml.h:163 +#, fuzzy +msgid "_Rotate/Flip" +msgstr "Obróæ" + +#. +#. * Submenu: Align Horizontally +#. +#: src/view.c:3624 +msgid "Align _Horizontally" +msgstr "" + +#. +#. * Submenu: Align Vertically +#. +#: src/view.c:3663 +msgid "Align _Vertically" +msgstr "" + +#: src/view.c:3724 data/ui/glabels-ui.xml.h:140 +#, fuzzy +msgid "_Delete" +msgstr "Usuñ" + +#. Build editor. +#: src/view-box.c:223 +#, fuzzy +msgid "Box object properties" +msgstr "Modyfikacja w³a¶ciwo¶ci skrzynki" + +#. Build editor. +#: src/view-ellipse.c:223 +#, fuzzy +msgid "Ellipse object properties" +msgstr "Modyfikacja w³a¶ciwo¶ci elipsy" + +#. Build editor. +#: src/view-line.c:223 +#, fuzzy +msgid "Line object properties" +msgstr "Modyfikacja w³a¶ciwo¶ci skrzynki" + +#. Build editor. +#: src/view-image.c:222 +#, fuzzy +msgid "Image object properties" +msgstr "Modyfikacja w³a¶ciwo¶ci obrazu" + +#. Build editor. +#: src/view-text.c:250 +#, fuzzy +msgid "Text object properties" +msgstr "Modyfikacja w³a¶ciwo¶ci skrzynki" + +#: src/view-text.c:562 data/glade/object-editor.glade.h:28 +msgid "Text" +msgstr "Tekst" + +#. Build editor. +#: src/view-barcode.c:209 +#, fuzzy +msgid "Barcode object properties" +msgstr "Modyfikacja w³a¶ciwo¶ci kodu paskowego" + +#: src/view-barcode.c:579 src/print.c:1088 +#, fuzzy +msgid "Invalid barcode data" +msgstr "Niepoprawny kod paskowy" + +#: src/merge-properties-dialog.c:231 +#, fuzzy +msgid "Merge Properties" +msgstr "W³a¶ciwo¶ci z³±czania" + +#. ---- Source section ---- +#: src/merge-properties-dialog.c:237 +msgid "Source" +msgstr "¬ród³o" + +#: src/merge-properties-dialog.c:245 +msgid "Format:" +msgstr "Format:" + +#. Location line +#: src/merge-properties-dialog.c:273 +msgid "Location:" +msgstr "Po³o¿enie:" + +#: src/merge-properties-dialog.c:282 src/merge-properties-dialog.c:393 +msgid "Select merge-database source" +msgstr "Wybierz ¼ród³o bazy danych z³±czania " + +#: src/merge-properties-dialog.c:289 src/merge-properties-dialog.c:404 +msgid "N/A" +msgstr "N/A" + +#. ---- Sample Fields section ---- +#: src/merge-properties-dialog.c:300 +msgid "Record selection/preview:" +msgstr "" + +#: src/merge-properties-dialog.c:326 +msgid "Select" +msgstr "Wybierz" + +#: src/merge-properties-dialog.c:334 +msgid "Record/Field" +msgstr "" + +#: src/merge-properties-dialog.c:342 data/glade/object-editor.glade.h:9 +msgid "Data" +msgstr "Dane" + +#: src/print-dialog.c:266 data/ui/glabels-ui.xml.h:82 +msgid "Print" +msgstr "Wydrukuj" + +#: src/print-dialog.c:281 +msgid "_Job" +msgstr "" + +#: src/print-dialog.c:286 +#, fuzzy +msgid "P_rinter" +msgstr "Wydrukuj" + +#. ----------- Add simple-copies widget ------------ +#: src/print-dialog.c:314 +msgid "Copies" +msgstr "Kopie" + +#. ------- Add merge control widget ------------ +#: src/print-dialog.c:322 +msgid "Document merge control" +msgstr "Kontrola z³±czania dokumentów" + +#. ----------- Add custom print options area ------------ +#: src/print-dialog.c:330 +msgid "Options" +msgstr "Opcje" + +#: src/print-dialog.c:351 +msgid "print crop marks" +msgstr "" + +#: src/print-dialog.c:553 src/print-dialog.c:592 +msgid "Print preview" +msgstr "Podgl±d wydruku" + +#: src/template-designer.c:409 data/glade/template-designer.glade.h:73 +msgid "gLabels Template Designer" +msgstr "" + +#: src/bc.c:60 +msgid "POSTNET (any)" +msgstr "" + +#: src/bc.c:63 +msgid "POSTNET-5 (ZIP only)" +msgstr "" + +#: src/bc.c:66 +msgid "POSTNET-9 (ZIP+4)" +msgstr "" + +#: src/bc.c:69 +msgid "POSTNET-11 (DPBC)" +msgstr "" + +#: src/bc.c:72 +msgid "EAN (any)" +msgstr "" + +#: src/bc.c:75 +msgid "EAN-8" +msgstr "" + +#: src/bc.c:78 +msgid "EAN-8 +2" +msgstr "" + +#: src/bc.c:81 +msgid "EAN-8 +5" +msgstr "" + +#: src/bc.c:84 +msgid "EAN-13" +msgstr "" + +#: src/bc.c:87 +msgid "EAN-13 +2" +msgstr "" + +#: src/bc.c:90 +msgid "EAN-13 +5" +msgstr "" + +#: src/bc.c:93 +msgid "UPC (UPC-A or UPC-E)" +msgstr "" + +#: src/bc.c:96 +msgid "UPC-A" +msgstr "" + +#: src/bc.c:99 +msgid "UPC-A +2" +msgstr "" + +#: src/bc.c:102 +msgid "UPC-A +5" +msgstr "" + +#: src/bc.c:105 +msgid "UPC-E" +msgstr "" + +#: src/bc.c:108 +msgid "UPC-E +2" +msgstr "" + +#: src/bc.c:111 +msgid "UPC-E +5" +msgstr "" + +#: src/bc.c:114 +msgid "ISBN" +msgstr "" + +#: src/bc.c:117 +msgid "ISBN +5" +msgstr "" + +#: src/bc.c:120 +msgid "Code 39" +msgstr "" + +#: src/bc.c:123 +msgid "Code 128" +msgstr "" + +#: src/bc.c:126 +msgid "Code 128C" +msgstr "" + +#: src/bc.c:129 +msgid "Code 128B" +msgstr "" + +#: src/bc.c:132 +msgid "Interleaved 2 of 5" +msgstr "" + +#: src/bc.c:135 +msgid "Codabar" +msgstr "" + +#: src/bc.c:138 +msgid "MSI" +msgstr "" + +#: src/bc.c:141 +msgid "Plessey" +msgstr "" + +#: src/label.c:569 +msgid "Untitled" +msgstr "" + +#: src/xml-label.c:176 src/xml-label.c:213 +msgid "xmlParseFile error" +msgstr "b³±d przetwarzania pliku xml" + +#: src/xml-label.c:250 +msgid "No document root" +msgstr "Brak g³ównego dokumentu" + +#: src/xml-label.c:264 +msgid "Importing from glabels 0.1 format" +msgstr "" + +#: src/xml-label.c:272 +msgid "Importing from glabels 0.4 format" +msgstr "" + +#: src/xml-label.c:279 +msgid "Importing from glabels 1.91 format" +msgstr "" + +#: src/xml-label.c:282 +#, fuzzy +msgid "bad document, unknown glabels Namespace" +msgstr "" +"dokument jest niepoprawnego typu, nie odnaleziono przestrzeni nazw glabels" + +#: src/xml-label.c:311 src/xml-label-04.c:75 src/xml-label-191.c:131 +#, c-format +msgid "Bad root node = \"%s\"" +msgstr "Niepoprawny wêze³ g³ówny = \"%s\"" + +#: src/xml-label.c:348 src/xml-label-191.c:165 +#, fuzzy, c-format +msgid "bad node in Document node = \"%s\"" +msgstr "Niepoprawny wêze³ g³ówny = \"%s\"" + +#: src/xml-label.c:393 src/xml-label-04.c:123 src/xml-label-191.c:197 +#, c-format +msgid "bad node = \"%s\"" +msgstr "niepoprawny wêze³ = \"%s\"" + +#: src/xml-label.c:796 src/xml-label-191.c:605 +#, fuzzy, c-format +msgid "bad node in Data node = \"%s\"" +msgstr "niepoprawny wêze³ = \"%s\"" + +#: src/xml-label.c:962 libglabels/xml-template.c:528 +msgid "Utf8 conversion error." +msgstr "" + +#: src/xml-label.c:969 libglabels/xml-template.c:535 +msgid "Problem saving xml file." +msgstr "Problem podczas zapisu pliku xml." + +#. This should always be an id, but just in case a name +#. slips by! +#: src/xml-label-191.c:680 libglabels/xml-template.c:192 +#, c-format +msgid "Unknown page size id \"%s\", trying as name" +msgstr "" + +#: src/xml-label-191.c:690 libglabels/xml-template.c:202 +#, c-format +msgid "Unknown page size id or name \"%s\"" +msgstr "" + +#: src/merge.c:172 src/merge.c:213 src/merge.c:399 src/merge.c:402 +msgid "None" +msgstr "Brak" + +#: src/merge-init.c:53 +#, fuzzy +msgid "Text file with comma delimeters (CSV)" +msgstr "Tekst oddzielony przecinkami (CSV)" + +#: src/merge-init.c:60 +#, fuzzy +msgid "Text file with colon delimeters" +msgstr "Tekst oddzielany dwukropkami" + +#: src/merge-init.c:67 +#, fuzzy +msgid "Text file with tab delimeters" +msgstr "Tekst oddzielony tabulacjami" + +#: src/wdgt-image-select.c:201 data/glade/object-editor.glade.h:11 +#, fuzzy +msgid "File:" +msgstr "Wype³nienie" + +#: src/wdgt-image-select.c:245 data/glade/object-editor.glade.h:16 +msgid "Key:" +msgstr "Klucz:" + +#: src/wdgt-print-copies.c:179 +msgid "Sheets:" +msgstr "Arkusze:" + +#: src/wdgt-print-copies.c:197 +msgid "Labels" +msgstr "Etykiety" + +#: src/wdgt-print-copies.c:200 +msgid "from:" +msgstr "od:" + +#: src/wdgt-print-copies.c:207 +msgid "to:" +msgstr "do:" + +#: src/wdgt-print-merge.c:178 +msgid "Start on label" +msgstr "Rozpocznij od etykiety" + +#: src/wdgt-print-merge.c:186 +msgid "on 1st sheet" +msgstr "na pierwszym arkuszu" + +#: src/wdgt-print-merge.c:195 +msgid "Copies:" +msgstr "Kopie:" + +#: src/wdgt-print-merge.c:201 +msgid "Collate" +msgstr "Uk³adanie" + +#: src/wdgt-media-select.c:269 data/glade/template-designer.glade.h:29 +msgid "Description:" +msgstr "Opis:" + +#: src/wdgt-media-select.c:279 data/glade/template-designer.glade.h:53 +msgid "Page size:" +msgstr "Rozmiar strony:" + +#: src/wdgt-media-select.c:290 +msgid "Label size:" +msgstr "Rozmiar etykiety:" + +#: src/wdgt-media-select.c:301 +msgid "Layout:" +msgstr "Wygl±d:" + +#: src/wdgt-media-select.c:578 +#, c-format +msgid "%d x %d (%d per sheet)" +msgstr "%d x %d (%d na arkusz)" + +#: src/wdgt-media-select.c:582 +#, fuzzy, c-format +msgid "%d per sheet" +msgstr "%d x %d (%d na arkusz)" + +#: src/wdgt-media-select.c:614 +#, c-format +msgid "%s x %s %s" +msgstr "%s x %s %s" + +#: src/wdgt-media-select.c:619 +#, c-format +msgid "%.5g x %.5g %s" +msgstr "%.5g x %.5g %s" + +#: src/wdgt-media-select.c:630 src/wdgt-media-select.c:644 +#, c-format +msgid "%s %s diameter" +msgstr "" + +#: src/wdgt-media-select.c:634 src/wdgt-media-select.c:648 +#, c-format +msgid "%.5g %s diameter" +msgstr "" + +#: src/wdgt-rotate-label.c:193 +msgid "Rotate" +msgstr "Obróæ" + +#. This is the default custom color +#: src/mygal/color-palette.c:396 +#, fuzzy +msgid "custom" +msgstr "W³asny klucz pola" + +#. "Custom" color - we'll pop up a GnomeColorPicker +#: src/mygal/color-palette.c:438 +#, fuzzy +msgid "Custom Color:" +msgstr "Kolor:" + +#: src/mygal/color-palette.c:446 +msgid "Choose Custom Color" +msgstr "" + +#: src/mygal/color-palette.c:579 +msgid "black" +msgstr "" + +#: src/mygal/color-palette.c:580 +msgid "light brown" +msgstr "" + +#: src/mygal/color-palette.c:581 +msgid "brown gold" +msgstr "" + +#: src/mygal/color-palette.c:582 +msgid "dark green #2" +msgstr "" + +#: src/mygal/color-palette.c:583 +msgid "navy" +msgstr "" + +#: src/mygal/color-palette.c:584 src/mygal/color-palette.c:640 +msgid "dark blue" +msgstr "" + +#: src/mygal/color-palette.c:585 +msgid "purple #2" +msgstr "" + +#: src/mygal/color-palette.c:586 +msgid "very dark gray" +msgstr "" + +#: src/mygal/color-palette.c:589 src/mygal/color-palette.c:645 +msgid "dark red" +msgstr "" + +#: src/mygal/color-palette.c:590 +msgid "red-orange" +msgstr "" + +#: src/mygal/color-palette.c:591 +msgid "gold" +msgstr "" + +#: src/mygal/color-palette.c:592 +msgid "dark green" +msgstr "" + +#: src/mygal/color-palette.c:593 src/mygal/color-palette.c:646 +msgid "dull blue" +msgstr "" + +#: src/mygal/color-palette.c:594 src/mygal/color-palette.c:647 +msgid "blue" +msgstr "" + +#: src/mygal/color-palette.c:595 +msgid "dull purple" +msgstr "" + +#: src/mygal/color-palette.c:596 +msgid "dark grey" +msgstr "" + +#: src/mygal/color-palette.c:599 +msgid "red" +msgstr "" + +#: src/mygal/color-palette.c:600 +msgid "orange" +msgstr "" + +#: src/mygal/color-palette.c:601 +msgid "lime" +msgstr "" + +#: src/mygal/color-palette.c:602 +msgid "dull green" +msgstr "" + +#: src/mygal/color-palette.c:603 +msgid "dull blue #2" +msgstr "" + +#: src/mygal/color-palette.c:604 +msgid "sky blue #2" +msgstr "" + +#: src/mygal/color-palette.c:605 src/mygal/color-palette.c:644 +msgid "purple" +msgstr "" + +#: src/mygal/color-palette.c:606 +msgid "gray" +msgstr "" + +#: src/mygal/color-palette.c:609 src/mygal/color-palette.c:641 +#, fuzzy +msgid "magenta" +msgstr "Obraz" + +#: src/mygal/color-palette.c:610 +msgid "bright orange" +msgstr "" + +#: src/mygal/color-palette.c:611 src/mygal/color-palette.c:642 +msgid "yellow" +msgstr "" + +#: src/mygal/color-palette.c:612 +#, fuzzy +msgid "green" +msgstr "stopni(e)" + +#: src/mygal/color-palette.c:613 src/mygal/color-palette.c:643 +msgid "cyan" +msgstr "" + +#: src/mygal/color-palette.c:614 +msgid "bright blue" +msgstr "" + +#: src/mygal/color-palette.c:615 src/mygal/color-palette.c:632 +msgid "red purple" +msgstr "" + +#: src/mygal/color-palette.c:616 +msgid "light grey" +msgstr "" + +#: src/mygal/color-palette.c:619 src/mygal/color-palette.c:636 +msgid "pink" +msgstr "" + +#: src/mygal/color-palette.c:620 +msgid "light orange" +msgstr "" + +#: src/mygal/color-palette.c:621 src/mygal/color-palette.c:633 +msgid "light yellow" +msgstr "" + +#: src/mygal/color-palette.c:622 +msgid "light green" +msgstr "" + +#: src/mygal/color-palette.c:623 +msgid "light cyan" +msgstr "" + +#: src/mygal/color-palette.c:624 src/mygal/color-palette.c:634 +msgid "light blue" +msgstr "" + +#: src/mygal/color-palette.c:625 src/mygal/color-palette.c:638 +msgid "light purple" +msgstr "" + +#: src/mygal/color-palette.c:626 +msgid "white" +msgstr "" + +#: src/mygal/color-palette.c:631 +msgid "purplish blue" +msgstr "" + +#: src/mygal/color-palette.c:635 +msgid "dark purple" +msgstr "" + +#: src/mygal/color-palette.c:637 +msgid "sky blue" +msgstr "" + +#: libglabels/template.c:848 +#, c-format +msgid "Generic %s full page" +msgstr "" + +#: libglabels/template.c:897 +msgid "No template files found!" +msgstr "Nie znaleziono pliku szablonu!" + +#. Create and append an "Other" entry. +#: libglabels/paper.c:67 +msgid "Other" +msgstr "" + +#: libglabels/paper.c:361 +#, fuzzy +msgid "No paper files found!" +msgstr "Nie znaleziono pliku szablonu!" + +#: data/ui/glabels-ui.xml.h:1 +msgid "About glabels" +msgstr "" + +#: data/ui/glabels-ui.xml.h:2 +msgid "About..." +msgstr "" + +#: data/ui/glabels-ui.xml.h:3 +msgid "Align _Horizontal" +msgstr "" + +#: data/ui/glabels-ui.xml.h:4 +msgid "Align _Vertical" +msgstr "" + +#: data/ui/glabels-ui.xml.h:5 +msgid "Align objects to bottoms" +msgstr "" + +#: data/ui/glabels-ui.xml.h:6 +msgid "Align objects to horizontal centers" +msgstr "" + +#: data/ui/glabels-ui.xml.h:7 +msgid "Align objects to left edges" +msgstr "" + +#: data/ui/glabels-ui.xml.h:8 +msgid "Align objects to right edges" +msgstr "" + +#: data/ui/glabels-ui.xml.h:9 +msgid "Align objects to tops" +msgstr "" + +#: data/ui/glabels-ui.xml.h:10 +msgid "Align objects to vertical centers" +msgstr "" + +#: data/ui/glabels-ui.xml.h:12 +msgid "Bold" +msgstr "" + +#: data/ui/glabels-ui.xml.h:14 +#, fuzzy +msgid "Center align" +msgstr "Ogólne" + +#: data/ui/glabels-ui.xml.h:15 +msgid "Center objects to horizontal label center" +msgstr "" + +#: data/ui/glabels-ui.xml.h:16 +msgid "Center objects to vertical label center" +msgstr "" + +#: data/ui/glabels-ui.xml.h:17 +msgid "Change the visibility of markup lines in the current window" +msgstr "" + +#: data/ui/glabels-ui.xml.h:18 +msgid "Change the visibility of the drawing toolbar in the current window" +msgstr "" + +#: data/ui/glabels-ui.xml.h:19 +msgid "Change the visibility of the grid in the current window" +msgstr "" + +#: data/ui/glabels-ui.xml.h:20 +msgid "Change the visibility of the main toolbar in the current window" +msgstr "" + +#: data/ui/glabels-ui.xml.h:21 +msgid "Change the visibility of the property toolbar in the current window" +msgstr "" + +#: data/ui/glabels-ui.xml.h:22 +msgid "Close" +msgstr "" + +#: data/ui/glabels-ui.xml.h:23 +#, fuzzy +msgid "Close the current file" +msgstr "Zapisuje bie¿±cy plik" + +#: data/ui/glabels-ui.xml.h:24 +msgid "Configure the application" +msgstr "" + +#: data/ui/glabels-ui.xml.h:25 +msgid "Contents" +msgstr "" + +#: data/ui/glabels-ui.xml.h:26 +msgid "Copy" +msgstr "" + +#: data/ui/glabels-ui.xml.h:27 +#, fuzzy +msgid "Copy the selection" +msgstr "Usuwa wszelkie zaznaczenia" + +#: data/ui/glabels-ui.xml.h:28 +#, fuzzy +msgid "Create a custom template" +msgstr "Tworzy liniê" + +#: data/ui/glabels-ui.xml.h:29 +#, fuzzy +msgid "Create a new document" +msgstr "Tworzy liniê" + +#: data/ui/glabels-ui.xml.h:30 +msgid "Create barcode object" +msgstr "Tworzy kod paskowy" + +#: data/ui/glabels-ui.xml.h:31 +msgid "Create box/rectangle object" +msgstr "Tworzy skrzynkê/prostok±t" + +#: data/ui/glabels-ui.xml.h:32 +msgid "Create ellipse/circle object" +msgstr "Tworzy elipsê/okr±g" + +#: data/ui/glabels-ui.xml.h:33 +msgid "Create image object" +msgstr "Tworzy obraz" + +#: data/ui/glabels-ui.xml.h:34 +msgid "Create line object" +msgstr "Tworzy liniê" + +#: data/ui/glabels-ui.xml.h:35 +msgid "Create text object" +msgstr "Tworzy obiekt tekstowy" + +#: data/ui/glabels-ui.xml.h:36 +msgid "Cu_t" +msgstr "" + +#: data/ui/glabels-ui.xml.h:37 +#, fuzzy +msgid "Customize" +msgstr "W³asny klucz pola" + +#: data/ui/glabels-ui.xml.h:38 +msgid "Customize Drawing Toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:39 +msgid "Customize Main Toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:40 +msgid "Customize Property Toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:41 +msgid "Customize toolbars" +msgstr "" + +#: data/ui/glabels-ui.xml.h:42 +msgid "Cut" +msgstr "" + +#: data/ui/glabels-ui.xml.h:43 +msgid "Cut the selection" +msgstr "" + +#: data/ui/glabels-ui.xml.h:44 +msgid "Decrease magnification" +msgstr "" + +#: data/ui/glabels-ui.xml.h:45 +msgid "Delete" +msgstr "Usuñ" + +#: data/ui/glabels-ui.xml.h:46 +#, fuzzy +msgid "Delete the selected objects" +msgstr "Tworzy obiekt tekstowy" + +#: data/ui/glabels-ui.xml.h:47 +msgid "Drawing toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:48 +msgid "Dump XML" +msgstr "" + +#: data/ui/glabels-ui.xml.h:49 +msgid "Dump the UI Xml description" +msgstr "" + +#: data/ui/glabels-ui.xml.h:50 +msgid "Edit merge properties" +msgstr "Modyfikuje w³a¶ciwo¶ci z³±czania" + +#: data/ui/glabels-ui.xml.h:54 +msgid "Flip object horizontally" +msgstr "" + +#: data/ui/glabels-ui.xml.h:55 +msgid "Flip object vertically" +msgstr "" + +#: data/ui/glabels-ui.xml.h:56 +#, fuzzy +msgid "Font name" +msgstr "Nie zapisuj" + +#: data/ui/glabels-ui.xml.h:57 +#, fuzzy +msgid "Font selector" +msgstr "Usuwa wszelkie zaznaczenia" + +#: data/ui/glabels-ui.xml.h:58 +#, fuzzy +msgid "Font size" +msgstr "Nie zapisuj" + +#: data/ui/glabels-ui.xml.h:59 +msgid "Icon and _Text" +msgstr "" + +#: data/ui/glabels-ui.xml.h:60 +msgid "Increase magnification" +msgstr "" + +#: data/ui/glabels-ui.xml.h:61 +msgid "Italic" +msgstr "" + +#: data/ui/glabels-ui.xml.h:63 +msgid "Left align" +msgstr "" + +#: data/ui/glabels-ui.xml.h:65 +msgid "Line width" +msgstr "" + +#: data/ui/glabels-ui.xml.h:66 +msgid "Lower object to bottom" +msgstr "" + +#: data/ui/glabels-ui.xml.h:67 +msgid "M_arkup" +msgstr "" + +#: data/ui/glabels-ui.xml.h:68 +msgid "Main toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:69 +msgid "Markup" +msgstr "" + +#: data/ui/glabels-ui.xml.h:70 +#, fuzzy +msgid "Modify document properties" +msgstr "Modyfikacja w³a¶ciwo¶ci z³±czania dokumentów" + +#: data/ui/glabels-ui.xml.h:71 +#, fuzzy +msgid "New" +msgstr "_Nowa" + +#: data/ui/glabels-ui.xml.h:72 +#, fuzzy +msgid "Object property editor" +msgstr "W³a¶ciwo¶ci tekstu" + +#: data/ui/glabels-ui.xml.h:73 +msgid "Only show icons in the drawing toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:74 +msgid "Only show icons in the main toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:76 +msgid "Open a file" +msgstr "Otwiera plik" + +#: data/ui/glabels-ui.xml.h:77 +#, fuzzy +msgid "Open the glabels manual" +msgstr "Otwórz etykietê" + +#: data/ui/glabels-ui.xml.h:78 +msgid "Paste" +msgstr "" + +#: data/ui/glabels-ui.xml.h:79 +msgid "Paste the clipboard" +msgstr "" + +#: data/ui/glabels-ui.xml.h:80 +#, fuzzy +msgid "Pr_eferences..." +msgstr "Glabels: Preferencje" + +#: data/ui/glabels-ui.xml.h:81 +#, fuzzy +msgid "Preferences" +msgstr "Glabels: Preferencje" + +#: data/ui/glabels-ui.xml.h:83 +#, fuzzy +msgid "Print the current file" +msgstr "Drukuje bie¿±cy plik" + +#: data/ui/glabels-ui.xml.h:84 +#, fuzzy +msgid "Proper_ties..." +msgstr "W³a¶ciwo¶ci tekstu" + +#: data/ui/glabels-ui.xml.h:85 +#, fuzzy +msgid "Properties" +msgstr "W³a¶ciwo¶ci tekstu" + +#: data/ui/glabels-ui.xml.h:86 +msgid "Property toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:87 +msgid "Quit" +msgstr "" + +#: data/ui/glabels-ui.xml.h:88 +msgid "Quit the program" +msgstr "" + +#: data/ui/glabels-ui.xml.h:89 +msgid "Raise object to top" +msgstr "" + +#: data/ui/glabels-ui.xml.h:90 +msgid "Recent _Files" +msgstr "" + +#: data/ui/glabels-ui.xml.h:91 +msgid "Redo" +msgstr "" + +#: data/ui/glabels-ui.xml.h:92 +msgid "Redo the undone action" +msgstr "" + +#: data/ui/glabels-ui.xml.h:93 +msgid "Remove all selections" +msgstr "Usuwa wszelkie zaznaczenia" + +#: data/ui/glabels-ui.xml.h:95 +#, no-c-format +msgid "Restore scale to 100%" +msgstr "" + +#: data/ui/glabels-ui.xml.h:96 +msgid "Right align" +msgstr "" + +#: data/ui/glabels-ui.xml.h:99 +msgid "Rotate object 90 clockwise" +msgstr "" + +#: data/ui/glabels-ui.xml.h:100 +msgid "Rotate object 90 counter-clockwise" +msgstr "" + +#: data/ui/glabels-ui.xml.h:101 +#, fuzzy +msgid "Save" +msgstr "Zapisz jako" + +#: data/ui/glabels-ui.xml.h:102 +msgid "Save As" +msgstr "Zapisz jako" + +#: data/ui/glabels-ui.xml.h:103 +#, fuzzy +msgid "Save _As..." +msgstr "Zapisz jako" + +#: data/ui/glabels-ui.xml.h:104 +#, fuzzy +msgid "Save the current file" +msgstr "Zapisuje bie¿±cy plik" + +#: data/ui/glabels-ui.xml.h:105 +msgid "Save the current file with a different name" +msgstr "" + +#: data/ui/glabels-ui.xml.h:106 +#, fuzzy +msgid "Select All" +msgstr "O_dznacz wszystko" + +#: data/ui/glabels-ui.xml.h:107 +#, fuzzy +msgid "Select _All" +msgstr "O_dznacz wszystko" + +#: data/ui/glabels-ui.xml.h:108 +#, fuzzy +msgid "Select all objects" +msgstr "Wybierz, przeno¶ i modyfikuj obiekty" + +#: data/ui/glabels-ui.xml.h:109 +msgid "Select, move and modify objects" +msgstr "Wybierz, przeno¶ i modyfikuj obiekty" + +#: data/ui/glabels-ui.xml.h:111 +msgid "Set drawing toolbar button style according to desktop default" +msgstr "" + +#: data/ui/glabels-ui.xml.h:112 +msgid "Set main toolbar button style according to desktop default" +msgstr "" + +#: data/ui/glabels-ui.xml.h:113 +msgid "Show _Tooltips" +msgstr "" + +#: data/ui/glabels-ui.xml.h:114 +msgid "Show both icons and texts in the drawing toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:115 +msgid "Show both icons and texts in the main toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:116 +msgid "Show tooltips in the drawing toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:117 +msgid "Show tooltips in the main toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:118 +msgid "Show tooltips in the property toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:119 +msgid "Template Designer" +msgstr "" + +#: data/ui/glabels-ui.xml.h:120 +msgid "Template _Designer..." +msgstr "" + +#: data/ui/glabels-ui.xml.h:121 +msgid "Text color" +msgstr "" + +#: data/ui/glabels-ui.xml.h:122 +#, fuzzy +msgid "U_n-select All" +msgstr "O_dznacz wszystko" + +#: data/ui/glabels-ui.xml.h:123 +#, fuzzy +msgid "Un-select All" +msgstr "O_dznacz wszystko" + +#: data/ui/glabels-ui.xml.h:124 +msgid "Undo" +msgstr "" + +#: data/ui/glabels-ui.xml.h:125 +msgid "Undo the last action" +msgstr "" + +#: data/ui/glabels-ui.xml.h:126 +#, fuzzy +msgid "Zoom _1:1" +msgstr "Powiêkszenie 1:1" + +#: data/ui/glabels-ui.xml.h:127 +#, fuzzy +msgid "Zoom _In" +msgstr "Powiêksz" + +#: data/ui/glabels-ui.xml.h:128 +#, fuzzy +msgid "Zoom _Out" +msgstr "Pomniejsz" + +#: data/ui/glabels-ui.xml.h:129 +#, fuzzy +msgid "Zoom to _fit" +msgstr "Powiêksza 1:1" + +#: data/ui/glabels-ui.xml.h:130 +msgid "Zoom to fit window" +msgstr "" + +#: data/ui/glabels-ui.xml.h:131 +msgid "_About..." +msgstr "" + +#: data/ui/glabels-ui.xml.h:132 +msgid "_Bottoms" +msgstr "" + +#: data/ui/glabels-ui.xml.h:135 +msgid "_Close" +msgstr "" + +#: data/ui/glabels-ui.xml.h:136 +msgid "_Contents" +msgstr "" + +#: data/ui/glabels-ui.xml.h:137 +msgid "_Copy" +msgstr "" + +#: data/ui/glabels-ui.xml.h:138 +#, fuzzy +msgid "_Create Object" +msgstr "Tworzy obiekt tekstowy" + +#: data/ui/glabels-ui.xml.h:139 +msgid "_Debug" +msgstr "" + +#: data/ui/glabels-ui.xml.h:141 +msgid "_Desktop Default" +msgstr "" + +#: data/ui/glabels-ui.xml.h:142 +msgid "_Drawing Toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:143 +msgid "_Edit" +msgstr "" + +#: data/ui/glabels-ui.xml.h:145 +#, fuzzy +msgid "_File" +msgstr "Wype³nienie" + +#: data/ui/glabels-ui.xml.h:146 +msgid "_Grid" +msgstr "" + +#: data/ui/glabels-ui.xml.h:147 +msgid "_Help" +msgstr "" + +#: data/ui/glabels-ui.xml.h:148 +msgid "_Icon" +msgstr "" + +#: data/ui/glabels-ui.xml.h:152 +msgid "_Main Toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:153 +#, fuzzy +msgid "_Merge Properties..." +msgstr "W³a¶ciwo¶ci z³±czania" + +#: data/ui/glabels-ui.xml.h:154 +msgid "_New" +msgstr "_Nowa" + +#: data/ui/glabels-ui.xml.h:155 +msgid "_Objects" +msgstr "" + +#: data/ui/glabels-ui.xml.h:156 +#, fuzzy +msgid "_Open..." +msgstr "Otwórz" + +#: data/ui/glabels-ui.xml.h:158 +msgid "_Paste" +msgstr "" + +#: data/ui/glabels-ui.xml.h:159 +#, fuzzy +msgid "_Print..." +msgstr "Wydrukuj" + +#: data/ui/glabels-ui.xml.h:160 +msgid "_Property Toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:161 +msgid "_Quit" +msgstr "" + +#: data/ui/glabels-ui.xml.h:164 +#, fuzzy +msgid "_Save" +msgstr "Zapisz jako" + +#: data/ui/glabels-ui.xml.h:168 +#, fuzzy +msgid "_View" +msgstr "_Nowa" + +#: data/glade/prefs-dialog.glade.h:1 +msgid " " +msgstr "" + +#: data/glade/prefs-dialog.glade.h:2 data/glade/object-editor.glade.h:1 +#: data/glade/template-designer.glade.h:5 +msgid "*" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:3 +msgid "Default page size" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:4 +msgid "Fill" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:5 +msgid "Line" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:6 +msgid "Text" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:7 +msgid "Units" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:8 data/glade/object-editor.glade.h:4 +msgid "Alignment:" +msgstr "Wyrównanie:" + +#: data/glade/prefs-dialog.glade.h:9 data/glade/object-editor.glade.h:8 +msgid "Color:" +msgstr "Kolor:" + +#: data/glade/prefs-dialog.glade.h:10 +msgid "Font:" +msgstr "Czcionka:" + +#: data/glade/prefs-dialog.glade.h:11 +msgid "ISO A4" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:12 +msgid "Inches" +msgstr "Cale" + +#: data/glade/prefs-dialog.glade.h:13 data/glade/object-editor.glade.h:19 +msgid "Line Spacing:" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:14 +#, fuzzy +msgid "Locale" +msgstr "Skala" + +#: data/glade/prefs-dialog.glade.h:15 +msgid "Millimeters" +msgstr "Milimetry" + +#: data/glade/prefs-dialog.glade.h:16 +msgid "Object defaults" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:17 +msgid "Points" +msgstr "Punkty" + +#: data/glade/prefs-dialog.glade.h:18 +msgid "Select default properties for new objects." +msgstr "" + +#: data/glade/prefs-dialog.glade.h:19 +msgid "Select locale specific behavior." +msgstr "" + +#: data/glade/prefs-dialog.glade.h:20 data/templates/paper-sizes.xml.h:25 +msgid "US Letter" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:21 data/glade/object-editor.glade.h:29 +#: data/glade/template-designer.glade.h:72 +msgid "Width:" +msgstr "Szeroko¶æ:" + +#: data/glade/object-editor.glade.h:2 +msgid "00000000000 00000" +msgstr "" + +#: data/glade/object-editor.glade.h:3 +msgid "Xxx object properties" +msgstr "" + +#: data/glade/object-editor.glade.h:5 +msgid "Allow merge to automatically shrink text" +msgstr "" + +#: data/glade/object-editor.glade.h:6 +msgid "Angle:" +msgstr "K±t" + +#: data/glade/object-editor.glade.h:7 +msgid "Checksum" +msgstr "" + +#: data/glade/object-editor.glade.h:10 +#, fuzzy +msgid "Family:" +msgstr "Wype³nienie" + +#: data/glade/object-editor.glade.h:12 +msgid "Fill" +msgstr "Wype³nienie" + +#: data/glade/object-editor.glade.h:13 data/glade/template-designer.glade.h:33 +msgid "Height:" +msgstr "Wysoko¶æ:" + +#: data/glade/object-editor.glade.h:14 +msgid "Image" +msgstr "Obraz" + +#: data/glade/object-editor.glade.h:15 +msgid "Insert merge field" +msgstr "Wstaw pole z³±czenia" + +#: data/glade/object-editor.glade.h:17 +msgid "Length:" +msgstr "D³ugo¶æ:" + +#: data/glade/object-editor.glade.h:18 +msgid "Line" +msgstr "Linia" + +#: data/glade/object-editor.glade.h:20 +msgid "Literal:" +msgstr "Litera³:" + +#: data/glade/object-editor.glade.h:21 +msgid "Load image" +msgstr "" + +#: data/glade/object-editor.glade.h:22 +msgid "Position" +msgstr "Pozycja" + +#: data/glade/object-editor.glade.h:23 +msgid "Reset image size" +msgstr "Wyzeruj rozmiar obrazu" + +#: data/glade/object-editor.glade.h:24 +msgid "Size" +msgstr "Rozmiar" + +#: data/glade/object-editor.glade.h:25 +#, fuzzy +msgid "Size:" +msgstr "Rozmiar" + +#: data/glade/object-editor.glade.h:26 +#, fuzzy +msgid "Style" +msgstr "Styl" + +#: data/glade/object-editor.glade.h:27 +#, fuzzy +msgid "Style:" +msgstr "Styl" + +#: data/glade/object-editor.glade.h:30 +msgid "X:" +msgstr "X:" + +#: data/glade/object-editor.glade.h:31 +msgid "Y:" +msgstr "Y:" + +#: data/glade/object-editor.glade.h:32 +msgid "degrees" +msgstr "stopni(e)" + +#: data/glade/object-editor.glade.h:33 +msgid "dialog1" +msgstr "" + +#: data/glade/object-editor.glade.h:34 +msgid "digits:" +msgstr "" + +#: data/glade/object-editor.glade.h:35 +#, fuzzy +msgid "format:" +msgstr "Format:" + +#: data/glade/template-designer.glade.h:1 +msgid " " +msgstr "" + +#: data/glade/template-designer.glade.h:2 +msgid "(e.g., \"Mailing Labels,\" \"Business Cards,\" ...)" +msgstr "" + +#: data/glade/template-designer.glade.h:3 +msgid "(e.g., 8163A)" +msgstr "" + +#: data/glade/template-designer.glade.h:4 +msgid "(e.g., Avery, Acme, ...)" +msgstr "" + +#: data/glade/template-designer.glade.h:6 +msgid "1. Outer radius:" +msgstr "" + +#: data/glade/template-designer.glade.h:7 +msgid "1. Radius:" +msgstr "" + +#: data/glade/template-designer.glade.h:8 +#, fuzzy +msgid "1. Width:" +msgstr "Szeroko¶æ:" + +#: data/glade/template-designer.glade.h:9 +#, fuzzy +msgid "2. Height:" +msgstr "Wysoko¶æ:" + +#: data/glade/template-designer.glade.h:10 +msgid "2. Inner radius:" +msgstr "" + +#: data/glade/template-designer.glade.h:11 +msgid "2. Waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:12 +msgid "3. Clipping width:" +msgstr "" + +#: data/glade/template-designer.glade.h:13 +msgid "3. Margin" +msgstr "" + +#: data/glade/template-designer.glade.h:14 +msgid "3. Round (radius of corner):" +msgstr "" + +#: data/glade/template-designer.glade.h:15 +msgid "4. Clipping height:" +msgstr "" + +#: data/glade/template-designer.glade.h:16 +msgid "4. Horiz. waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:17 +msgid "5. Vert. waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:18 +msgid "5. Waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:19 +msgid "6. Margin" +msgstr "" + +#: data/glade/template-designer.glade.h:20 +msgid "Brand/Manufacturer:" +msgstr "" + +#: data/glade/template-designer.glade.h:21 +msgid "CD/DVD (including credit card CDs)" +msgstr "" + +#: data/glade/template-designer.glade.h:22 +msgid "" +"Congratulations!\n" +"\n" +"You have completed the gLabels Template Designer.\n" +"If you wish to accept and save your design, click \"Apply.\"\n" +"\n" +"Otherwise, you may click \"Cancel\" to abandon your design\n" +"or \"Back\" to continue editing this design." +msgstr "" + +#: data/glade/template-designer.glade.h:30 +msgid "Design Completed" +msgstr "" + +#: data/glade/template-designer.glade.h:31 +msgid "Distance from left edge (x0):" +msgstr "" + +#: data/glade/template-designer.glade.h:32 +msgid "Distance from top edge (y0):" +msgstr "" + +#: data/glade/template-designer.glade.h:34 +msgid "Horizontal pitch (dx):" +msgstr "" + +#: data/glade/template-designer.glade.h:35 +msgid "" +"How many layouts will your template contain? \n" +"\n" +"A layout is a set of labels or cards that can be arranged in a simple grid.\n" +"Most templates only need one layout, as in the first example.\n" +"The second example illustrates when two layouts are needed." +msgstr "" + +#: data/glade/template-designer.glade.h:40 +msgid "Label Size (CD/DVD)" +msgstr "" + +#: data/glade/template-designer.glade.h:41 +#, fuzzy +msgid "Label Size (Round)" +msgstr "Rozmiar etykiety:" + +#: data/glade/template-designer.glade.h:42 +#, fuzzy +msgid "Label or Card Shape" +msgstr "Nowa etykieta lub karta" + +#: data/glade/template-designer.glade.h:43 +msgid "Label or Card Size (Rectangular)" +msgstr "" + +#: data/glade/template-designer.glade.h:44 +#, fuzzy +msgid "Layout #1" +msgstr "Wygl±d:" + +#: data/glade/template-designer.glade.h:45 +#, fuzzy +msgid "Layout #2" +msgstr "Wygl±d:" + +#: data/glade/template-designer.glade.h:46 +#, fuzzy +msgid "Layout(s)" +msgstr "Wygl±d:" + +#: data/glade/template-designer.glade.h:47 +#, fuzzy +msgid "Name and Description" +msgstr "Opis:" + +#: data/glade/template-designer.glade.h:48 +msgid "Number across (nx):" +msgstr "" + +#: data/glade/template-designer.glade.h:49 +msgid "Number down (ny):" +msgstr "" + +#: data/glade/template-designer.glade.h:50 +msgid "Number of Layouts" +msgstr "" + +#: data/glade/template-designer.glade.h:51 +msgid "Number of layouts:" +msgstr "" + +#: data/glade/template-designer.glade.h:52 +#, fuzzy +msgid "Page Size" +msgstr "Rozmiar strony:" + +#: data/glade/template-designer.glade.h:54 +msgid "Part #:" +msgstr "" + +#: data/glade/template-designer.glade.h:55 +msgid "" +"Please enter the following identifying information about the template " +"stationery." +msgstr "" + +#: data/glade/template-designer.glade.h:56 +msgid "Please enter the following layout information." +msgstr "" + +#: data/glade/template-designer.glade.h:57 +msgid "" +"Please enter the following size parameters of a single label in your " +"template." +msgstr "" + +#: data/glade/template-designer.glade.h:58 +msgid "" +"Please enter the following size parameters of a single label or card in your " +"template." +msgstr "" + +#: data/glade/template-designer.glade.h:59 +msgid "Please select the basic shape of the labels or cards." +msgstr "" + +#: data/glade/template-designer.glade.h:60 +msgid "Please select the page size of the template stationery." +msgstr "" + +#: data/glade/template-designer.glade.h:61 +#, fuzzy +msgid "Print test sheet" +msgstr "na pierwszym arkuszu" + +#: data/glade/template-designer.glade.h:62 +msgid "Rectangular or square (can have rounded corners)" +msgstr "" + +#: data/glade/template-designer.glade.h:63 +msgid "Round" +msgstr "" + +#: data/glade/template-designer.glade.h:64 +msgid "" +"Templates needing\n" +"two layouts." +msgstr "" + +#: data/glade/template-designer.glade.h:66 +msgid "" +"Templates needing only\n" +"one layout." +msgstr "" + +#: data/glade/template-designer.glade.h:68 +msgid "Vertical pitch (dy):" +msgstr "" + +#: data/glade/template-designer.glade.h:69 +msgid "" +"Welcome to the gLabels Template Designer.\n" +"\n" +"This dialog will assist you in the creation of a custom gLabels template." +msgstr "" + +#: data/templates/paper-sizes.xml.h:1 +msgid "A0" +msgstr "" + +#: data/templates/paper-sizes.xml.h:2 +msgid "A1" +msgstr "" + +#: data/templates/paper-sizes.xml.h:3 +msgid "A10" +msgstr "" + +#: data/templates/paper-sizes.xml.h:4 +msgid "A2" +msgstr "" + +#: data/templates/paper-sizes.xml.h:5 +msgid "A3" +msgstr "" + +#: data/templates/paper-sizes.xml.h:6 +msgid "A4" +msgstr "" + +#: data/templates/paper-sizes.xml.h:7 +msgid "A5" +msgstr "" + +#: data/templates/paper-sizes.xml.h:8 +msgid "A6" +msgstr "" + +#: data/templates/paper-sizes.xml.h:9 +msgid "A7" +msgstr "" + +#: data/templates/paper-sizes.xml.h:10 +msgid "A8" +msgstr "" + +#: data/templates/paper-sizes.xml.h:11 +msgid "A9" +msgstr "" + +#: data/templates/paper-sizes.xml.h:12 +msgid "B0" +msgstr "" + +#: data/templates/paper-sizes.xml.h:13 +msgid "B1" +msgstr "" + +#: data/templates/paper-sizes.xml.h:14 +msgid "B10" +msgstr "" + +#: data/templates/paper-sizes.xml.h:15 +msgid "B2" +msgstr "" + +#: data/templates/paper-sizes.xml.h:16 +msgid "B3" +msgstr "" + +#: data/templates/paper-sizes.xml.h:17 +msgid "B4" +msgstr "" + +#: data/templates/paper-sizes.xml.h:18 +msgid "B5" +msgstr "" + +#: data/templates/paper-sizes.xml.h:19 +msgid "B6" +msgstr "" + +#: data/templates/paper-sizes.xml.h:20 +msgid "B7" +msgstr "" + +#: data/templates/paper-sizes.xml.h:21 +msgid "B8" +msgstr "" + +#: data/templates/paper-sizes.xml.h:22 +msgid "B9" +msgstr "" + +#: data/templates/paper-sizes.xml.h:23 +msgid "US Executive" +msgstr "" + +#: data/templates/paper-sizes.xml.h:24 +msgid "US Legal" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:1 +#: data/templates/zweckform-iso-templates.xml.h:1 +msgid "Address Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:2 +#: data/templates/avery-iso-templates.xml.h:2 +#: data/templates/zweckform-iso-templates.xml.h:3 +#: data/templates/misc-us-templates.xml.h:2 +#: data/templates/misc-iso-templates.xml.h:9 +msgid "Business Cards" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:3 +msgid "CD/DVD Labels (Disc Labels)" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:4 +msgid "Diskette Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:5 +#, fuzzy +msgid "Filing Labels" +msgstr "Etykiety" + +#: data/templates/avery-us-templates.xml.h:6 +msgid "Full Sheet Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:7 +#, fuzzy +msgid "Large Round Labels" +msgstr "Rozpocznij od etykiety" + +#: data/templates/avery-us-templates.xml.h:8 +msgid "Name Badge Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:9 +msgid "Return Address Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:10 +msgid "Shipping Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:11 +#, fuzzy +msgid "Small Round Labels" +msgstr "Rozpocznij od etykiety" + +#: data/templates/avery-us-templates.xml.h:12 +#, fuzzy +msgid "Square Labels" +msgstr "Etykiety" + +#: data/templates/avery-us-templates.xml.h:13 +msgid "Video Tape Face Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:14 +msgid "Video Tape Spine Labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:1 +msgid "Address labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:3 +msgid "CD Booklet" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:4 +msgid "CD Inlet" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:5 +#: data/templates/zweckform-iso-templates.xml.h:4 +#: data/templates/misc-us-templates.xml.h:4 +#: data/templates/misc-iso-templates.xml.h:10 +#, fuzzy +msgid "CD/DVD Labels" +msgstr "Etykiety" + +#: data/templates/avery-iso-templates.xml.h:6 +msgid "Diskette labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:7 +#: data/templates/zweckform-iso-templates.xml.h:7 +#: data/templates/misc-iso-templates.xml.h:17 +msgid "Mailing Labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:8 +#, fuzzy +msgid "Mailing labels" +msgstr "Etykiety" + +#: data/templates/avery-iso-templates.xml.h:9 +msgid "Mini Address Labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:10 +#, fuzzy +msgid "Shipping labels" +msgstr "Otwórz etykietê" + +#: data/templates/zweckform-iso-templates.xml.h:2 +msgid "Allround Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:5 +msgid "Correction and Cover-up Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:6 +msgid "Lever Arch File Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:8 +msgid "QSL-Karten Etiketten 70mm x 50,8mm" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:9 +msgid "Rectangular Copier Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:10 +#: data/templates/misc-iso-templates.xml.h:22 +msgid "Rectangular Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:11 +msgid "Video Labels (back)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:1 +msgid "Business Card CD" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:3 +msgid "CD Template Rectangles" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:5 +msgid "CD/DVD Labels (Face Only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:6 +#: data/templates/misc-iso-templates.xml.h:11 +msgid "CD/DVD Labels (face only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:7 +#, fuzzy +msgid "DLT Labels" +msgstr "Etykiety" + +#: data/templates/misc-us-templates.xml.h:8 +msgid "Microtube labels" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:9 +msgid "Mini-CD Labels" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:10 +msgid "PRO CD Labels 2-up (CD spine only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:11 +msgid "PRO CD Labels 2-up (Face only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:12 +#: data/templates/misc-iso-templates.xml.h:21 +msgid "PRO CD Labels 2-up (face only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:13 +msgid "Slimline CD Case (rightside up)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:14 +msgid "Slimline CD Case (upside down)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:1 +msgid "Agipa 119488: Business Cards" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:2 +msgid "Allround Labels --24" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:3 +msgid "Allround Labels --44" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:4 +msgid "Allround Labels --64" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:5 +msgid "Allround Labels --65" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:6 +msgid "Arch File Labels" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:7 +msgid "Arch File Labels (large)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:8 +msgid "Arch File Labels (small)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:12 +msgid "CD/DVD Labels Standard Format (face only)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:13 +msgid "Diskette Labels (face only)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:14 +msgid "EPSON Photo Stickers 16" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:15 +msgid "Etiketten" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:16 +msgid "Fridge Magnet Stickers" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:18 +msgid "Mailing Labels --14" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:19 +msgid "Mailing Labels-2 columns" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:20 +msgid "Mailing Labels-3 columns" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:23 +msgid "Video Labels (face only)" +msgstr "" + +#: data/desktop/glabels.desktop.in.h:1 +msgid "Create labels, business cards and media covers." +msgstr "" + +#: data/desktop/glabels.desktop.in.h:2 +msgid "gLabels Label Designer" +msgstr "" + +#: data/mime/glabels.keys.in.h:1 data/mime/glabels.xml.in.h:1 +#, fuzzy +msgid "gLabels Project File" +msgstr "W³a¶ciwo¶ci tekstu" + +#, fuzzy +#~ msgid "Object _Properties..." +#~ msgstr "W³a¶ciwo¶ci tekstu" + +#~ msgid "Display units" +#~ msgstr "Jednostki wy¶wietlania" + +#~ msgid "Default page size" +#~ msgstr "Domy¶lny rozmiar strony" + +#~ msgid "Outline" +#~ msgstr "Ramka" + +#~ msgid "Edit line object properties" +#~ msgstr "Modyfikacja w³a¶ciwo¶ci linii" + +#~ msgid "Edit text object properties" +#~ msgstr "Modyfikacja w³a¶ciowo¶ci tekstu" + +#~ msgid "Maintain current aspect ratio" +#~ msgstr "Utrzymywanie aktualnych proporcji" + +#, fuzzy +#~ msgid "CD Labels" +#~ msgstr "Etykiety" + +#, fuzzy +#~ msgid "Open %s" +#~ msgstr "Otwórz" + +#~ msgid "Revert to saved copy of %s?" +#~ msgstr "Przywróciæ zapisan± kopiê pliku %s?" + +#~ msgid "Unknown media type. Using default." +#~ msgstr "Nieznany typ no¶nika. U¿yto warto¶ci domy¶lnych." + +#~ msgid "" +#~ "``%s'' has been modified.\n" +#~ "\n" +#~ "Do you wish to save it?" +#~ msgstr "" +#~ "Plik \"%s\" zosta³ zmodyfikowany.\n" +#~ "\n" +#~ "Czy chcesz go zapisaæ?" + +#~ msgid "Close / Save label as" +#~ msgstr "Zamyka / Zapisuje etykietê jako" + +#~ msgid "Label no longer valid!" +#~ msgstr "Etykieta nie jest ju¿ poprawna!" + +#~ msgid "Error writing file" +#~ msgstr "B³±d podczas zapisu pliku" + +#~ msgid "Edit properties..." +#~ msgstr "Modyfikuj w³a¶ciwo¶ci..." + +#~ msgid "Appearance" +#~ msgstr "Wygl±d" + +#~ msgid "Position/Size" +#~ msgstr "Pozycja/Rozmiar" + +#~ msgid "Image format not currently supported" +#~ msgstr "Format obrazu aktualnie nie jest obs³ugiwany" + +#~ msgid "Barcode data" +#~ msgstr "Dane kodu paskowego" + +#~ msgid "%" +#~ msgstr "%" + +#~ msgid "Show text with barcode" +#~ msgstr "Wy¶wietlanie tekstu z kodem paskowym" + +#~ msgid "Fields" +#~ msgstr "Pola" + +#~ msgid "Column" +#~ msgstr "Kolumna" + +#~ msgid "Sample data" +#~ msgstr "Próbne dane" + +#~ msgid "Make a new, empty label" +#~ msgstr "Tworzy now±, pust± etykietê" + +#~ msgid " New " +#~ msgstr " Nowa " + +#~ msgid "New Label/Card" +#~ msgstr "Nowa Etykieta/Karta" + +#~ msgid " Open " +#~ msgstr " Otwórz " + +#~ msgid " Save " +#~ msgstr " Zapisz " + +#~ msgid " Print " +#~ msgstr " Wydrukuj " + +#~ msgid "Function is not implemented!" +#~ msgstr "Funkcja nie jest zaimplementowana!" diff --git a/glabels2/po/pt_BR.po b/glabels2/po/pt_BR.po new file mode 100644 index 00000000..2c1568eb --- /dev/null +++ b/glabels2/po/pt_BR.po @@ -0,0 +1,2624 @@ +# Brazilian Portuguese translation of Glabels. +# Copyright (C) 2001 Jim Evins +# Paulo R. Ormenese , 2001. +# +msgid "" +msgstr "" +"Project-Id-Version: glabels 1.91.0\n" +"POT-Creation-Date: 2004-08-08 00:43-0400\n" +"PO-Revision-Date: 2003-01-03 23:15-0300\n" +"Last-Translator: Paulo R. Ormenese \n" +"Language-Team: Brazilian portuguese <>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/glabels.c:55 +msgid "Show view debugging messages." +msgstr "Exibe mensagens de depuração de visualização." + +#: src/glabels.c:58 +msgid "Show item debugging messages." +msgstr "Exibe mensagens de depuração de item." + +#: src/glabels.c:61 +msgid "Show printing debugging messages." +msgstr "Exibe mensagens de depuração de impressão." + +#: src/glabels.c:64 +msgid "Show prefs debugging messages." +msgstr "Exibe mensagens de depuração de preferências." + +#: src/glabels.c:67 +msgid "Show file debugging messages." +msgstr "Exibe mensagens de depuração de arquivo." + +#: src/glabels.c:70 +msgid "Show document debugging messages." +msgstr "Exibe mensagens de depuração de documeto." + +#: src/glabels.c:73 +msgid "Show template debugging messages." +msgstr "Exibe mensagens de depuração de modelo." + +#: src/glabels.c:76 +#, fuzzy +msgid "Show paper debugging messages." +msgstr "Exibe mensagens de depuração de preferências." + +#: src/glabels.c:79 +msgid "Show xml debugging messages." +msgstr "Exibe mensagens de depuração de xml." + +#: src/glabels.c:82 +msgid "Show document merge debugging messages." +msgstr "Exibe mensagens de depuração de fusão de documento." + +#: src/glabels.c:85 +msgid "Show commands debugging messages." +msgstr "Exibe mensagens de depuração de comandos." + +#: src/glabels.c:88 +msgid "Show undo debugging messages." +msgstr "Exibe mensagens de depuração de desfazer." + +#: src/glabels.c:91 +msgid "Show recent debugging messages." +msgstr "Exibe mensagens de depuração de recentes" + +#: src/glabels.c:94 +msgid "Show window debugging messages." +msgstr "Exibe mensagens de depuração de janela." + +#: src/glabels.c:97 +msgid "Show ui debugging messages." +msgstr "Exibe mensagens de depuração de ui." + +#: src/glabels.c:100 +#, fuzzy +msgid "Show property_bar debugging messages." +msgstr "Exibe mensagens de depuração de preferências." + +#: src/glabels.c:103 +msgid "Show media select widget debugging messages." +msgstr "Exibe mensagens de depuração de widget de seleção de mídia." + +#: src/glabels.c:106 +msgid "Show mini preview widget debugging messages." +msgstr "Exibe mensagens de depuração de widget de mini previsão." + +#: src/glabels.c:109 +#, fuzzy +msgid "Show pixbuf cache debugging messages." +msgstr "Exibe mensagens de depuração de visualização." + +#: src/glabels.c:112 +msgid "Show widget debugging messages." +msgstr "Exibe mensagens de depuração de widget." + +#: src/glabels.c:115 +#, fuzzy +msgid "Show object editor debugging messages." +msgstr "Exibe mensagens de depuração de recentes" + +#: src/glabels.c:118 +msgid "Turn on all debugging messages." +msgstr "Ativa todas as mensagens de depuração." + +#: src/glabels.c:187 +msgid "Could not initialize Bonobo!\n" +msgstr "Impossível inicializar Bonobo!\n" + +#: src/glabels-batch.c:48 +msgid "print this message" +msgstr "mostra esta mensagem" + +#: src/glabels-batch.c:50 +msgid "print the version of glabels-batch being used" +msgstr "mostra a versão de glabels-batch que está sendo usada" + +#: src/glabels-batch.c:52 +msgid "set output filename (default=\"output.ps\")" +msgstr "define o nome do arquivo de saída (padrão=\"output.ps\")" + +#: src/glabels-batch.c:52 +msgid "filename" +msgstr "nome_de_arquivo" + +#: src/glabels-batch.c:54 +msgid "number of sheets (default=1)" +msgstr "número de páginas (padrão=1)" + +#: src/glabels-batch.c:54 +msgid "sheets" +msgstr "páginas" + +#: src/glabels-batch.c:56 +msgid "number of copies (default=1)" +msgstr "número de cópias (padrão=1)" + +#: src/glabels-batch.c:56 +msgid "copies" +msgstr "cópias" + +#: src/glabels-batch.c:58 src/print-dialog.c:336 +msgid "print outlines (to test printer alignment)" +msgstr "imprimir contornos (testar alinhamento da impressora)" + +#: src/glabels-batch.c:60 src/print-dialog.c:344 +msgid "print in reverse (i.e. a mirror image)" +msgstr "imprimir ao contrário (como uma imagem de espelho)" + +#: src/glabels-batch.c:96 +msgid "[OPTION...] GLABELS_FILE..." +msgstr "[OPÇÃO...] ARQUIVO_GLABELS..." + +#: src/glabels-batch.c:116 +msgid "missing glabels file\n" +msgstr "faltando arquivo glabels\n" + +#: src/glabels-batch.c:157 +#, c-format +msgid "cannot open glabels file %s\n" +msgstr "impossível abrir o arquivo glabels %s\n" + +#: src/window.c:244 +msgid "(none) - gLabels" +msgstr "(sem nome) - gLabels" + +#: src/window.c:414 +msgid "(modified)" +msgstr "(modificado)" + +#: src/stock.c:65 data/ui/glabels-ui.xml.h:165 +msgid "_Select Mode" +msgstr "_Selecionar Modo" + +#: src/stock.c:66 data/ui/glabels-ui.xml.h:166 +msgid "_Text" +msgstr "_Texto" + +#: src/stock.c:67 data/ui/glabels-ui.xml.h:151 +msgid "_Line" +msgstr "_Linha" + +#: src/stock.c:68 data/ui/glabels-ui.xml.h:133 +msgid "_Box" +msgstr "_Caixa" + +#: src/stock.c:69 data/ui/glabels-ui.xml.h:144 +msgid "_Ellipse" +msgstr "_Elipse" + +#: src/stock.c:70 data/ui/glabels-ui.xml.h:149 +msgid "_Image" +msgstr "_Imagem" + +#: src/stock.c:71 data/ui/glabels-ui.xml.h:11 +msgid "Bar_code" +msgstr "_Código barras" + +#: src/stock.c:72 +msgid "_Merge Properties" +msgstr "Propriedades de _Fusão" + +#: src/stock.c:73 +msgid "Object _Properties" +msgstr "_Propriedades de Objeto" + +#: src/stock.c:74 data/ui/glabels-ui.xml.h:13 +msgid "Bring to _Front" +msgstr "Trazer para _Frente" + +#: src/stock.c:75 data/ui/glabels-ui.xml.h:110 +msgid "Send to _Back" +msgstr "Enviar para _trás" + +#: src/stock.c:76 data/ui/glabels-ui.xml.h:97 +msgid "Rotate _Left" +msgstr "Girar _Esquerda" + +#: src/stock.c:77 data/ui/glabels-ui.xml.h:98 +msgid "Rotate _Right" +msgstr "Girar _Direita" + +#: src/stock.c:78 data/ui/glabels-ui.xml.h:52 +msgid "Flip _Horizontally" +msgstr "Refletir _Horizontalmente" + +#: src/stock.c:79 data/ui/glabels-ui.xml.h:53 +msgid "Flip _Vertically" +msgstr "Refletir _Verticalmente" + +#: src/stock.c:80 data/ui/glabels-ui.xml.h:150 +msgid "_Lefts" +msgstr "_Esquerdas" + +#: src/stock.c:81 data/ui/glabels-ui.xml.h:162 +msgid "_Rights" +msgstr "_Direitas" + +#: src/stock.c:82 data/ui/glabels-ui.xml.h:134 +msgid "_Centers" +msgstr "C_entros" + +#: src/stock.c:83 data/ui/glabels-ui.xml.h:167 +msgid "_Tops" +msgstr "_Topos" + +#: src/stock.c:84 +msgid "Bottoms" +msgstr "Bases" + +#: src/stock.c:85 +msgid "Centers" +msgstr "Centros" + +#: src/stock.c:86 src/stock.c:87 data/ui/glabels-ui.xml.h:62 +msgid "Label Ce_nter" +msgstr "Ce_ntro Etiqueta" + +#: src/stock.c:88 data/ui/glabels-ui.xml.h:51 +msgid "Fill color" +msgstr "" + +#: src/stock.c:89 data/ui/glabels-ui.xml.h:64 +msgid "Line color" +msgstr "" + +#: src/stock.c:90 src/stock.c:92 +#, fuzzy +msgid "Linked" +msgstr "Linha" + +#: src/stock.c:91 src/stock.c:93 +#, fuzzy +msgid "Not Linked" +msgstr "Nenhum" + +#: src/ui-property-bar.c:345 src/object-editor.c:499 +#, fuzzy +msgid "Default" +msgstr "Apagar" + +#: src/ui-property-bar.c:360 src/object-editor.c:512 +msgid "No fill" +msgstr "" + +#: src/ui-property-bar.c:375 src/object-editor.c:505 +#, fuzzy +msgid "No line" +msgstr "Nenhum" + +#: src/ui-sidebar.c:180 +#, fuzzy +msgid "Object properties" +msgstr "_Propriedades de Objeto" + +#: src/commands.c:385 +msgid "" +"A label and business card creation program for GNOME.\n" +" \n" +"Glabels is free software; you can redistribute it and/or modify it under the " +"terms of the GNU General Public License as published by the Free Software " +"Foundation; either version 2 of the License, or (at your option) any later " +"version.\n" +" \n" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details.\n" +msgstr "" +"Um programa para criação de etiquetas e cartões de negócios para o GNOME.\n" +"\n" +"Glabels é software livre; você pode redistribuí-lo e/ou modificá-lo sob os " +"termos da Licença Pública Geral GNU conforme publicada pela Free Software " +"Foundation; ou a versão 2 da Licença, ou (sob sua opção) qualquer versão " +"posterior.\n" +"\n" +"Este programa é distribuido na esperança de que seja útil, mas SEM QUALQUER " +"GARANTIA; sem mesmo as garantias implícitas de COMERCIALIZAÇÃO ou AJUSTES A " +"UM PROPÓSITO PARTICULAR. Veja a Licença Pública Geral GNU para mais " +"detalhes.\n" + +#: src/commands.c:399 +msgid "See the file AUTHORS for additional credits," +msgstr "Veja o arquivo AUTHORS para ver créditos adicionais," + +#: src/commands.c:400 +#, fuzzy +msgid "or visit http://glabels.sourceforge.net/" +msgstr "ou visite http://snaught.com/glabels" + +#: src/commands.c:409 +msgid " " +msgstr "" + +#: src/commands.c:424 +msgid "glabels" +msgstr "glabels" + +#: src/file.c:100 +msgid "New Label or Card" +msgstr "Nova Etiqueta ou Cartão" + +#: src/file.c:132 src/file.c:304 +msgid "Media Type" +msgstr "Tipo de mídia" + +#: src/file.c:138 src/file.c:310 +msgid "Label orientation" +msgstr "Orientação da etiqueta" + +#: src/file.c:269 +#, fuzzy +msgid "Label properties" +msgstr "_Propriedades de Objeto" + +#: src/file.c:452 src/file.c:870 +msgid "All files" +msgstr "" + +#: src/file.c:457 src/file.c:875 +#, fuzzy +msgid "gLabels documents" +msgstr "Preferências do gLabels" + +#: src/file.c:505 src/file.c:617 src/file.c:934 src/file.c:1130 +msgid "Empty file name selection" +msgstr "Seleção de nome de arquivo vazia" + +#: src/file.c:506 src/file.c:520 src/file.c:618 src/file.c:632 +msgid "Please select a file or supply a valid file name" +msgstr "Por favor, selecione um arquivo ou forneça um nome de arquivo válido" + +#: src/file.c:519 src/file.c:631 +msgid "File does not exist" +msgstr "Arquivo inexistente" + +#: src/file.c:563 data/ui/glabels-ui.xml.h:75 +msgid "Open" +msgstr "Abrir" + +#: src/file.c:565 +msgid "Open label" +msgstr "Abrir etiqueta" + +#: src/file.c:707 +#, c-format +msgid "Could not open file \"%s\"" +msgstr "Impossível abrir o arquivo \"%s\"" + +#: src/file.c:715 +msgid "Not a supported file format" +msgstr "Formato de arquivo não suportado" + +#: src/file.c:797 src/file.c:979 src/file.c:1174 +#, c-format +msgid "Could not save file \"%s\"" +msgstr "Impossível salvar o arquivo \"%s\"" + +#: src/file.c:805 src/file.c:987 src/file.c:1182 +msgid "Error encountered during save. The file is still not saved." +msgstr "Erro encontrado ao salvar. O arquivo ainda não foi salvo." + +#: src/file.c:848 src/file.c:1048 +#, c-format +msgid "Save \"%s\" as" +msgstr "Salvar \"%s\" como" + +#: src/file.c:935 src/file.c:1131 +msgid "Please supply a valid file name" +msgstr "Por favor, forneça um nome de arquivo válido" + +#: src/file.c:952 src/file.c:1147 +#, c-format +msgid "Overwrite file \"%s\"?" +msgstr "Sobrescrever o arquivo \"%s\"?" + +#: src/file.c:960 src/file.c:1155 +msgid "File already exists." +msgstr "O arquivo já existe." + +#: src/file.c:1271 +#, c-format +msgid "Save changes to document \"%s\" before closing?" +msgstr "Salvar modificações no documento \"%s\" antes de fechar?" + +#: src/file.c:1279 +msgid "Your changes will be lost if you don't save them." +msgstr "Suas modificações serão perdidas se você não salvá-las." + +#: src/file.c:1282 +msgid "Close without saving" +msgstr "Fechar sem salvar" + +#. Should not happen +#: src/prefs.c:156 src/prefs.c:163 data/glade/prefs-dialog.glade.h:23 +#: data/glade/object-editor.glade.h:37 +msgid "points" +msgstr "pontos" + +#: src/prefs.c:158 data/glade/object-editor.glade.h:36 +#: data/glade/template-designer.glade.h:74 +msgid "inches" +msgstr "poleg." + +#: src/prefs.c:160 +msgid "mm" +msgstr "mm" + +#: src/prefs-dialog.c:248 data/glade/prefs-dialog.glade.h:22 +msgid "gLabels Preferences" +msgstr "Preferências do gLabels" + +#. +#. * Submenu: Order +#. +#: src/view.c:3570 data/ui/glabels-ui.xml.h:157 +msgid "_Order" +msgstr "_Ordenar" + +#. +#. * Submenu: Rotate/Flip +#. +#: src/view.c:3591 data/ui/glabels-ui.xml.h:163 +msgid "_Rotate/Flip" +msgstr "_Girar/Refletir" + +#. +#. * Submenu: Align Horizontally +#. +#: src/view.c:3624 +msgid "Align _Horizontally" +msgstr "Alinhar _Horizontalmente" + +#. +#. * Submenu: Align Vertically +#. +#: src/view.c:3663 +msgid "Align _Vertically" +msgstr "Alinhar _Verticalmente" + +#: src/view.c:3724 data/ui/glabels-ui.xml.h:140 +msgid "_Delete" +msgstr "_Apagar" + +#. Build editor. +#: src/view-box.c:223 +#, fuzzy +msgid "Box object properties" +msgstr "Editar propriedades do objeto caixa" + +#. Build editor. +#: src/view-ellipse.c:223 +#, fuzzy +msgid "Ellipse object properties" +msgstr "Editar propriedades do objeto elipse" + +#. Build editor. +#: src/view-line.c:223 +#, fuzzy +msgid "Line object properties" +msgstr "Edita propriedades do objeto" + +#. Build editor. +#: src/view-image.c:222 +#, fuzzy +msgid "Image object properties" +msgstr "Editar propriedades do objeto imagem" + +#. Build editor. +#: src/view-text.c:250 +#, fuzzy +msgid "Text object properties" +msgstr "Edita propriedades do objeto" + +#: src/view-text.c:562 data/glade/object-editor.glade.h:28 +msgid "Text" +msgstr "Texto" + +#. Build editor. +#: src/view-barcode.c:209 +#, fuzzy +msgid "Barcode object properties" +msgstr "Editar propriedades do objeto código de barras" + +#: src/view-barcode.c:579 src/print.c:1088 +#, fuzzy +msgid "Invalid barcode data" +msgstr "Código de barras inválido" + +#: src/merge-properties-dialog.c:231 +msgid "Merge Properties" +msgstr "Propriedades de Fusão" + +#. ---- Source section ---- +#: src/merge-properties-dialog.c:237 +msgid "Source" +msgstr "Fonte" + +#: src/merge-properties-dialog.c:245 +msgid "Format:" +msgstr "Formato:" + +#. Location line +#: src/merge-properties-dialog.c:273 +msgid "Location:" +msgstr "Localização" + +#: src/merge-properties-dialog.c:282 src/merge-properties-dialog.c:393 +msgid "Select merge-database source" +msgstr "Selecione a fonte da base de dados da fusão" + +#: src/merge-properties-dialog.c:289 src/merge-properties-dialog.c:404 +msgid "N/A" +msgstr "Não definido" + +#. ---- Sample Fields section ---- +#: src/merge-properties-dialog.c:300 +msgid "Record selection/preview:" +msgstr "Seleção/previsão de registro:" + +#: src/merge-properties-dialog.c:326 +msgid "Select" +msgstr "Selecionar" + +#: src/merge-properties-dialog.c:334 +msgid "Record/Field" +msgstr "Registro/Campo" + +#: src/merge-properties-dialog.c:342 data/glade/object-editor.glade.h:9 +msgid "Data" +msgstr "Dado" + +#: src/print-dialog.c:266 data/ui/glabels-ui.xml.h:82 +msgid "Print" +msgstr "Imprimir" + +#: src/print-dialog.c:281 +msgid "_Job" +msgstr "_Trabalho" + +#: src/print-dialog.c:286 +msgid "P_rinter" +msgstr "Imp_ressora" + +#. ----------- Add simple-copies widget ------------ +#: src/print-dialog.c:314 +msgid "Copies" +msgstr "Cópias" + +#. ------- Add merge control widget ------------ +#: src/print-dialog.c:322 +msgid "Document merge control" +msgstr "Controle de fusão do documento" + +#. ----------- Add custom print options area ------------ +#: src/print-dialog.c:330 +msgid "Options" +msgstr "Opções" + +#: src/print-dialog.c:351 +msgid "print crop marks" +msgstr "" + +#: src/print-dialog.c:553 src/print-dialog.c:592 +msgid "Print preview" +msgstr "Visualizar impressão" + +#: src/template-designer.c:409 data/glade/template-designer.glade.h:73 +msgid "gLabels Template Designer" +msgstr "" + +#: src/bc.c:60 +msgid "POSTNET (any)" +msgstr "" + +#: src/bc.c:63 +msgid "POSTNET-5 (ZIP only)" +msgstr "" + +#: src/bc.c:66 +msgid "POSTNET-9 (ZIP+4)" +msgstr "" + +#: src/bc.c:69 +msgid "POSTNET-11 (DPBC)" +msgstr "" + +#: src/bc.c:72 +msgid "EAN (any)" +msgstr "" + +#: src/bc.c:75 +msgid "EAN-8" +msgstr "" + +#: src/bc.c:78 +msgid "EAN-8 +2" +msgstr "" + +#: src/bc.c:81 +msgid "EAN-8 +5" +msgstr "" + +#: src/bc.c:84 +msgid "EAN-13" +msgstr "" + +#: src/bc.c:87 +msgid "EAN-13 +2" +msgstr "" + +#: src/bc.c:90 +msgid "EAN-13 +5" +msgstr "" + +#: src/bc.c:93 +msgid "UPC (UPC-A or UPC-E)" +msgstr "" + +#: src/bc.c:96 +msgid "UPC-A" +msgstr "" + +#: src/bc.c:99 +msgid "UPC-A +2" +msgstr "" + +#: src/bc.c:102 +msgid "UPC-A +5" +msgstr "" + +#: src/bc.c:105 +msgid "UPC-E" +msgstr "" + +#: src/bc.c:108 +msgid "UPC-E +2" +msgstr "" + +#: src/bc.c:111 +msgid "UPC-E +5" +msgstr "" + +#: src/bc.c:114 +msgid "ISBN" +msgstr "" + +#: src/bc.c:117 +msgid "ISBN +5" +msgstr "" + +#: src/bc.c:120 +msgid "Code 39" +msgstr "" + +#: src/bc.c:123 +msgid "Code 128" +msgstr "" + +#: src/bc.c:126 +msgid "Code 128C" +msgstr "" + +#: src/bc.c:129 +msgid "Code 128B" +msgstr "" + +#: src/bc.c:132 +msgid "Interleaved 2 of 5" +msgstr "" + +#: src/bc.c:135 +msgid "Codabar" +msgstr "" + +#: src/bc.c:138 +msgid "MSI" +msgstr "" + +#: src/bc.c:141 +msgid "Plessey" +msgstr "" + +#: src/label.c:569 +msgid "Untitled" +msgstr "Sem_título" + +#: src/xml-label.c:176 src/xml-label.c:213 +msgid "xmlParseFile error" +msgstr "erro: xmlParseFile" + +#: src/xml-label.c:250 +msgid "No document root" +msgstr "Sem raiz do documento" + +#: src/xml-label.c:264 +msgid "Importing from glabels 0.1 format" +msgstr "Importando do formato do glabels 0.1" + +#: src/xml-label.c:272 +msgid "Importing from glabels 0.4 format" +msgstr "Importando do formato do glabels 0.4" + +#: src/xml-label.c:279 +#, fuzzy +msgid "Importing from glabels 1.91 format" +msgstr "Importando do formato do glabels 0.1" + +#: src/xml-label.c:282 +msgid "bad document, unknown glabels Namespace" +msgstr "documento ruim, espaço de nome glabels não encontrado" + +#: src/xml-label.c:311 src/xml-label-04.c:75 src/xml-label-191.c:131 +#, c-format +msgid "Bad root node = \"%s\"" +msgstr "Nó raiz ruim = \"%s\"" + +#: src/xml-label.c:348 src/xml-label-191.c:165 +#, fuzzy, c-format +msgid "bad node in Document node = \"%s\"" +msgstr "Nó raiz ruim = \"%s\"" + +#: src/xml-label.c:393 src/xml-label-04.c:123 src/xml-label-191.c:197 +#, c-format +msgid "bad node = \"%s\"" +msgstr "nó ruim = \"%s\"" + +#: src/xml-label.c:796 src/xml-label-191.c:605 +#, fuzzy, c-format +msgid "bad node in Data node = \"%s\"" +msgstr "nó ruim = \"%s\"" + +#: src/xml-label.c:962 libglabels/xml-template.c:528 +msgid "Utf8 conversion error." +msgstr "" + +#: src/xml-label.c:969 libglabels/xml-template.c:535 +msgid "Problem saving xml file." +msgstr "Problema salvando arquivo xml." + +#. This should always be an id, but just in case a name +#. slips by! +#: src/xml-label-191.c:680 libglabels/xml-template.c:192 +#, c-format +msgid "Unknown page size id \"%s\", trying as name" +msgstr "" + +#: src/xml-label-191.c:690 libglabels/xml-template.c:202 +#, c-format +msgid "Unknown page size id or name \"%s\"" +msgstr "" + +#: src/merge.c:172 src/merge.c:213 src/merge.c:399 src/merge.c:402 +msgid "None" +msgstr "Nenhum" + +#: src/merge-init.c:53 +msgid "Text file with comma delimeters (CSV)" +msgstr "Arquivo texto separado com vírgulas (CSV)" + +#: src/merge-init.c:60 +msgid "Text file with colon delimeters" +msgstr "Arquivo texto separado com dois pontos" + +#: src/merge-init.c:67 +msgid "Text file with tab delimeters" +msgstr "Arquivo texto separado com tab" + +#: src/wdgt-image-select.c:201 data/glade/object-editor.glade.h:11 +msgid "File:" +msgstr "Arquivo:" + +#: src/wdgt-image-select.c:245 data/glade/object-editor.glade.h:16 +msgid "Key:" +msgstr "Chave:" + +#: src/wdgt-print-copies.c:179 +msgid "Sheets:" +msgstr "Páginas:" + +#: src/wdgt-print-copies.c:197 +msgid "Labels" +msgstr "Etiquetas" + +#: src/wdgt-print-copies.c:200 +msgid "from:" +msgstr "de:" + +#: src/wdgt-print-copies.c:207 +msgid "to:" +msgstr "até:" + +#: src/wdgt-print-merge.c:178 +msgid "Start on label" +msgstr "Iniciar na etiqueta" + +#: src/wdgt-print-merge.c:186 +msgid "on 1st sheet" +msgstr "na primeira folha" + +#: src/wdgt-print-merge.c:195 +msgid "Copies:" +msgstr "Cópias:" + +#: src/wdgt-print-merge.c:201 +msgid "Collate" +msgstr "Ordenar" + +#: src/wdgt-media-select.c:269 data/glade/template-designer.glade.h:29 +msgid "Description:" +msgstr "Descrição:" + +#: src/wdgt-media-select.c:279 data/glade/template-designer.glade.h:53 +msgid "Page size:" +msgstr "Tamanho da página:" + +#: src/wdgt-media-select.c:290 +msgid "Label size:" +msgstr "Tamanho da etiqueta:" + +#: src/wdgt-media-select.c:301 +msgid "Layout:" +msgstr "Disposição:" + +#: src/wdgt-media-select.c:578 +#, c-format +msgid "%d x %d (%d per sheet)" +msgstr "%d x %d (%d por página)" + +#: src/wdgt-media-select.c:582 +#, c-format +msgid "%d per sheet" +msgstr "%d por página" + +#: src/wdgt-media-select.c:614 +#, c-format +msgid "%s x %s %s" +msgstr "%s x %s %s" + +#: src/wdgt-media-select.c:619 +#, c-format +msgid "%.5g x %.5g %s" +msgstr "%.5g x %.5g %s" + +#: src/wdgt-media-select.c:630 src/wdgt-media-select.c:644 +#, c-format +msgid "%s %s diameter" +msgstr "%s %s diâmetro" + +#: src/wdgt-media-select.c:634 src/wdgt-media-select.c:648 +#, c-format +msgid "%.5g %s diameter" +msgstr "%.5g %s diâmetro" + +#: src/wdgt-rotate-label.c:193 +msgid "Rotate" +msgstr "Girar" + +#. This is the default custom color +#: src/mygal/color-palette.c:396 +#, fuzzy +msgid "custom" +msgstr "Personalizar" + +#. "Custom" color - we'll pop up a GnomeColorPicker +#: src/mygal/color-palette.c:438 +#, fuzzy +msgid "Custom Color:" +msgstr "Personaliza barras de ferramentas" + +#: src/mygal/color-palette.c:446 +msgid "Choose Custom Color" +msgstr "" + +#: src/mygal/color-palette.c:579 +msgid "black" +msgstr "" + +#: src/mygal/color-palette.c:580 +msgid "light brown" +msgstr "" + +#: src/mygal/color-palette.c:581 +msgid "brown gold" +msgstr "" + +#: src/mygal/color-palette.c:582 +msgid "dark green #2" +msgstr "" + +#: src/mygal/color-palette.c:583 +msgid "navy" +msgstr "" + +#: src/mygal/color-palette.c:584 src/mygal/color-palette.c:640 +msgid "dark blue" +msgstr "" + +#: src/mygal/color-palette.c:585 +msgid "purple #2" +msgstr "" + +#: src/mygal/color-palette.c:586 +msgid "very dark gray" +msgstr "" + +#: src/mygal/color-palette.c:589 src/mygal/color-palette.c:645 +msgid "dark red" +msgstr "" + +#: src/mygal/color-palette.c:590 +msgid "red-orange" +msgstr "" + +#: src/mygal/color-palette.c:591 +msgid "gold" +msgstr "" + +#: src/mygal/color-palette.c:592 +msgid "dark green" +msgstr "" + +#: src/mygal/color-palette.c:593 src/mygal/color-palette.c:646 +msgid "dull blue" +msgstr "" + +#: src/mygal/color-palette.c:594 src/mygal/color-palette.c:647 +msgid "blue" +msgstr "" + +#: src/mygal/color-palette.c:595 +msgid "dull purple" +msgstr "" + +#: src/mygal/color-palette.c:596 +msgid "dark grey" +msgstr "" + +#: src/mygal/color-palette.c:599 +msgid "red" +msgstr "" + +#: src/mygal/color-palette.c:600 +msgid "orange" +msgstr "" + +#: src/mygal/color-palette.c:601 +msgid "lime" +msgstr "" + +#: src/mygal/color-palette.c:602 +msgid "dull green" +msgstr "" + +#: src/mygal/color-palette.c:603 +msgid "dull blue #2" +msgstr "" + +#: src/mygal/color-palette.c:604 +msgid "sky blue #2" +msgstr "" + +#: src/mygal/color-palette.c:605 src/mygal/color-palette.c:644 +msgid "purple" +msgstr "" + +#: src/mygal/color-palette.c:606 +msgid "gray" +msgstr "" + +#: src/mygal/color-palette.c:609 src/mygal/color-palette.c:641 +#, fuzzy +msgid "magenta" +msgstr "Imagem" + +#: src/mygal/color-palette.c:610 +msgid "bright orange" +msgstr "" + +#: src/mygal/color-palette.c:611 src/mygal/color-palette.c:642 +msgid "yellow" +msgstr "" + +#: src/mygal/color-palette.c:612 +#, fuzzy +msgid "green" +msgstr "graus" + +#: src/mygal/color-palette.c:613 src/mygal/color-palette.c:643 +msgid "cyan" +msgstr "" + +#: src/mygal/color-palette.c:614 +msgid "bright blue" +msgstr "" + +#: src/mygal/color-palette.c:615 src/mygal/color-palette.c:632 +msgid "red purple" +msgstr "" + +#: src/mygal/color-palette.c:616 +msgid "light grey" +msgstr "" + +#: src/mygal/color-palette.c:619 src/mygal/color-palette.c:636 +msgid "pink" +msgstr "" + +#: src/mygal/color-palette.c:620 +msgid "light orange" +msgstr "" + +#: src/mygal/color-palette.c:621 src/mygal/color-palette.c:633 +msgid "light yellow" +msgstr "" + +#: src/mygal/color-palette.c:622 +msgid "light green" +msgstr "" + +#: src/mygal/color-palette.c:623 +msgid "light cyan" +msgstr "" + +#: src/mygal/color-palette.c:624 src/mygal/color-palette.c:634 +msgid "light blue" +msgstr "" + +#: src/mygal/color-palette.c:625 src/mygal/color-palette.c:638 +msgid "light purple" +msgstr "" + +#: src/mygal/color-palette.c:626 +msgid "white" +msgstr "" + +#: src/mygal/color-palette.c:631 +msgid "purplish blue" +msgstr "" + +#: src/mygal/color-palette.c:635 +msgid "dark purple" +msgstr "" + +#: src/mygal/color-palette.c:637 +msgid "sky blue" +msgstr "" + +#: libglabels/template.c:848 +#, c-format +msgid "Generic %s full page" +msgstr "Página completa %s genérico" + +#: libglabels/template.c:897 +msgid "No template files found!" +msgstr "Nenhum arquivo modelo encontrado!" + +#. Create and append an "Other" entry. +#: libglabels/paper.c:67 +msgid "Other" +msgstr "" + +#: libglabels/paper.c:361 +#, fuzzy +msgid "No paper files found!" +msgstr "Nenhum arquivo modelo encontrado!" + +#: data/ui/glabels-ui.xml.h:1 +msgid "About glabels" +msgstr "Sobre glabels" + +#: data/ui/glabels-ui.xml.h:2 +msgid "About..." +msgstr "Sobre..." + +#: data/ui/glabels-ui.xml.h:3 +msgid "Align _Horizontal" +msgstr "Alinhar _Horizontal" + +#: data/ui/glabels-ui.xml.h:4 +msgid "Align _Vertical" +msgstr "Alinhar _Vertical" + +#: data/ui/glabels-ui.xml.h:5 +msgid "Align objects to bottoms" +msgstr "Alinha objetos pelas bases" + +#: data/ui/glabels-ui.xml.h:6 +msgid "Align objects to horizontal centers" +msgstr "Alinha objetos pelos centros horizontais" + +#: data/ui/glabels-ui.xml.h:7 +msgid "Align objects to left edges" +msgstr "Alinha objetos pelas bordas esquerdas" + +#: data/ui/glabels-ui.xml.h:8 +msgid "Align objects to right edges" +msgstr "Alinha objetos pelas bordas direitas" + +#: data/ui/glabels-ui.xml.h:9 +msgid "Align objects to tops" +msgstr "Alinha objetos pelos topos" + +#: data/ui/glabels-ui.xml.h:10 +msgid "Align objects to vertical centers" +msgstr "Alinha objetos pelos centros verticais" + +#: data/ui/glabels-ui.xml.h:12 +msgid "Bold" +msgstr "" + +#: data/ui/glabels-ui.xml.h:14 +#, fuzzy +msgid "Center align" +msgstr "Centros" + +#: data/ui/glabels-ui.xml.h:15 +msgid "Center objects to horizontal label center" +msgstr "Centra objetos no centro horizontal da etiqueta" + +#: data/ui/glabels-ui.xml.h:16 +msgid "Center objects to vertical label center" +msgstr "Centra objetos no centro vertical da etiqueta" + +#: data/ui/glabels-ui.xml.h:17 +msgid "Change the visibility of markup lines in the current window" +msgstr "Muda a visibilidade das linhas de marcação na janela atual" + +#: data/ui/glabels-ui.xml.h:18 +msgid "Change the visibility of the drawing toolbar in the current window" +msgstr "Muda a visibilidade da barra de ferramentas de desenho na janela atual" + +#: data/ui/glabels-ui.xml.h:19 +msgid "Change the visibility of the grid in the current window" +msgstr "Muda a visibilidade da grade na janela atual" + +#: data/ui/glabels-ui.xml.h:20 +msgid "Change the visibility of the main toolbar in the current window" +msgstr "Muda a visibilidade da barra de ferramentas principal na janela atual" + +#: data/ui/glabels-ui.xml.h:21 +#, fuzzy +msgid "Change the visibility of the property toolbar in the current window" +msgstr "Muda a visibilidade da barra de ferramentas principal na janela atual" + +#: data/ui/glabels-ui.xml.h:22 +msgid "Close" +msgstr "Fechar" + +#: data/ui/glabels-ui.xml.h:23 +msgid "Close the current file" +msgstr "Fechar o arquivo atual" + +#: data/ui/glabels-ui.xml.h:24 +msgid "Configure the application" +msgstr "Configurar a aplicação" + +#: data/ui/glabels-ui.xml.h:25 +msgid "Contents" +msgstr "Conteúdo" + +#: data/ui/glabels-ui.xml.h:26 +msgid "Copy" +msgstr "Copiar" + +#: data/ui/glabels-ui.xml.h:27 +msgid "Copy the selection" +msgstr "Copia a seleção" + +#: data/ui/glabels-ui.xml.h:28 +#, fuzzy +msgid "Create a custom template" +msgstr "Cria um novo documento" + +#: data/ui/glabels-ui.xml.h:29 +msgid "Create a new document" +msgstr "Cria um novo documento" + +#: data/ui/glabels-ui.xml.h:30 +msgid "Create barcode object" +msgstr "Criar objeto código de barras" + +#: data/ui/glabels-ui.xml.h:31 +msgid "Create box/rectangle object" +msgstr "Criar objeto caixa/retângulo" + +#: data/ui/glabels-ui.xml.h:32 +msgid "Create ellipse/circle object" +msgstr "Criar objeto elipse/círculo" + +#: data/ui/glabels-ui.xml.h:33 +msgid "Create image object" +msgstr "Criar objeto imagem" + +#: data/ui/glabels-ui.xml.h:34 +msgid "Create line object" +msgstr "Criar objeto linha" + +#: data/ui/glabels-ui.xml.h:35 +msgid "Create text object" +msgstr "Criar objeto texto" + +#: data/ui/glabels-ui.xml.h:36 +msgid "Cu_t" +msgstr "Cor_tar" + +#: data/ui/glabels-ui.xml.h:37 +msgid "Customize" +msgstr "Personalizar" + +#: data/ui/glabels-ui.xml.h:38 +msgid "Customize Drawing Toolbar" +msgstr "Personaliza barra de ferramentas de desenho" + +#: data/ui/glabels-ui.xml.h:39 +msgid "Customize Main Toolbar" +msgstr "Personaliza barra de ferramentas principal" + +#: data/ui/glabels-ui.xml.h:40 +#, fuzzy +msgid "Customize Property Toolbar" +msgstr "Personaliza barras de ferramentas" + +#: data/ui/glabels-ui.xml.h:41 +msgid "Customize toolbars" +msgstr "Personaliza barras de ferramentas" + +#: data/ui/glabels-ui.xml.h:42 +msgid "Cut" +msgstr "Cortar" + +#: data/ui/glabels-ui.xml.h:43 +msgid "Cut the selection" +msgstr "Corta a seleção" + +#: data/ui/glabels-ui.xml.h:44 +msgid "Decrease magnification" +msgstr "Diminuir aumento" + +#: data/ui/glabels-ui.xml.h:45 +msgid "Delete" +msgstr "Apagar" + +#: data/ui/glabels-ui.xml.h:46 +msgid "Delete the selected objects" +msgstr "Apaga os objetos selecionados" + +#: data/ui/glabels-ui.xml.h:47 +msgid "Drawing toolbar" +msgstr "Barra de ferramentas de desenho" + +#: data/ui/glabels-ui.xml.h:48 +msgid "Dump XML" +msgstr "Descarregar XML" + +#: data/ui/glabels-ui.xml.h:49 +msgid "Dump the UI Xml description" +msgstr "Descarrega a descrição da UI Xml" + +#: data/ui/glabels-ui.xml.h:50 +msgid "Edit merge properties" +msgstr "Editar propriedades de fusão" + +#: data/ui/glabels-ui.xml.h:54 +msgid "Flip object horizontally" +msgstr "Reflete objeto horizontalmente" + +#: data/ui/glabels-ui.xml.h:55 +msgid "Flip object vertically" +msgstr "Reflete objeto verticalmente" + +#: data/ui/glabels-ui.xml.h:56 +#, fuzzy +msgid "Font name" +msgstr "Não salve" + +#: data/ui/glabels-ui.xml.h:57 +#, fuzzy +msgid "Font selector" +msgstr "Copia a seleção" + +#: data/ui/glabels-ui.xml.h:58 +#, fuzzy +msgid "Font size" +msgstr "Não salve" + +#: data/ui/glabels-ui.xml.h:59 +msgid "Icon and _Text" +msgstr "Ícone e _Texto" + +#: data/ui/glabels-ui.xml.h:60 +msgid "Increase magnification" +msgstr "Aumentar aumento" + +#: data/ui/glabels-ui.xml.h:61 +msgid "Italic" +msgstr "" + +#: data/ui/glabels-ui.xml.h:63 +msgid "Left align" +msgstr "" + +#: data/ui/glabels-ui.xml.h:65 +msgid "Line width" +msgstr "" + +#: data/ui/glabels-ui.xml.h:66 +msgid "Lower object to bottom" +msgstr "Abaixa objeto à base" + +#: data/ui/glabels-ui.xml.h:67 +msgid "M_arkup" +msgstr "M_arcação" + +#: data/ui/glabels-ui.xml.h:68 +msgid "Main toolbar" +msgstr "Barra de ferramentas principal" + +#: data/ui/glabels-ui.xml.h:69 +msgid "Markup" +msgstr "Marcação" + +#: data/ui/glabels-ui.xml.h:70 +#, fuzzy +msgid "Modify document properties" +msgstr "Editar propriedades de fusão do documento" + +#: data/ui/glabels-ui.xml.h:71 +msgid "New" +msgstr "Novo" + +#: data/ui/glabels-ui.xml.h:72 +#, fuzzy +msgid "Object property editor" +msgstr "_Propriedades de Objeto" + +#: data/ui/glabels-ui.xml.h:73 +msgid "Only show icons in the drawing toolbar" +msgstr "Exibe somente ícones na barra de ferramentas de desenho" + +#: data/ui/glabels-ui.xml.h:74 +msgid "Only show icons in the main toolbar" +msgstr "Exibe somente ícones na barra de ferramentas principal" + +#: data/ui/glabels-ui.xml.h:76 +msgid "Open a file" +msgstr "Abrir um arquivo" + +#: data/ui/glabels-ui.xml.h:77 +msgid "Open the glabels manual" +msgstr "Abre o manual do glabels" + +#: data/ui/glabels-ui.xml.h:78 +msgid "Paste" +msgstr "Colar" + +#: data/ui/glabels-ui.xml.h:79 +msgid "Paste the clipboard" +msgstr "Cola a área de transferência" + +#: data/ui/glabels-ui.xml.h:80 +msgid "Pr_eferences..." +msgstr "Pr_eferências..." + +#: data/ui/glabels-ui.xml.h:81 +msgid "Preferences" +msgstr "Preferências" + +#: data/ui/glabels-ui.xml.h:83 +msgid "Print the current file" +msgstr "Imprime o arquivo atual" + +#: data/ui/glabels-ui.xml.h:84 +#, fuzzy +msgid "Proper_ties..." +msgstr "Propriedades" + +#: data/ui/glabels-ui.xml.h:85 +msgid "Properties" +msgstr "Propriedades" + +#: data/ui/glabels-ui.xml.h:86 +msgid "Property toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:87 +msgid "Quit" +msgstr "Sair" + +#: data/ui/glabels-ui.xml.h:88 +msgid "Quit the program" +msgstr "Sai do programa" + +#: data/ui/glabels-ui.xml.h:89 +msgid "Raise object to top" +msgstr "Sobe objetos ao topo" + +#: data/ui/glabels-ui.xml.h:90 +msgid "Recent _Files" +msgstr "_Arquivos recentes" + +#: data/ui/glabels-ui.xml.h:91 +msgid "Redo" +msgstr "Refazer" + +#: data/ui/glabels-ui.xml.h:92 +msgid "Redo the undone action" +msgstr "Refaz a ação desfeita" + +#: data/ui/glabels-ui.xml.h:93 +msgid "Remove all selections" +msgstr "Remover todas as seleções" + +#: data/ui/glabels-ui.xml.h:95 +#, no-c-format +msgid "Restore scale to 100%" +msgstr "Restaura escala para 100%" + +#: data/ui/glabels-ui.xml.h:96 +msgid "Right align" +msgstr "" + +#: data/ui/glabels-ui.xml.h:99 +msgid "Rotate object 90 clockwise" +msgstr "Gira objeto 90 sentido horário" + +#: data/ui/glabels-ui.xml.h:100 +msgid "Rotate object 90 counter-clockwise" +msgstr "Gira objeto 90 sentido anti-horário" + +#: data/ui/glabels-ui.xml.h:101 +msgid "Save" +msgstr "Salvar" + +#: data/ui/glabels-ui.xml.h:102 +msgid "Save As" +msgstr "Salvar como" + +#: data/ui/glabels-ui.xml.h:103 +msgid "Save _As..." +msgstr "Salvar _como..." + +#: data/ui/glabels-ui.xml.h:104 +msgid "Save the current file" +msgstr "Salva o arquivo atual" + +#: data/ui/glabels-ui.xml.h:105 +msgid "Save the current file with a different name" +msgstr "Salva o arquivo atual com um nome diferente" + +#: data/ui/glabels-ui.xml.h:106 +msgid "Select All" +msgstr "Selecionar Tudo" + +#: data/ui/glabels-ui.xml.h:107 +msgid "Select _All" +msgstr "Selecionar _Tudo" + +#: data/ui/glabels-ui.xml.h:108 +msgid "Select all objects" +msgstr "Seleciona todos os objetos" + +#: data/ui/glabels-ui.xml.h:109 +msgid "Select, move and modify objects" +msgstr "Seleciona, movimenta e modifica objetos" + +#: data/ui/glabels-ui.xml.h:111 +msgid "Set drawing toolbar button style according to desktop default" +msgstr "" +"Define estilo de botão da barra de ferramentas de desenho de acordo com " +"padrão do desktop" + +#: data/ui/glabels-ui.xml.h:112 +msgid "Set main toolbar button style according to desktop default" +msgstr "" +"Define estilo de botão da barra de ferramentas principal de acordo com " +"padrão do desktop" + +#: data/ui/glabels-ui.xml.h:113 +msgid "Show _Tooltips" +msgstr "Exibir _Dicas" + +#: data/ui/glabels-ui.xml.h:114 +#, fuzzy +msgid "Show both icons and texts in the drawing toolbar" +msgstr "Exibe dicas na barra de ferramentas de desenho" + +#: data/ui/glabels-ui.xml.h:115 +#, fuzzy +msgid "Show both icons and texts in the main toolbar" +msgstr "Exibe dicas na barra de ferramentas principal" + +#: data/ui/glabels-ui.xml.h:116 +msgid "Show tooltips in the drawing toolbar" +msgstr "Exibe dicas na barra de ferramentas de desenho" + +#: data/ui/glabels-ui.xml.h:117 +msgid "Show tooltips in the main toolbar" +msgstr "Exibe dicas na barra de ferramentas principal" + +#: data/ui/glabels-ui.xml.h:118 +#, fuzzy +msgid "Show tooltips in the property toolbar" +msgstr "Exibe dicas na barra de ferramentas principal" + +#: data/ui/glabels-ui.xml.h:119 +msgid "Template Designer" +msgstr "" + +#: data/ui/glabels-ui.xml.h:120 +msgid "Template _Designer..." +msgstr "" + +#: data/ui/glabels-ui.xml.h:121 +msgid "Text color" +msgstr "" + +#: data/ui/glabels-ui.xml.h:122 +msgid "U_n-select All" +msgstr "D_esmarcar Tudo" + +#: data/ui/glabels-ui.xml.h:123 +msgid "Un-select All" +msgstr "Desmarcar Tudo" + +#: data/ui/glabels-ui.xml.h:124 +msgid "Undo" +msgstr "Desfazer" + +#: data/ui/glabels-ui.xml.h:125 +msgid "Undo the last action" +msgstr "Desfaz a última ação" + +#: data/ui/glabels-ui.xml.h:126 +msgid "Zoom _1:1" +msgstr "Zoom _1:1" + +#: data/ui/glabels-ui.xml.h:127 +msgid "Zoom _In" +msgstr "M_ais Zoom" + +#: data/ui/glabels-ui.xml.h:128 +msgid "Zoom _Out" +msgstr "M_enos Zoom" + +#: data/ui/glabels-ui.xml.h:129 +#, fuzzy +msgid "Zoom to _fit" +msgstr "Zoom para 1:1" + +#: data/ui/glabels-ui.xml.h:130 +msgid "Zoom to fit window" +msgstr "" + +#: data/ui/glabels-ui.xml.h:131 +msgid "_About..." +msgstr "_Sobre..." + +#: data/ui/glabels-ui.xml.h:132 +msgid "_Bottoms" +msgstr "_Bases" + +#: data/ui/glabels-ui.xml.h:135 +msgid "_Close" +msgstr "_Fechar" + +#: data/ui/glabels-ui.xml.h:136 +msgid "_Contents" +msgstr "_Conteúdo" + +#: data/ui/glabels-ui.xml.h:137 +msgid "_Copy" +msgstr "_Copiar" + +#: data/ui/glabels-ui.xml.h:138 +msgid "_Create Object" +msgstr "_Criar Objeto" + +#: data/ui/glabels-ui.xml.h:139 +msgid "_Debug" +msgstr "_Depurar" + +#: data/ui/glabels-ui.xml.h:141 +msgid "_Desktop Default" +msgstr "Padrão _Desktop" + +#: data/ui/glabels-ui.xml.h:142 +msgid "_Drawing Toolbar" +msgstr "Barra de _Desenho" + +#: data/ui/glabels-ui.xml.h:143 +msgid "_Edit" +msgstr "_Editar" + +#: data/ui/glabels-ui.xml.h:145 +msgid "_File" +msgstr "_Arquivo" + +#: data/ui/glabels-ui.xml.h:146 +msgid "_Grid" +msgstr "_Grade" + +#: data/ui/glabels-ui.xml.h:147 +msgid "_Help" +msgstr "A_juda" + +#: data/ui/glabels-ui.xml.h:148 +msgid "_Icon" +msgstr "_Ícone" + +#: data/ui/glabels-ui.xml.h:152 +msgid "_Main Toolbar" +msgstr "Barra _Principal" + +#: data/ui/glabels-ui.xml.h:153 +msgid "_Merge Properties..." +msgstr "Propriedades de _Fusão..." + +#: data/ui/glabels-ui.xml.h:154 +msgid "_New" +msgstr "_Novo" + +#: data/ui/glabels-ui.xml.h:155 +msgid "_Objects" +msgstr "_Objetos" + +#: data/ui/glabels-ui.xml.h:156 +msgid "_Open..." +msgstr "_Abrir..." + +#: data/ui/glabels-ui.xml.h:158 +msgid "_Paste" +msgstr "_Colar" + +#: data/ui/glabels-ui.xml.h:159 +msgid "_Print..." +msgstr "Im_primir..." + +#: data/ui/glabels-ui.xml.h:160 +#, fuzzy +msgid "_Property Toolbar" +msgstr "Barra de _Desenho" + +#: data/ui/glabels-ui.xml.h:161 +msgid "_Quit" +msgstr "_Sair" + +#: data/ui/glabels-ui.xml.h:164 +msgid "_Save" +msgstr "_Salvar" + +#: data/ui/glabels-ui.xml.h:168 +msgid "_View" +msgstr "_Visualizar" + +#: data/glade/prefs-dialog.glade.h:1 +msgid " " +msgstr "" + +#: data/glade/prefs-dialog.glade.h:2 data/glade/object-editor.glade.h:1 +#: data/glade/template-designer.glade.h:5 +msgid "*" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:3 +msgid "Default page size" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:4 +msgid "Fill" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:5 +msgid "Line" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:6 +msgid "Text" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:7 +msgid "Units" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:8 data/glade/object-editor.glade.h:4 +msgid "Alignment:" +msgstr "Alinhamento:" + +#: data/glade/prefs-dialog.glade.h:9 data/glade/object-editor.glade.h:8 +msgid "Color:" +msgstr "Cor:" + +#: data/glade/prefs-dialog.glade.h:10 +msgid "Font:" +msgstr "Fonte:" + +#: data/glade/prefs-dialog.glade.h:11 +msgid "ISO A4" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:12 +msgid "Inches" +msgstr "Polegadas" + +#: data/glade/prefs-dialog.glade.h:13 data/glade/object-editor.glade.h:19 +msgid "Line Spacing:" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:14 +msgid "Locale" +msgstr "Local" + +#: data/glade/prefs-dialog.glade.h:15 +msgid "Millimeters" +msgstr "Milímetros" + +#: data/glade/prefs-dialog.glade.h:16 +msgid "Object defaults" +msgstr "Padrões do objeto" + +#: data/glade/prefs-dialog.glade.h:17 +msgid "Points" +msgstr "Pontos" + +#: data/glade/prefs-dialog.glade.h:18 +msgid "Select default properties for new objects." +msgstr "Selecione as propriedades padrões para novos objetos." + +#: data/glade/prefs-dialog.glade.h:19 +msgid "Select locale specific behavior." +msgstr "Selecione comportamento específico do local." + +#: data/glade/prefs-dialog.glade.h:20 data/templates/paper-sizes.xml.h:25 +msgid "US Letter" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:21 data/glade/object-editor.glade.h:29 +#: data/glade/template-designer.glade.h:72 +msgid "Width:" +msgstr "Largura:" + +#: data/glade/object-editor.glade.h:2 +msgid "00000000000 00000" +msgstr "" + +#: data/glade/object-editor.glade.h:3 +msgid "Xxx object properties" +msgstr "" + +#: data/glade/object-editor.glade.h:5 +msgid "Allow merge to automatically shrink text" +msgstr "" + +#: data/glade/object-editor.glade.h:6 +msgid "Angle:" +msgstr "Ângulo:" + +#: data/glade/object-editor.glade.h:7 +msgid "Checksum" +msgstr "" + +#: data/glade/object-editor.glade.h:10 +#, fuzzy +msgid "Family:" +msgstr "Arquivo:" + +#: data/glade/object-editor.glade.h:12 +msgid "Fill" +msgstr "Preencher" + +#: data/glade/object-editor.glade.h:13 data/glade/template-designer.glade.h:33 +msgid "Height:" +msgstr "Altura:" + +#: data/glade/object-editor.glade.h:14 +msgid "Image" +msgstr "Imagem" + +#: data/glade/object-editor.glade.h:15 +msgid "Insert merge field" +msgstr "Inserir campo de fusão" + +#: data/glade/object-editor.glade.h:17 +msgid "Length:" +msgstr "Comprimento:" + +#: data/glade/object-editor.glade.h:18 +msgid "Line" +msgstr "Linha" + +#: data/glade/object-editor.glade.h:20 +msgid "Literal:" +msgstr "Literal:" + +#: data/glade/object-editor.glade.h:21 +msgid "Load image" +msgstr "" + +#: data/glade/object-editor.glade.h:22 +msgid "Position" +msgstr "Posição" + +#: data/glade/object-editor.glade.h:23 +msgid "Reset image size" +msgstr "Redefinir tamanho da imagem" + +#: data/glade/object-editor.glade.h:24 +msgid "Size" +msgstr "Tamanho" + +#: data/glade/object-editor.glade.h:25 +#, fuzzy +msgid "Size:" +msgstr "Tamanho" + +#: data/glade/object-editor.glade.h:26 +#, fuzzy +msgid "Style" +msgstr "Estilo:" + +#: data/glade/object-editor.glade.h:27 +msgid "Style:" +msgstr "Estilo:" + +#: data/glade/object-editor.glade.h:30 +msgid "X:" +msgstr "X:" + +#: data/glade/object-editor.glade.h:31 +msgid "Y:" +msgstr "Y:" + +#: data/glade/object-editor.glade.h:32 +msgid "degrees" +msgstr "graus" + +#: data/glade/object-editor.glade.h:33 +msgid "dialog1" +msgstr "" + +#: data/glade/object-editor.glade.h:34 +msgid "digits:" +msgstr "" + +#: data/glade/object-editor.glade.h:35 +#, fuzzy +msgid "format:" +msgstr "Formato:" + +#: data/glade/template-designer.glade.h:1 +msgid " " +msgstr "" + +#: data/glade/template-designer.glade.h:2 +msgid "(e.g., \"Mailing Labels,\" \"Business Cards,\" ...)" +msgstr "" + +#: data/glade/template-designer.glade.h:3 +msgid "(e.g., 8163A)" +msgstr "" + +#: data/glade/template-designer.glade.h:4 +msgid "(e.g., Avery, Acme, ...)" +msgstr "" + +#: data/glade/template-designer.glade.h:6 +msgid "1. Outer radius:" +msgstr "" + +#: data/glade/template-designer.glade.h:7 +msgid "1. Radius:" +msgstr "" + +#: data/glade/template-designer.glade.h:8 +#, fuzzy +msgid "1. Width:" +msgstr "Largura:" + +#: data/glade/template-designer.glade.h:9 +#, fuzzy +msgid "2. Height:" +msgstr "Altura:" + +#: data/glade/template-designer.glade.h:10 +msgid "2. Inner radius:" +msgstr "" + +#: data/glade/template-designer.glade.h:11 +msgid "2. Waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:12 +msgid "3. Clipping width:" +msgstr "" + +#: data/glade/template-designer.glade.h:13 +msgid "3. Margin" +msgstr "" + +#: data/glade/template-designer.glade.h:14 +msgid "3. Round (radius of corner):" +msgstr "" + +#: data/glade/template-designer.glade.h:15 +msgid "4. Clipping height:" +msgstr "" + +#: data/glade/template-designer.glade.h:16 +msgid "4. Horiz. waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:17 +msgid "5. Vert. waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:18 +msgid "5. Waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:19 +msgid "6. Margin" +msgstr "" + +#: data/glade/template-designer.glade.h:20 +msgid "Brand/Manufacturer:" +msgstr "" + +#: data/glade/template-designer.glade.h:21 +msgid "CD/DVD (including credit card CDs)" +msgstr "" + +#: data/glade/template-designer.glade.h:22 +msgid "" +"Congratulations!\n" +"\n" +"You have completed the gLabels Template Designer.\n" +"If you wish to accept and save your design, click \"Apply.\"\n" +"\n" +"Otherwise, you may click \"Cancel\" to abandon your design\n" +"or \"Back\" to continue editing this design." +msgstr "" + +#: data/glade/template-designer.glade.h:30 +msgid "Design Completed" +msgstr "" + +#: data/glade/template-designer.glade.h:31 +msgid "Distance from left edge (x0):" +msgstr "" + +#: data/glade/template-designer.glade.h:32 +msgid "Distance from top edge (y0):" +msgstr "" + +#: data/glade/template-designer.glade.h:34 +msgid "Horizontal pitch (dx):" +msgstr "" + +#: data/glade/template-designer.glade.h:35 +msgid "" +"How many layouts will your template contain? \n" +"\n" +"A layout is a set of labels or cards that can be arranged in a simple grid.\n" +"Most templates only need one layout, as in the first example.\n" +"The second example illustrates when two layouts are needed." +msgstr "" + +#: data/glade/template-designer.glade.h:40 +msgid "Label Size (CD/DVD)" +msgstr "" + +#: data/glade/template-designer.glade.h:41 +#, fuzzy +msgid "Label Size (Round)" +msgstr "Tamanho da etiqueta:" + +#: data/glade/template-designer.glade.h:42 +#, fuzzy +msgid "Label or Card Shape" +msgstr "Nova Etiqueta ou Cartão" + +#: data/glade/template-designer.glade.h:43 +msgid "Label or Card Size (Rectangular)" +msgstr "" + +#: data/glade/template-designer.glade.h:44 +#, fuzzy +msgid "Layout #1" +msgstr "Disposição:" + +#: data/glade/template-designer.glade.h:45 +#, fuzzy +msgid "Layout #2" +msgstr "Disposição:" + +#: data/glade/template-designer.glade.h:46 +#, fuzzy +msgid "Layout(s)" +msgstr "Disposição:" + +#: data/glade/template-designer.glade.h:47 +#, fuzzy +msgid "Name and Description" +msgstr "Descrição:" + +#: data/glade/template-designer.glade.h:48 +msgid "Number across (nx):" +msgstr "" + +#: data/glade/template-designer.glade.h:49 +msgid "Number down (ny):" +msgstr "" + +#: data/glade/template-designer.glade.h:50 +msgid "Number of Layouts" +msgstr "" + +#: data/glade/template-designer.glade.h:51 +msgid "Number of layouts:" +msgstr "" + +#: data/glade/template-designer.glade.h:52 +#, fuzzy +msgid "Page Size" +msgstr "Tamanho da página:" + +#: data/glade/template-designer.glade.h:54 +msgid "Part #:" +msgstr "" + +#: data/glade/template-designer.glade.h:55 +msgid "" +"Please enter the following identifying information about the template " +"stationery." +msgstr "" + +#: data/glade/template-designer.glade.h:56 +msgid "Please enter the following layout information." +msgstr "" + +#: data/glade/template-designer.glade.h:57 +msgid "" +"Please enter the following size parameters of a single label in your " +"template." +msgstr "" + +#: data/glade/template-designer.glade.h:58 +msgid "" +"Please enter the following size parameters of a single label or card in your " +"template." +msgstr "" + +#: data/glade/template-designer.glade.h:59 +msgid "Please select the basic shape of the labels or cards." +msgstr "" + +#: data/glade/template-designer.glade.h:60 +msgid "Please select the page size of the template stationery." +msgstr "" + +#: data/glade/template-designer.glade.h:61 +#, fuzzy +msgid "Print test sheet" +msgstr "na primeira folha" + +#: data/glade/template-designer.glade.h:62 +msgid "Rectangular or square (can have rounded corners)" +msgstr "" + +#: data/glade/template-designer.glade.h:63 +msgid "Round" +msgstr "" + +#: data/glade/template-designer.glade.h:64 +msgid "" +"Templates needing\n" +"two layouts." +msgstr "" + +#: data/glade/template-designer.glade.h:66 +msgid "" +"Templates needing only\n" +"one layout." +msgstr "" + +#: data/glade/template-designer.glade.h:68 +msgid "Vertical pitch (dy):" +msgstr "" + +#: data/glade/template-designer.glade.h:69 +msgid "" +"Welcome to the gLabels Template Designer.\n" +"\n" +"This dialog will assist you in the creation of a custom gLabels template." +msgstr "" + +#: data/templates/paper-sizes.xml.h:1 +msgid "A0" +msgstr "" + +#: data/templates/paper-sizes.xml.h:2 +msgid "A1" +msgstr "" + +#: data/templates/paper-sizes.xml.h:3 +msgid "A10" +msgstr "" + +#: data/templates/paper-sizes.xml.h:4 +msgid "A2" +msgstr "" + +#: data/templates/paper-sizes.xml.h:5 +msgid "A3" +msgstr "" + +#: data/templates/paper-sizes.xml.h:6 +msgid "A4" +msgstr "" + +#: data/templates/paper-sizes.xml.h:7 +msgid "A5" +msgstr "" + +#: data/templates/paper-sizes.xml.h:8 +msgid "A6" +msgstr "" + +#: data/templates/paper-sizes.xml.h:9 +msgid "A7" +msgstr "" + +#: data/templates/paper-sizes.xml.h:10 +msgid "A8" +msgstr "" + +#: data/templates/paper-sizes.xml.h:11 +msgid "A9" +msgstr "" + +#: data/templates/paper-sizes.xml.h:12 +msgid "B0" +msgstr "" + +#: data/templates/paper-sizes.xml.h:13 +msgid "B1" +msgstr "" + +#: data/templates/paper-sizes.xml.h:14 +msgid "B10" +msgstr "" + +#: data/templates/paper-sizes.xml.h:15 +msgid "B2" +msgstr "" + +#: data/templates/paper-sizes.xml.h:16 +msgid "B3" +msgstr "" + +#: data/templates/paper-sizes.xml.h:17 +msgid "B4" +msgstr "" + +#: data/templates/paper-sizes.xml.h:18 +msgid "B5" +msgstr "" + +#: data/templates/paper-sizes.xml.h:19 +msgid "B6" +msgstr "" + +#: data/templates/paper-sizes.xml.h:20 +msgid "B7" +msgstr "" + +#: data/templates/paper-sizes.xml.h:21 +msgid "B8" +msgstr "" + +#: data/templates/paper-sizes.xml.h:22 +msgid "B9" +msgstr "" + +#: data/templates/paper-sizes.xml.h:23 +msgid "US Executive" +msgstr "" + +#: data/templates/paper-sizes.xml.h:24 +msgid "US Legal" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:1 +#: data/templates/zweckform-iso-templates.xml.h:1 +msgid "Address Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:2 +#: data/templates/avery-iso-templates.xml.h:2 +#: data/templates/zweckform-iso-templates.xml.h:3 +#: data/templates/misc-us-templates.xml.h:2 +#: data/templates/misc-iso-templates.xml.h:9 +msgid "Business Cards" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:3 +msgid "CD/DVD Labels (Disc Labels)" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:4 +msgid "Diskette Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:5 +#, fuzzy +msgid "Filing Labels" +msgstr "Etiquetas" + +#: data/templates/avery-us-templates.xml.h:6 +msgid "Full Sheet Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:7 +#, fuzzy +msgid "Large Round Labels" +msgstr "Iniciar na etiqueta" + +#: data/templates/avery-us-templates.xml.h:8 +msgid "Name Badge Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:9 +msgid "Return Address Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:10 +msgid "Shipping Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:11 +#, fuzzy +msgid "Small Round Labels" +msgstr "Iniciar na etiqueta" + +#: data/templates/avery-us-templates.xml.h:12 +#, fuzzy +msgid "Square Labels" +msgstr "Etiquetas" + +#: data/templates/avery-us-templates.xml.h:13 +msgid "Video Tape Face Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:14 +msgid "Video Tape Spine Labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:1 +msgid "Address labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:3 +msgid "CD Booklet" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:4 +msgid "CD Inlet" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:5 +#: data/templates/zweckform-iso-templates.xml.h:4 +#: data/templates/misc-us-templates.xml.h:4 +#: data/templates/misc-iso-templates.xml.h:10 +#, fuzzy +msgid "CD/DVD Labels" +msgstr "Etiquetas" + +#: data/templates/avery-iso-templates.xml.h:6 +#, fuzzy +msgid "Diskette labels" +msgstr "Sobre glabels" + +#: data/templates/avery-iso-templates.xml.h:7 +#: data/templates/zweckform-iso-templates.xml.h:7 +#: data/templates/misc-iso-templates.xml.h:17 +msgid "Mailing Labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:8 +#, fuzzy +msgid "Mailing labels" +msgstr "glabels" + +#: data/templates/avery-iso-templates.xml.h:9 +msgid "Mini Address Labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:10 +#, fuzzy +msgid "Shipping labels" +msgstr "Abrir etiqueta" + +#: data/templates/zweckform-iso-templates.xml.h:2 +#, fuzzy +msgid "Allround Labels" +msgstr "Sobre glabels" + +#: data/templates/zweckform-iso-templates.xml.h:5 +msgid "Correction and Cover-up Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:6 +msgid "Lever Arch File Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:8 +msgid "QSL-Karten Etiketten 70mm x 50,8mm" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:9 +msgid "Rectangular Copier Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:10 +#: data/templates/misc-iso-templates.xml.h:22 +msgid "Rectangular Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:11 +msgid "Video Labels (back)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:1 +msgid "Business Card CD" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:3 +msgid "CD Template Rectangles" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:5 +msgid "CD/DVD Labels (Face Only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:6 +#: data/templates/misc-iso-templates.xml.h:11 +msgid "CD/DVD Labels (face only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:7 +#, fuzzy +msgid "DLT Labels" +msgstr "Etiquetas" + +#: data/templates/misc-us-templates.xml.h:8 +#, fuzzy +msgid "Microtube labels" +msgstr "Sobre glabels" + +#: data/templates/misc-us-templates.xml.h:9 +msgid "Mini-CD Labels" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:10 +msgid "PRO CD Labels 2-up (CD spine only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:11 +msgid "PRO CD Labels 2-up (Face only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:12 +#: data/templates/misc-iso-templates.xml.h:21 +msgid "PRO CD Labels 2-up (face only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:13 +msgid "Slimline CD Case (rightside up)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:14 +msgid "Slimline CD Case (upside down)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:1 +msgid "Agipa 119488: Business Cards" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:2 +msgid "Allround Labels --24" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:3 +msgid "Allround Labels --44" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:4 +msgid "Allround Labels --64" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:5 +msgid "Allround Labels --65" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:6 +msgid "Arch File Labels" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:7 +msgid "Arch File Labels (large)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:8 +msgid "Arch File Labels (small)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:12 +msgid "CD/DVD Labels Standard Format (face only)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:13 +msgid "Diskette Labels (face only)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:14 +msgid "EPSON Photo Stickers 16" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:15 +msgid "Etiketten" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:16 +msgid "Fridge Magnet Stickers" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:18 +msgid "Mailing Labels --14" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:19 +msgid "Mailing Labels-2 columns" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:20 +msgid "Mailing Labels-3 columns" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:23 +msgid "Video Labels (face only)" +msgstr "" + +#: data/desktop/glabels.desktop.in.h:1 +msgid "Create labels, business cards and media covers." +msgstr "" + +#: data/desktop/glabels.desktop.in.h:2 +msgid "gLabels Label Designer" +msgstr "" + +#: data/mime/glabels.keys.in.h:1 data/mime/glabels.xml.in.h:1 +#, fuzzy +msgid "gLabels Project File" +msgstr "_Propriedades de Objeto" + +#~ msgid "Object _Properties..." +#~ msgstr "_Propriedades do Objeto..." + +#~ msgid "Display units" +#~ msgstr "Exibir unidades" + +#~ msgid "Default page size" +#~ msgstr "Tamanho de página padrão" + +#~ msgid "Outline" +#~ msgstr "Contorno" + +#~ msgid "Edit line object properties" +#~ msgstr "Editar propriedades do objeto linha" + +#~ msgid "Edit text object properties" +#~ msgstr "Editar propriedades do objeto texto" + +#~ msgid "Edit text:" +#~ msgstr "Editar texto:" + +#~ msgid "Maintain current aspect ratio" +#~ msgstr "Manter taxa de aspecto atual" + +#, fuzzy +#~ msgid "CD Labels" +#~ msgstr "Etiquetas" + +#~ msgid "Open %s" +#~ msgstr "Abrir %s" + +#~ msgid "Scale:" +#~ msgstr "Escala:" + +#~ msgid "%" +#~ msgstr "%" + +#~ msgid "Show text with barcode" +#~ msgstr "Exibir texto com código de barras" + +#~ msgid "Edit properties..." +#~ msgstr "Editar propriedades..." + +#~ msgid "Fields" +#~ msgstr "Campos" + +#~ msgid "Column" +#~ msgstr "Coluna" + +#~ msgid "Custom field key" +#~ msgstr "Chave do campo específico" + +#~ msgid "Sample data" +#~ msgstr "Dado de amostra" + +#~ msgid "Revert to saved copy of %s?" +#~ msgstr "Reverter para a cópia gravada de %s?" + +#~ msgid "Unknown media type. Using default." +#~ msgstr "Tipo de mídia desconhecido. Usando padrão." + +#~ msgid "" +#~ "``%s'' has been modified.\n" +#~ "\n" +#~ "Do you wish to save it?" +#~ msgstr "" +#~ "``%s'' foi modificado.\n" +#~ "\n" +#~ "Deseja salvá-lo?" + +#~ msgid "Close / Save label as" +#~ msgstr "Fechar / Salvar etiqueta como" + +#~ msgid "Label no longer valid!" +#~ msgstr "Etiqueta não é mais válida" + +#~ msgid "Error writing file" +#~ msgstr "Erro gravando o arquivo" + +#~ msgid "Appearance" +#~ msgstr "Aparência" + +#~ msgid "Position/Size" +#~ msgstr "Posição/Tamanho" + +#~ msgid "Image format not currently supported" +#~ msgstr "Formato de imagem não suportado atualmente" + +#~ msgid "Barcode data" +#~ msgstr "Dado do Código de Barras:" + +#~ msgid "General" +#~ msgstr "Geral" + +#~ msgid "Make a new, empty label" +#~ msgstr "Criar uma etiqueta nova, vazia" + +#~ msgid " New " +#~ msgstr " Novo " + +#~ msgid "New Label/Card" +#~ msgstr "Nova Etiqueta/Cartão" + +#~ msgid " Open " +#~ msgstr " Abrir " + +#~ msgid " Save " +#~ msgstr " Salvar " + +#~ msgid " Print " +#~ msgstr " Imprimir " + +#~ msgid "Function is not implemented!" +#~ msgstr "Função não está implementada!" + +#~ msgid "Function is not yet implemented!" +#~ msgstr "Função ainda não implementada!" diff --git a/glabels2/po/ru.po b/glabels2/po/ru.po new file mode 100644 index 00000000..40067b12 --- /dev/null +++ b/glabels2/po/ru.po @@ -0,0 +1,2459 @@ +# Russian translation of glabels. +# Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +# Vitaly Lipatov , 2002, 2003, 2004, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: glabels 2.1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-01-22 14:03-0500\n" +"PO-Revision-Date: 2005-04-10 02:18MSK\n" +"Last-Translator: Vitaly Lipatov \n" +"Language-Team: Russian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.10\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: src/glabels.c:116 +msgid "Could not initialize Bonobo!\n" +msgstr "Невозможно инициализировать Bonobo!\n" + +#: src/glabels-batch.c:52 +msgid "print this message" +msgstr "напечатать это сообщение" + +#: src/glabels-batch.c:54 +msgid "print the version of glabels-batch being used" +msgstr "выводит версию используемого glabels-batch" + +#: src/glabels-batch.c:56 +msgid "set output filename (default=\"output.ps\")" +msgstr "установить название выходного файла (по умолчанию - \"output.ps\"" + +#: src/glabels-batch.c:56 src/glabels-batch.c:70 +msgid "filename" +msgstr "название" + +#: src/glabels-batch.c:58 +msgid "number of sheets (default=1)" +msgstr "количество страниц (по умолчанию - 1)" + +#: src/glabels-batch.c:58 +msgid "sheets" +msgstr "страниц" + +#: src/glabels-batch.c:60 +msgid "number of copies (default=1)" +msgstr "количество копий (по умолчанию - 1)" + +#: src/glabels-batch.c:60 +msgid "copies" +msgstr "копий" + +#: src/glabels-batch.c:62 +msgid "first label on first sheet (default=1)" +msgstr "первая этикетка на первой странице (по умолчанию - 1)" + +#: src/glabels-batch.c:62 +msgid "first" +msgstr "первое" + +#: src/glabels-batch.c:64 src/print-dialog.c:336 +msgid "print outlines (to test printer alignment)" +msgstr "печатать контуры этикеток" + +#: src/glabels-batch.c:66 src/print-dialog.c:344 +msgid "print in reverse (i.e. a mirror image)" +msgstr "печатать перевёрнуто (как отражается в зеркале)" + +#: src/glabels-batch.c:68 src/print-dialog.c:351 +msgid "print crop marks" +msgstr "печатать метки для обрезки" + +#: src/glabels-batch.c:70 +msgid "input file for merging" +msgstr "входной файл для объединения" + +#: src/glabels-batch.c:107 +msgid "[OPTION...] GLABELS_FILE..." +msgstr "[ПАРАМЕТРЫ...] файл_glabels..." + +#: src/glabels-batch.c:127 +#, c-format +msgid "missing glabels file\n" +msgstr "не указан файл glabels\n" + +#: src/glabels-batch.c:158 +msgid "cannot perform document merge with glabels file %s\n" +msgstr "невозможно выполнить объединение документа с файлом glabels %s\n" + +#: src/glabels-batch.c:182 +#, c-format +msgid "cannot open glabels file %s\n" +msgstr "невозможно открыть файл %s\n" + +#: src/window.c:244 +msgid "(none) - gLabels" +msgstr "(ничего) - gLabels" + +#: src/window.c:414 +msgid "(modified)" +msgstr "(изменено)" + +#: src/stock.c:65 data/ui/glabels-ui.xml.h:162 +msgid "_Select Mode" +msgstr "_Режим выбора" + +#: src/stock.c:66 data/ui/glabels-ui.xml.h:163 +msgid "_Text" +msgstr "_Текст" + +#: src/stock.c:67 data/ui/glabels-ui.xml.h:148 +msgid "_Line" +msgstr "_Линия" + +#: src/stock.c:68 data/ui/glabels-ui.xml.h:130 +msgid "_Box" +msgstr "_Прямоугольник" + +#: src/stock.c:69 data/ui/glabels-ui.xml.h:141 +msgid "_Ellipse" +msgstr "_Эллипс" + +#: src/stock.c:70 data/ui/glabels-ui.xml.h:146 +msgid "_Image" +msgstr "_Изображение" + +#: src/stock.c:71 data/ui/glabels-ui.xml.h:11 +msgid "Bar_code" +msgstr "_Штрих-код" + +#: src/stock.c:72 +msgid "_Merge Properties" +msgstr "Свойства _объединения" + +#: src/stock.c:73 +msgid "Object _Properties" +msgstr "_Свойства объекта" + +#: src/stock.c:74 data/ui/glabels-ui.xml.h:13 +msgid "Bring to _Front" +msgstr "На _передний план" + +#: src/stock.c:75 data/ui/glabels-ui.xml.h:109 +msgid "Send to _Back" +msgstr "На _задний план" + +#: src/stock.c:76 data/ui/glabels-ui.xml.h:96 +msgid "Rotate _Left" +msgstr "Повернуть на_лево" + +#: src/stock.c:77 data/ui/glabels-ui.xml.h:97 +msgid "Rotate _Right" +msgstr "Повернуть на_право" + +#: src/stock.c:78 data/ui/glabels-ui.xml.h:52 +msgid "Flip _Horizontally" +msgstr "Отразить _горизонтально" + +#: src/stock.c:79 data/ui/glabels-ui.xml.h:53 +msgid "Flip _Vertically" +msgstr "Отразить _вертикально" + +#: src/stock.c:80 data/ui/glabels-ui.xml.h:147 +msgid "_Lefts" +msgstr "С_лева" + +#: src/stock.c:81 data/ui/glabels-ui.xml.h:159 +msgid "_Rights" +msgstr "С_права" + +#: src/stock.c:82 data/ui/glabels-ui.xml.h:131 +msgid "_Centers" +msgstr "По _центру" + +#: src/stock.c:83 data/ui/glabels-ui.xml.h:164 +msgid "_Tops" +msgstr "По _верху" + +#: src/stock.c:84 +msgid "Bottoms" +msgstr "По низу" + +#: src/stock.c:85 +msgid "Centers" +msgstr "По центру" + +#: src/stock.c:86 src/stock.c:87 data/ui/glabels-ui.xml.h:62 +msgid "Label Ce_nter" +msgstr "_Центр этикетки" + +#: src/stock.c:88 data/ui/glabels-ui.xml.h:51 +msgid "Fill color" +msgstr "Цвет заливки" + +#: src/stock.c:89 data/ui/glabels-ui.xml.h:64 +msgid "Line color" +msgstr "Цвет линии" + +#: src/stock.c:90 src/stock.c:92 +msgid "Linked" +msgstr "Прикреплено" + +#: src/stock.c:91 src/stock.c:93 +msgid "Not Linked" +msgstr "Не прикреплено" + +#: src/ui-property-bar.c:345 src/object-editor.c:587 +msgid "Default" +msgstr "По умолчанию" + +#: src/ui-property-bar.c:360 src/object-editor.c:600 +msgid "No fill" +msgstr "Не заполнять" + +#: src/ui-property-bar.c:375 src/object-editor.c:593 +msgid "No line" +msgstr "Нет линии" + +#: src/ui-sidebar.c:180 +msgid "Object properties" +msgstr "Свойства объекта" + +#: src/commands.c:385 +msgid "" +"A label and business card creation program for GNOME.\n" +" \n" +"Glabels is free software; you can redistribute it and/or modify it under the " +"terms of the GNU General Public License as published by the Free Software " +"Foundation; either version 2 of the License, or (at your option) any later " +"version.\n" +" \n" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details.\n" +msgstr "" +"Программа создания этикеток и визиток для GNOME\n" +" \n" +"Glabels является свободным программным обеспечением; вы вправе " +"распространять её и/или модифицировать в соответствии с условиями версии 2 " +"либо по вашему выбору более поздней версии Стандартной Общественной Лицензии " +"GNU, опубликованной Free Software Foundation.\n" +" \n" +"Мы распространяем данную программу в надежде на то, что она будет вам " +"полезной, однако НЕ ПРЕДОСТАВЛЯЕМ НА НЕЁ НИКАКИХ ГАРАНТИЙ, в том числе " +"ГАРАНТИИ ТОВАРНОГО СОСТОЯНИЯ ПРИ ПРОДАЖЕ и ПРИГОДНОСТИ ДЛЯ ИСПОЛЬЗОВАНИЯ В " +"КОНКРЕТНЫХ ЦЕЛЯХ. Для получения более подробной информации ознакомьтесь со " +"Стандартной Общественной Лицензией GNU.\n" + +#: src/commands.c:399 +msgid "See the file AUTHORS for additional credits," +msgstr "Смотрите в файл AUTHORS для дополнительной информации," + +#: src/commands.c:400 +msgid "or visit http://glabels.sourceforge.net/" +msgstr "или посетите сайт http://glabels.sourceforge.net/" + +#: src/commands.c:409 +msgid " " +msgstr "" + +#: src/commands.c:424 +msgid "glabels" +msgstr "glabels" + +#: src/file.c:100 +msgid "New Label or Card" +msgstr "Новая этикетка или визитка" + +#: src/file.c:132 src/file.c:304 +msgid "Media Type" +msgstr "Размер бумаги" + +#: src/file.c:138 src/file.c:310 +msgid "Label orientation" +msgstr "Расположение этикетки" + +#: src/file.c:269 +msgid "Label properties" +msgstr "Свойства этикетки" + +#: src/file.c:452 src/file.c:870 +msgid "All files" +msgstr "Все файлы" + +#: src/file.c:457 src/file.c:875 +msgid "gLabels documents" +msgstr "Документы gLabels" + +#: src/file.c:505 src/file.c:617 src/file.c:934 src/file.c:1130 +msgid "Empty file name selection" +msgstr "Пустой выбор файла" + +#: src/file.c:506 src/file.c:520 src/file.c:618 src/file.c:632 +msgid "Please select a file or supply a valid file name" +msgstr "Выберите файл или введите корректное название файла" + +#: src/file.c:519 src/file.c:631 +msgid "File does not exist" +msgstr "Файл не существует" + +#: src/file.c:563 data/ui/glabels-ui.xml.h:74 +msgid "Open" +msgstr "Открыть" + +#: src/file.c:565 +msgid "Open label" +msgstr "Открыть этикетку" + +#: src/file.c:707 +#, c-format +msgid "Could not open file \"%s\"" +msgstr "Невозможно открыть файл \"%s\"" + +#: src/file.c:715 +msgid "Not a supported file format" +msgstr "Файл неподдерживаемого формата" + +#: src/file.c:797 src/file.c:979 src/file.c:1174 +#, c-format +msgid "Could not save file \"%s\"" +msgstr "Невозможно сохранить файл \"%s\"" + +#: src/file.c:805 src/file.c:987 src/file.c:1182 +msgid "Error encountered during save. The file is still not saved." +msgstr "Произошла ошибка при сохранении файла. Файл всё ещё не сохранён." + +#: src/file.c:848 src/file.c:1048 +#, c-format +msgid "Save \"%s\" as" +msgstr "Сохранить \"%s\" как" + +#: src/file.c:935 src/file.c:1131 +msgid "Please supply a valid file name" +msgstr "Укажите корректное название файла" + +#: src/file.c:952 src/file.c:1147 +#, c-format +msgid "Overwrite file \"%s\"?" +msgstr "Перезаписать файл \"%s\"?" + +#: src/file.c:960 src/file.c:1155 +msgid "File already exists." +msgstr "Файл уже существует." + +#: src/file.c:1271 +#, c-format +msgid "Save changes to document \"%s\" before closing?" +msgstr "Сохранить изменения в документе \"%s\" перед закрытием?" + +#: src/file.c:1279 +msgid "Your changes will be lost if you don't save them." +msgstr "Все изменения будут потеряны, если вы их не сохраните." + +#: src/file.c:1282 +msgid "Close without saving" +msgstr "Закрыть без сохранения" + +#. Should not happen +#: src/prefs.c:156 src/prefs.c:163 data/glade/prefs-dialog.glade.h:23 +#: data/glade/object-editor.glade.h:37 +msgid "points" +msgstr "точек" + +#: src/prefs.c:158 data/glade/object-editor.glade.h:36 +#: data/glade/template-designer.glade.h:74 +msgid "inches" +msgstr "дюймов" + +#: src/prefs.c:160 +msgid "mm" +msgstr "мм" + +#: src/prefs-dialog.c:248 data/glade/prefs-dialog.glade.h:22 +msgid "gLabels Preferences" +msgstr "Параметры gLabels" + +#. +#. * Submenu: Order +#. +#: src/view.c:3574 data/ui/glabels-ui.xml.h:154 +msgid "_Order" +msgstr "_Порядок" + +#. +#. * Submenu: Rotate/Flip +#. +#: src/view.c:3595 data/ui/glabels-ui.xml.h:160 +msgid "_Rotate/Flip" +msgstr "_Повернуть/Отразить" + +#. +#. * Submenu: Align Horizontally +#. +#: src/view.c:3628 +msgid "Align _Horizontally" +msgstr "Выровнять _горизонтально" + +#. +#. * Submenu: Align Vertically +#. +#: src/view.c:3667 +msgid "Align _Vertically" +msgstr "Выровнять _вертикально" + +#: src/view.c:3728 data/ui/glabels-ui.xml.h:137 +msgid "_Delete" +msgstr "У_далить" + +#. Build editor. +#: src/view-box.c:236 +msgid "Box object properties" +msgstr "Свойства прямоугольника" + +#. Build editor. +#: src/view-ellipse.c:236 +msgid "Ellipse object properties" +msgstr "Свойства эллипса" + +#. Build editor. +#: src/view-line.c:229 +msgid "Line object properties" +msgstr "Свойство линии" + +#. Build editor. +#: src/view-image.c:223 +msgid "Image object properties" +msgstr "Свойства изображения" + +#. Build editor. +#: src/view-text.c:251 +msgid "Text object properties" +msgstr "Свойства текста" + +#: src/view-text.c:571 data/glade/object-editor.glade.h:28 +msgid "Text" +msgstr "Текст" + +#. Build editor. +#: src/view-barcode.c:210 +msgid "Barcode object properties" +msgstr "Свойства объекта типа штрих-код" + +#: src/view-barcode.c:594 src/print.c:1125 +msgid "Invalid barcode data" +msgstr "Неверные данные штрих-кода" + +#: src/merge-properties-dialog.c:231 +msgid "Merge Properties" +msgstr "Свойства объединения" + +#. ---- Source section ---- +#: src/merge-properties-dialog.c:237 +msgid "Source" +msgstr "Источник" + +#: src/merge-properties-dialog.c:245 +msgid "Format:" +msgstr "Формат:" + +#. Location line +#: src/merge-properties-dialog.c:273 +msgid "Location:" +msgstr "Расположение:" + +#: src/merge-properties-dialog.c:282 src/merge-properties-dialog.c:393 +msgid "Select merge-database source" +msgstr "Выбрать источник данных для объединения" + +#: src/merge-properties-dialog.c:289 src/merge-properties-dialog.c:404 +msgid "N/A" +msgstr "Недоступно" + +#. ---- Sample Fields section ---- +#: src/merge-properties-dialog.c:300 +msgid "Record selection/preview:" +msgstr "Просмотр и выбор записей:" + +#: src/merge-properties-dialog.c:326 +msgid "Select" +msgstr "Выбран" + +#: src/merge-properties-dialog.c:334 +msgid "Record/Field" +msgstr "Запись/Поле" + +#: src/merge-properties-dialog.c:342 data/glade/object-editor.glade.h:9 +msgid "Data" +msgstr "Данные" + +#: src/print-dialog.c:266 data/ui/glabels-ui.xml.h:81 +msgid "Print" +msgstr "Напечатать" + +#: src/print-dialog.c:281 +msgid "_Job" +msgstr "_Задание" + +#: src/print-dialog.c:286 +msgid "P_rinter" +msgstr "П_ринтер" + +#. ----------- Add simple-copies widget ------------ +#: src/print-dialog.c:314 +msgid "Copies" +msgstr "Копий" + +#. ------- Add merge control widget ------------ +#: src/print-dialog.c:322 +msgid "Document merge control" +msgstr "Управление объединением" + +#. ----------- Add custom print options area ------------ +#: src/print-dialog.c:330 +msgid "Options" +msgstr "Параметры" + +#: src/print-dialog.c:553 src/print-dialog.c:592 +msgid "Print preview" +msgstr "Просмотреть" + +#: src/template-designer.c:409 data/glade/template-designer.glade.h:73 +msgid "gLabels Template Designer" +msgstr "Дизайнер шаблонов gLabels" + +#: src/bc.c:60 +msgid "POSTNET (any)" +msgstr "POSTNET (любой)" + +#: src/bc.c:63 +msgid "POSTNET-5 (ZIP only)" +msgstr "POSTNET-5 (только почтовый индекс)" + +#: src/bc.c:66 +msgid "POSTNET-9 (ZIP+4)" +msgstr "POSTNET-9 (ZIP+4)" + +#: src/bc.c:69 +msgid "POSTNET-11 (DPBC)" +msgstr "POSTNET-11 (DPBC)" + +#: src/bc.c:72 +msgid "EAN (any)" +msgstr "EAN (любой)" + +#: src/bc.c:75 +msgid "EAN-8" +msgstr "EAN-8" + +#: src/bc.c:78 +msgid "EAN-8 +2" +msgstr "EAN-8 +2" + +#: src/bc.c:81 +msgid "EAN-8 +5" +msgstr "EAN-8 +5" + +#: src/bc.c:84 +msgid "EAN-13" +msgstr "EAN-13" + +#: src/bc.c:87 +msgid "EAN-13 +2" +msgstr "EAN-13 +2" + +#: src/bc.c:90 +msgid "EAN-13 +5" +msgstr "EAN-13 +5" + +#: src/bc.c:93 +msgid "UPC (UPC-A or UPC-E)" +msgstr "UPC (UPC-A or UPC-E)" + +#: src/bc.c:96 +msgid "UPC-A" +msgstr "UPC-A" + +#: src/bc.c:99 +msgid "UPC-A +2" +msgstr "UPC-A +2" + +#: src/bc.c:102 +msgid "UPC-A +5" +msgstr "UPC-A +5" + +#: src/bc.c:105 +msgid "UPC-E" +msgstr "UPC-E" + +#: src/bc.c:108 +msgid "UPC-E +2" +msgstr "UPC-E +2" + +#: src/bc.c:111 +msgid "UPC-E +5" +msgstr "UPC-E +5" + +#: src/bc.c:114 +msgid "ISBN" +msgstr "ISBN" + +#: src/bc.c:117 +msgid "ISBN +5" +msgstr "ISBN +5" + +#: src/bc.c:120 +msgid "Code 39" +msgstr "Code 39" + +#: src/bc.c:123 +msgid "Code 128" +msgstr "Code 128" + +#: src/bc.c:126 +msgid "Code 128C" +msgstr "Code 128C" + +#: src/bc.c:129 +msgid "Code 128B" +msgstr "Code 128B" + +#: src/bc.c:132 +msgid "Interleaved 2 of 5" +msgstr "Interleaved 2 of 5" + +#: src/bc.c:135 +msgid "Codabar" +msgstr "" + +#: src/bc.c:138 +msgid "MSI" +msgstr "MSI" + +#: src/bc.c:141 +msgid "Plessey" +msgstr "" + +#: src/label.c:569 +msgid "Untitled" +msgstr "Без названия" + +#: src/xml-label.c:176 src/xml-label.c:213 +msgid "xmlParseFile error" +msgstr "Ошибка при разборе файла XML" + +#: src/xml-label.c:250 +msgid "No document root" +msgstr "Нет корня документа" + +#: src/xml-label.c:264 +msgid "Importing from glabels 0.1 format" +msgstr "Импортируем из файла glabels версии 0.1" + +#: src/xml-label.c:272 +msgid "Importing from glabels 0.4 format" +msgstr "Импортируем из файла glabels версии 0.4" + +#: src/xml-label.c:279 +msgid "Importing from glabels 1.91 format" +msgstr "Импортируем из формата glabels версии 1.91" + +#: src/xml-label.c:282 +msgid "bad document, unknown glabels Namespace" +msgstr "документ неверного типа, неизвестное пространство имён glabels" + +#: src/xml-label.c:311 src/xml-label-04.c:75 src/xml-label-191.c:131 +#, c-format +msgid "Bad root node = \"%s\"" +msgstr "Неверный корневой узел = \"%s\"" + +#: src/xml-label.c:348 src/xml-label-191.c:165 +#, c-format +msgid "bad node in Document node = \"%s\"" +msgstr "Неверный узел в узле документа= \"%s\"" + +#: src/xml-label.c:393 src/xml-label-04.c:123 src/xml-label-191.c:197 +#, c-format +msgid "bad node = \"%s\"" +msgstr "неверный узел = \"%s\"" + +#: src/xml-label.c:855 src/xml-label-191.c:624 +#, c-format +msgid "bad node in Data node = \"%s\"" +msgstr "неверный узел в узле данных= \"%s\"" + +#: src/xml-label.c:1030 libglabels/xml-template.c:535 +msgid "Utf8 conversion error." +msgstr "Ошибка преобразования UTF8." + +#: src/xml-label.c:1037 libglabels/xml-template.c:542 +msgid "Problem saving xml file." +msgstr "Проблемы при сохранении файла XML" + +#. This should always be an id, but just in case a name +#. slips by! +#: src/xml-label-191.c:699 libglabels/xml-template.c:199 +#, c-format +msgid "Unknown page size id \"%s\", trying as name" +msgstr "Неизвестный идентификатор размера страницы \"%s\", пробуем как название" + +#: src/xml-label-191.c:709 libglabels/xml-template.c:209 +#, c-format +msgid "Unknown page size id or name \"%s\"" +msgstr "Неизвестный идентификатор размера страницы или название \"%s\"" + +#: src/merge.c:172 src/merge.c:213 src/merge.c:399 src/merge.c:402 +msgid "None" +msgstr "Ничего" + +#: src/merge-init.c:53 +msgid "Text file with comma delimeters (CSV)" +msgstr "Текст с разделителем \"запятая\" (CSV)" + +#: src/merge-init.c:60 +msgid "Text file with colon delimeters" +msgstr "Текст с разделителем \"двоеточие\"" + +#: src/merge-init.c:67 +msgid "Text file with tab delimeters" +msgstr "Текст с разделителем \"символ табуляции\"" + +#: src/wdgt-image-select.c:201 data/glade/object-editor.glade.h:11 +msgid "File:" +msgstr "Файл:" + +#: src/wdgt-image-select.c:245 data/glade/object-editor.glade.h:16 +msgid "Key:" +msgstr "Ключ:" + +#: src/wdgt-print-copies.c:179 +msgid "Sheets:" +msgstr "Листов:" + +#: src/wdgt-print-copies.c:197 +msgid "Labels" +msgstr "Этикетки" + +#: src/wdgt-print-copies.c:200 +msgid "from:" +msgstr "с:" + +#: src/wdgt-print-copies.c:207 +msgid "to:" +msgstr "до:" + +#: src/wdgt-print-merge.c:178 +msgid "Start on label" +msgstr "Начать с этикетки" + +#: src/wdgt-print-merge.c:186 +msgid "on 1st sheet" +msgstr "на первом листе" + +#: src/wdgt-print-merge.c:195 +msgid "Copies:" +msgstr "Копий:" + +#: src/wdgt-print-merge.c:201 +msgid "Collate" +msgstr "Собирать" + +#: src/wdgt-media-select.c:269 data/glade/template-designer.glade.h:29 +msgid "Description:" +msgstr "Описание:" + +#: src/wdgt-media-select.c:279 data/glade/template-designer.glade.h:53 +msgid "Page size:" +msgstr "Размер страницы:" + +#: src/wdgt-media-select.c:290 +msgid "Label size:" +msgstr "Размер этикетки:" + +#: src/wdgt-media-select.c:301 +msgid "Layout:" +msgstr "Формат:" + +#: src/wdgt-media-select.c:578 +#, c-format +msgid "%d x %d (%d per sheet)" +msgstr "%d x %d (%d на лист)" + +#: src/wdgt-media-select.c:582 +#, c-format +msgid "%d per sheet" +msgstr "%d на лист" + +#: src/wdgt-media-select.c:614 +#, c-format +msgid "%s x %s %s" +msgstr "%s x %s %s" + +#: src/wdgt-media-select.c:619 +#, c-format +msgid "%.5g x %.5g %s" +msgstr "%.5g x %.5g %s" + +#: src/wdgt-media-select.c:630 src/wdgt-media-select.c:644 +#, c-format +msgid "%s %s diameter" +msgstr "%s %s диаметр" + +#: src/wdgt-media-select.c:634 src/wdgt-media-select.c:648 +#, c-format +msgid "%.5g %s diameter" +msgstr "%.5g %s диаметр" + +#: src/wdgt-rotate-label.c:193 +msgid "Rotate" +msgstr "Повернуть" + +#. This is the default custom color +#: src/mygal/color-palette.c:396 +msgid "custom" +msgstr "выборочно" + +#. "Custom" color - we'll pop up a GnomeColorPicker +#: src/mygal/color-palette.c:438 +msgid "Custom Color:" +msgstr "Пользовательский цвет:" + +#: src/mygal/color-palette.c:446 +msgid "Choose Custom Color" +msgstr "Выберите пользовательский цвет" + +#: src/mygal/color-palette.c:579 +msgid "black" +msgstr "чёрный" + +#: src/mygal/color-palette.c:580 +msgid "light brown" +msgstr "светло-коричневый" + +#: src/mygal/color-palette.c:581 +msgid "brown gold" +msgstr "золотой коричневый" + +#: src/mygal/color-palette.c:582 +msgid "dark green #2" +msgstr "чёрно-зелёный ?2" + +#: src/mygal/color-palette.c:583 +msgid "navy" +msgstr "морской" + +#: src/mygal/color-palette.c:584 src/mygal/color-palette.c:640 +msgid "dark blue" +msgstr "тёмно-синий" + +#: src/mygal/color-palette.c:585 +msgid "purple #2" +msgstr "пурпурный ?2" + +#: src/mygal/color-palette.c:586 +msgid "very dark gray" +msgstr "очень тёмно-серый" + +#: src/mygal/color-palette.c:589 src/mygal/color-palette.c:645 +msgid "dark red" +msgstr "тёмно-красный" + +#: src/mygal/color-palette.c:590 +msgid "red-orange" +msgstr "красно-оранжевый" + +#: src/mygal/color-palette.c:591 +msgid "gold" +msgstr "золотой" + +#: src/mygal/color-palette.c:592 +msgid "dark green" +msgstr "тёмно-зелёный" + +#: src/mygal/color-palette.c:593 src/mygal/color-palette.c:646 +msgid "dull blue" +msgstr "тускло-синий" + +#: src/mygal/color-palette.c:594 src/mygal/color-palette.c:647 +msgid "blue" +msgstr "синий" + +#: src/mygal/color-palette.c:595 +msgid "dull purple" +msgstr "тускло-пурпурный" + +#: src/mygal/color-palette.c:596 +msgid "dark grey" +msgstr "тёмно-серый" + +#: src/mygal/color-palette.c:599 +msgid "red" +msgstr "красный" + +#: src/mygal/color-palette.c:600 +msgid "orange" +msgstr "оранжевый" + +#: src/mygal/color-palette.c:601 +msgid "lime" +msgstr "лимонный" + +#: src/mygal/color-palette.c:602 +msgid "dull green" +msgstr "тускло-зелёный" + +#: src/mygal/color-palette.c:603 +msgid "dull blue #2" +msgstr "туско-синий ?2" + +#: src/mygal/color-palette.c:604 +msgid "sky blue #2" +msgstr "небесно-синий ?2" + +#: src/mygal/color-palette.c:605 src/mygal/color-palette.c:644 +msgid "purple" +msgstr "пурпурный" + +#: src/mygal/color-palette.c:606 +msgid "gray" +msgstr "серый" + +#: src/mygal/color-palette.c:609 src/mygal/color-palette.c:641 +msgid "magenta" +msgstr "малиновый" + +#: src/mygal/color-palette.c:610 +msgid "bright orange" +msgstr "ярко-оранжевый" + +#: src/mygal/color-palette.c:611 src/mygal/color-palette.c:642 +msgid "yellow" +msgstr "жёлтый" + +#: src/mygal/color-palette.c:612 +msgid "green" +msgstr "зелёный" + +#: src/mygal/color-palette.c:613 src/mygal/color-palette.c:643 +msgid "cyan" +msgstr "циан" + +#: src/mygal/color-palette.c:614 +msgid "bright blue" +msgstr "ярко-синий" + +#: src/mygal/color-palette.c:615 src/mygal/color-palette.c:632 +msgid "red purple" +msgstr "красно-пурпурный" + +#: src/mygal/color-palette.c:616 +msgid "light grey" +msgstr "светло-серый" + +#: src/mygal/color-palette.c:619 src/mygal/color-palette.c:636 +msgid "pink" +msgstr "розовый" + +#: src/mygal/color-palette.c:620 +msgid "light orange" +msgstr "светло-оранжевый" + +#: src/mygal/color-palette.c:621 src/mygal/color-palette.c:633 +msgid "light yellow" +msgstr "светло-жёлтый" + +#: src/mygal/color-palette.c:622 +msgid "light green" +msgstr "светло-зелёный" + +#: src/mygal/color-palette.c:623 +msgid "light cyan" +msgstr "светло-циан" + +#: src/mygal/color-palette.c:624 src/mygal/color-palette.c:634 +msgid "light blue" +msgstr "светло-синий" + +#: src/mygal/color-palette.c:625 src/mygal/color-palette.c:638 +msgid "light purple" +msgstr "светло-пурпурный" + +#: src/mygal/color-palette.c:626 +msgid "white" +msgstr "белый" + +#: src/mygal/color-palette.c:631 +msgid "purplish blue" +msgstr "пурпурно-синий" + +#: src/mygal/color-palette.c:635 +msgid "dark purple" +msgstr "тёмно-пурпурный" + +#: src/mygal/color-palette.c:637 +msgid "sky blue" +msgstr "небесно-синий" + +#: libglabels/template.c:848 +#, c-format +msgid "Generic %s full page" +msgstr "Основная %s полная страница" + +#: libglabels/template.c:897 +msgid "No template files found!" +msgstr "Не найдены файлы шаблона!" + +#. Create and append an "Other" entry. +#: libglabels/paper.c:67 +msgid "Other" +msgstr "Другой" + +#: libglabels/paper.c:361 +msgid "No paper files found!" +msgstr "Не найдены файлы описания бумаги!" + +#: data/ui/glabels-ui.xml.h:1 +msgid "About glabels" +msgstr "О gLabels" + +#: data/ui/glabels-ui.xml.h:2 +msgid "About..." +msgstr "О программе..." + +#: data/ui/glabels-ui.xml.h:3 +msgid "Align _Horizontal" +msgstr "Выровнять по _горизонтали" + +#: data/ui/glabels-ui.xml.h:4 +msgid "Align _Vertical" +msgstr "Выровнять по _вертикали" + +#: data/ui/glabels-ui.xml.h:5 +msgid "Align objects to bottoms" +msgstr "Выровнять объекты по низам" + +#: data/ui/glabels-ui.xml.h:6 +msgid "Align objects to horizontal centers" +msgstr "Выровнять объекты по горизонтальным центрам" + +#: data/ui/glabels-ui.xml.h:7 +msgid "Align objects to left edges" +msgstr "Выровнять объекты по левому краю" + +#: data/ui/glabels-ui.xml.h:8 +msgid "Align objects to right edges" +msgstr "Выровнять объекты по правому краю" + +#: data/ui/glabels-ui.xml.h:9 +msgid "Align objects to tops" +msgstr "Выровнять объекты по верхам" + +#: data/ui/glabels-ui.xml.h:10 +msgid "Align objects to vertical centers" +msgstr "Выровнять объекты по вертикальным центрам" + +#: data/ui/glabels-ui.xml.h:12 +msgid "Bold" +msgstr "Жирный" + +#: data/ui/glabels-ui.xml.h:14 +msgid "Center align" +msgstr "Выровнять по центру" + +#: data/ui/glabels-ui.xml.h:15 +msgid "Center objects to horizontal label center" +msgstr "Центрировать объекты по центру горизонтальной метки" + +#: data/ui/glabels-ui.xml.h:16 +msgid "Center objects to vertical label center" +msgstr "Центрировать объекты по центру вертикальной метки" + +#: data/ui/glabels-ui.xml.h:17 +msgid "Change the visibility of markup lines in the current window" +msgstr "Изменить видимость линии разметки в текущем окне" + +#: data/ui/glabels-ui.xml.h:18 +msgid "Change the visibility of the drawing toolbar in the current window" +msgstr "Изменить видимость панели инструментов для рисования в текущем окне" + +#: data/ui/glabels-ui.xml.h:19 +msgid "Change the visibility of the grid in the current window" +msgstr "Изменить видимость сетки в текущем окне" + +#: data/ui/glabels-ui.xml.h:20 +msgid "Change the visibility of the main toolbar in the current window" +msgstr "Изменить видимость главной панели инструментов в текущем окне" + +#: data/ui/glabels-ui.xml.h:21 +msgid "Change the visibility of the property toolbar in the current window" +msgstr "Изменить видимость панели свойств в текущем окне" + +#: data/ui/glabels-ui.xml.h:22 +msgid "Close" +msgstr "Закрыть" + +#: data/ui/glabels-ui.xml.h:23 +msgid "Close the current file" +msgstr "Закрыть текущий файл" + +#: data/ui/glabels-ui.xml.h:24 +msgid "Configure the application" +msgstr "Настроить программу" + +#: data/ui/glabels-ui.xml.h:25 +msgid "Contents" +msgstr "Содержание справки" + +#: data/ui/glabels-ui.xml.h:26 +msgid "Copy" +msgstr "Запомнить" + +#: data/ui/glabels-ui.xml.h:27 +msgid "Copy the selection" +msgstr "Запомнить выделенное" + +#: data/ui/glabels-ui.xml.h:28 +msgid "Create a custom template" +msgstr "Создать свой шаблон" + +#: data/ui/glabels-ui.xml.h:29 +msgid "Create a new document" +msgstr "Создать новый документ" + +#: data/ui/glabels-ui.xml.h:30 +msgid "Create barcode object" +msgstr "Разместить штрих-код" + +#: data/ui/glabels-ui.xml.h:31 +msgid "Create box/rectangle object" +msgstr "Разместить прямоугольник" + +#: data/ui/glabels-ui.xml.h:32 +msgid "Create ellipse/circle object" +msgstr "Разместить эллипс/круг" + +#: data/ui/glabels-ui.xml.h:33 +msgid "Create image object" +msgstr "Разместить растровое изображение" + +#: data/ui/glabels-ui.xml.h:34 +msgid "Create line object" +msgstr "Разместить линию" + +#: data/ui/glabels-ui.xml.h:35 +msgid "Create text object" +msgstr "Разместить текст" + +#: data/ui/glabels-ui.xml.h:36 +msgid "Cu_t" +msgstr "_Вырезать" + +#: data/ui/glabels-ui.xml.h:37 +msgid "Customize" +msgstr "Настроить" + +#: data/ui/glabels-ui.xml.h:38 +msgid "Customize Drawing Toolbar" +msgstr "Настроить панель рисования" + +#: data/ui/glabels-ui.xml.h:39 +msgid "Customize Main Toolbar" +msgstr "Настроить панель инструментов" + +#: data/ui/glabels-ui.xml.h:40 +msgid "Customize Property Toolbar" +msgstr "Настроить панель свойств" + +#: data/ui/glabels-ui.xml.h:41 +msgid "Customize toolbars" +msgstr "Настроить панель инструментов" + +#: data/ui/glabels-ui.xml.h:42 +msgid "Cut" +msgstr "Вырезать" + +#: data/ui/glabels-ui.xml.h:43 +msgid "Cut the selection" +msgstr "Вырезать выделенное" + +#: data/ui/glabels-ui.xml.h:44 +msgid "Decrease magnification" +msgstr "Уменьшить" + +#: data/ui/glabels-ui.xml.h:45 +msgid "Delete" +msgstr "Удалить" + +#: data/ui/glabels-ui.xml.h:46 +msgid "Delete the selected objects" +msgstr "Удалить выбранные объекты" + +#: data/ui/glabels-ui.xml.h:47 +msgid "Drawing toolbar" +msgstr "Панель рисования" + +#: data/ui/glabels-ui.xml.h:48 +msgid "Dump XML" +msgstr "Дамп XML" + +#: data/ui/glabels-ui.xml.h:49 +msgid "Dump the UI Xml description" +msgstr "Дамп XML-описания UI" + +#: data/ui/glabels-ui.xml.h:50 +msgid "Edit merge properties" +msgstr "Изменить свойства объединения" + +#: data/ui/glabels-ui.xml.h:54 +msgid "Flip object horizontally" +msgstr "Отразить объект горизонтально" + +#: data/ui/glabels-ui.xml.h:55 +msgid "Flip object vertically" +msgstr "Отразить объект вертикально" + +#: data/ui/glabels-ui.xml.h:56 +msgid "Font name" +msgstr "Название шрифта" + +#: data/ui/glabels-ui.xml.h:57 +msgid "Font selector" +msgstr "Выбор шрифта" + +#: data/ui/glabels-ui.xml.h:58 +msgid "Font size" +msgstr "Размер шрифта" + +#: data/ui/glabels-ui.xml.h:59 +msgid "Icon and _Text" +msgstr "Пиктограмма и _Текст" + +#: data/ui/glabels-ui.xml.h:60 +msgid "Increase magnification" +msgstr "Увеличить" + +#: data/ui/glabels-ui.xml.h:61 +msgid "Italic" +msgstr "Курсив" + +#: data/ui/glabels-ui.xml.h:63 +msgid "Left align" +msgstr "Выровнять слева" + +#: data/ui/glabels-ui.xml.h:65 +msgid "Line width" +msgstr "Толщина линии" + +#: data/ui/glabels-ui.xml.h:66 +msgid "Lower object to bottom" +msgstr "Переместить объект на задний план" + +#: data/ui/glabels-ui.xml.h:67 +msgid "M_arkup" +msgstr "_Разметка" + +#: data/ui/glabels-ui.xml.h:68 +msgid "Main toolbar" +msgstr "Показывать панель инструментов" + +#: data/ui/glabels-ui.xml.h:69 +msgid "Markup" +msgstr "Разметка" + +#: data/ui/glabels-ui.xml.h:70 +msgid "Modify document properties" +msgstr "Изменить свойства документа" + +#: data/ui/glabels-ui.xml.h:71 +msgid "New" +msgstr "Создать" + +#: data/ui/glabels-ui.xml.h:72 +msgid "Object property editor" +msgstr "Редактор свойств объекта" + +#: data/ui/glabels-ui.xml.h:73 +msgid "Only show icons in the main toolbar" +msgstr "Показывать только картинки в главной панели инструментов" + +#: data/ui/glabels-ui.xml.h:75 +msgid "Open a file" +msgstr "Открыть файл" + +#: data/ui/glabels-ui.xml.h:76 +msgid "Open the glabels manual" +msgstr "Открыть руководство по glabels" + +#: data/ui/glabels-ui.xml.h:77 +msgid "Paste" +msgstr "Вставить" + +#: data/ui/glabels-ui.xml.h:78 +msgid "Paste the clipboard" +msgstr "Вставить из буфера" + +#: data/ui/glabels-ui.xml.h:79 +msgid "Pr_eferences..." +msgstr "_Настроить..." + +#: data/ui/glabels-ui.xml.h:80 +msgid "Preferences" +msgstr "Параметры" + +#: data/ui/glabels-ui.xml.h:82 +msgid "Print the current file" +msgstr "Напечатать текущий файл" + +#: data/ui/glabels-ui.xml.h:83 +msgid "Proper_ties..." +msgstr "Свойс_тва..." + +#: data/ui/glabels-ui.xml.h:84 +msgid "Properties" +msgstr "Свойства" + +#: data/ui/glabels-ui.xml.h:85 +msgid "Property toolbar" +msgstr "Панель свойств" + +#: data/ui/glabels-ui.xml.h:86 +msgid "Quit" +msgstr "Выйти" + +#: data/ui/glabels-ui.xml.h:87 +msgid "Quit the program" +msgstr "Выйти из программы" + +#: data/ui/glabels-ui.xml.h:88 +msgid "Raise object to top" +msgstr "Переместить объект на передний план" + +#: data/ui/glabels-ui.xml.h:89 +msgid "Recent _Files" +msgstr "Недавние _файлы" + +#: data/ui/glabels-ui.xml.h:90 +msgid "Redo" +msgstr "Повторить" + +#: data/ui/glabels-ui.xml.h:91 +msgid "Redo the undone action" +msgstr "Повторить отменённое действие" + +#: data/ui/glabels-ui.xml.h:92 +msgid "Remove all selections" +msgstr "Удалить всё выделенное" + +#: data/ui/glabels-ui.xml.h:94 +#, no-c-format +msgid "Restore scale to 100%" +msgstr "Масштаб 1:1" + +#: data/ui/glabels-ui.xml.h:95 +msgid "Right align" +msgstr "Выровнять справа" + +#: data/ui/glabels-ui.xml.h:98 +msgid "Rotate object 90 clockwise" +msgstr "Повернуть объект на 90 градусов по часовой стрелке" + +#: data/ui/glabels-ui.xml.h:99 +msgid "Rotate object 90 counter-clockwise" +msgstr "Повернуть объект на 90 градусов против часовой стрелке" + +#: data/ui/glabels-ui.xml.h:100 +msgid "Save" +msgstr "Сохранить" + +#: data/ui/glabels-ui.xml.h:101 +msgid "Save As" +msgstr "Сохранить как" + +#: data/ui/glabels-ui.xml.h:102 +msgid "Save _As..." +msgstr "Сохранить _как..." + +#: data/ui/glabels-ui.xml.h:103 +msgid "Save the current file" +msgstr "Сохранить текущий файл" + +#: data/ui/glabels-ui.xml.h:104 +msgid "Save the current file with a different name" +msgstr "Сохранить текущий файл под другим именем" + +#: data/ui/glabels-ui.xml.h:105 +msgid "Select All" +msgstr "Выбрать всё" + +#: data/ui/glabels-ui.xml.h:106 +msgid "Select _All" +msgstr "Выбрать вс_ё" + +#: data/ui/glabels-ui.xml.h:107 +msgid "Select all objects" +msgstr "Выбрать все объекты" + +#: data/ui/glabels-ui.xml.h:108 +msgid "Select, move and modify objects" +msgstr "Выбрать, переместить или изменить объекты" + +#: data/ui/glabels-ui.xml.h:110 +msgid "Set main toolbar button style according to desktop default" +msgstr "" +"Установить стиль кнопок главной панели инструментов согласно настройкам " +"рабочего стола" + +#: data/ui/glabels-ui.xml.h:111 +msgid "Show _Tooltips" +msgstr "Показывать _подсказки" + +#: data/ui/glabels-ui.xml.h:112 +msgid "Show both icons and texts in the main toolbar" +msgstr "Показывать и пиктограммы и текст в главной панели инструментов" + +#: data/ui/glabels-ui.xml.h:113 +msgid "Show tooltips in the drawing toolbar" +msgstr "Показывать подсказки в панели рисования" + +#: data/ui/glabels-ui.xml.h:114 +msgid "Show tooltips in the main toolbar" +msgstr "Показывать подсказки в главной панели инструментов" + +#: data/ui/glabels-ui.xml.h:115 +msgid "Show tooltips in the property toolbar" +msgstr "Показывать подсказки на панели свойств" + +#: data/ui/glabels-ui.xml.h:116 +msgid "Template Designer" +msgstr "Дизайнер шаблонов" + +#: data/ui/glabels-ui.xml.h:117 +msgid "Template _Designer..." +msgstr "Дизайнер _Шаблонов..." + +#: data/ui/glabels-ui.xml.h:118 +msgid "Text color" +msgstr "Цвет текста" + +#: data/ui/glabels-ui.xml.h:119 +msgid "U_n-select All" +msgstr "_Снять выделение со всего" + +#: data/ui/glabels-ui.xml.h:120 +msgid "Un-select All" +msgstr "_Снять выделение со всего" + +#: data/ui/glabels-ui.xml.h:121 +msgid "Undo" +msgstr "Отменить" + +#: data/ui/glabels-ui.xml.h:122 +msgid "Undo the last action" +msgstr "Отменить последнее действие" + +#: data/ui/glabels-ui.xml.h:123 +msgid "Zoom _1:1" +msgstr "Масштаб _1:1" + +#: data/ui/glabels-ui.xml.h:124 +msgid "Zoom _In" +msgstr "У_величить" + +#: data/ui/glabels-ui.xml.h:125 +msgid "Zoom _Out" +msgstr "У_меньшить" + +#: data/ui/glabels-ui.xml.h:126 +msgid "Zoom to _fit" +msgstr "Уместить целиком в окно" + +#: data/ui/glabels-ui.xml.h:127 +msgid "Zoom to fit window" +msgstr "Изменить масштаб, чтобы изображение было видно полностью" + +#: data/ui/glabels-ui.xml.h:128 +msgid "_About..." +msgstr "_О программе..." + +#: data/ui/glabels-ui.xml.h:129 +msgid "_Bottoms" +msgstr "По _низу" + +#: data/ui/glabels-ui.xml.h:132 +msgid "_Close" +msgstr "_Закрыть" + +#: data/ui/glabels-ui.xml.h:133 +msgid "_Contents" +msgstr "_Содержание справки" + +#: data/ui/glabels-ui.xml.h:134 +msgid "_Copy" +msgstr "_Запомнить" + +#: data/ui/glabels-ui.xml.h:135 +msgid "_Create Object" +msgstr "_Создать объект" + +#: data/ui/glabels-ui.xml.h:136 +msgid "_Debug" +msgstr "_Отладка" + +#: data/ui/glabels-ui.xml.h:138 +msgid "_Desktop Default" +msgstr "_Согласно настройкам рабочего стола" + +#: data/ui/glabels-ui.xml.h:139 +msgid "_Drawing Toolbar" +msgstr "Показывать панель _рисования" + +#: data/ui/glabels-ui.xml.h:140 +msgid "_Edit" +msgstr "_Правка" + +#: data/ui/glabels-ui.xml.h:142 +msgid "_File" +msgstr "_Файл" + +#: data/ui/glabels-ui.xml.h:143 +msgid "_Grid" +msgstr "_Сетка" + +#: data/ui/glabels-ui.xml.h:144 +msgid "_Help" +msgstr "_Справка" + +#: data/ui/glabels-ui.xml.h:145 +msgid "_Icon" +msgstr "_Пиктограмма" + +#: data/ui/glabels-ui.xml.h:149 +msgid "_Main Toolbar" +msgstr "Показывать панель _инструментов" + +#: data/ui/glabels-ui.xml.h:150 +msgid "_Merge Properties..." +msgstr "_Свойства объединения..." + +#: data/ui/glabels-ui.xml.h:151 +msgid "_New" +msgstr "_Создать" + +#: data/ui/glabels-ui.xml.h:152 +msgid "_Objects" +msgstr "_Объекты" + +#: data/ui/glabels-ui.xml.h:153 +msgid "_Open..." +msgstr "_Открыть..." + +#: data/ui/glabels-ui.xml.h:155 +msgid "_Paste" +msgstr "Вст_авить" + +#: data/ui/glabels-ui.xml.h:156 +msgid "_Print..." +msgstr "_Напечатать..." + +#: data/ui/glabels-ui.xml.h:157 +msgid "_Property Toolbar" +msgstr "Показывать панель с_войств" + +#: data/ui/glabels-ui.xml.h:158 +msgid "_Quit" +msgstr "В_ыйти" + +#: data/ui/glabels-ui.xml.h:161 +msgid "_Save" +msgstr "_Сохранить" + +#: data/ui/glabels-ui.xml.h:165 +msgid "_View" +msgstr "_Вид" + +#: data/glade/prefs-dialog.glade.h:1 +msgid " " +msgstr " " + +#: data/glade/prefs-dialog.glade.h:2 data/glade/object-editor.glade.h:1 +#: data/glade/template-designer.glade.h:5 +msgid "*" +msgstr "*" + +#: data/glade/prefs-dialog.glade.h:3 +msgid "Default page size" +msgstr "Размер страницы по умолчанию" + +#: data/glade/prefs-dialog.glade.h:4 +msgid "Fill" +msgstr "Заполнение" + +#: data/glade/prefs-dialog.glade.h:5 +msgid "Line" +msgstr "Линия" + +#: data/glade/prefs-dialog.glade.h:6 +msgid "Text" +msgstr "Текст" + +#: data/glade/prefs-dialog.glade.h:7 +msgid "Units" +msgstr "Единицы измерения" + +#: data/glade/prefs-dialog.glade.h:8 data/glade/object-editor.glade.h:4 +msgid "Alignment:" +msgstr "Выравнивание:" + +#: data/glade/prefs-dialog.glade.h:9 data/glade/object-editor.glade.h:8 +msgid "Color:" +msgstr "Цвет:" + +#: data/glade/prefs-dialog.glade.h:10 +msgid "Font:" +msgstr "Шрифт:" + +#: data/glade/prefs-dialog.glade.h:11 +msgid "ISO A4" +msgstr "ISO A4" + +#: data/glade/prefs-dialog.glade.h:12 +msgid "Inches" +msgstr "Дюймы" + +#: data/glade/prefs-dialog.glade.h:13 data/glade/object-editor.glade.h:19 +msgid "Line Spacing:" +msgstr "" +"Межстрочный\n" +"интервал:" + +#: data/glade/prefs-dialog.glade.h:14 +msgid "Locale" +msgstr "Локаль" + +#: data/glade/prefs-dialog.glade.h:15 +msgid "Millimeters" +msgstr "Миллиметры" + +#: data/glade/prefs-dialog.glade.h:16 +msgid "Object defaults" +msgstr "Настройки объектов по умолчанию" + +#: data/glade/prefs-dialog.glade.h:17 +msgid "Points" +msgstr "Пункты" + +#: data/glade/prefs-dialog.glade.h:18 +msgid "Select default properties for new objects." +msgstr "Укажите свойства новых объектов по умолчанию." + +#: data/glade/prefs-dialog.glade.h:19 +msgid "Select locale specific behavior." +msgstr "Укажите ваши предпочтения." + +#. Most popular (at top of list) +#: data/glade/prefs-dialog.glade.h:20 data/templates/paper-sizes.xml.h:29 +msgid "US Letter" +msgstr "US Letter" + +#: data/glade/prefs-dialog.glade.h:21 data/glade/object-editor.glade.h:29 +#: data/glade/template-designer.glade.h:72 +msgid "Width:" +msgstr "Ширина:" + +#: data/glade/object-editor.glade.h:2 +msgid "00000000000 00000" +msgstr "00000000000 00000" + +#: data/glade/object-editor.glade.h:3 +msgid "Xxx object properties" +msgstr "Xxx свойства объекта" + +#: data/glade/object-editor.glade.h:5 +msgid "Allow merge to automatically shrink text" +msgstr "Разрешить автоматически уменьшать текст при объединении" + +#: data/glade/object-editor.glade.h:6 +msgid "Angle:" +msgstr "Угол:" + +#: data/glade/object-editor.glade.h:7 +msgid "Checksum" +msgstr "Контрольная сумма" + +#: data/glade/object-editor.glade.h:10 +msgid "Family:" +msgstr "Семейство:" + +#: data/glade/object-editor.glade.h:12 +msgid "Fill" +msgstr "Заполнение" + +#: data/glade/object-editor.glade.h:13 data/glade/template-designer.glade.h:33 +msgid "Height:" +msgstr "Высота:" + +#: data/glade/object-editor.glade.h:14 +msgid "Image" +msgstr "Изображение" + +#: data/glade/object-editor.glade.h:15 +msgid "Insert merge field" +msgstr "Вставить объединительное поле" + +#: data/glade/object-editor.glade.h:17 +msgid "Length:" +msgstr "Длина:" + +#: data/glade/object-editor.glade.h:18 +msgid "Line" +msgstr "Линия" + +#: data/glade/object-editor.glade.h:20 +msgid "Literal:" +msgstr "Буквально:" + +#: data/glade/object-editor.glade.h:21 +msgid "Load image" +msgstr "Загрузить изображение" + +#: data/glade/object-editor.glade.h:22 +msgid "Position" +msgstr "Расположение" + +#: data/glade/object-editor.glade.h:23 +msgid "Reset image size" +msgstr "Установить размер изображения по умолчанию" + +#: data/glade/object-editor.glade.h:24 +msgid "Size" +msgstr "Размер" + +#: data/glade/object-editor.glade.h:25 +msgid "Size:" +msgstr "Размер:" + +#: data/glade/object-editor.glade.h:26 +msgid "Style" +msgstr "Стиль:" + +#: data/glade/object-editor.glade.h:27 +msgid "Style:" +msgstr "Стиль:" + +#: data/glade/object-editor.glade.h:30 +msgid "X:" +msgstr "X:" + +#: data/glade/object-editor.glade.h:31 +msgid "Y:" +msgstr "Y:" + +#: data/glade/object-editor.glade.h:32 +msgid "degrees" +msgstr "градусов" + +#: data/glade/object-editor.glade.h:33 +msgid "dialog1" +msgstr "dialog1" + +#: data/glade/object-editor.glade.h:34 +msgid "digits:" +msgstr "цифры:" + +#: data/glade/object-editor.glade.h:35 +msgid "format:" +msgstr "формат:" + +#: data/glade/template-designer.glade.h:1 +msgid " " +msgstr " " + +#: data/glade/template-designer.glade.h:2 +msgid "(e.g., \"Mailing Labels,\" \"Business Cards,\" ...)" +msgstr "(например, \"Почтовые этикетки,\" \"Визитные карточки,\" ...)" + +#: data/glade/template-designer.glade.h:3 +msgid "(e.g., 8163A)" +msgstr "(e.g., 8163A)" + +#: data/glade/template-designer.glade.h:4 +msgid "(e.g., Avery, Acme, ...)" +msgstr "(e.g., Avery, Acme, ...)" + +#: data/glade/template-designer.glade.h:6 +msgid "1. Outer radius:" +msgstr "1. Наружный радиус:" + +#: data/glade/template-designer.glade.h:7 +msgid "1. Radius:" +msgstr "1. Радиус:" + +#: data/glade/template-designer.glade.h:8 +msgid "1. Width:" +msgstr "1. Ширина:" + +#: data/glade/template-designer.glade.h:9 +msgid "2. Height:" +msgstr "2. Высота:" + +#: data/glade/template-designer.glade.h:10 +msgid "2. Inner radius:" +msgstr "2. Внутренний радиус:" + +#: data/glade/template-designer.glade.h:11 +msgid "2. Waste (overprint allowed):" +msgstr "2. Пустое поле (на нём можно будет печать):" + +#: data/glade/template-designer.glade.h:12 +msgid "3. Clipping width:" +msgstr "3. Ширина для обрезки:" + +#: data/glade/template-designer.glade.h:13 +msgid "3. Margin" +msgstr "3. Поле" + +#: data/glade/template-designer.glade.h:14 +msgid "3. Round (radius of corner):" +msgstr "3. Округлость (радиус вершины):" + +#: data/glade/template-designer.glade.h:15 +msgid "4. Clipping height:" +msgstr "4. Высота обрезки:" + +#: data/glade/template-designer.glade.h:16 +msgid "4. Horiz. waste (overprint allowed):" +msgstr "4. Пустое гориз. пространство (может быть заполнено):" + +#: data/glade/template-designer.glade.h:17 +msgid "5. Vert. waste (overprint allowed):" +msgstr "5. Пустое верт. пространство (может быть заполнено):" + +#: data/glade/template-designer.glade.h:18 +msgid "5. Waste (overprint allowed):" +msgstr "5. Пустое пространство (может быть заполнено):" + +#: data/glade/template-designer.glade.h:19 +msgid "6. Margin" +msgstr "6. Поле" + +#: data/glade/template-designer.glade.h:20 +msgid "Brand/Manufacturer:" +msgstr "Производитель или торговая марка:" + +#: data/glade/template-designer.glade.h:21 +msgid "CD/DVD (including credit card CDs)" +msgstr "CD/DVD (включая CD размером с визитку)" + +#: data/glade/template-designer.glade.h:22 +msgid "" +"Congratulations!\n" +"\n" +"You have completed the gLabels Template Designer.\n" +"If you wish to accept and save your design, click \"Apply.\"\n" +"\n" +"Otherwise, you may click \"Cancel\" to abandon your design\n" +"or \"Back\" to continue editing this design." +msgstr "" +"Поздравляем!\n" +"\n" +"Вы завершили создание шаблона в gLabels.\n" +"Чтобы сохранить разработку, нажмите \"Применить\"\n" +"\n" +"Также вы можете нажать \"Отменить\", чтобы не сохранять, или \"Назад\", " +"чтобы продолжить редактирование." + +#: data/glade/template-designer.glade.h:30 +msgid "Design Completed" +msgstr "Оформление завершено" + +#: data/glade/template-designer.glade.h:31 +msgid "Distance from left edge (x0):" +msgstr "Расстояние от левого угла (x0):" + +#: data/glade/template-designer.glade.h:32 +msgid "Distance from top edge (y0):" +msgstr "Расстояние от верхнего угла (y0)" + +#: data/glade/template-designer.glade.h:34 +msgid "Horizontal pitch (dx):" +msgstr "Интервал по горизонтали (dx):" + +#: data/glade/template-designer.glade.h:35 +msgid "" +"How many layouts will your template contain? \n" +"\n" +"A layout is a set of labels or cards that can be arranged in a simple grid.\n" +"Most templates only need one layout, as in the first example.\n" +"The second example illustrates when two layouts are needed." +msgstr "" +"Сколько форм будет содержать шаблон? \n" +"\n" +"Форма - это набор этикеток или визиток, которые можут быть распределены по " +"простой сетке.\n" +"Большинству шаблонов требуется только одна форма, как в первом примере.\n" +"Второй пример иллюстрирует случай, когда необходимо применять две формы." + +#: data/glade/template-designer.glade.h:40 +msgid "Label Size (CD/DVD)" +msgstr "Размер метки (CD/DVD)" + +#: data/glade/template-designer.glade.h:41 +msgid "Label Size (Round)" +msgstr "Размер метки (диаметр)" + +#: data/glade/template-designer.glade.h:42 +msgid "Label or Card Shape" +msgstr "Форма этикетки или визитки" + +#: data/glade/template-designer.glade.h:43 +msgid "Label or Card Size (Rectangular)" +msgstr "Развер этикетки или визитки (прямоугольник)" + +#: data/glade/template-designer.glade.h:44 +msgid "Layout #1" +msgstr "Форма #1" + +#: data/glade/template-designer.glade.h:45 +msgid "Layout #2" +msgstr "Форма #2" + +#: data/glade/template-designer.glade.h:46 +msgid "Layout(s)" +msgstr "Формы" + +#: data/glade/template-designer.glade.h:47 +msgid "Name and Description" +msgstr "Название и Описание" + +#: data/glade/template-designer.glade.h:48 +msgid "Number across (nx):" +msgstr "По горизонтали (nx):" + +#: data/glade/template-designer.glade.h:49 +msgid "Number down (ny):" +msgstr "По вертикали (ny):" + +#: data/glade/template-designer.glade.h:50 +msgid "Number of Layouts" +msgstr "Количество форм" + +#: data/glade/template-designer.glade.h:51 +msgid "Number of layouts:" +msgstr "Количество форм:" + +#: data/glade/template-designer.glade.h:52 +msgid "Page Size" +msgstr "Размер страницы" + +#: data/glade/template-designer.glade.h:54 +msgid "Part #:" +msgstr "Часть #:" + +#: data/glade/template-designer.glade.h:55 +msgid "" +"Please enter the following identifying information about the template " +"stationery." +msgstr "Укажите следующую идентификационную информацию о ." + +#: data/glade/template-designer.glade.h:56 +msgid "Please enter the following layout information." +msgstr "Введите следующую информацию об оформлении." + +#: data/glade/template-designer.glade.h:57 +msgid "" +"Please enter the following size parameters of a single label in your " +"template." +msgstr "Введите геометрические размеры одиночной этикетки в вашем шаблоне." + +#: data/glade/template-designer.glade.h:58 +msgid "" +"Please enter the following size parameters of a single label or card in your " +"template." +msgstr "" +"Введите геометрические размеры одиночной этикетки или визитки в вашем " +"шаблоне." + +#: data/glade/template-designer.glade.h:59 +msgid "Please select the basic shape of the labels or cards." +msgstr "Выберите основную фигуру этикетки или карточки." + +#: data/glade/template-designer.glade.h:60 +msgid "Please select the page size of the template stationery." +msgstr "Выберите размер страницы для шаблона." + +#: data/glade/template-designer.glade.h:61 +msgid "Print test sheet" +msgstr "Напечатать тестовую страницу" + +#: data/glade/template-designer.glade.h:62 +msgid "Rectangular or square (can have rounded corners)" +msgstr "Прямоугольник или квадрат (может иметь скруглённые края)" + +#: data/glade/template-designer.glade.h:63 +msgid "Round" +msgstr "Круг" + +#: data/glade/template-designer.glade.h:64 +msgid "" +"Templates needing\n" +"two layouts." +msgstr "" +"Для данного шаблона\n" +"требуется две формы." + +#: data/glade/template-designer.glade.h:66 +msgid "" +"Templates needing only\n" +"one layout." +msgstr "" +"Для данного шаблона требуется\n" +"только одна форма." + +#: data/glade/template-designer.glade.h:68 +msgid "Vertical pitch (dy):" +msgstr "Интервал по вертикали (dy):" + +#: data/glade/template-designer.glade.h:69 +msgid "" +"Welcome to the gLabels Template Designer.\n" +"\n" +"This dialog will assist you in the creation of a custom gLabels template." +msgstr "" +"Добро пожаловать в Дизайнер шаблонов gLabels.\n" +"\n" +"Этот диалог будет сопровождать вас в создании вашего собственного шаблона " +"gLabels." + +#. Other ISO A series sizes +#: data/templates/paper-sizes.xml.h:2 +msgid "A0" +msgstr "A0" + +#: data/templates/paper-sizes.xml.h:3 +msgid "A1" +msgstr "A1" + +#: data/templates/paper-sizes.xml.h:4 +msgid "A10" +msgstr "A10" + +#: data/templates/paper-sizes.xml.h:5 +msgid "A2" +msgstr "A2" + +#: data/templates/paper-sizes.xml.h:6 +msgid "A3" +msgstr "A3" + +#: data/templates/paper-sizes.xml.h:7 +msgid "A4" +msgstr "A4" + +#: data/templates/paper-sizes.xml.h:8 +msgid "A5" +msgstr "A5" + +#: data/templates/paper-sizes.xml.h:9 +msgid "A6" +msgstr "A6" + +#: data/templates/paper-sizes.xml.h:10 +msgid "A7" +msgstr "A7" + +#: data/templates/paper-sizes.xml.h:11 +msgid "A8" +msgstr "A8" + +#: data/templates/paper-sizes.xml.h:12 +msgid "A9" +msgstr "A9" + +#. ISO B series sizes +#: data/templates/paper-sizes.xml.h:14 +msgid "B0" +msgstr "B0" + +#: data/templates/paper-sizes.xml.h:15 +msgid "B1" +msgstr "B1" + +#: data/templates/paper-sizes.xml.h:16 +msgid "B10" +msgstr "B10" + +#: data/templates/paper-sizes.xml.h:17 +msgid "B2" +msgstr "B2" + +#: data/templates/paper-sizes.xml.h:18 +msgid "B3" +msgstr "B3" + +#: data/templates/paper-sizes.xml.h:19 +msgid "B4" +msgstr "B4" + +#: data/templates/paper-sizes.xml.h:20 +msgid "B5" +msgstr "B5" + +#: data/templates/paper-sizes.xml.h:21 +msgid "B6" +msgstr "B6" + +#: data/templates/paper-sizes.xml.h:22 +msgid "B7" +msgstr "B7" + +#: data/templates/paper-sizes.xml.h:23 +msgid "B8" +msgstr "B8" + +#: data/templates/paper-sizes.xml.h:24 +msgid "B9" +msgstr "B9" + +#: data/templates/paper-sizes.xml.h:25 +msgid "US Executive" +msgstr "US Executive" + +#. Other US paper sizes +#: data/templates/paper-sizes.xml.h:27 +msgid "US Legal" +msgstr "US Legal" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:2 +#: data/templates/zweckform-iso-templates.xml.h:2 +msgid "Address Labels" +msgstr "Этикетка с адресом" + +#. =================================================================== +#. ============================================================ +#. =================================================================== +#. ====================================================== +#: data/templates/avery-us-templates.xml.h:4 +#: data/templates/avery-iso-templates.xml.h:4 +#: data/templates/zweckform-iso-templates.xml.h:6 +#: data/templates/misc-us-templates.xml.h:3 +#: data/templates/misc-iso-templates.xml.h:17 +msgid "Business Cards" +msgstr "Визитные карточки" + +#: data/templates/avery-us-templates.xml.h:5 +msgid "CD/DVD Labels (Disc Labels)" +msgstr "Метки для CD/DVD (Наклейки на диск)" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:7 +msgid "Diskette Labels" +msgstr "Наклейки на дискеты" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:9 +msgid "Filing Labels" +msgstr "Заполняемые этикетки" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:11 +msgid "Full Sheet Labels" +msgstr "Этикетки на всю страницу" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:13 +msgid "Large Round Labels" +msgstr "Этикетки с большим закруглением" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:15 +msgid "Name Badge Labels" +msgstr "Именной бейджик" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:17 +msgid "Return Address Labels" +msgstr "Наклейка для обратного адреса" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:19 +msgid "Shipping Labels" +msgstr "Ценники" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:21 +msgid "Small Round Labels" +msgstr "Маленькие круглые этикетки" + +#. =================================================================== +#: data/templates/avery-us-templates.xml.h:23 +msgid "Square Labels" +msgstr "Прямоугольные этикетки" + +#: data/templates/avery-us-templates.xml.h:24 +msgid "Video Tape Face Labels" +msgstr "Лицевые наклейки на видеокассету" + +#: data/templates/avery-us-templates.xml.h:25 +msgid "Video Tape Spine Labels" +msgstr "Торцевые наклейки на видеокассету" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:2 +msgid "Address labels" +msgstr "Адресные наклейки" + +#. =============================================================== +#: data/templates/avery-iso-templates.xml.h:6 +msgid "CD Booklet" +msgstr "Вкладыш в CD" + +#. =============================================================== +#: data/templates/avery-iso-templates.xml.h:8 +#, fuzzy +msgid "CD Inlet" +msgstr "CD" + +#. =============================================================== +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:10 +#: data/templates/zweckform-iso-templates.xml.h:8 +#: data/templates/misc-us-templates.xml.h:5 +#: data/templates/misc-iso-templates.xml.h:21 +msgid "CD/DVD Labels" +msgstr "Этикетки для CD/DVD" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:12 +msgid "Diskette labels" +msgstr "Наклейки на дискеты" + +#. =============================================================== +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:14 +#: data/templates/zweckform-iso-templates.xml.h:14 +#: data/templates/misc-iso-templates.xml.h:35 +msgid "Mailing Labels" +msgstr "Почтовые этикетки" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:16 +msgid "Mailing labels" +msgstr "Почтовые наклейки" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:18 +msgid "Mini Address Labels" +msgstr "Маленькие наклейки с адресом" + +#. =================================================================== +#: data/templates/avery-iso-templates.xml.h:20 +msgid "Shipping labels" +msgstr "Ценники" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:4 +msgid "Allround Labels" +msgstr "" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:10 +msgid "Correction and Cover-up Labels" +msgstr "Исправляющие и покрывающие метки" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:12 +#, fuzzy +msgid "Lever Arch File Labels" +msgstr "Файл" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:16 +#, fuzzy +msgid "QSL-Karten Etiketten 70mm x 50,8mm" +msgstr "x" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:18 +msgid "Rectangular Copier Labels" +msgstr "" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:20 +#: data/templates/misc-iso-templates.xml.h:44 +msgid "Rectangular Labels" +msgstr "Прямоугольные метки" + +#. =================================================================== +#: data/templates/zweckform-iso-templates.xml.h:22 +msgid "Video Labels (back)" +msgstr "Видеонаклейки (оборотная сторона)" + +#: data/templates/misc-us-templates.xml.h:1 +msgid "Business Card CD" +msgstr "Визитная карточка на CD" + +#: data/templates/misc-us-templates.xml.h:4 +msgid "CD Template Rectangles" +msgstr "Прямоугольный шаблон для CD" + +#: data/templates/misc-us-templates.xml.h:6 +msgid "CD/DVD Labels (Face Only)" +msgstr "Наклейки для CD/DVD (лицевая сторона)" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:7 +#: data/templates/misc-iso-templates.xml.h:23 +msgid "CD/DVD Labels (face only)" +msgstr "Вкладыши CD/DVD (лицевая сторона)" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:9 +msgid "Cassette Labels" +msgstr "Наклейки на кассеты" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:11 +msgid "DLT Labels" +msgstr "Этикетки на DLT" + +#. =================================================================== +#: data/templates/misc-us-templates.xml.h:13 +msgid "Microtube labels" +msgstr "Этикетки для Microtube" + +#: data/templates/misc-us-templates.xml.h:14 +msgid "Mini-CD Labels" +msgstr "Этикетки для Мини-CD" + +#: data/templates/misc-us-templates.xml.h:15 +#, fuzzy +msgid "PRO CD Labels 2-up (CD spine only)" +msgstr "CD CD" + +#: data/templates/misc-us-templates.xml.h:16 +#, fuzzy +msgid "PRO CD Labels 2-up (Face only)" +msgstr "CD" + +#: data/templates/misc-us-templates.xml.h:17 +#: data/templates/misc-iso-templates.xml.h:42 +#, fuzzy +msgid "PRO CD Labels 2-up (face only)" +msgstr "CD" + +#: data/templates/misc-us-templates.xml.h:18 +msgid "Slimline CD Case (rightside up)" +msgstr "Тонкие коробки для CD (правая сторона вверху)" + +#: data/templates/misc-us-templates.xml.h:19 +msgid "Slimline CD Case (upside down)" +msgstr "Тонкие коробки для CD (кверх ногами)" + +#: data/templates/misc-iso-templates.xml.h:1 +msgid "Agipa 119488: Business Cards" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:3 +msgid "Allround Labels --24" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:5 +msgid "Allround Labels --44" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:7 +msgid "Allround Labels --64" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:9 +msgid "Allround Labels --65" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:11 +#, fuzzy +msgid "Arch File Labels" +msgstr "Файл" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:13 +#, fuzzy +msgid "Arch File Labels (large)" +msgstr "Файл большой" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:15 +#, fuzzy +msgid "Arch File Labels (small)" +msgstr "Файл маленький" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:19 +msgid "CD Labels" +msgstr "Этикетки для CD" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:25 +msgid "CD/DVD Labels Standard Format (face only)" +msgstr "Наклейки стандартного формата для CD/DVD (лицевая сторона)" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:27 +msgid "Diskette Labels (face only)" +msgstr "Наклейки для дискет (лицевая сторона)" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:29 +msgid "EPSON Photo Stickers 16" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:31 +msgid "Etiketten" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:33 +msgid "Fridge Magnet Stickers" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:37 +msgid "Mailing Labels --14" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:39 +msgid "Mailing Labels-2 columns" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:41 +msgid "Mailing Labels-3 columns" +msgstr "" + +#. =================================================================== +#: data/templates/misc-iso-templates.xml.h:46 +msgid "Video Labels (face only)" +msgstr "Наклейки на видеокассеты (лицевая сторона)" + +#: data/desktop/glabels.desktop.in.h:1 +msgid "Create labels, business cards and media covers" +msgstr "Создание этикеток, визитных карточек и вкладышей для дисков" + +#: data/desktop/glabels.desktop.in.h:2 +msgid "gLabels Label Designer" +msgstr "Дизайнер этикеток gLabels" + +#: data/mime/glabels.keys.in.h:1 data/mime/glabels.xml.in.h:1 +msgid "gLabels Project File" +msgstr "Файл проекта gLabels" + diff --git a/glabels2/po/zh_TW.Big5.po b/glabels2/po/zh_TW.Big5.po new file mode 100644 index 00000000..485e1ccc --- /dev/null +++ b/glabels2/po/zh_TW.Big5.po @@ -0,0 +1,2650 @@ +# Traditional Chinese Translation for glabels +# Copyright (C) 2002 Free Software Foundation, Inc. +# Shell Hung , 2002 +# +msgid "" +msgstr "" +"Project-Id-Version: glabels 0.4.4\n" +"POT-Creation-Date: 2004-08-08 00:43-0400\n" +"PO-Revision-Date: 2002-07-14 18:30+0800\n" +"Last-Translator: Shell Hung \n" +"Language-Team: zh-l10n \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=big5\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/glabels.c:55 +msgid "Show view debugging messages." +msgstr "" + +#: src/glabels.c:58 +msgid "Show item debugging messages." +msgstr "" + +#: src/glabels.c:61 +msgid "Show printing debugging messages." +msgstr "" + +#: src/glabels.c:64 +msgid "Show prefs debugging messages." +msgstr "" + +#: src/glabels.c:67 +msgid "Show file debugging messages." +msgstr "" + +#: src/glabels.c:70 +msgid "Show document debugging messages." +msgstr "" + +#: src/glabels.c:73 +msgid "Show template debugging messages." +msgstr "" + +#: src/glabels.c:76 +msgid "Show paper debugging messages." +msgstr "" + +#: src/glabels.c:79 +msgid "Show xml debugging messages." +msgstr "" + +#: src/glabels.c:82 +msgid "Show document merge debugging messages." +msgstr "" + +#: src/glabels.c:85 +msgid "Show commands debugging messages." +msgstr "" + +#: src/glabels.c:88 +msgid "Show undo debugging messages." +msgstr "" + +#: src/glabels.c:91 +msgid "Show recent debugging messages." +msgstr "" + +#: src/glabels.c:94 +msgid "Show window debugging messages." +msgstr "" + +#: src/glabels.c:97 +msgid "Show ui debugging messages." +msgstr "" + +#: src/glabels.c:100 +msgid "Show property_bar debugging messages." +msgstr "" + +#: src/glabels.c:103 +msgid "Show media select widget debugging messages." +msgstr "" + +#: src/glabels.c:106 +msgid "Show mini preview widget debugging messages." +msgstr "" + +#: src/glabels.c:109 +msgid "Show pixbuf cache debugging messages." +msgstr "" + +#: src/glabels.c:112 +msgid "Show widget debugging messages." +msgstr "" + +#: src/glabels.c:115 +msgid "Show object editor debugging messages." +msgstr "" + +#: src/glabels.c:118 +msgid "Turn on all debugging messages." +msgstr "" + +#: src/glabels.c:187 +msgid "Could not initialize Bonobo!\n" +msgstr "" + +#: src/glabels-batch.c:48 +msgid "print this message" +msgstr "¦C¦L³o­Ó°T®§" + +#: src/glabels-batch.c:50 +msgid "print the version of glabels-batch being used" +msgstr "¦C¦L¥X glabels-batch ªºª©¥»¸ê°T" + +#: src/glabels-batch.c:52 +msgid "set output filename (default=\"output.ps\")" +msgstr "³]©w¿é¥XÀɦWºÙ (¹w³]¬°\"output.ps\")" + +#: src/glabels-batch.c:52 +msgid "filename" +msgstr "ÀɮצWºÙ" + +#: src/glabels-batch.c:54 +msgid "number of sheets (default=1)" +msgstr "¯È±i¼Æ¥Ø (¹w³]¬° 1)" + +#: src/glabels-batch.c:54 +msgid "sheets" +msgstr "¯È±i" + +#: src/glabels-batch.c:56 +msgid "number of copies (default=1)" +msgstr "¥÷¼Æ (¹w³]¬° 1)" + +#: src/glabels-batch.c:56 +msgid "copies" +msgstr "¥÷¼Æ" + +#: src/glabels-batch.c:58 src/print-dialog.c:336 +msgid "print outlines (to test printer alignment)" +msgstr "¦L¥X¥~Ãä (´ú¸Õ¥´¦L¾÷°Ñ¼Æ)" + +#: src/glabels-batch.c:60 src/print-dialog.c:344 +msgid "print in reverse (i.e. a mirror image)" +msgstr "¤Ï¤è¦V¦C¦L (¦p­Ë¦V¼v¹³)" + +#: src/glabels-batch.c:96 +msgid "[OPTION...] GLABELS_FILE..." +msgstr "[¿ï¶µ...] GLABELS_FILE..." + +#: src/glabels-batch.c:116 +msgid "missing glabels file\n" +msgstr "¨S¦³¿é¤J glabels ªºÀÉ®×\n" + +#: src/glabels-batch.c:157 +#, c-format +msgid "cannot open glabels file %s\n" +msgstr "¶}±ÒÀÉ®×¥¢±Ñ %s\n" + +#: src/window.c:244 +msgid "(none) - gLabels" +msgstr "" + +#: src/window.c:414 +msgid "(modified)" +msgstr "" + +#: src/stock.c:65 data/ui/glabels-ui.xml.h:165 +#, fuzzy +msgid "_Select Mode" +msgstr "¿ï¾Ü" + +#: src/stock.c:66 data/ui/glabels-ui.xml.h:166 +#, fuzzy +msgid "_Text" +msgstr "¤å¦r" + +#: src/stock.c:67 data/ui/glabels-ui.xml.h:151 +#, fuzzy +msgid "_Line" +msgstr "½u" + +#: src/stock.c:68 data/ui/glabels-ui.xml.h:133 +#, fuzzy +msgid "_Box" +msgstr "²°¤l" + +#: src/stock.c:69 data/ui/glabels-ui.xml.h:144 +#, fuzzy +msgid "_Ellipse" +msgstr "¾ò¶ê§Î" + +#: src/stock.c:70 data/ui/glabels-ui.xml.h:149 +#, fuzzy +msgid "_Image" +msgstr "¹Ï¹³" + +#: src/stock.c:71 data/ui/glabels-ui.xml.h:11 +#, fuzzy +msgid "Bar_code" +msgstr "¼Æ½X±ø" + +#: src/stock.c:72 +#, fuzzy +msgid "_Merge Properties" +msgstr "¦X¨Ö³]©w" + +#: src/stock.c:73 +#, fuzzy +msgid "Object _Properties" +msgstr "¤å¦r¼Ë»ª" + +#: src/stock.c:74 data/ui/glabels-ui.xml.h:13 +#, fuzzy +msgid "Bring to _Front" +msgstr "±a¥X¨ì«e­±" + +#: src/stock.c:75 data/ui/glabels-ui.xml.h:110 +#, fuzzy +msgid "Send to _Back" +msgstr "©ñ¦b³Ì©³" + +#: src/stock.c:76 data/ui/glabels-ui.xml.h:97 +#, fuzzy +msgid "Rotate _Left" +msgstr "±ÛÂà" + +#: src/stock.c:77 data/ui/glabels-ui.xml.h:98 +#, fuzzy +msgid "Rotate _Right" +msgstr "±ÛÂà" + +#: src/stock.c:78 data/ui/glabels-ui.xml.h:52 +msgid "Flip _Horizontally" +msgstr "" + +#: src/stock.c:79 data/ui/glabels-ui.xml.h:53 +msgid "Flip _Vertically" +msgstr "" + +#: src/stock.c:80 data/ui/glabels-ui.xml.h:150 +msgid "_Lefts" +msgstr "" + +#: src/stock.c:81 data/ui/glabels-ui.xml.h:162 +msgid "_Rights" +msgstr "" + +#: src/stock.c:82 data/ui/glabels-ui.xml.h:134 +msgid "_Centers" +msgstr "" + +#: src/stock.c:83 data/ui/glabels-ui.xml.h:167 +#, fuzzy +msgid "_Tops" +msgstr "¤u¨ã (&_T)" + +#: src/stock.c:84 +msgid "Bottoms" +msgstr "" + +#: src/stock.c:85 +msgid "Centers" +msgstr "" + +#: src/stock.c:86 src/stock.c:87 data/ui/glabels-ui.xml.h:62 +msgid "Label Ce_nter" +msgstr "" + +#: src/stock.c:88 data/ui/glabels-ui.xml.h:51 +msgid "Fill color" +msgstr "" + +#: src/stock.c:89 data/ui/glabels-ui.xml.h:64 +msgid "Line color" +msgstr "" + +#: src/stock.c:90 src/stock.c:92 +#, fuzzy +msgid "Linked" +msgstr "½u" + +#: src/stock.c:91 src/stock.c:93 +#, fuzzy +msgid "Not Linked" +msgstr "¨S¦³" + +#: src/ui-property-bar.c:345 src/object-editor.c:499 +#, fuzzy +msgid "Default" +msgstr "§R°£" + +#: src/ui-property-bar.c:360 src/object-editor.c:512 +msgid "No fill" +msgstr "" + +#: src/ui-property-bar.c:375 src/object-editor.c:505 +#, fuzzy +msgid "No line" +msgstr "¨S¦³" + +#: src/ui-sidebar.c:180 +#, fuzzy +msgid "Object properties" +msgstr "¤å¦r¼Ë»ª" + +#: src/commands.c:385 +msgid "" +"A label and business card creation program for GNOME.\n" +" \n" +"Glabels is free software; you can redistribute it and/or modify it under the " +"terms of the GNU General Public License as published by the Free Software " +"Foundation; either version 2 of the License, or (at your option) any later " +"version.\n" +" \n" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details.\n" +msgstr "" +"A label and business card creation program for GNOME.\n" +" \n" +"Glabels is free software; you can redistribute it and/or modify it under the " +"terms of the GNU General Public License as published by the Free Software " +"Foundation; either version 2 of the License, or (at your option) any later " +"version.\n" +" \n" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details.\n" + +#: src/commands.c:399 +msgid "See the file AUTHORS for additional credits," +msgstr "" + +#: src/commands.c:400 +msgid "or visit http://glabels.sourceforge.net/" +msgstr "" + +#: src/commands.c:409 +msgid " " +msgstr "" + +#: src/commands.c:424 +#, fuzzy +msgid "glabels" +msgstr "¼Ðñ" + +#: src/file.c:100 +msgid "New Label or Card" +msgstr "·s¼W¼Ðñ©Î¥d" + +#: src/file.c:132 src/file.c:304 +msgid "Media Type" +msgstr "´CÅéºØÃþ" + +#: src/file.c:138 src/file.c:310 +msgid "Label orientation" +msgstr "¼Ðñ¤è¦V" + +#: src/file.c:269 +#, fuzzy +msgid "Label properties" +msgstr "¤å¦r¼Ë»ª" + +#: src/file.c:452 src/file.c:870 +msgid "All files" +msgstr "" + +#: src/file.c:457 src/file.c:875 +#, fuzzy +msgid "gLabels documents" +msgstr "Glabels: ³]©w­È" + +#: src/file.c:505 src/file.c:617 src/file.c:934 src/file.c:1130 +#, fuzzy +msgid "Empty file name selection" +msgstr "²¾°£©Ò¦³¿ï¾Ü¶µ" + +#: src/file.c:506 src/file.c:520 src/file.c:618 src/file.c:632 +msgid "Please select a file or supply a valid file name" +msgstr "" + +#: src/file.c:519 src/file.c:631 +msgid "File does not exist" +msgstr "" + +#: src/file.c:563 data/ui/glabels-ui.xml.h:75 +msgid "Open" +msgstr "¶}±Ò" + +#: src/file.c:565 +msgid "Open label" +msgstr "¶}±Ò¼Ðñ" + +#: src/file.c:707 +#, fuzzy, c-format +msgid "Could not open file \"%s\"" +msgstr "¶}±ÒÀÉ®×¥¢±Ñ" + +#: src/file.c:715 +msgid "Not a supported file format" +msgstr "" + +#: src/file.c:797 src/file.c:979 src/file.c:1174 +#, fuzzy, c-format +msgid "Could not save file \"%s\"" +msgstr "¤£¯àÀx¦sÀÉ®×" + +#: src/file.c:805 src/file.c:987 src/file.c:1182 +msgid "Error encountered during save. The file is still not saved." +msgstr "" + +#: src/file.c:848 src/file.c:1048 +#, fuzzy, c-format +msgid "Save \"%s\" as" +msgstr "Àx¦s¼Ðñ¬°..." + +#: src/file.c:935 src/file.c:1131 +#, fuzzy +msgid "Please supply a valid file name" +msgstr "½Ð¥²»Ý¿é¤JÀɮצWºÙ" + +#: src/file.c:952 src/file.c:1147 +#, c-format +msgid "Overwrite file \"%s\"?" +msgstr "" + +#: src/file.c:960 src/file.c:1155 +msgid "File already exists." +msgstr "" + +#: src/file.c:1271 +#, c-format +msgid "Save changes to document \"%s\" before closing?" +msgstr "" + +#: src/file.c:1279 +msgid "Your changes will be lost if you don't save them." +msgstr "" + +#: src/file.c:1282 +msgid "Close without saving" +msgstr "" + +#. Should not happen +#: src/prefs.c:156 src/prefs.c:163 data/glade/prefs-dialog.glade.h:23 +#: data/glade/object-editor.glade.h:37 +msgid "points" +msgstr "ÂI" + +#: src/prefs.c:158 data/glade/object-editor.glade.h:36 +#: data/glade/template-designer.glade.h:74 +msgid "inches" +msgstr "­^¤o" + +#: src/prefs.c:160 +msgid "mm" +msgstr "mm" + +#: src/prefs-dialog.c:248 data/glade/prefs-dialog.glade.h:22 +#, fuzzy +msgid "gLabels Preferences" +msgstr "Glabels: ³]©w­È" + +#. +#. * Submenu: Order +#. +#: src/view.c:3570 data/ui/glabels-ui.xml.h:157 +msgid "_Order" +msgstr "" + +#. +#. * Submenu: Rotate/Flip +#. +#: src/view.c:3591 data/ui/glabels-ui.xml.h:163 +#, fuzzy +msgid "_Rotate/Flip" +msgstr "±ÛÂà" + +#. +#. * Submenu: Align Horizontally +#. +#: src/view.c:3624 +msgid "Align _Horizontally" +msgstr "" + +#. +#. * Submenu: Align Vertically +#. +#: src/view.c:3663 +msgid "Align _Vertically" +msgstr "" + +#: src/view.c:3724 data/ui/glabels-ui.xml.h:140 +#, fuzzy +msgid "_Delete" +msgstr "§R°£" + +#. Build editor. +#: src/view-box.c:223 +#, fuzzy +msgid "Box object properties" +msgstr "­×§ï¤è¶ôª«¥ó³]©w" + +#. Build editor. +#: src/view-ellipse.c:223 +#, fuzzy +msgid "Ellipse object properties" +msgstr "­×§ï¾ò¶êª«¥ó³]©w" + +#. Build editor. +#: src/view-line.c:223 +#, fuzzy +msgid "Line object properties" +msgstr "­×§ï¤è¶ôª«¥ó³]©w" + +#. Build editor. +#: src/view-image.c:222 +#, fuzzy +msgid "Image object properties" +msgstr "­×§ï¹Ï¹³ª«¥ó³]©w" + +#. Build editor. +#: src/view-text.c:250 +#, fuzzy +msgid "Text object properties" +msgstr "­×§ï¤è¶ôª«¥ó³]©w" + +#: src/view-text.c:562 data/glade/object-editor.glade.h:28 +msgid "Text" +msgstr "¤å¦r" + +#. Build editor. +#: src/view-barcode.c:209 +#, fuzzy +msgid "Barcode object properties" +msgstr "­×§ï¼Æ½X±øª«¥ó³]©w" + +#: src/view-barcode.c:579 src/print.c:1088 +#, fuzzy +msgid "Invalid barcode data" +msgstr "¤£¥¿½Tªº¼Æ½X±ø" + +#: src/merge-properties-dialog.c:231 +#, fuzzy +msgid "Merge Properties" +msgstr "¦X¨Ö³]©w" + +#. ---- Source section ---- +#: src/merge-properties-dialog.c:237 +msgid "Source" +msgstr "¨Ó·½ÀÉ" + +#: src/merge-properties-dialog.c:245 +msgid "Format:" +msgstr "®æ¦¡:" + +#. Location line +#: src/merge-properties-dialog.c:273 +msgid "Location:" +msgstr "¦ì¸m:" + +#: src/merge-properties-dialog.c:282 src/merge-properties-dialog.c:393 +msgid "Select merge-database source" +msgstr "¿ï¾Ü¦X¨Ö¸ê®Æ®w¨Ó·½" + +#: src/merge-properties-dialog.c:289 src/merge-properties-dialog.c:404 +msgid "N/A" +msgstr "N/A" + +#. ---- Sample Fields section ---- +#: src/merge-properties-dialog.c:300 +msgid "Record selection/preview:" +msgstr "" + +#: src/merge-properties-dialog.c:326 +msgid "Select" +msgstr "¿ï¾Ü" + +#: src/merge-properties-dialog.c:334 +msgid "Record/Field" +msgstr "" + +#: src/merge-properties-dialog.c:342 data/glade/object-editor.glade.h:9 +msgid "Data" +msgstr "¸ê®Æ" + +#: src/print-dialog.c:266 data/ui/glabels-ui.xml.h:82 +msgid "Print" +msgstr "¦C¦L" + +#: src/print-dialog.c:281 +msgid "_Job" +msgstr "" + +#: src/print-dialog.c:286 +#, fuzzy +msgid "P_rinter" +msgstr "¦C¦L" + +#. ----------- Add simple-copies widget ------------ +#: src/print-dialog.c:314 +msgid "Copies" +msgstr "¥÷¼Æ" + +#. ------- Add merge control widget ------------ +#: src/print-dialog.c:322 +msgid "Document merge control" +msgstr "¤å¥ó¦X¨Ö±±¨î" + +#. ----------- Add custom print options area ------------ +#: src/print-dialog.c:330 +msgid "Options" +msgstr "³]©w" + +#: src/print-dialog.c:351 +msgid "print crop marks" +msgstr "" + +#: src/print-dialog.c:553 src/print-dialog.c:592 +msgid "Print preview" +msgstr "¹wÄý¦C¦L" + +#: src/template-designer.c:409 data/glade/template-designer.glade.h:73 +msgid "gLabels Template Designer" +msgstr "" + +#: src/bc.c:60 +msgid "POSTNET (any)" +msgstr "" + +#: src/bc.c:63 +msgid "POSTNET-5 (ZIP only)" +msgstr "" + +#: src/bc.c:66 +msgid "POSTNET-9 (ZIP+4)" +msgstr "" + +#: src/bc.c:69 +msgid "POSTNET-11 (DPBC)" +msgstr "" + +#: src/bc.c:72 +msgid "EAN (any)" +msgstr "" + +#: src/bc.c:75 +msgid "EAN-8" +msgstr "" + +#: src/bc.c:78 +msgid "EAN-8 +2" +msgstr "" + +#: src/bc.c:81 +msgid "EAN-8 +5" +msgstr "" + +#: src/bc.c:84 +msgid "EAN-13" +msgstr "" + +#: src/bc.c:87 +msgid "EAN-13 +2" +msgstr "" + +#: src/bc.c:90 +msgid "EAN-13 +5" +msgstr "" + +#: src/bc.c:93 +msgid "UPC (UPC-A or UPC-E)" +msgstr "" + +#: src/bc.c:96 +msgid "UPC-A" +msgstr "" + +#: src/bc.c:99 +msgid "UPC-A +2" +msgstr "" + +#: src/bc.c:102 +msgid "UPC-A +5" +msgstr "" + +#: src/bc.c:105 +msgid "UPC-E" +msgstr "" + +#: src/bc.c:108 +msgid "UPC-E +2" +msgstr "" + +#: src/bc.c:111 +msgid "UPC-E +5" +msgstr "" + +#: src/bc.c:114 +msgid "ISBN" +msgstr "" + +#: src/bc.c:117 +msgid "ISBN +5" +msgstr "" + +#: src/bc.c:120 +msgid "Code 39" +msgstr "" + +#: src/bc.c:123 +msgid "Code 128" +msgstr "" + +#: src/bc.c:126 +msgid "Code 128C" +msgstr "" + +#: src/bc.c:129 +msgid "Code 128B" +msgstr "" + +#: src/bc.c:132 +msgid "Interleaved 2 of 5" +msgstr "" + +#: src/bc.c:135 +msgid "Codabar" +msgstr "" + +#: src/bc.c:138 +msgid "MSI" +msgstr "" + +#: src/bc.c:141 +msgid "Plessey" +msgstr "" + +#: src/label.c:569 +msgid "Untitled" +msgstr "" + +#: src/xml-label.c:176 src/xml-label.c:213 +msgid "xmlParseFile error" +msgstr "xmlParseFile ¿ù»~" + +#: src/xml-label.c:250 +msgid "No document root" +msgstr "¨S¦³¤å¥ó©lºÝ" + +#: src/xml-label.c:264 +msgid "Importing from glabels 0.1 format" +msgstr "" + +#: src/xml-label.c:272 +msgid "Importing from glabels 0.4 format" +msgstr "" + +#: src/xml-label.c:279 +msgid "Importing from glabels 1.91 format" +msgstr "" + +#: src/xml-label.c:282 +#, fuzzy +msgid "bad document, unknown glabels Namespace" +msgstr "¤£¥¿½Tªº¤å¥óºØÃþ, §ä¤£¨ì glabels ®æ¦¡" + +#: src/xml-label.c:311 src/xml-label-04.c:75 src/xml-label-191.c:131 +#, c-format +msgid "Bad root node = \"%s\"" +msgstr "¿ù»~ªº°ò½X = \"%s\"" + +#: src/xml-label.c:348 src/xml-label-191.c:165 +#, fuzzy, c-format +msgid "bad node in Document node = \"%s\"" +msgstr "¿ù»~ªº°ò½X = \"%s\"" + +#: src/xml-label.c:393 src/xml-label-04.c:123 src/xml-label-191.c:197 +#, c-format +msgid "bad node = \"%s\"" +msgstr "¿ù»~ªº¸`ÂI = \"%s\"" + +#: src/xml-label.c:796 src/xml-label-191.c:605 +#, fuzzy, c-format +msgid "bad node in Data node = \"%s\"" +msgstr "¿ù»~ªº¸`ÂI = \"%s\"" + +#: src/xml-label.c:962 libglabels/xml-template.c:528 +msgid "Utf8 conversion error." +msgstr "" + +#: src/xml-label.c:969 libglabels/xml-template.c:535 +msgid "Problem saving xml file." +msgstr "Àx¦s XML Àɮ׮ɵo¥Í¿ù»~." + +#. This should always be an id, but just in case a name +#. slips by! +#: src/xml-label-191.c:680 libglabels/xml-template.c:192 +#, c-format +msgid "Unknown page size id \"%s\", trying as name" +msgstr "" + +#: src/xml-label-191.c:690 libglabels/xml-template.c:202 +#, c-format +msgid "Unknown page size id or name \"%s\"" +msgstr "" + +#: src/merge.c:172 src/merge.c:213 src/merge.c:399 src/merge.c:402 +msgid "None" +msgstr "¨S¦³" + +#: src/merge-init.c:53 +#, fuzzy +msgid "Text file with comma delimeters (CSV)" +msgstr "¥H³r¸¹¤À®æ (CSV)" + +#: src/merge-init.c:60 +#, fuzzy +msgid "Text file with colon delimeters" +msgstr "¥H«_¸¹¤À®æ" + +#: src/merge-init.c:67 +#, fuzzy +msgid "Text file with tab delimeters" +msgstr "¥H [TAB] ¬°¤À®æ" + +#: src/wdgt-image-select.c:201 data/glade/object-editor.glade.h:11 +#, fuzzy +msgid "File:" +msgstr "¶ñº¡" + +#: src/wdgt-image-select.c:245 data/glade/object-editor.glade.h:16 +msgid "Key:" +msgstr "¸ê®Æ­È:" + +#: src/wdgt-print-copies.c:179 +msgid "Sheets:" +msgstr "¯È±i:" + +#: src/wdgt-print-copies.c:197 +msgid "Labels" +msgstr "¼Ðñ" + +#: src/wdgt-print-copies.c:200 +msgid "from:" +msgstr "¥Ñ:" + +#: src/wdgt-print-copies.c:207 +msgid "to:" +msgstr "¨ì:" + +#: src/wdgt-print-merge.c:178 +msgid "Start on label" +msgstr "¥Ñ¸Tñ¶}¯Å" + +#: src/wdgt-print-merge.c:186 +msgid "on 1st sheet" +msgstr "¦b­º±i¯È" + +#: src/wdgt-print-merge.c:195 +msgid "Copies:" +msgstr "¥÷¼Æ:" + +#: src/wdgt-print-merge.c:201 +msgid "Collate" +msgstr "®Õ¹ï" + +#: src/wdgt-media-select.c:269 data/glade/template-designer.glade.h:29 +msgid "Description:" +msgstr "´y­z:" + +#: src/wdgt-media-select.c:279 data/glade/template-designer.glade.h:53 +msgid "Page size:" +msgstr "¯È±i¤j¤p:" + +#: src/wdgt-media-select.c:290 +msgid "Label size:" +msgstr "¼Ðñ¤j¤p:" + +#: src/wdgt-media-select.c:301 +msgid "Layout:" +msgstr "ª©­±:" + +#: src/wdgt-media-select.c:578 +#, c-format +msgid "%d x %d (%d per sheet)" +msgstr "%d x %d (¨C­¶ %d)" + +#: src/wdgt-media-select.c:582 +#, fuzzy, c-format +msgid "%d per sheet" +msgstr "%d x %d (¨C­¶ %d)" + +#: src/wdgt-media-select.c:614 +#, c-format +msgid "%s x %s %s" +msgstr "%s x %s %s" + +#: src/wdgt-media-select.c:619 +#, c-format +msgid "%.5g x %.5g %s" +msgstr "%.5g x %.5g %s" + +#: src/wdgt-media-select.c:630 src/wdgt-media-select.c:644 +#, c-format +msgid "%s %s diameter" +msgstr "" + +#: src/wdgt-media-select.c:634 src/wdgt-media-select.c:648 +#, c-format +msgid "%.5g %s diameter" +msgstr "" + +#: src/wdgt-rotate-label.c:193 +msgid "Rotate" +msgstr "±ÛÂà" + +#. This is the default custom color +#: src/mygal/color-palette.c:396 +#, fuzzy +msgid "custom" +msgstr "¦Û­qÄæ¦ìÆ_" + +#. "Custom" color - we'll pop up a GnomeColorPicker +#: src/mygal/color-palette.c:438 +#, fuzzy +msgid "Custom Color:" +msgstr "ÃC¦â:" + +#: src/mygal/color-palette.c:446 +msgid "Choose Custom Color" +msgstr "" + +#: src/mygal/color-palette.c:579 +msgid "black" +msgstr "" + +#: src/mygal/color-palette.c:580 +msgid "light brown" +msgstr "" + +#: src/mygal/color-palette.c:581 +msgid "brown gold" +msgstr "" + +#: src/mygal/color-palette.c:582 +msgid "dark green #2" +msgstr "" + +#: src/mygal/color-palette.c:583 +msgid "navy" +msgstr "" + +#: src/mygal/color-palette.c:584 src/mygal/color-palette.c:640 +msgid "dark blue" +msgstr "" + +#: src/mygal/color-palette.c:585 +msgid "purple #2" +msgstr "" + +#: src/mygal/color-palette.c:586 +msgid "very dark gray" +msgstr "" + +#: src/mygal/color-palette.c:589 src/mygal/color-palette.c:645 +msgid "dark red" +msgstr "" + +#: src/mygal/color-palette.c:590 +msgid "red-orange" +msgstr "" + +#: src/mygal/color-palette.c:591 +msgid "gold" +msgstr "" + +#: src/mygal/color-palette.c:592 +msgid "dark green" +msgstr "" + +#: src/mygal/color-palette.c:593 src/mygal/color-palette.c:646 +msgid "dull blue" +msgstr "" + +#: src/mygal/color-palette.c:594 src/mygal/color-palette.c:647 +msgid "blue" +msgstr "" + +#: src/mygal/color-palette.c:595 +msgid "dull purple" +msgstr "" + +#: src/mygal/color-palette.c:596 +msgid "dark grey" +msgstr "" + +#: src/mygal/color-palette.c:599 +msgid "red" +msgstr "" + +#: src/mygal/color-palette.c:600 +msgid "orange" +msgstr "" + +#: src/mygal/color-palette.c:601 +msgid "lime" +msgstr "" + +#: src/mygal/color-palette.c:602 +msgid "dull green" +msgstr "" + +#: src/mygal/color-palette.c:603 +msgid "dull blue #2" +msgstr "" + +#: src/mygal/color-palette.c:604 +msgid "sky blue #2" +msgstr "" + +#: src/mygal/color-palette.c:605 src/mygal/color-palette.c:644 +msgid "purple" +msgstr "" + +#: src/mygal/color-palette.c:606 +msgid "gray" +msgstr "" + +#: src/mygal/color-palette.c:609 src/mygal/color-palette.c:641 +#, fuzzy +msgid "magenta" +msgstr "¹Ï¹³" + +#: src/mygal/color-palette.c:610 +msgid "bright orange" +msgstr "" + +#: src/mygal/color-palette.c:611 src/mygal/color-palette.c:642 +msgid "yellow" +msgstr "" + +#: src/mygal/color-palette.c:612 +#, fuzzy +msgid "green" +msgstr "«×¼Æ" + +#: src/mygal/color-palette.c:613 src/mygal/color-palette.c:643 +msgid "cyan" +msgstr "" + +#: src/mygal/color-palette.c:614 +msgid "bright blue" +msgstr "" + +#: src/mygal/color-palette.c:615 src/mygal/color-palette.c:632 +msgid "red purple" +msgstr "" + +#: src/mygal/color-palette.c:616 +msgid "light grey" +msgstr "" + +#: src/mygal/color-palette.c:619 src/mygal/color-palette.c:636 +msgid "pink" +msgstr "" + +#: src/mygal/color-palette.c:620 +msgid "light orange" +msgstr "" + +#: src/mygal/color-palette.c:621 src/mygal/color-palette.c:633 +msgid "light yellow" +msgstr "" + +#: src/mygal/color-palette.c:622 +msgid "light green" +msgstr "" + +#: src/mygal/color-palette.c:623 +msgid "light cyan" +msgstr "" + +#: src/mygal/color-palette.c:624 src/mygal/color-palette.c:634 +msgid "light blue" +msgstr "" + +#: src/mygal/color-palette.c:625 src/mygal/color-palette.c:638 +msgid "light purple" +msgstr "" + +#: src/mygal/color-palette.c:626 +msgid "white" +msgstr "" + +#: src/mygal/color-palette.c:631 +msgid "purplish blue" +msgstr "" + +#: src/mygal/color-palette.c:635 +msgid "dark purple" +msgstr "" + +#: src/mygal/color-palette.c:637 +msgid "sky blue" +msgstr "" + +#: libglabels/template.c:848 +#, c-format +msgid "Generic %s full page" +msgstr "" + +#: libglabels/template.c:897 +msgid "No template files found!" +msgstr "§ä¤£¨ì¼Ëª©ÀÉ®× !" + +#. Create and append an "Other" entry. +#: libglabels/paper.c:67 +msgid "Other" +msgstr "" + +#: libglabels/paper.c:361 +#, fuzzy +msgid "No paper files found!" +msgstr "§ä¤£¨ì¼Ëª©ÀÉ®× !" + +#: data/ui/glabels-ui.xml.h:1 +msgid "About glabels" +msgstr "" + +#: data/ui/glabels-ui.xml.h:2 +msgid "About..." +msgstr "" + +#: data/ui/glabels-ui.xml.h:3 +msgid "Align _Horizontal" +msgstr "" + +#: data/ui/glabels-ui.xml.h:4 +msgid "Align _Vertical" +msgstr "" + +#: data/ui/glabels-ui.xml.h:5 +msgid "Align objects to bottoms" +msgstr "" + +#: data/ui/glabels-ui.xml.h:6 +msgid "Align objects to horizontal centers" +msgstr "" + +#: data/ui/glabels-ui.xml.h:7 +msgid "Align objects to left edges" +msgstr "" + +#: data/ui/glabels-ui.xml.h:8 +msgid "Align objects to right edges" +msgstr "" + +#: data/ui/glabels-ui.xml.h:9 +msgid "Align objects to tops" +msgstr "" + +#: data/ui/glabels-ui.xml.h:10 +msgid "Align objects to vertical centers" +msgstr "" + +#: data/ui/glabels-ui.xml.h:12 +msgid "Bold" +msgstr "" + +#: data/ui/glabels-ui.xml.h:14 +#, fuzzy +msgid "Center align" +msgstr "¤@¯ë" + +#: data/ui/glabels-ui.xml.h:15 +msgid "Center objects to horizontal label center" +msgstr "" + +#: data/ui/glabels-ui.xml.h:16 +msgid "Center objects to vertical label center" +msgstr "" + +#: data/ui/glabels-ui.xml.h:17 +msgid "Change the visibility of markup lines in the current window" +msgstr "" + +#: data/ui/glabels-ui.xml.h:18 +msgid "Change the visibility of the drawing toolbar in the current window" +msgstr "" + +#: data/ui/glabels-ui.xml.h:19 +msgid "Change the visibility of the grid in the current window" +msgstr "" + +#: data/ui/glabels-ui.xml.h:20 +msgid "Change the visibility of the main toolbar in the current window" +msgstr "" + +#: data/ui/glabels-ui.xml.h:21 +msgid "Change the visibility of the property toolbar in the current window" +msgstr "" + +#: data/ui/glabels-ui.xml.h:22 +msgid "Close" +msgstr "" + +#: data/ui/glabels-ui.xml.h:23 +#, fuzzy +msgid "Close the current file" +msgstr "Àx¦s²{¦bÀÉ®×" + +#: data/ui/glabels-ui.xml.h:24 +msgid "Configure the application" +msgstr "" + +#: data/ui/glabels-ui.xml.h:25 +msgid "Contents" +msgstr "" + +#: data/ui/glabels-ui.xml.h:26 +msgid "Copy" +msgstr "" + +#: data/ui/glabels-ui.xml.h:27 +#, fuzzy +msgid "Copy the selection" +msgstr "²¾°£©Ò¦³¿ï¾Ü¶µ" + +#: data/ui/glabels-ui.xml.h:28 +#, fuzzy +msgid "Create a custom template" +msgstr "µe½uª«¥ó" + +#: data/ui/glabels-ui.xml.h:29 +#, fuzzy +msgid "Create a new document" +msgstr "µe½uª«¥ó" + +#: data/ui/glabels-ui.xml.h:30 +msgid "Create barcode object" +msgstr "«Ø¥ß¼Æ½X±ø" + +#: data/ui/glabels-ui.xml.h:31 +msgid "Create box/rectangle object" +msgstr "«Ø¥ß·sªº²°¤l/¤è§Îª«¥ó" + +#: data/ui/glabels-ui.xml.h:32 +msgid "Create ellipse/circle object" +msgstr "«Ø¥ß¾ò¶ê§Î/¹Ï§Îª«¥ó" + +#: data/ui/glabels-ui.xml.h:33 +msgid "Create image object" +msgstr "«Ø¥ß¼v¹³ª«¥ó" + +#: data/ui/glabels-ui.xml.h:34 +msgid "Create line object" +msgstr "µe½uª«¥ó" + +#: data/ui/glabels-ui.xml.h:35 +msgid "Create text object" +msgstr "«Ø¥ß·sªº¤å¦rª«¥ó" + +#: data/ui/glabels-ui.xml.h:36 +msgid "Cu_t" +msgstr "" + +#: data/ui/glabels-ui.xml.h:37 +#, fuzzy +msgid "Customize" +msgstr "¦Û­qÄæ¦ìÆ_" + +#: data/ui/glabels-ui.xml.h:38 +msgid "Customize Drawing Toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:39 +msgid "Customize Main Toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:40 +msgid "Customize Property Toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:41 +msgid "Customize toolbars" +msgstr "" + +#: data/ui/glabels-ui.xml.h:42 +msgid "Cut" +msgstr "" + +#: data/ui/glabels-ui.xml.h:43 +msgid "Cut the selection" +msgstr "" + +#: data/ui/glabels-ui.xml.h:44 +msgid "Decrease magnification" +msgstr "" + +#: data/ui/glabels-ui.xml.h:45 +msgid "Delete" +msgstr "§R°£" + +#: data/ui/glabels-ui.xml.h:46 +#, fuzzy +msgid "Delete the selected objects" +msgstr "«Ø¥ß·sªº¤å¦rª«¥ó" + +#: data/ui/glabels-ui.xml.h:47 +msgid "Drawing toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:48 +msgid "Dump XML" +msgstr "" + +#: data/ui/glabels-ui.xml.h:49 +msgid "Dump the UI Xml description" +msgstr "" + +#: data/ui/glabels-ui.xml.h:50 +msgid "Edit merge properties" +msgstr "­×§ï¦X¨Ö³]©w" + +#: data/ui/glabels-ui.xml.h:54 +msgid "Flip object horizontally" +msgstr "" + +#: data/ui/glabels-ui.xml.h:55 +msgid "Flip object vertically" +msgstr "" + +#: data/ui/glabels-ui.xml.h:56 +#, fuzzy +msgid "Font name" +msgstr "¤£­nÀx¦s" + +#: data/ui/glabels-ui.xml.h:57 +#, fuzzy +msgid "Font selector" +msgstr "²¾°£©Ò¦³¿ï¾Ü¶µ" + +#: data/ui/glabels-ui.xml.h:58 +#, fuzzy +msgid "Font size" +msgstr "¤£­nÀx¦s" + +#: data/ui/glabels-ui.xml.h:59 +msgid "Icon and _Text" +msgstr "" + +#: data/ui/glabels-ui.xml.h:60 +msgid "Increase magnification" +msgstr "" + +#: data/ui/glabels-ui.xml.h:61 +msgid "Italic" +msgstr "" + +#: data/ui/glabels-ui.xml.h:63 +msgid "Left align" +msgstr "" + +#: data/ui/glabels-ui.xml.h:65 +msgid "Line width" +msgstr "" + +#: data/ui/glabels-ui.xml.h:66 +msgid "Lower object to bottom" +msgstr "" + +#: data/ui/glabels-ui.xml.h:67 +msgid "M_arkup" +msgstr "" + +#: data/ui/glabels-ui.xml.h:68 +msgid "Main toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:69 +msgid "Markup" +msgstr "" + +#: data/ui/glabels-ui.xml.h:70 +#, fuzzy +msgid "Modify document properties" +msgstr "­×§ï¤å¥ó¦X¨Ö³]©w" + +#: data/ui/glabels-ui.xml.h:71 +#, fuzzy +msgid "New" +msgstr "·s¼W (&_N)" + +#: data/ui/glabels-ui.xml.h:72 +#, fuzzy +msgid "Object property editor" +msgstr "¤å¦r¼Ë»ª" + +#: data/ui/glabels-ui.xml.h:73 +msgid "Only show icons in the drawing toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:74 +msgid "Only show icons in the main toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:76 +msgid "Open a file" +msgstr "¶}±ÒÀÉ®×" + +#: data/ui/glabels-ui.xml.h:77 +#, fuzzy +msgid "Open the glabels manual" +msgstr "¶}±Ò¼Ðñ" + +#: data/ui/glabels-ui.xml.h:78 +msgid "Paste" +msgstr "" + +#: data/ui/glabels-ui.xml.h:79 +msgid "Paste the clipboard" +msgstr "" + +#: data/ui/glabels-ui.xml.h:80 +#, fuzzy +msgid "Pr_eferences..." +msgstr "Glabels: ³]©w­È" + +#: data/ui/glabels-ui.xml.h:81 +#, fuzzy +msgid "Preferences" +msgstr "Glabels: ³]©w­È" + +#: data/ui/glabels-ui.xml.h:83 +#, fuzzy +msgid "Print the current file" +msgstr "¦C¦L²{¦³ÀÉ®×" + +#: data/ui/glabels-ui.xml.h:84 +#, fuzzy +msgid "Proper_ties..." +msgstr "¤å¦r¼Ë»ª" + +#: data/ui/glabels-ui.xml.h:85 +#, fuzzy +msgid "Properties" +msgstr "¤å¦r¼Ë»ª" + +#: data/ui/glabels-ui.xml.h:86 +msgid "Property toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:87 +msgid "Quit" +msgstr "" + +#: data/ui/glabels-ui.xml.h:88 +msgid "Quit the program" +msgstr "" + +#: data/ui/glabels-ui.xml.h:89 +msgid "Raise object to top" +msgstr "" + +#: data/ui/glabels-ui.xml.h:90 +msgid "Recent _Files" +msgstr "" + +#: data/ui/glabels-ui.xml.h:91 +msgid "Redo" +msgstr "" + +#: data/ui/glabels-ui.xml.h:92 +msgid "Redo the undone action" +msgstr "" + +#: data/ui/glabels-ui.xml.h:93 +msgid "Remove all selections" +msgstr "²¾°£©Ò¦³¿ï¾Ü¶µ" + +#: data/ui/glabels-ui.xml.h:95 +#, no-c-format +msgid "Restore scale to 100%" +msgstr "" + +#: data/ui/glabels-ui.xml.h:96 +msgid "Right align" +msgstr "" + +#: data/ui/glabels-ui.xml.h:99 +msgid "Rotate object 90 clockwise" +msgstr "" + +#: data/ui/glabels-ui.xml.h:100 +msgid "Rotate object 90 counter-clockwise" +msgstr "" + +#: data/ui/glabels-ui.xml.h:101 +#, fuzzy +msgid "Save" +msgstr "¥t¦s¬°..." + +#: data/ui/glabels-ui.xml.h:102 +msgid "Save As" +msgstr "¥t¦s¬°..." + +#: data/ui/glabels-ui.xml.h:103 +#, fuzzy +msgid "Save _As..." +msgstr "¥t¦s¬°..." + +#: data/ui/glabels-ui.xml.h:104 +#, fuzzy +msgid "Save the current file" +msgstr "Àx¦s²{¦bÀÉ®×" + +#: data/ui/glabels-ui.xml.h:105 +msgid "Save the current file with a different name" +msgstr "" + +#: data/ui/glabels-ui.xml.h:106 +#, fuzzy +msgid "Select All" +msgstr "¤Ï¿ï¾Ü¥þ³¡ (&_N)" + +#: data/ui/glabels-ui.xml.h:107 +#, fuzzy +msgid "Select _All" +msgstr "¤Ï¿ï¾Ü¥þ³¡ (&_N)" + +#: data/ui/glabels-ui.xml.h:108 +#, fuzzy +msgid "Select all objects" +msgstr "¿ï¾Ü, ²¾°Ê¤Î­×§ïª«¥ó" + +#: data/ui/glabels-ui.xml.h:109 +msgid "Select, move and modify objects" +msgstr "¿ï¾Ü, ²¾°Ê¤Î­×§ïª«¥ó" + +#: data/ui/glabels-ui.xml.h:111 +msgid "Set drawing toolbar button style according to desktop default" +msgstr "" + +#: data/ui/glabels-ui.xml.h:112 +msgid "Set main toolbar button style according to desktop default" +msgstr "" + +#: data/ui/glabels-ui.xml.h:113 +msgid "Show _Tooltips" +msgstr "" + +#: data/ui/glabels-ui.xml.h:114 +msgid "Show both icons and texts in the drawing toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:115 +msgid "Show both icons and texts in the main toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:116 +msgid "Show tooltips in the drawing toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:117 +msgid "Show tooltips in the main toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:118 +msgid "Show tooltips in the property toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:119 +msgid "Template Designer" +msgstr "" + +#: data/ui/glabels-ui.xml.h:120 +msgid "Template _Designer..." +msgstr "" + +#: data/ui/glabels-ui.xml.h:121 +msgid "Text color" +msgstr "" + +#: data/ui/glabels-ui.xml.h:122 +#, fuzzy +msgid "U_n-select All" +msgstr "¤Ï¿ï¾Ü¥þ³¡ (&_N)" + +#: data/ui/glabels-ui.xml.h:123 +#, fuzzy +msgid "Un-select All" +msgstr "¤Ï¿ï¾Ü¥þ³¡ (&_N)" + +#: data/ui/glabels-ui.xml.h:124 +msgid "Undo" +msgstr "" + +#: data/ui/glabels-ui.xml.h:125 +msgid "Undo the last action" +msgstr "" + +#: data/ui/glabels-ui.xml.h:126 +#, fuzzy +msgid "Zoom _1:1" +msgstr "1:1 Åã¥Ü" + +#: data/ui/glabels-ui.xml.h:127 +#, fuzzy +msgid "Zoom _In" +msgstr "©ñ¤j" + +#: data/ui/glabels-ui.xml.h:128 +#, fuzzy +msgid "Zoom _Out" +msgstr "ÁY¤p" + +#: data/ui/glabels-ui.xml.h:129 +#, fuzzy +msgid "Zoom to _fit" +msgstr "1:1 Åã¥Ü" + +#: data/ui/glabels-ui.xml.h:130 +msgid "Zoom to fit window" +msgstr "" + +#: data/ui/glabels-ui.xml.h:131 +msgid "_About..." +msgstr "" + +#: data/ui/glabels-ui.xml.h:132 +msgid "_Bottoms" +msgstr "" + +#: data/ui/glabels-ui.xml.h:135 +msgid "_Close" +msgstr "" + +#: data/ui/glabels-ui.xml.h:136 +msgid "_Contents" +msgstr "" + +#: data/ui/glabels-ui.xml.h:137 +msgid "_Copy" +msgstr "" + +#: data/ui/glabels-ui.xml.h:138 +#, fuzzy +msgid "_Create Object" +msgstr "«Ø¥ß·sªº¤å¦rª«¥ó" + +#: data/ui/glabels-ui.xml.h:139 +msgid "_Debug" +msgstr "" + +#: data/ui/glabels-ui.xml.h:141 +msgid "_Desktop Default" +msgstr "" + +#: data/ui/glabels-ui.xml.h:142 +msgid "_Drawing Toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:143 +msgid "_Edit" +msgstr "" + +#: data/ui/glabels-ui.xml.h:145 +#, fuzzy +msgid "_File" +msgstr "¶ñº¡" + +#: data/ui/glabels-ui.xml.h:146 +msgid "_Grid" +msgstr "" + +#: data/ui/glabels-ui.xml.h:147 +msgid "_Help" +msgstr "" + +#: data/ui/glabels-ui.xml.h:148 +msgid "_Icon" +msgstr "" + +#: data/ui/glabels-ui.xml.h:152 +msgid "_Main Toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:153 +#, fuzzy +msgid "_Merge Properties..." +msgstr "¦X¨Ö³]©w" + +#: data/ui/glabels-ui.xml.h:154 +msgid "_New" +msgstr "·s¼W (&_N)" + +#: data/ui/glabels-ui.xml.h:155 +msgid "_Objects" +msgstr "" + +#: data/ui/glabels-ui.xml.h:156 +#, fuzzy +msgid "_Open..." +msgstr "¶}±Ò" + +#: data/ui/glabels-ui.xml.h:158 +msgid "_Paste" +msgstr "" + +#: data/ui/glabels-ui.xml.h:159 +#, fuzzy +msgid "_Print..." +msgstr "¦C¦L" + +#: data/ui/glabels-ui.xml.h:160 +msgid "_Property Toolbar" +msgstr "" + +#: data/ui/glabels-ui.xml.h:161 +msgid "_Quit" +msgstr "" + +#: data/ui/glabels-ui.xml.h:164 +#, fuzzy +msgid "_Save" +msgstr "¥t¦s¬°..." + +#: data/ui/glabels-ui.xml.h:168 +#, fuzzy +msgid "_View" +msgstr "·s¼W (&_N)" + +#: data/glade/prefs-dialog.glade.h:1 +msgid " " +msgstr "" + +#: data/glade/prefs-dialog.glade.h:2 data/glade/object-editor.glade.h:1 +#: data/glade/template-designer.glade.h:5 +msgid "*" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:3 +msgid "Default page size" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:4 +msgid "Fill" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:5 +msgid "Line" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:6 +msgid "Text" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:7 +msgid "Units" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:8 data/glade/object-editor.glade.h:4 +msgid "Alignment:" +msgstr "¹ï¸m:" + +#: data/glade/prefs-dialog.glade.h:9 data/glade/object-editor.glade.h:8 +msgid "Color:" +msgstr "ÃC¦â:" + +#: data/glade/prefs-dialog.glade.h:10 +msgid "Font:" +msgstr "¦r«¬:" + +#: data/glade/prefs-dialog.glade.h:11 +msgid "ISO A4" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:12 +msgid "Inches" +msgstr "­^¤o" + +#: data/glade/prefs-dialog.glade.h:13 data/glade/object-editor.glade.h:19 +msgid "Line Spacing:" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:14 +#, fuzzy +msgid "Locale" +msgstr "¤ñ¨Ò:" + +#: data/glade/prefs-dialog.glade.h:15 +msgid "Millimeters" +msgstr "²@¦Ì" + +#: data/glade/prefs-dialog.glade.h:16 +msgid "Object defaults" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:17 +msgid "Points" +msgstr "ÂI" + +#: data/glade/prefs-dialog.glade.h:18 +msgid "Select default properties for new objects." +msgstr "" + +#: data/glade/prefs-dialog.glade.h:19 +msgid "Select locale specific behavior." +msgstr "" + +#: data/glade/prefs-dialog.glade.h:20 data/templates/paper-sizes.xml.h:25 +msgid "US Letter" +msgstr "" + +#: data/glade/prefs-dialog.glade.h:21 data/glade/object-editor.glade.h:29 +#: data/glade/template-designer.glade.h:72 +msgid "Width:" +msgstr "Áï«×:" + +#: data/glade/object-editor.glade.h:2 +msgid "00000000000 00000" +msgstr "" + +#: data/glade/object-editor.glade.h:3 +msgid "Xxx object properties" +msgstr "" + +#: data/glade/object-editor.glade.h:5 +msgid "Allow merge to automatically shrink text" +msgstr "" + +#: data/glade/object-editor.glade.h:6 +msgid "Angle:" +msgstr "¨¤«×:" + +#: data/glade/object-editor.glade.h:7 +msgid "Checksum" +msgstr "" + +#: data/glade/object-editor.glade.h:10 +#, fuzzy +msgid "Family:" +msgstr "¶ñº¡" + +#: data/glade/object-editor.glade.h:12 +msgid "Fill" +msgstr "¶ñº¡" + +#: data/glade/object-editor.glade.h:13 data/glade/template-designer.glade.h:33 +msgid "Height:" +msgstr "°ª«×:" + +#: data/glade/object-editor.glade.h:14 +msgid "Image" +msgstr "¹Ï¹³" + +#: data/glade/object-editor.glade.h:15 +msgid "Insert merge field" +msgstr "´¡¤J¦X¨Ö¦C" + +#: data/glade/object-editor.glade.h:17 +msgid "Length:" +msgstr "ªø«×:" + +#: data/glade/object-editor.glade.h:18 +msgid "Line" +msgstr "½u" + +#: data/glade/object-editor.glade.h:20 +msgid "Literal:" +msgstr "¤å¦r:" + +#: data/glade/object-editor.glade.h:21 +msgid "Load image" +msgstr "" + +#: data/glade/object-editor.glade.h:22 +msgid "Position" +msgstr "¦ì¸m" + +#: data/glade/object-editor.glade.h:23 +msgid "Reset image size" +msgstr "­«³]¹Ï¹³¤j¤p" + +#: data/glade/object-editor.glade.h:24 +msgid "Size" +msgstr "¤j¤p" + +#: data/glade/object-editor.glade.h:25 +#, fuzzy +msgid "Size:" +msgstr "¤j¤p" + +#: data/glade/object-editor.glade.h:26 +#, fuzzy +msgid "Style" +msgstr "¼Ë¦¡" + +#: data/glade/object-editor.glade.h:27 +#, fuzzy +msgid "Style:" +msgstr "¼Ë¦¡" + +#: data/glade/object-editor.glade.h:30 +msgid "X:" +msgstr "X:" + +#: data/glade/object-editor.glade.h:31 +msgid "Y:" +msgstr "Y:" + +#: data/glade/object-editor.glade.h:32 +msgid "degrees" +msgstr "«×¼Æ" + +#: data/glade/object-editor.glade.h:33 +msgid "dialog1" +msgstr "" + +#: data/glade/object-editor.glade.h:34 +msgid "digits:" +msgstr "" + +#: data/glade/object-editor.glade.h:35 +#, fuzzy +msgid "format:" +msgstr "®æ¦¡:" + +#: data/glade/template-designer.glade.h:1 +msgid " " +msgstr "" + +#: data/glade/template-designer.glade.h:2 +msgid "(e.g., \"Mailing Labels,\" \"Business Cards,\" ...)" +msgstr "" + +#: data/glade/template-designer.glade.h:3 +msgid "(e.g., 8163A)" +msgstr "" + +#: data/glade/template-designer.glade.h:4 +msgid "(e.g., Avery, Acme, ...)" +msgstr "" + +#: data/glade/template-designer.glade.h:6 +msgid "1. Outer radius:" +msgstr "" + +#: data/glade/template-designer.glade.h:7 +msgid "1. Radius:" +msgstr "" + +#: data/glade/template-designer.glade.h:8 +#, fuzzy +msgid "1. Width:" +msgstr "Áï«×:" + +#: data/glade/template-designer.glade.h:9 +#, fuzzy +msgid "2. Height:" +msgstr "°ª«×:" + +#: data/glade/template-designer.glade.h:10 +msgid "2. Inner radius:" +msgstr "" + +#: data/glade/template-designer.glade.h:11 +msgid "2. Waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:12 +msgid "3. Clipping width:" +msgstr "" + +#: data/glade/template-designer.glade.h:13 +msgid "3. Margin" +msgstr "" + +#: data/glade/template-designer.glade.h:14 +msgid "3. Round (radius of corner):" +msgstr "" + +#: data/glade/template-designer.glade.h:15 +msgid "4. Clipping height:" +msgstr "" + +#: data/glade/template-designer.glade.h:16 +msgid "4. Horiz. waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:17 +msgid "5. Vert. waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:18 +msgid "5. Waste (overprint allowed):" +msgstr "" + +#: data/glade/template-designer.glade.h:19 +msgid "6. Margin" +msgstr "" + +#: data/glade/template-designer.glade.h:20 +msgid "Brand/Manufacturer:" +msgstr "" + +#: data/glade/template-designer.glade.h:21 +msgid "CD/DVD (including credit card CDs)" +msgstr "" + +#: data/glade/template-designer.glade.h:22 +msgid "" +"Congratulations!\n" +"\n" +"You have completed the gLabels Template Designer.\n" +"If you wish to accept and save your design, click \"Apply.\"\n" +"\n" +"Otherwise, you may click \"Cancel\" to abandon your design\n" +"or \"Back\" to continue editing this design." +msgstr "" + +#: data/glade/template-designer.glade.h:30 +msgid "Design Completed" +msgstr "" + +#: data/glade/template-designer.glade.h:31 +msgid "Distance from left edge (x0):" +msgstr "" + +#: data/glade/template-designer.glade.h:32 +msgid "Distance from top edge (y0):" +msgstr "" + +#: data/glade/template-designer.glade.h:34 +msgid "Horizontal pitch (dx):" +msgstr "" + +#: data/glade/template-designer.glade.h:35 +msgid "" +"How many layouts will your template contain? \n" +"\n" +"A layout is a set of labels or cards that can be arranged in a simple grid.\n" +"Most templates only need one layout, as in the first example.\n" +"The second example illustrates when two layouts are needed." +msgstr "" + +#: data/glade/template-designer.glade.h:40 +msgid "Label Size (CD/DVD)" +msgstr "" + +#: data/glade/template-designer.glade.h:41 +#, fuzzy +msgid "Label Size (Round)" +msgstr "¼Ðñ¤j¤p:" + +#: data/glade/template-designer.glade.h:42 +#, fuzzy +msgid "Label or Card Shape" +msgstr "·s¼W¼Ðñ©Î¥d" + +#: data/glade/template-designer.glade.h:43 +msgid "Label or Card Size (Rectangular)" +msgstr "" + +#: data/glade/template-designer.glade.h:44 +#, fuzzy +msgid "Layout #1" +msgstr "ª©­±:" + +#: data/glade/template-designer.glade.h:45 +#, fuzzy +msgid "Layout #2" +msgstr "ª©­±:" + +#: data/glade/template-designer.glade.h:46 +#, fuzzy +msgid "Layout(s)" +msgstr "ª©­±:" + +#: data/glade/template-designer.glade.h:47 +#, fuzzy +msgid "Name and Description" +msgstr "´y­z:" + +#: data/glade/template-designer.glade.h:48 +msgid "Number across (nx):" +msgstr "" + +#: data/glade/template-designer.glade.h:49 +msgid "Number down (ny):" +msgstr "" + +#: data/glade/template-designer.glade.h:50 +msgid "Number of Layouts" +msgstr "" + +#: data/glade/template-designer.glade.h:51 +msgid "Number of layouts:" +msgstr "" + +#: data/glade/template-designer.glade.h:52 +#, fuzzy +msgid "Page Size" +msgstr "¯È±i¤j¤p:" + +#: data/glade/template-designer.glade.h:54 +msgid "Part #:" +msgstr "" + +#: data/glade/template-designer.glade.h:55 +msgid "" +"Please enter the following identifying information about the template " +"stationery." +msgstr "" + +#: data/glade/template-designer.glade.h:56 +msgid "Please enter the following layout information." +msgstr "" + +#: data/glade/template-designer.glade.h:57 +msgid "" +"Please enter the following size parameters of a single label in your " +"template." +msgstr "" + +#: data/glade/template-designer.glade.h:58 +msgid "" +"Please enter the following size parameters of a single label or card in your " +"template." +msgstr "" + +#: data/glade/template-designer.glade.h:59 +msgid "Please select the basic shape of the labels or cards." +msgstr "" + +#: data/glade/template-designer.glade.h:60 +msgid "Please select the page size of the template stationery." +msgstr "" + +#: data/glade/template-designer.glade.h:61 +#, fuzzy +msgid "Print test sheet" +msgstr "¦b­º±i¯È" + +#: data/glade/template-designer.glade.h:62 +msgid "Rectangular or square (can have rounded corners)" +msgstr "" + +#: data/glade/template-designer.glade.h:63 +msgid "Round" +msgstr "" + +#: data/glade/template-designer.glade.h:64 +msgid "" +"Templates needing\n" +"two layouts." +msgstr "" + +#: data/glade/template-designer.glade.h:66 +msgid "" +"Templates needing only\n" +"one layout." +msgstr "" + +#: data/glade/template-designer.glade.h:68 +msgid "Vertical pitch (dy):" +msgstr "" + +#: data/glade/template-designer.glade.h:69 +msgid "" +"Welcome to the gLabels Template Designer.\n" +"\n" +"This dialog will assist you in the creation of a custom gLabels template." +msgstr "" + +#: data/templates/paper-sizes.xml.h:1 +msgid "A0" +msgstr "" + +#: data/templates/paper-sizes.xml.h:2 +msgid "A1" +msgstr "" + +#: data/templates/paper-sizes.xml.h:3 +msgid "A10" +msgstr "" + +#: data/templates/paper-sizes.xml.h:4 +msgid "A2" +msgstr "" + +#: data/templates/paper-sizes.xml.h:5 +msgid "A3" +msgstr "" + +#: data/templates/paper-sizes.xml.h:6 +msgid "A4" +msgstr "" + +#: data/templates/paper-sizes.xml.h:7 +msgid "A5" +msgstr "" + +#: data/templates/paper-sizes.xml.h:8 +msgid "A6" +msgstr "" + +#: data/templates/paper-sizes.xml.h:9 +msgid "A7" +msgstr "" + +#: data/templates/paper-sizes.xml.h:10 +msgid "A8" +msgstr "" + +#: data/templates/paper-sizes.xml.h:11 +msgid "A9" +msgstr "" + +#: data/templates/paper-sizes.xml.h:12 +msgid "B0" +msgstr "" + +#: data/templates/paper-sizes.xml.h:13 +msgid "B1" +msgstr "" + +#: data/templates/paper-sizes.xml.h:14 +msgid "B10" +msgstr "" + +#: data/templates/paper-sizes.xml.h:15 +msgid "B2" +msgstr "" + +#: data/templates/paper-sizes.xml.h:16 +msgid "B3" +msgstr "" + +#: data/templates/paper-sizes.xml.h:17 +msgid "B4" +msgstr "" + +#: data/templates/paper-sizes.xml.h:18 +msgid "B5" +msgstr "" + +#: data/templates/paper-sizes.xml.h:19 +msgid "B6" +msgstr "" + +#: data/templates/paper-sizes.xml.h:20 +msgid "B7" +msgstr "" + +#: data/templates/paper-sizes.xml.h:21 +msgid "B8" +msgstr "" + +#: data/templates/paper-sizes.xml.h:22 +msgid "B9" +msgstr "" + +#: data/templates/paper-sizes.xml.h:23 +msgid "US Executive" +msgstr "" + +#: data/templates/paper-sizes.xml.h:24 +msgid "US Legal" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:1 +#: data/templates/zweckform-iso-templates.xml.h:1 +msgid "Address Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:2 +#: data/templates/avery-iso-templates.xml.h:2 +#: data/templates/zweckform-iso-templates.xml.h:3 +#: data/templates/misc-us-templates.xml.h:2 +#: data/templates/misc-iso-templates.xml.h:9 +msgid "Business Cards" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:3 +msgid "CD/DVD Labels (Disc Labels)" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:4 +msgid "Diskette Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:5 +#, fuzzy +msgid "Filing Labels" +msgstr "¼Ðñ" + +#: data/templates/avery-us-templates.xml.h:6 +msgid "Full Sheet Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:7 +#, fuzzy +msgid "Large Round Labels" +msgstr "¥Ñ¸Tñ¶}¯Å" + +#: data/templates/avery-us-templates.xml.h:8 +msgid "Name Badge Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:9 +msgid "Return Address Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:10 +msgid "Shipping Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:11 +#, fuzzy +msgid "Small Round Labels" +msgstr "¥Ñ¸Tñ¶}¯Å" + +#: data/templates/avery-us-templates.xml.h:12 +#, fuzzy +msgid "Square Labels" +msgstr "¼Ðñ" + +#: data/templates/avery-us-templates.xml.h:13 +msgid "Video Tape Face Labels" +msgstr "" + +#: data/templates/avery-us-templates.xml.h:14 +msgid "Video Tape Spine Labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:1 +msgid "Address labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:3 +msgid "CD Booklet" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:4 +msgid "CD Inlet" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:5 +#: data/templates/zweckform-iso-templates.xml.h:4 +#: data/templates/misc-us-templates.xml.h:4 +#: data/templates/misc-iso-templates.xml.h:10 +#, fuzzy +msgid "CD/DVD Labels" +msgstr "¼Ðñ" + +#: data/templates/avery-iso-templates.xml.h:6 +msgid "Diskette labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:7 +#: data/templates/zweckform-iso-templates.xml.h:7 +#: data/templates/misc-iso-templates.xml.h:17 +msgid "Mailing Labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:8 +#, fuzzy +msgid "Mailing labels" +msgstr "¼Ðñ" + +#: data/templates/avery-iso-templates.xml.h:9 +msgid "Mini Address Labels" +msgstr "" + +#: data/templates/avery-iso-templates.xml.h:10 +#, fuzzy +msgid "Shipping labels" +msgstr "¶}±Ò¼Ðñ" + +#: data/templates/zweckform-iso-templates.xml.h:2 +msgid "Allround Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:5 +msgid "Correction and Cover-up Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:6 +msgid "Lever Arch File Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:8 +msgid "QSL-Karten Etiketten 70mm x 50,8mm" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:9 +msgid "Rectangular Copier Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:10 +#: data/templates/misc-iso-templates.xml.h:22 +msgid "Rectangular Labels" +msgstr "" + +#: data/templates/zweckform-iso-templates.xml.h:11 +msgid "Video Labels (back)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:1 +msgid "Business Card CD" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:3 +msgid "CD Template Rectangles" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:5 +msgid "CD/DVD Labels (Face Only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:6 +#: data/templates/misc-iso-templates.xml.h:11 +msgid "CD/DVD Labels (face only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:7 +#, fuzzy +msgid "DLT Labels" +msgstr "¼Ðñ" + +#: data/templates/misc-us-templates.xml.h:8 +msgid "Microtube labels" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:9 +msgid "Mini-CD Labels" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:10 +msgid "PRO CD Labels 2-up (CD spine only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:11 +msgid "PRO CD Labels 2-up (Face only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:12 +#: data/templates/misc-iso-templates.xml.h:21 +msgid "PRO CD Labels 2-up (face only)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:13 +msgid "Slimline CD Case (rightside up)" +msgstr "" + +#: data/templates/misc-us-templates.xml.h:14 +msgid "Slimline CD Case (upside down)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:1 +msgid "Agipa 119488: Business Cards" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:2 +msgid "Allround Labels --24" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:3 +msgid "Allround Labels --44" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:4 +msgid "Allround Labels --64" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:5 +msgid "Allround Labels --65" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:6 +msgid "Arch File Labels" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:7 +msgid "Arch File Labels (large)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:8 +msgid "Arch File Labels (small)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:12 +msgid "CD/DVD Labels Standard Format (face only)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:13 +msgid "Diskette Labels (face only)" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:14 +msgid "EPSON Photo Stickers 16" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:15 +msgid "Etiketten" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:16 +msgid "Fridge Magnet Stickers" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:18 +msgid "Mailing Labels --14" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:19 +msgid "Mailing Labels-2 columns" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:20 +msgid "Mailing Labels-3 columns" +msgstr "" + +#: data/templates/misc-iso-templates.xml.h:23 +msgid "Video Labels (face only)" +msgstr "" + +#: data/desktop/glabels.desktop.in.h:1 +msgid "Create labels, business cards and media covers." +msgstr "" + +#: data/desktop/glabels.desktop.in.h:2 +msgid "gLabels Label Designer" +msgstr "" + +#: data/mime/glabels.keys.in.h:1 data/mime/glabels.xml.in.h:1 +#, fuzzy +msgid "gLabels Project File" +msgstr "¤å¦r¼Ë»ª" + +#, fuzzy +#~ msgid "Object _Properties..." +#~ msgstr "¤å¦r¼Ë»ª" + +#~ msgid "Display units" +#~ msgstr "Åã¥Ü³æ¦ì" + +#~ msgid "Default page size" +#~ msgstr "¹w³]¯È±i¤j¤p" + +#~ msgid "Outline" +#~ msgstr "¥~Ãä" + +#~ msgid "Edit line object properties" +#~ msgstr "­×§ï½uª«¥óªº³]©w" + +#~ msgid "Edit text object properties" +#~ msgstr "­×§ï¤å¦rª«¥óªº³]©w" + +#~ msgid "Maintain current aspect ratio" +#~ msgstr "«O¯d²{¦³ªº¤j¤p¤ñ¨Ò" + +#, fuzzy +#~ msgid "CD Labels" +#~ msgstr "¼Ðñ" + +#, fuzzy +#~ msgid "Open %s" +#~ msgstr "¶}±Ò" + +#~ msgid "Revert to saved copy of %s?" +#~ msgstr "­n¸ü¤J¤wÀx¦sªº³Æ¥÷ %s ?" + +#~ msgid "Unknown media type. Using default." +#~ msgstr "¤£©úªº´CÅéÃþ§Î. ¨Ï¥Î¹w³]." + +#~ msgid "" +#~ "``%s'' has been modified.\n" +#~ "\n" +#~ "Do you wish to save it?" +#~ msgstr "" +#~ "``%s`` ¤w³Q­×§ï.\n" +#~ "\n" +#~ "­n²{¦bÀx¦s¶Ü ?" + +#~ msgid "Close / Save label as" +#~ msgstr "Ãö³¬ / Àx¦s¼Ðñ¬°..." + +#~ msgid "Label no longer valid!" +#~ msgstr "¼Ðñ¨Ã¤£¬O¥¿½T¥iŪªº !" + +#~ msgid "Error writing file" +#~ msgstr "¦b¼g¤JÀɮ׮ɵo¥Í¿ù»~" + +#~ msgid "Edit properties..." +#~ msgstr "­×§ï³]©w..." + +#~ msgid "Appearance" +#~ msgstr "¼Ë»ª" + +#~ msgid "Position/Size" +#~ msgstr "¦ì¸m/¤j¤p" + +#~ msgid "Image format not currently supported" +#~ msgstr "¹Ï¹³®æ¦¡¨Ã¨S¦³¤ä´©" + +#~ msgid "Barcode data" +#~ msgstr "¼Æ½X±ø¸ê®Æ" + +#~ msgid "%" +#~ msgstr "%" + +#~ msgid "Show text with barcode" +#~ msgstr "Åã¥Ü¼Æ½X±ø¤å¦r" + +#~ msgid "Fields" +#~ msgstr "Äæ¦ì" + +#~ msgid "Column" +#~ msgstr "¦C" + +#~ msgid "Sample data" +#~ msgstr "¼Ë¥»¸ê®Æ" + +#~ msgid "Make a new, empty label" +#~ msgstr "»s§@·sÀÉ, ªÅªº¼Ëñ" + +#~ msgid " New " +#~ msgstr " ·s¼W " + +#~ msgid "New Label/Card" +#~ msgstr "·s¼W¼Ðñ/¥d" + +#~ msgid " Open " +#~ msgstr " ¶}±Ò " + +#~ msgid " Save " +#~ msgstr " Àx¦s " + +#~ msgid " Print " +#~ msgstr " ¦C¦L " + +#~ msgid "Function is not implemented!" +#~ msgstr "¥\¯à¥¼§¹¦¨ !" diff --git a/glabels2/src/Makefile.am b/glabels2/src/Makefile.am new file mode 100644 index 00000000..d687e1ba --- /dev/null +++ b/glabels2/src/Makefile.am @@ -0,0 +1,289 @@ +LIB_BARCODE_DIR = ../barcode-0.98 +LIB_IEC16022_DIR = ../iec16022-0.2.1 + +SUBDIRS= pixmaps stock-pixmaps mygal + +bin_PROGRAMS = glabels glabels-batch + +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_builddir) \ + -I$(LIB_BARCODE_DIR) \ + -I$(LIB_IEC16022_DIR) \ + $(GLABELS_CFLAGS) \ + $(DISABLE_DEPRECATED_CFLAGS) \ + -DPREFIX=\""$(prefix)"\" \ + -DSYSCONFDIR=\""$(sysconfdir)"\" \ + -DDATADIR=\""$(datadir)"\" \ + -DLIBDIR=\""$(libdir)"\" \ + -DGLABELS_LOCALEDIR=\""$(datadir)/locale"\" \ + -DGLABELS_GLADE_DIR=\""$(datadir)/glabels/glade/"\" \ + -DGLABELS_ICON_DIR=\""$(datadir)/pixmaps/"\" \ + -DGLABELS_PIXMAP_DIR=\""$(datadir)/pixmaps/glabels/"\" \ + -DG_LOG_DOMAIN=\""glabels\"" + +glabels_LDFLAGS = -export-dynamic + +glabels_LDADD = \ + $(GLABELS_LIBS) \ + ../libglabels/libglabels.la \ + mygal/libmygal.la \ + $(LIB_BARCODE_DIR)/libbarcode.la \ + $(LIB_IEC16022_DIR)/libiec16022.la + +glabels_batch_LDFLAGS = -export-dynamic + +glabels_batch_LDADD = \ + $(GLABELS_LIBS) \ + ../libglabels/libglabels.la \ + $(LIB_BARCODE_DIR)/libbarcode.la \ + $(LIB_IEC16022_DIR)/libiec16022.la + +BUILT_SOURCES = \ + marshal.c \ + marshal.h + +glabels_SOURCES = \ + glabels.c \ + warning-handler.c \ + warning-handler.h \ + critical-error-handler.c \ + critical-error-handler.h \ + window.c \ + window.h \ + stock.c \ + stock.h \ + ui.h \ + ui.c \ + ui-util.h \ + ui-util.c \ + ui-commands.h \ + ui-commands.c \ + ui-property-bar.h \ + ui-property-bar.c \ + ui-sidebar.h \ + ui-sidebar.c \ + file.h \ + file.c \ + new-label-dialog.h \ + new-label-dialog.c \ + recent.h \ + recent.c \ + prefs.c \ + prefs.h \ + prefs-model.c \ + prefs-model.h \ + prefs-dialog.c \ + prefs-dialog.h \ + hig.h \ + view.c \ + view.h \ + view-object.c \ + view-object.h \ + view-box.c \ + view-box.h \ + view-ellipse.c \ + view-ellipse.h \ + view-line.c \ + view-line.h \ + view-image.c \ + view-image.h \ + view-text.c \ + view-text.h \ + view-barcode.c \ + view-barcode.h \ + merge-properties-dialog.c \ + merge-properties-dialog.h \ + object-editor.c \ + object-editor.h \ + object-editor-private.h \ + object-editor-position-page.c \ + object-editor-size-page.c \ + object-editor-lsize-page.c \ + object-editor-line-page.c \ + object-editor-fill-page.c \ + object-editor-image-page.c \ + object-editor-text-page.c \ + object-editor-edit-page.c \ + object-editor-bc-page.c \ + object-editor-data-page.c \ + object-editor-shadow-page.c \ + print.c \ + print.h \ + print-op.c \ + print-op.h \ + template-designer.c \ + template-designer.h \ + bc.c \ + bc.h \ + bc-gnubarcode.c \ + bc-gnubarcode.h \ + bc-postnet.c \ + bc-postnet.h \ + bc-iec16022.c \ + bc-iec16022.h \ + label.c \ + label.h \ + label-object.c \ + label-object.h \ + label-text.c \ + label-text.h \ + label-box.c \ + label-box.h \ + label-line.c \ + label-line.h \ + label-ellipse.c \ + label-ellipse.h \ + label-image.c \ + label-image.h \ + label-barcode.c \ + label-barcode.h \ + xml-label.c \ + xml-label.h \ + xml-label-04.c \ + xml-label-04.h \ + pixbuf-cache.c \ + pixbuf-cache.h \ + base64.c \ + base64.h \ + merge.c \ + merge.h \ + merge-init.c \ + merge-init.h \ + merge-text.c \ + merge-text.h \ + merge-evolution.c \ + merge-evolution.h \ + merge-vcard.c \ + merge-vcard.h \ + text-node.c \ + text-node.h \ + mini-preview-pixbuf.c \ + mini-preview-pixbuf.h \ + mini-preview-pixbuf-cache.c \ + mini-preview-pixbuf-cache.h \ + wdgt-print-copies.c \ + wdgt-print-copies.h \ + wdgt-print-merge.c \ + wdgt-print-merge.h \ + wdgt-media-select.c \ + wdgt-media-select.h \ + wdgt-mini-preview.c \ + wdgt-mini-preview.h \ + wdgt-rotate-label.c \ + wdgt-rotate-label.h \ + wdgt-chain-button.c \ + wdgt-chain-button.h \ + cairo-label-path.c \ + cairo-label-path.h \ + cairo-markup-path.c \ + cairo-markup-path.h \ + cairo-ellipse-path.c \ + cairo-ellipse-path.h \ + util.c \ + util.h \ + color.c \ + color.h \ + debug.c \ + debug.h \ + $(BUILT_SOURCES) + + +glabels_batch_SOURCES = \ + glabels-batch.c \ + print.c \ + print.h \ + print-op.c \ + print-op.h \ + bc.c \ + bc.h \ + bc-gnubarcode.c \ + bc-gnubarcode.h \ + bc-postnet.c \ + bc-postnet.h \ + bc-iec16022.c \ + bc-iec16022.h \ + label.c \ + label.h \ + label-object.c \ + label-object.h \ + label-text.c \ + label-text.h \ + label-box.c \ + label-box.h \ + label-line.c \ + label-line.h \ + label-ellipse.c \ + label-ellipse.h \ + label-image.c \ + label-image.h \ + label-barcode.c \ + label-barcode.h \ + xml-label.c \ + xml-label.h \ + xml-label-04.c \ + xml-label-04.h \ + pixbuf-cache.c \ + pixbuf-cache.h \ + base64.c \ + base64.h \ + merge.c \ + merge.h \ + merge-init.c \ + merge-init.h \ + merge-text.c \ + merge-text.h \ + merge-evolution.c \ + merge-evolution.h \ + merge-vcard.c \ + merge-vcard.h \ + text-node.c \ + text-node.h \ + prefs.c \ + prefs.h \ + prefs-model.c \ + prefs-model.h \ + util.c \ + util.h \ + color.c \ + color.h \ + debug.c \ + debug.h \ + wdgt-print-copies.c \ + wdgt-print-copies.h \ + wdgt-print-merge.c \ + wdgt-print-merge.h \ + wdgt-mini-preview.c \ + wdgt-mini-preview.h \ + hig.h \ + cairo-label-path.c \ + cairo-label-path.h \ + cairo-ellipse-path.c \ + cairo-ellipse-path.h \ + $(BUILT_SOURCES) + +marshal.h: marshal.list $(GLIB_GENMARSHAL) + $(GLIB_GENMARSHAL) $< --header --prefix=gl_marshal > $@ + +marshal.c: marshal.list $(GLIB_GENMARSHAL) + echo "#include \"marshal.h\"" > $@ && \ + $(GLIB_GENMARSHAL) $< --body --prefix=gl_marshal >> $@ + +EXTRA_DIST = \ + marshal.list + +CLEANFILES = $(BUILT_SOURCES) + +$(bin_PROGRAMS): $(LIB_BARCODE_DIR)/libbarcode.la \ + $(LIB_IEC16022_DIR)/libiec16022.la \ + ../libglabels/libglabels.la + +$(LIB_BARCODE_DIR)/libbarcode.la: + cd $(LIB_BARCODE_DIR); $(MAKE) + +$(LIB_IEC16022_DIR)/libiec16022.la: + cd $(LIB_IEC16022_DIR); $(MAKE) + +../libglabels/libglabels.la: + cd ../libglabels; $(MAKE) + diff --git a/glabels2/src/base64.c b/glabels2/src/base64.c new file mode 100644 index 00000000..b3de985b --- /dev/null +++ b/glabels2/src/base64.c @@ -0,0 +1,204 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * base64.c: GLabels base64 encode/decode module + * + * Copyright (C) 2003 Jim Evins + * + * This module is based on base64.c from fetchmail: + * + * Copyright (C)2002 by Eric S. Raymond. + * Portions are copyrighted by Carl E. Harris and George M. Sipe. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * This base 64 encoding is defined in RFC2045 section 6.8. + */ +#include + +#include "base64.h" + +#include +#include +#include + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + +#define LINE_LENGTH 76 /* Must be <= 76 and must be a multiple of 4 */ +#define BAD -1 + +#define DECODE64(c) (isascii(c) ? base64val[c] : BAD) + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +static const gchar base64digits[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +static const gchar base64val[] = { + BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, + BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, + BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD, 62, BAD,BAD,BAD, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,BAD,BAD, BAD,BAD,BAD,BAD, + BAD, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,BAD, BAD,BAD,BAD,BAD, + BAD, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,BAD, BAD,BAD,BAD,BAD +}; + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + + +/*****************************************************************************/ +/* Encode to Base64 string. */ +/*****************************************************************************/ +gchar * +gl_base64_encode (const guchar *in, guint inlen) +{ + gchar *out, *p_out; + gint buf_size; + gint i; + + /* Calculate output buffer size */ + buf_size = 4*((inlen+2)/3); /* Encoded characters */ + buf_size += buf_size / LINE_LENGTH + 2; /* Line breaks */ + buf_size += 1; /* null termination */ + + /* Allocate output buffer */ + out = g_new0 (gchar, buf_size); + p_out=out; + + /* Now do the encoding */ + *p_out++ = '\n'; + for ( i=0; inlen >= 3; inlen-=3 ) { + + *p_out++ = base64digits[in[0] >> 2]; + *p_out++ = base64digits[((in[0] << 4) & 0x30) | (in[1] >> 4)]; + *p_out++ = base64digits[((in[1] << 2) & 0x3c) | (in[2] >> 6)]; + *p_out++ = base64digits[in[2] & 0x3f]; + in += 3; + + i += 4; + if ( (i % LINE_LENGTH) == 0 ) { + *p_out++ = '\n'; + } + + } + if (inlen > 0) { + guchar fragment; + + *p_out++ = base64digits[in[0] >> 2]; + fragment = (in[0] << 4) & 0x30; + if (inlen > 1) + fragment |= in[1] >> 4; + *p_out++ = base64digits[fragment]; + *p_out++ = (inlen < 2) ? '=' : base64digits[(in[1] << 2) & 0x3c]; + *p_out++ = '='; + + *p_out++ = '\n'; + } + *p_out++ = '\0'; + + return out; +} + +/*****************************************************************************/ +/* Decode from a Base64 string. */ +/*****************************************************************************/ +guchar * +gl_base64_decode (const gchar *in, guint *outlen) +{ + gchar *out, *p_out; + gint buf_size; + register guchar digit1, digit2, digit3, digit4; + + /* Calculate output buffer size */ + buf_size = strlen (in) * 3 / 4; + + /* Allocate output buffer */ + out = g_new0 (gchar, buf_size); + + *outlen = 0; + p_out = out; + + /* Skip non-printable characters */ + while ( (*in == '\n') || (*in == '\r') || (*in == ' ') ) { + in ++; + } + if (!*in) { + g_free (out); + return NULL; + } + + /* Now do the decoding */ + do { + digit1 = in[0]; + if (DECODE64(digit1) == BAD) { + g_free (out); + return NULL; + } + digit2 = in[1]; + if (DECODE64(digit2) == BAD) { + g_free (out); + return NULL; + } + digit3 = in[2]; + if (digit3 != '=' && DECODE64(digit3) == BAD) { + g_free (out); + return NULL; + } + digit4 = in[3]; + if (digit4 != '=' && DECODE64(digit4) == BAD) { + g_free (out); + return NULL; + } + in += 4; + + *p_out++ = (DECODE64(digit1)<<2) | (DECODE64(digit2) >> 4); + (*outlen)++; + if (digit3 != '=') + { + *p_out++ = ((DECODE64(digit2)<<4)&0xf0) | (DECODE64(digit3)>>2); + (*outlen)++; + if (digit4 != '=') + { + *p_out++ = ((DECODE64(digit3)<<6)&0xc0) | DECODE64(digit4); + (*outlen)++; + } + } + + /* Skip non-printable characters */ + while ( (*in == '\n') || (*in == '\r') || (*in == ' ') ) { + in ++; + } + + } while (*in && digit4 != '='); + + return (guchar *)out; +} + diff --git a/glabels2/src/base64.h b/glabels2/src/base64.h new file mode 100644 index 00000000..420d2a4c --- /dev/null +++ b/glabels2/src/base64.h @@ -0,0 +1,45 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * base64.h: GLabels base64 encode/decode module + * + * Copyright (C) 2003 Jim Evins + * + * This module is based on base64.c from fetchmail: + * + * Copyright (C)2002 by Eric S. Raymond. + * Portions are copyrighted by Carl E. Harris and George M. Sipe. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __BASE64_H__ +#define __BASE64_H__ + +#include + +G_BEGIN_DECLS + +gchar *gl_base64_encode (const guchar *in, + guint inlen); + +guchar *gl_base64_decode (const gchar *in, + guint *outlen); + +G_END_DECLS + +#endif + diff --git a/glabels2/src/bc-gnubarcode.c b/glabels2/src/bc-gnubarcode.c new file mode 100644 index 00000000..2c84114b --- /dev/null +++ b/glabels2/src/bc-gnubarcode.c @@ -0,0 +1,459 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * bc-gnubarcode.c: front-end to GNU-barcode-library module + * + * Copyright (C) 2001-2003 Jim Evins . + * + * Some of this code is borrowed from the postscript renderer (ps.c) + * from the GNU barcode library: + * + * Copyright (C) 1999 Alessaandro Rubini (rubini@gnu.org) + * Copyright (C) 1999 Prosa Srl. (prosa@prosa.it) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "bc-gnubarcode.h" + +#include +#include +#include +#include +#include + +#include "barcode.h" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ +#define SHRINK_AMOUNT 0.15 /* shrink bars to account for ink spreading */ +#define FONT_SCALE 0.95 /* Shrink fonts just a hair */ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ +static glBarcode *render_pass1 (struct Barcode_Item *bci, + gint flags); + +static gboolean is_length_valid (const gchar *digits, + gint n1, + gint n2); + +static gboolean is_length1_valid (const gchar *digits, + gint n1, + gint n2); + +static gboolean is_length2_valid (const gchar *digits, + gint n1, + gint n2); + + +/*****************************************************************************/ +/* Generate intermediate representation of barcode. */ +/*****************************************************************************/ +glBarcode * +gl_barcode_gnubarcode_new (const gchar *id, + gboolean text_flag, + gboolean checksum_flag, + gdouble w, + gdouble h, + const gchar *digits) +{ + glBarcode *gbc; + struct Barcode_Item *bci; + gint flags; + + /* Assign type flag. Pre-filter by length for subtypes. */ + if (g_strcasecmp (id, "EAN") == 0) { + flags = BARCODE_EAN; + } else if (g_strcasecmp (id, "EAN-8") == 0) { + if (!is_length_valid (digits, 7, 8)) { + return NULL; + } + flags = BARCODE_EAN; + } else if (g_strcasecmp (id, "EAN-8+2") == 0) { + if (!is_length1_valid (digits, 7, 8) || !is_length2_valid (digits, 2, 2)) { + return NULL; + } + flags = BARCODE_EAN; + } else if (g_strcasecmp (id, "EAN-8+5") == 0) { + if (!is_length1_valid (digits, 7, 8) || !is_length2_valid (digits, 5, 5)) { + return NULL; + } + flags = BARCODE_EAN; + } else if (g_strcasecmp (id, "EAN-13") == 0) { + if (!is_length_valid (digits, 12, 13)) { + return NULL; + } + flags = BARCODE_EAN; + } else if (g_strcasecmp (id, "EAN-13+2") == 0) { + if (!is_length1_valid (digits, 12,13) || !is_length2_valid (digits, 2,2)) { + return NULL; + } + flags = BARCODE_EAN; + } else if (g_strcasecmp (id, "EAN-13+5") == 0) { + if (!is_length1_valid (digits, 12,13) || !is_length2_valid (digits, 5,5)) { + return NULL; + } + flags = BARCODE_EAN; + } else if (g_strcasecmp (id, "UPC") == 0) { + flags = BARCODE_UPC; + } else if (g_strcasecmp (id, "UPC-A") == 0) { + if (!is_length_valid (digits, 11, 12)) { + return NULL; + } + flags = BARCODE_UPC; + } else if (g_strcasecmp (id, "UPC-A+2") == 0) { + if (!is_length1_valid (digits, 11,12) || !is_length2_valid (digits, 2,2)) { + return NULL; + } + flags = BARCODE_UPC; + } else if (g_strcasecmp (id, "UPC-A+5") == 0) { + if (!is_length1_valid (digits, 11,12) || !is_length2_valid (digits, 5,5)) { + return NULL; + } + flags = BARCODE_UPC; + } else if (g_strcasecmp (id, "UPC-E") == 0) { + if (!is_length_valid (digits, 6, 8)) { + return NULL; + } + flags = BARCODE_UPC; + } else if (g_strcasecmp (id, "UPC-E+2") == 0) { + if (!is_length1_valid (digits, 6, 8) || !is_length2_valid (digits, 2,2)) { + return NULL; + } + flags = BARCODE_UPC; + } else if (g_strcasecmp (id, "UPC-E+5") == 0) { + if (!is_length1_valid (digits, 6, 8) || !is_length2_valid (digits, 5,5)) { + return NULL; + } + flags = BARCODE_UPC; + } else if (g_strcasecmp (id, "ISBN") == 0) { + if (!is_length_valid (digits, 9, 10)) { + return NULL; + } + flags = BARCODE_ISBN; + } else if (g_strcasecmp (id, "ISBN+5") == 0) { + if (!is_length1_valid (digits, 9, 10) || !is_length2_valid (digits, 5,5)) { + return NULL; + } + flags = BARCODE_ISBN; + } else if (g_strcasecmp (id, "Code39") == 0) { + flags = BARCODE_39; + } else if (g_strcasecmp (id, "Code128") == 0) { + flags = BARCODE_128; + } else if (g_strcasecmp (id, "Code128C") == 0) { + flags = BARCODE_128C; + } else if (g_strcasecmp (id, "Code128B") == 0) { + flags = BARCODE_128B; + } else if (g_strcasecmp (id, "I25") == 0) { + flags = BARCODE_I25; + } else if (g_strcasecmp (id, "CBR") == 0) { + flags = BARCODE_CBR; + } else if (g_strcasecmp (id, "MSI") == 0) { + flags = BARCODE_MSI; + } else if (g_strcasecmp (id, "PLS") == 0) { + flags = BARCODE_PLS; + } else { + g_message( "Illegal barcode id %s", id ); + flags = BARCODE_ANY; + } + + + bci = Barcode_Create ((char *)digits); + + /* First encode using GNU Barcode library */ + if (!text_flag) { + flags |= BARCODE_NO_ASCII; + } + if (!checksum_flag) { + flags |= BARCODE_NO_CHECKSUM; + } + + bci->scalef = 0.0; + bci->width = w; + bci->height = h; + + Barcode_Encode (bci, flags); + if (!bci->partial || !bci->textinfo) { + Barcode_Delete (bci); + return NULL; + } + + /* now render with our custom back-end, + to create appropriate intermdediate format */ + gbc = render_pass1 (bci, flags); + + Barcode_Delete (bci); + return gbc; +} + +/*-------------------------------------------------------------------------- + * PRIVATE. Render to glBarcode intermediate representation of barcode. + * + * Some of this code is borrowed from the postscript renderer (ps.c) + * from the GNU barcode library: + * + * Copyright (C) 1999 Alessaandro Rubini (rubini@gnu.org) + * Copyright (C) 1999 Prosa Srl. (prosa@prosa.it) + * + *--------------------------------------------------------------------------*/ +static glBarcode * +render_pass1 (struct Barcode_Item *bci, + gint flags) +{ + gint validbits = BARCODE_NO_ASCII; + glBarcode *gbc; + glBarcodeLine *line; + glBarcodeChar *bchar; + gdouble scalef = 1.0; + gdouble x; + gint i, j, barlen; + gdouble f1, f2; + gint mode = '-'; /* text below bars */ + gdouble x0, y0, yr; + gchar *p, c; + + if (bci->width > (2*bci->margin)) { + bci->width -= 2*bci->margin; + } + if (bci->height > (2*bci->margin)) { + bci->height -= 2*bci->margin; + } + + /* If any flag is clear in "flags", inherit it from "bci->flags" */ + if (!(flags & BARCODE_NO_ASCII)) { + flags |= bci->flags & BARCODE_NO_ASCII; + } + flags = bci->flags = (flags & validbits) | (bci->flags & ~validbits); + + /* First calculate barlen */ + barlen = bci->partial[0] - '0'; + for (p = bci->partial + 1; *p != 0; p++) { + if (isdigit (*p)) { + barlen += *p - '0'; + } else { + if ((*p != '+') && (*p != '-')) { + barlen += *p - 'a' + 1; + } + } + } + + /* The scale factor depends on bar length */ + if (!bci->scalef) { + if (!bci->width) bci->width = barlen; /* default */ + scalef = bci->scalef = (double)bci->width / (double)barlen; + if (scalef < 0.5) scalef = 0.5; + } + + /* The width defaults to "just enough" */ + bci->width = barlen * scalef + 1; + + /* But it can be too small, in this case enlarge and center the area */ + if (bci->width < barlen * scalef) { + int wid = barlen * scalef + 1; + bci->xoff -= (wid - bci->width)/2 ; + bci->width = wid; + /* Can't extend too far on the left */ + if (bci->xoff < 0) { + bci->width += -bci->xoff; + bci->xoff = 0; + } + } + + /* The height defaults to 80 points (rescaled) */ + if (!bci->height) + bci->height = 80 * scalef; + + /* If too small (5 + text), reduce the scale factor and center */ + i = 5 + 10 * ((bci->flags & BARCODE_NO_ASCII)==0); + if (bci->height < i * scalef ) { +#if 0 + double scaleg = ((double)bci->height) / i; + int wid = bci->width * scaleg / scalef; + bci->xoff += (bci->width - wid)/2; + bci->width = wid; + scalef = scaleg; +#else + bci->height = i * scalef; +#endif + } + + gbc = g_new0 (glBarcode, 1); + + /* Now traverse the code string and create a list of lines */ + x = bci->margin + (bci->partial[0] - '0') * scalef; + for (p = bci->partial + 1, i = 1; *p != 0; p++, i++) { + /* special cases: '+' and '-' */ + if (*p == '+' || *p == '-') { + mode = *p; /* don't count it */ + i++; + continue; + } + /* j is the width of this bar/space */ + if (isdigit (*p)) + j = *p - '0'; + else + j = *p - 'a' + 1; + if (i % 2) { /* bar */ + x0 = x + (j * scalef) / 2; + y0 = bci->margin; + yr = bci->height; + if (!(bci->flags & BARCODE_NO_ASCII)) { /* leave space for text */ + if (mode == '-') { + /* text below bars: 10 or 5 points */ + yr -= (isdigit (*p) ? 10 : 5) * scalef; + } else { /* '+' */ + /* above bars: 10 or 0 from bottom, + and 10 from top */ + y0 += 10 * scalef; + yr -= (isdigit (*p) ? 20 : 10) * scalef; + } + } + line = g_new0 (glBarcodeLine, 1); + line->x = x0; + line->y = y0; + line->length = yr; + line->width = (j * scalef) - SHRINK_AMOUNT; + gbc->lines = g_list_append (gbc->lines, line); + } + x += j * scalef; + + } + + /* Now the text */ + mode = '-'; /* reinstantiate default */ + if (!(bci->flags & BARCODE_NO_ASCII)) { + for (p = bci->textinfo; p; p = strchr (p, ' ')) { + while (*p == ' ') + p++; + if (!*p) + break; + if (*p == '+' || *p == '-') { + mode = *p; + continue; + } + if (sscanf (p, "%lf:%lf:%c", &f1, &f2, &c) != 3) { + g_message ("impossible data: %s", p); + continue; + } + bchar = g_new0 (glBarcodeChar, 1); + bchar->x = f1 * scalef + bci->margin; + if (mode == '-') { + bchar->y = + bci->margin + bci->height - 8 * scalef; + } else { + bchar->y = bci->margin; + } + bchar->fsize = f2 * FONT_SCALE * scalef; + bchar->c = c; + gbc->chars = g_list_append (gbc->chars, bchar); + } + } + + /* Fill in other info */ + gbc->height = bci->height + 2.0 * bci->margin; + gbc->width = bci->width + 2.0 * bci->margin; + +#if 0 + g_print ("w=%f, h=%f\n", gbc->width, gbc->height); +#endif + + return gbc; +} + +/*--------------------------------------------------------------------------*/ +/* Validate specific length of string (for subtypes). */ +/*--------------------------------------------------------------------------*/ +static gboolean +is_length_valid (const gchar *digits, + gint n1, + gint n2) +{ + gchar *p; + gint i; + + if (!digits) { + return FALSE; + } + + for (p = (gchar *)digits, i=0; *p != 0; p++) { + if (g_ascii_isdigit (*p)) { + i++; + } + } + + return (i >= n1) && (i <= n2); +} + +/*--------------------------------------------------------------------------*/ +/* Validate specific length of string (for subtypes). */ +/*--------------------------------------------------------------------------*/ +static gboolean +is_length1_valid (const gchar *digits, + gint n1, + gint n2) +{ + gchar *p; + gint i; + + if (!digits) { + return FALSE; + } + + for (p = (gchar *)digits, i=0; !g_ascii_isspace (*p) && *p != 0; p++) { + if (g_ascii_isdigit (*p)) { + i++; + } + } + + return (i >= n1) && (i <= n2); +} + +/*--------------------------------------------------------------------------*/ +/* Validate specific length of second string (for subtypes). */ +/*--------------------------------------------------------------------------*/ +static gboolean +is_length2_valid (const gchar *digits, + gint n1, + gint n2) +{ + gchar *p; + gint i; + + if (!digits) { + return FALSE; + } + + for (p = (gchar *)digits; !g_ascii_isspace (*p) && (*p != 0); p++) { + /* Skip over 1st string */ + } + + for (i=0; *p != 0; p++) { + if (g_ascii_isdigit (*p)) { + i++; + } + } + + return (i >= n1) && (i <= n2); +} + diff --git a/glabels2/src/bc-gnubarcode.h b/glabels2/src/bc-gnubarcode.h new file mode 100644 index 00000000..1e91d998 --- /dev/null +++ b/glabels2/src/bc-gnubarcode.h @@ -0,0 +1,40 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * bc_gnubarcode.h: front-end to GNU-barcode-library module header file + * + * Copyright (C) 2001-2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __BC_GNUBARCODE_H__ +#define __BC_GNUBARCODE_H__ + +#include "bc.h" + +G_BEGIN_DECLS + +glBarcode *gl_barcode_gnubarcode_new (const gchar *id, + gboolean text_flag, + gboolean checksum_flag, + gdouble w, + gdouble h, + const gchar *digits); + +G_END_DECLS + +#endif /* __BC_GNUBARCODE_H__ */ diff --git a/glabels2/src/bc-iec16022.c b/glabels2/src/bc-iec16022.c new file mode 100644 index 00000000..8fb87fc4 --- /dev/null +++ b/glabels2/src/bc-iec16022.c @@ -0,0 +1,151 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * bc-iec16022.c: front-end to iec16022-library module + * + * Copyright (C) 2001-2006 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "bc-iec16022.h" + +#include +#include +#include +#include + +#include "iec16022ecc200.h" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ +#define MIN_PIXEL_SIZE 1.0 + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ +static glBarcode *render_iec16022 (const gchar *grid, + gint i_width, + gint i_height, + gdouble w, + gdouble h); + +/*****************************************************************************/ +/* Generate intermediate representation of barcode. */ +/*****************************************************************************/ +glBarcode * +gl_barcode_iec16022_new (const gchar *id, + gboolean text_flag, + gboolean checksum_flag, + gdouble w, + gdouble h, + const gchar *digits) +{ + gchar *grid; + gint i_width, i_height; + glBarcode *gbc; + + if ( strlen (digits) == 0 ) + { + return NULL; + } + + i_width = 0; + i_height = 0; + + grid = (gchar *)iec16022ecc200 (&i_width, &i_height, NULL, + strlen (digits), (unsigned char *)digits, + NULL, NULL, NULL); + + /* now render with our custom back-end, + to create appropriate intermdediate format */ + gbc = render_iec16022 (grid, i_width, i_height, w, h); + + free (grid); + return gbc; +} + +/*-------------------------------------------------------------------------- + * PRIVATE. Render to glBarcode intermediate representation of barcode. + *--------------------------------------------------------------------------*/ +static glBarcode * +render_iec16022 (const gchar *grid, + gint i_width, + gint i_height, + gdouble w, + gdouble h) +{ + glBarcode *gbc; + glBarcodeLine *line; + gint x, y; + gdouble aspect_ratio, pixel_size; + + /* Treat requested size as a bounding box, scale to maintain aspect + * ratio while fitting it in this bounding box. */ + aspect_ratio = (gdouble)i_height / (gdouble)i_width; + if ( h > w*aspect_ratio ) { + h = w * aspect_ratio; + } else { + w = h / aspect_ratio; + } + + /* Now determine pixel size. */ + pixel_size = w / i_width; + if ( pixel_size < MIN_PIXEL_SIZE ) + { + pixel_size = MIN_PIXEL_SIZE; + } + + gbc = g_new0 (glBarcode, 1); + + /* Now traverse the code string and create a list of boxes */ + for ( y = i_height-1; y >= 0; y-- ) + { + + for ( x = 0; x < i_width; x++ ) + { + + if (*grid++) + { + line = g_new0 (glBarcodeLine, 1); + line->x = x*pixel_size + pixel_size/2.0; + line->y = y*pixel_size; + line->length = pixel_size; + line->width = pixel_size; + gbc->lines = g_list_append (gbc->lines, line); + } + + } + + } + + /* Fill in other info */ + gbc->height = i_height * pixel_size; + gbc->width = i_width * pixel_size; + +#if 0 + g_print ("w=%f, h=%f\n", gbc->width, gbc->height); +#endif + + return gbc; +} + diff --git a/glabels2/src/bc-iec16022.h b/glabels2/src/bc-iec16022.h new file mode 100644 index 00000000..099387ac --- /dev/null +++ b/glabels2/src/bc-iec16022.h @@ -0,0 +1,40 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * bc_iec16022.h: front-end to iec16022-library module header file + * + * Copyright (C) 2001-2006 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __BC_IEC16022_H__ +#define __BC_IEC16022_H__ + +#include "bc.h" + +G_BEGIN_DECLS + +glBarcode *gl_barcode_iec16022_new (const gchar *id, + gboolean text_flag, + gboolean checksum_flag, + gdouble w, + gdouble h, + const gchar *digits); + +G_END_DECLS + +#endif /* __BC_IEC16022_H__ */ diff --git a/glabels2/src/bc-postnet.c b/glabels2/src/bc-postnet.c new file mode 100644 index 00000000..5b710c09 --- /dev/null +++ b/glabels2/src/bc-postnet.c @@ -0,0 +1,222 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * bc_postnet.c: GLabels POSTNET barcode module + * + * Copyright (C) 2001-2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * This module implements the POSTNET barcode specified in the USPS + * publication 25, Mar 2001. + */ + +#include + +#include "bc-postnet.h" + +#include +#include +#include +#include + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ +#define POSTNET_BAR_WIDTH 1.25 +#define POSTNET_FULLBAR_HEIGHT 9.00 +#define POSTNET_HALFBAR_HEIGHT 3.50 +#define POSTNET_BAR_PITCH 3.25 +#define POSTNET_HORIZ_MARGIN 9.00 +#define POSTNET_VERT_MARGIN 3.00 + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ +static gchar *symbols[] = { + /* 0 */ "11000", + /* 1 */ "00011", + /* 2 */ "00101", + /* 3 */ "00110", + /* 4 */ "01001", + /* 5 */ "01010", + /* 6 */ "01100", + /* 7 */ "10001", + /* 8 */ "10010", + /* 9 */ "10100", +}; + +static gchar *frame_symbol = "1"; + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ +static gchar *postnet_code (const gchar *digits); + +static gboolean is_length_valid (const gchar *digits, + gint n); + + +/****************************************************************************/ +/* Generate list of lines that form the barcode for the given digits. */ +/****************************************************************************/ +glBarcode * +gl_barcode_postnet_new (const gchar *id, + gboolean text_flag, + gboolean checksum_flag, + gdouble w, + gdouble h, + const gchar *digits) +{ + gchar *code, *p; + glBarcode *gbc; + glBarcodeLine *line; + gdouble x; + + /* Validate code length for all subtypes. */ + if ( (g_strcasecmp (id, "POSTNET") == 0) ) { + if (!is_length_valid (digits, 5) && + !is_length_valid (digits, 9) && + !is_length_valid (digits, 11)) { + return NULL; + } + } + if ( (g_strcasecmp (id, "POSTNET-5") == 0) ) { + if (!is_length_valid (digits, 5)) { + return NULL; + } + } + if ( (g_strcasecmp (id, "POSTNET-9") == 0) ) { + if (!is_length_valid (digits, 9)) { + return NULL; + } + } + if ( (g_strcasecmp (id, "POSTNET-11") == 0) ) { + if (!is_length_valid (digits, 11)) { + return NULL; + } + } + if ( (g_strcasecmp (id, "CEPNET") == 0) ) { + if (!is_length_valid (digits, 8)) { + return NULL; + } + } + + /* First get code string */ + code = postnet_code (digits); + if (code == NULL) { + return NULL; + } + + gbc = g_new0 (glBarcode, 1); + + /* Now traverse the code string and create a list of lines */ + x = POSTNET_HORIZ_MARGIN; + for (p = code; *p != 0; p++) { + line = g_new0 (glBarcodeLine, 1); + line->x = x; + line->y = POSTNET_VERT_MARGIN; + if (*p == '0') { + line->y += + POSTNET_FULLBAR_HEIGHT - POSTNET_HALFBAR_HEIGHT; + line->length = POSTNET_HALFBAR_HEIGHT; + } else { + line->length = POSTNET_FULLBAR_HEIGHT; + } + line->width = POSTNET_BAR_WIDTH; + + gbc->lines = g_list_append (gbc->lines, line); + + x += POSTNET_BAR_PITCH; + } + + g_free (code); + + gbc->width = x + POSTNET_HORIZ_MARGIN; + gbc->height = POSTNET_FULLBAR_HEIGHT + 2 * POSTNET_VERT_MARGIN; + + gbc->chars = NULL; + + return gbc; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Generate string of symbols, representing barcode. */ +/*--------------------------------------------------------------------------*/ +static gchar * +postnet_code (const gchar *digits) +{ + gchar *p; + gint len; + gint d, sum; + GString *code; + gchar *ret; + + /* Left frame bar */ + code = g_string_new (frame_symbol); + + sum = 0; + for (p = (gchar *)digits, len = 0; (*p != 0) && (len < 11); p++) { + if (g_ascii_isdigit (*p)) { + /* Only translate valid characters (0-9) */ + d = (*p) - '0'; + sum += d; + code = g_string_append (code, symbols[d]); + len++; + } + } + + /* Create correction character */ + d = (10 - (sum % 10)) % 10; + code = g_string_append (code, symbols[d]); + + /* Right frame bar */ + code = g_string_append (code, frame_symbol); + + ret = g_strdup (code->str); + g_string_free (code, TRUE); + + return ret; +} + +/*--------------------------------------------------------------------------*/ +/* Validate specific length of string (for subtypes). */ +/*--------------------------------------------------------------------------*/ +static gboolean +is_length_valid (const gchar *digits, + gint n) +{ + gchar *p; + gint i; + + if (!digits) { + return FALSE; + } + + for (p = (gchar *)digits, i=0; *p != 0; p++) { + if (g_ascii_isdigit (*p)) { + i++; + } + } + + return (i == n); +} + diff --git a/glabels2/src/bc-postnet.h b/glabels2/src/bc-postnet.h new file mode 100644 index 00000000..6e642ab2 --- /dev/null +++ b/glabels2/src/bc-postnet.h @@ -0,0 +1,40 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * bc_postnet.h: GLabels POSTNET barcode module header file + * + * Copyright (C) 2001-2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __BC_POSTNET_H__ +#define __BC_POSTNET_H__ + +#include "bc.h" + +G_BEGIN_DECLS + +glBarcode *gl_barcode_postnet_new (const gchar *id, + gboolean text_flag, + gboolean checksum_flag, + gdouble w, + gdouble h, + const gchar *digits); + +G_END_DECLS + +#endif /* __BC_POSTNET_H__ */ diff --git a/glabels2/src/bc.c b/glabels2/src/bc.c new file mode 100644 index 00000000..89de2fbb --- /dev/null +++ b/glabels2/src/bc.c @@ -0,0 +1,386 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * bc.c: GLabels barcode module + * + * Copyright (C) 2001-2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "bc.h" + +#include +#include +#include +#include + +#include "bc-postnet.h" +#include "bc-gnubarcode.h" +#include "bc-iec16022.h" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +typedef struct { + gchar *id; + gchar *name; + glBarcodeNewFunc new; + gboolean can_text; + gboolean text_optional; + gboolean can_checksum; + gboolean checksum_optional; + gchar *default_digits; + gboolean can_freeform; + guint prefered_n; +} Backend; + + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +static const Backend backends[] = { + + { "POSTNET", N_("POSTNET (any)"), gl_barcode_postnet_new, + FALSE, FALSE, TRUE, FALSE, "12345-6789-12", FALSE, 11}, + + { "POSTNET-5", N_("POSTNET-5 (ZIP only)"), gl_barcode_postnet_new, + FALSE, FALSE, TRUE, FALSE, "12345", FALSE, 5}, + + { "POSTNET-9", N_("POSTNET-9 (ZIP+4)"), gl_barcode_postnet_new, + FALSE, FALSE, TRUE, FALSE, "12345-6789", FALSE, 9}, + + { "POSTNET-11", N_("POSTNET-11 (DPBC)"), gl_barcode_postnet_new, + FALSE, FALSE, TRUE, FALSE, "12345-6789-12", FALSE, 11}, + + { "CEPNET", N_("CEPNET"), gl_barcode_postnet_new, + FALSE, FALSE, TRUE, FALSE, "12345-678", FALSE, 8}, + + { "EAN", N_("EAN (any)"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, FALSE, "000000000000 00000", FALSE, 17}, + + { "EAN-8", N_("EAN-8"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, FALSE, "0000000", FALSE, 7}, + + { "EAN-8+2", N_("EAN-8 +2"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, FALSE, "0000000 00", FALSE, 9}, + + { "EAN-8+5", N_("EAN-8 +5"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, FALSE, "0000000 00000", FALSE, 12}, + + { "EAN-13", N_("EAN-13"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, FALSE, "000000000000", FALSE, 12}, + + { "EAN-13+2", N_("EAN-13 +2"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, FALSE, "000000000000 00", FALSE, 14}, + + { "EAN-13+5", N_("EAN-13 +5"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, FALSE, "000000000000 00000", FALSE, 17}, + + { "UPC", N_("UPC (UPC-A or UPC-E)"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, FALSE, "00000000000 00000", FALSE, 16}, + + { "UPC-A", N_("UPC-A"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, FALSE, "00000000000", FALSE, 11}, + + { "UPC-A+2", N_("UPC-A +2"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, FALSE, "00000000000 00", FALSE, 13}, + + { "UPC-A+5", N_("UPC-A +5"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, FALSE, "00000000000 00000", FALSE, 16}, + + { "UPC-E", N_("UPC-E"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, FALSE, "000000", FALSE, 6}, + + { "UPC-E+2", N_("UPC-E +2"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, FALSE, "000000 00", FALSE, 8}, + + { "UPC-E+5", N_("UPC-E +5"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, FALSE, "000000 00000", FALSE, 11}, + + { "ISBN", N_("ISBN"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, TRUE, "0-00000-000-0", FALSE, 10}, + + { "ISBN+5", N_("ISBN +5"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, TRUE, "0-00000-000-0 00000", FALSE, 15}, + + { "Code39", N_("Code 39"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, TRUE, "0000000000", TRUE, 10}, + + { "Code128", N_("Code 128"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, TRUE, "0000000000", TRUE, 10}, + + { "Code128C", N_("Code 128C"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, TRUE, "0000000000", TRUE, 10}, + + { "Code128B", N_("Code 128B"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, TRUE, "0000000000", TRUE, 10}, + + { "I25", N_("Interleaved 2 of 5"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, TRUE, "0000000000", TRUE, 10}, + + { "CBR", N_("Codabar"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, TRUE, "0000000000", TRUE, 10}, + + { "MSI", N_("MSI"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, TRUE, "0000000000", TRUE, 10}, + + { "PLS", N_("Plessey"), gl_barcode_gnubarcode_new, + TRUE, TRUE, TRUE, TRUE, "0000000000", TRUE, 10}, + + { "IEC16022", N_("IEC16022 (DataMatrix)"), gl_barcode_iec16022_new, + FALSE, FALSE, TRUE, FALSE, "12345678", TRUE, 8}, + + { NULL, NULL, NULL, FALSE, FALSE, FALSE, FALSE, NULL, FALSE, 0} + +}; + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + + +/*---------------------------------------------------------------------------*/ +/* Convert id to index into above table. */ +/*---------------------------------------------------------------------------*/ +static gint +id_to_index (const gchar *id) +{ + gint i; + + if (id == 0) { + return 0; /* NULL request default. I.e., the first element. */ + } + + for (i=0; backends[i].id != NULL; i++) { + if (g_strcasecmp (id, backends[i].id) == 0) { + return i; + } + } + + g_message( "Unknown barcode id \"%s\"", id ); + return 0; +} + +/*---------------------------------------------------------------------------*/ +/* Convert name to index into above table. */ +/*---------------------------------------------------------------------------*/ +static gint +name_to_index (const gchar *name) +{ + gint i; + + g_return_val_if_fail (name!=NULL, 0); + + for (i=0; backends[i].id != NULL; i++) { + if (g_strcasecmp (name, backends[i].name) == 0) { + return i; + } + } + + g_message( "Unknown barcode name \"%s\"", name ); + return 0; +} + +/*****************************************************************************/ +/* Call appropriate barcode backend to create barcode in intermediate format.*/ +/*****************************************************************************/ +glBarcode * +gl_barcode_new (const gchar *id, + gboolean text_flag, + gboolean checksum_flag, + gdouble w, + gdouble h, + const gchar *digits) +{ + glBarcode *gbc; + gint i; + + g_return_val_if_fail (digits!=NULL, NULL); + + i = id_to_index (id); + gbc = backends[i].new (backends[i].id, + text_flag, + checksum_flag, + w, + h, + digits); + + return gbc; +} + +/*****************************************************************************/ +/* Free previously created barcode. */ +/*****************************************************************************/ +void +gl_barcode_free (glBarcode **gbc) +{ + GList *p; + + if (*gbc != NULL) { + + for (p = (*gbc)->lines; p != NULL; p = p->next) { + g_free (p->data); + p->data = NULL; + } + g_list_free ((*gbc)->lines); + (*gbc)->lines = NULL; + + for (p = (*gbc)->chars; p != NULL; p = p->next) { + g_free (p->data); + p->data = NULL; + } + g_list_free ((*gbc)->chars); + (*gbc)->chars = NULL; + + g_free (*gbc); + *gbc = NULL; + } +} + +/*****************************************************************************/ +/* Get a list of names for valid barcode styles. */ +/*****************************************************************************/ +GList * +gl_barcode_get_styles_list (void) +{ + gint i; + GList *list = NULL; + + for (i=0; backends[i].id != NULL; i++) { + list = g_list_append (list, g_strdup (backends[i].name)); + } + + return list; +} + +/*****************************************************************************/ +/* Free up a previously allocated list of style names. */ +/*****************************************************************************/ +void +gl_barcode_free_styles_list (GList *styles_list) +{ + GList *p; + + for (p=styles_list; p != NULL; p=p->next) { + g_free (p->data); + p->data = NULL; + } + + g_list_free (styles_list); +} + + +/*****************************************************************************/ +/* Return an appropriate set of digits for the given barcode style. */ +/*****************************************************************************/ +gchar * +gl_barcode_default_digits (const gchar *id, + guint n) +{ + int i; + + i = id_to_index (id); + + if (backends[i].can_freeform) { + + return g_strnfill (MAX (n,1), '0'); + + } else { + + return g_strdup (backends[i].default_digits); + + } +} + +/*****************************************************************************/ +/* Query text capabilities. */ +/*****************************************************************************/ +gboolean +gl_barcode_can_text (const gchar *id) +{ + return backends[id_to_index (id)].can_text; +} + +gboolean +gl_barcode_text_optional (const gchar *id) +{ + return backends[id_to_index (id)].text_optional; +} + +/*****************************************************************************/ +/* Query checksum capabilities. */ +/*****************************************************************************/ +gboolean +gl_barcode_can_csum (const gchar *id) +{ + return backends[id_to_index (id)].can_checksum; +} + +gboolean +gl_barcode_csum_optional (const gchar *id) +{ + return backends[id_to_index (id)].checksum_optional; +} + + +/*****************************************************************************/ +/* Query if freeform input is allowed. */ +/*****************************************************************************/ +gboolean +gl_barcode_can_freeform (const gchar *id) +{ + return backends[id_to_index (id)].can_freeform; +} + +/*****************************************************************************/ +/* Query prefered number of digits of input. */ +/*****************************************************************************/ +guint +gl_barcode_get_prefered_n (const gchar *id) +{ + return backends[id_to_index (id)].prefered_n; +} + +/*****************************************************************************/ +/* Convert style to text. */ +/*****************************************************************************/ +const gchar * +gl_barcode_id_to_name (const gchar *id) +{ + return backends[id_to_index (id)].name; +} + +/*****************************************************************************/ +/* Convert name to style. */ +/*****************************************************************************/ +const gchar * +gl_barcode_name_to_id (const gchar *name) +{ + g_return_val_if_fail (name!=NULL, backends[0].id); + + return backends[name_to_index (name)].id; +} diff --git a/glabels2/src/bc.h b/glabels2/src/bc.h new file mode 100644 index 00000000..f46d8897 --- /dev/null +++ b/glabels2/src/bc.h @@ -0,0 +1,90 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * bc.h: GLabels barcode module header file + * + * Copyright (C) 2001-2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __BC_H__ +#define __BC_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +typedef struct { + gdouble x, y, length, width; +} glBarcodeLine; + +typedef struct { + gdouble x, y, fsize; + gchar c; +} glBarcodeChar; + +typedef struct { + gdouble width, height; + GList *lines; /* List of glBarcodeLine */ + GList *chars; /* List of glBarcodeChar */ +} glBarcode; + +typedef glBarcode *(*glBarcodeNewFunc) (const gchar *id, + gboolean text_flag, + gboolean checksum_flag, + gdouble w, + gdouble h, + const gchar *digits); + + +#define GL_BARCODE_FONT_FAMILY "Sans" +#define GL_BARCODE_FONT_WEIGHT PANGO_WEIGHT_NORMAL + + +glBarcode *gl_barcode_new (const gchar *id, + gboolean text_flag, + gboolean checksum_flag, + gdouble w, + gdouble h, + const gchar *digits); + +void gl_barcode_free (glBarcode **bc); + +GList *gl_barcode_get_styles_list (void); +void gl_barcode_free_styles_list (GList *styles_list); + +gchar *gl_barcode_default_digits (const gchar *id, + guint n); + +gboolean gl_barcode_can_text (const gchar *id); +gboolean gl_barcode_text_optional (const gchar *id); + +gboolean gl_barcode_can_csum (const gchar *id); +gboolean gl_barcode_csum_optional (const gchar *id); + +gboolean gl_barcode_can_freeform (const gchar *id); +guint gl_barcode_get_prefered_n (const gchar *id); + +const gchar *gl_barcode_id_to_name (const gchar *id); +const gchar *gl_barcode_name_to_id (const gchar *name); + +G_END_DECLS + +#endif /* __BC_H__ */ + diff --git a/glabels2/src/cairo-ellipse-path.c b/glabels2/src/cairo-ellipse-path.c new file mode 100644 index 00000000..3a4cb888 --- /dev/null +++ b/glabels2/src/cairo-ellipse-path.c @@ -0,0 +1,79 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * cairo_ellipse_path.c: Cairo ellipse path module + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "cairo-ellipse-path.h" + +#include +#include + +#include "debug.h" + +/*===========================================*/ +/* Private macros and constants. */ +/*===========================================*/ + +#define ARC_FINE 2 + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + + + +/*****************************************************************************/ +/* Create ellipse path */ +/*****************************************************************************/ +void +gl_cairo_ellipse_path (cairo_t *cr, + gdouble rx, + gdouble ry) +{ + gdouble x, y; + gint i_theta; + + gl_debug (DEBUG_VIEW, "START"); + + cairo_new_path (cr); + cairo_move_to (cr, 2*rx, ry); + for (i_theta = ARC_FINE; i_theta <= 360; i_theta += ARC_FINE) { + x = rx + rx * cos (i_theta * G_PI / 180.0); + y = ry + ry * sin (i_theta * G_PI / 180.0); + cairo_line_to (cr, x, y); + } + cairo_close_path (cr); + + gl_debug (DEBUG_VIEW, "END"); +} + + diff --git a/glabels2/src/cairo-ellipse-path.h b/glabels2/src/cairo-ellipse-path.h new file mode 100644 index 00000000..3c6a7568 --- /dev/null +++ b/glabels2/src/cairo-ellipse-path.h @@ -0,0 +1,40 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * cairo_ellipse_path.h: Cairo ellipse path module header file + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __CAIRO_ELLIPSE_PATH_H__ +#define __CAIRO_ELLIPSE_PATH_H__ + +#include +#include + +G_BEGIN_DECLS + +void gl_cairo_ellipse_path (cairo_t *cr, + gdouble rx, + gdouble ry); + + +G_END_DECLS + +#endif diff --git a/glabels2/src/cairo-label-path.c b/glabels2/src/cairo-label-path.c new file mode 100644 index 00000000..1bc194ac --- /dev/null +++ b/glabels2/src/cairo-label-path.c @@ -0,0 +1,263 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * cairo_label_path.c: Cairo label path module + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "cairo-label-path.h" + +#include +#include + +#include "debug.h" + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void gl_cairo_rect_label_path (cairo_t *cr, + lglTemplate *template, + gboolean rotate_flag, + gboolean waste_flag); +static void gl_cairo_round_label_path (cairo_t *cr, + lglTemplate *template, + gboolean rotate_flag, + gboolean waste_flag); +static void gl_cairo_cd_label_path (cairo_t *cr, + lglTemplate *template, + gboolean rotate_flag, + gboolean waste_flag); + + +/*--------------------------------------------------------------------------*/ +/* Create label path */ +/*--------------------------------------------------------------------------*/ +void +gl_cairo_label_path (cairo_t *cr, + lglTemplate *template, + gboolean rotate_flag, + gboolean waste_flag) +{ + const lglTemplateFrame *frame; + + gl_debug (DEBUG_PATH, "START"); + + frame = (lglTemplateFrame *)template->frames->data; + + switch (frame->shape) { + + case LGL_TEMPLATE_FRAME_SHAPE_RECT: + gl_cairo_rect_label_path (cr, template, rotate_flag, waste_flag); + break; + + case LGL_TEMPLATE_FRAME_SHAPE_ROUND: + gl_cairo_round_label_path (cr, template, rotate_flag, waste_flag); + break; + + case LGL_TEMPLATE_FRAME_SHAPE_CD: + gl_cairo_cd_label_path (cr, template, rotate_flag, waste_flag); + break; + + default: + g_message ("Unknown label style"); + break; + } + + gl_debug (DEBUG_PATH, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* Create rectangular label path */ +/*--------------------------------------------------------------------------*/ +static void +gl_cairo_rect_label_path (cairo_t *cr, + lglTemplate *template, + gboolean rotate_flag, + gboolean waste_flag) +{ + const lglTemplateFrame *frame; + gdouble w, h, r; + gdouble x_waste, y_waste; + + gl_debug (DEBUG_PATH, "START"); + + frame = (lglTemplateFrame *)template->frames->data; + r = frame->rect.r; + + x_waste = 0.0; + y_waste = 0.0; + + if (rotate_flag) + { + lgl_template_frame_get_size (frame, &h, &w); + if (waste_flag) + { + x_waste = frame->rect.y_waste; + y_waste = frame->rect.x_waste; + } + } + else + { + lgl_template_frame_get_size (frame, &w, &h); + if (waste_flag) + { + x_waste = frame->rect.x_waste; + y_waste = frame->rect.y_waste; + } + } + + + if ( r == 0.0 ) + { + cairo_rectangle (cr, -x_waste, -y_waste, w+x_waste, h+y_waste); + } + else + { + cairo_new_path (cr); + cairo_arc_negative (cr, r-x_waste, r-y_waste, r, 3*G_PI/2, G_PI); + cairo_arc_negative (cr, r-x_waste, h-r+y_waste, r, G_PI, G_PI/2); + cairo_arc_negative (cr, w-r+x_waste, h-r+y_waste, r, G_PI/2, 0.); + cairo_arc_negative (cr, w-r+x_waste, r-y_waste, r, 2*G_PI, 3*G_PI/2); + cairo_close_path (cr); + } + + gl_debug (DEBUG_PATH, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* Create round label path */ +/*--------------------------------------------------------------------------*/ +static void +gl_cairo_round_label_path (cairo_t *cr, + lglTemplate *template, + gboolean rotate_flag, + gboolean waste_flag) +{ + const lglTemplateFrame *frame; + gdouble w, h; + gdouble waste; + + gl_debug (DEBUG_PATH, "START"); + + frame = (lglTemplateFrame *)template->frames->data; + + if (rotate_flag) + { + lgl_template_frame_get_size (frame, &h, &w); + } + else + { + lgl_template_frame_get_size (frame, &w, &h); + } + + if (waste_flag) + { + waste = frame->round.waste; + } + else + { + waste = 0.0; + } + + cairo_arc (cr, w/2, h/2, w/2+waste, 0.0, 2*G_PI); + cairo_close_path (cr); + + gl_debug (DEBUG_PATH, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* Create cd label path */ +/*--------------------------------------------------------------------------*/ +static void +gl_cairo_cd_label_path (cairo_t *cr, + lglTemplate *template, + gboolean rotate_flag, + gboolean waste_flag) +{ + const lglTemplateFrame *frame; + gdouble w, h; + gdouble xc, yc; + gdouble r1, r2; + gdouble theta1, theta2; + gdouble waste; + + gl_debug (DEBUG_PATH, "START"); + + frame = (lglTemplateFrame *)template->frames->data; + + if (rotate_flag) + { + lgl_template_frame_get_size (frame, &h, &w); + } + else + { + lgl_template_frame_get_size (frame, &w, &h); + } + + xc = w/2.0; + yc = h/2.0; + + r1 = frame->cd.r1; + r2 = frame->cd.r2; + + if (waste_flag) + { + waste = frame->cd.waste; + } + else + { + waste = 0.0; + } + + /* + * Outer path (may be clipped in the case of a business card type CD) + */ + theta1 = acos (w / (2.0*r1)); + theta2 = asin (h / (2.0*r1)); + + cairo_new_path (cr); + cairo_arc (cr, xc, yc, r1+waste, theta1, theta2); + cairo_arc (cr, xc, yc, r1+waste, G_PI-theta2, G_PI-theta1); + cairo_arc (cr, xc, yc, r1+waste, G_PI+theta1, G_PI+theta2); + cairo_arc (cr, xc, yc, r1+waste, 2*G_PI-theta2, 2*G_PI-theta1); + cairo_close_path (cr); + + + /* + * Inner path (hole) + */ + cairo_new_sub_path (cr); + cairo_arc (cr, xc, yc, r2-waste, 0.0, 2*G_PI); + cairo_close_path (cr); + + gl_debug (DEBUG_PATH, "END"); +} + diff --git a/glabels2/src/cairo-label-path.h b/glabels2/src/cairo-label-path.h new file mode 100644 index 00000000..ad0495f5 --- /dev/null +++ b/glabels2/src/cairo-label-path.h @@ -0,0 +1,40 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * cairo_label_path.h: Cairo label path module header file + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __CAIRO_LABEL_PATH_H__ +#define __CAIRO_LABEL_PATH_H__ + +#include +#include + +G_BEGIN_DECLS + +void gl_cairo_label_path (cairo_t *cr, + lglTemplate *template, + gboolean rotate_flag, + gboolean waste_flag); + +G_END_DECLS + +#endif diff --git a/glabels2/src/cairo-markup-path.c b/glabels2/src/cairo-markup-path.c new file mode 100644 index 00000000..cb7ead7c --- /dev/null +++ b/glabels2/src/cairo-markup-path.c @@ -0,0 +1,315 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * cairo_markup_path.c: Cairo markup path module + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "cairo-markup-path.h" + +#include +#include + +#include "debug.h" + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void gl_cairo_markup_margin_path (cairo_t *cr, + const lglTemplateMarkup *markup, + glLabel *label); + +static void gl_cairo_markup_margin_rect_path (cairo_t *cr, + const lglTemplateMarkup *markup, + glLabel *label); + +static void gl_cairo_markup_margin_round_path (cairo_t *cr, + const lglTemplateMarkup *markup, + glLabel *label); + +static void gl_cairo_markup_margin_cd_path (cairo_t *cr, + const lglTemplateMarkup *markup, + glLabel *label); + +static void gl_cairo_markup_line_path (cairo_t *cr, + const lglTemplateMarkup *markup); + +static void gl_cairo_markup_circle_path (cairo_t *cr, + const lglTemplateMarkup *markup); + +static void gl_cairo_markup_rect_path (cairo_t *cr, + const lglTemplateMarkup *markup); + + +/*--------------------------------------------------------------------------*/ +/* Create markup path */ +/*--------------------------------------------------------------------------*/ +void +gl_cairo_markup_path (cairo_t *cr, + const lglTemplateMarkup *markup, + glLabel *label) +{ + gl_debug (DEBUG_PATH, "START"); + + switch (markup->type) { + case LGL_TEMPLATE_MARKUP_MARGIN: + gl_cairo_markup_margin_path (cr, markup, label); + break; + case LGL_TEMPLATE_MARKUP_LINE: + gl_cairo_markup_line_path (cr, markup); + break; + case LGL_TEMPLATE_MARKUP_CIRCLE: + gl_cairo_markup_circle_path (cr, markup); + break; + case LGL_TEMPLATE_MARKUP_RECT: + gl_cairo_markup_rect_path (cr, markup); + break; + default: + g_message ("Unknown template markup type"); + break; + } + + gl_debug (DEBUG_PATH, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Draw margin markup. */ +/*---------------------------------------------------------------------------*/ +static void +gl_cairo_markup_margin_path (cairo_t *cr, + const lglTemplateMarkup *markup, + glLabel *label) +{ + const lglTemplateFrame *frame; + + gl_debug (DEBUG_PATH, "START"); + + frame = (lglTemplateFrame *)label->template->frames->data; + + switch (frame->shape) { + + case LGL_TEMPLATE_FRAME_SHAPE_RECT: + gl_cairo_markup_margin_rect_path (cr, markup, label); + break; + + case LGL_TEMPLATE_FRAME_SHAPE_ROUND: + gl_cairo_markup_margin_round_path (cr, markup, label); + break; + + case LGL_TEMPLATE_FRAME_SHAPE_CD: + gl_cairo_markup_margin_cd_path (cr, markup, label); + break; + + default: + g_message ("Unknown template label style"); + break; + } + + gl_debug (DEBUG_PATH, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Draw simple recangular margin. */ +/*---------------------------------------------------------------------------*/ +static void +gl_cairo_markup_margin_rect_path (cairo_t *cr, + const lglTemplateMarkup *markup, + glLabel *label) +{ + const lglTemplateFrame *frame; + gdouble w, h, r, m; + + gl_debug (DEBUG_PATH, "START"); + + frame = (lglTemplateFrame *)label->template->frames->data; + + m = markup->margin.size; + + gl_label_get_size (label, &w, &h); + w = w - 2*m; + h = h - 2*m; + r = MAX (frame->rect.r - m, 0.0); + + if ( r == 0.0 ) + { + cairo_rectangle (cr, m, m, w, h); + } + else + { + cairo_new_path (cr); + cairo_arc_negative (cr, m+r, m+r, r, 3*G_PI/2, G_PI); + cairo_arc_negative (cr, m+r, m+h-r, r, G_PI, G_PI/2); + cairo_arc_negative (cr, m+w-r, m+h-r, r, G_PI/2, 0.); + cairo_arc_negative (cr, m+w-r, m+r, r, 2*G_PI, 3*G_PI/2); + cairo_close_path (cr); + } + + gl_debug (DEBUG_PATH, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Draw round margin. */ +/*---------------------------------------------------------------------------*/ +static void +gl_cairo_markup_margin_round_path (cairo_t *cr, + const lglTemplateMarkup *markup, + glLabel *label) +{ + const lglTemplateFrame *frame; + gdouble r, m; + + gl_debug (DEBUG_PATH, "START"); + + frame = (lglTemplateFrame *)label->template->frames->data; + + r = frame->round.r; + m = markup->margin.size; + + cairo_arc (cr, r, r, r-m, 0, 2*G_PI); + cairo_close_path (cr); + + gl_debug (DEBUG_PATH, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Draw CD margins. */ +/*---------------------------------------------------------------------------*/ +static void +gl_cairo_markup_margin_cd_path (cairo_t *cr, + const lglTemplateMarkup *markup, + glLabel *label) +{ + const lglTemplateFrame *frame; + gdouble m, r1, r2; + gdouble theta1, theta2; + gdouble xc, yc; + gdouble w, h; + + gl_debug (DEBUG_PATH, "START"); + + frame = (lglTemplateFrame *)label->template->frames->data; + + gl_label_get_size (label, &w, &h); + xc = w/2.0; + yc = h/2.0; + + m = markup->margin.size; + r1 = frame->cd.r1 - m; + r2 = frame->cd.r2 + m; + + + /* + * Outer path (may be clipped) + */ + theta1 = acos ((w-2*m) / (2.0*r1)); + theta2 = asin ((h-2*m) / (2.0*r1)); + + cairo_new_path (cr); + cairo_arc (cr, xc, yc, r1, theta1, theta2); + cairo_arc (cr, xc, yc, r1, G_PI-theta2, G_PI-theta1); + cairo_arc (cr, xc, yc, r1, G_PI+theta1, G_PI+theta2); + cairo_arc (cr, xc, yc, r1, 2*G_PI-theta2, 2*G_PI-theta1); + cairo_close_path (cr); + + + /* Inner path (hole) */ + cairo_new_sub_path (cr); + cairo_arc (cr, xc, yc, r2, 0.0, 2*G_PI); + cairo_close_path (cr); + + gl_debug (DEBUG_PATH, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Draw line markup. */ +/*---------------------------------------------------------------------------*/ +static void +gl_cairo_markup_line_path (cairo_t *cr, + const lglTemplateMarkup *markup) +{ + gl_debug (DEBUG_PATH, "START"); + + cairo_move_to (cr, markup->line.x1, markup->line.y1); + cairo_line_to (cr, markup->line.x2, markup->line.y2); + + gl_debug (DEBUG_PATH, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Draw circle markup. */ +/*---------------------------------------------------------------------------*/ +static void +gl_cairo_markup_circle_path (cairo_t *cr, + const lglTemplateMarkup *markup) +{ + gl_debug (DEBUG_PATH, "START"); + + cairo_arc (cr, + markup->circle.x0, markup->circle.y0, + markup->circle.r, + 0.0, 2*G_PI); + cairo_close_path (cr); + + gl_debug (DEBUG_PATH, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Draw rect markup. */ +/*---------------------------------------------------------------------------*/ +static void +gl_cairo_markup_rect_path (cairo_t *cr, + const lglTemplateMarkup *markup) +{ + gdouble x1 = markup->rect.x1; + gdouble y1 = markup->rect.y1; + gdouble w = markup->rect.w; + gdouble h = markup->rect.h; + gdouble r = markup->rect.r; + + gl_debug (DEBUG_PATH, "START"); + + if ( r == 0.0 ) + { + cairo_rectangle (cr, x1, y1, w, h); + } + else + { + cairo_new_path (cr); + cairo_arc_negative (cr, x1+r, y1+r, r, 3*G_PI/2, G_PI); + cairo_arc_negative (cr, x1+r, y1+h-r, r, G_PI, G_PI/2); + cairo_arc_negative (cr, x1+w-r, y1+h-r, r, G_PI/2, 0.); + cairo_arc_negative (cr, x1+w-r, y1+r, r, 2*G_PI, 3*G_PI/2); + cairo_close_path (cr); + } + + gl_debug (DEBUG_PATH, "END"); +} + diff --git a/glabels2/src/cairo-markup-path.h b/glabels2/src/cairo-markup-path.h new file mode 100644 index 00000000..9dfab554 --- /dev/null +++ b/glabels2/src/cairo-markup-path.h @@ -0,0 +1,40 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * cairo_markup_path.h: Cairo markup path module header file + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __CAIRO_MARKUP_PATH_H__ +#define __CAIRO_MARKUP_PATH_H__ + +#include +#include +#include "label.h" + +G_BEGIN_DECLS + +void gl_cairo_markup_path (cairo_t *cr, + const lglTemplateMarkup *markup, + glLabel *label); + +G_END_DECLS + +#endif diff --git a/glabels2/src/color.c b/glabels2/src/color.c new file mode 100644 index 00000000..e8c039dc --- /dev/null +++ b/glabels2/src/color.c @@ -0,0 +1,243 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * color.c: various small utilities for dealing with canvas colors + * + * Copyright (C) 2002-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "color.h" + +#include + +/*****************************************************************************/ +/* Apply given opacity to given color. */ +/*****************************************************************************/ +guint +gl_color_set_opacity (guint color, + gdouble opacity) +{ + guint new_color; + + new_color = (color & 0xFFFFFF00) | (((guint)(255.0*opacity)) & 0xFF); + + return new_color; +} + +/*****************************************************************************/ +/* Resolve actual shadow color by adjusting opacity. */ +/*****************************************************************************/ +guint +gl_color_shadow (guint base_color, + gdouble opacity, + guint object_color) +{ + guint color; + + color = gl_color_set_opacity (base_color, + opacity * GL_COLOR_F_ALPHA (object_color)); + + return color; +} + +/*****************************************************************************/ +/* Convert gLabels color into a GdkColor */ +/*****************************************************************************/ +GdkColor * +gl_color_to_gdk_color (guint color) +{ + GdkColor *gdk_color; + + gdk_color = g_new0 (GdkColor, 1); + + gdk_color->red = GL_COLOR_F_RED (color) * 65535; + gdk_color->green = GL_COLOR_F_GREEN (color) * 65535; + gdk_color->blue = GL_COLOR_F_BLUE (color) * 65535; + + return gdk_color; +} + +/*****************************************************************************/ +/* Convert GdkColor into a gLabels color */ +/*****************************************************************************/ +guint +gl_color_from_gdk_color (GdkColor *gdk_color) +{ + guint color; + + color = GL_COLOR ((gdk_color->red >>8), + (gdk_color->green >>8), + (gdk_color->blue >>8)); + + return color; +} + +/****************************************************************************/ +/* Create a single color node with default color. */ +/****************************************************************************/ +glColorNode * +gl_color_node_new_default (void) +{ + glColorNode* color_node; + + color_node = g_new0(glColorNode,1); + + color_node->field_flag = FALSE; + color_node->color = GL_COLOR_NONE; + color_node->key = NULL; + + return color_node; +} + +/****************************************************************************/ +/* Copy a single color node. */ +/****************************************************************************/ +glColorNode * +gl_color_node_dup (glColorNode *src) +{ + glColorNode *dst; + + if ( src == NULL ) return NULL; + + dst = g_new0 (glColorNode, 1); + + dst->field_flag = src->field_flag; + if (src->key != NULL) + { + dst->key = g_strdup (src->key); + } + else + { + dst->key = NULL; + } + dst->color = src->color; + + return dst; +} + +/****************************************************************************/ +/* Compare 2 color nodes for equality. */ +/****************************************************************************/ +gboolean +gl_color_node_equal (glColorNode *color_node1, + glColorNode *color_node2) +{ + /* First take care of the case of either or both being NULL. */ + if ( color_node1 == NULL ) + { + return ( color_node2 == NULL ); + } + else + { + if ( color_node2 == NULL ) + { + return FALSE; + } + } + + /* Bail if field flags differ. */ + if ( color_node1->field_flag != color_node2->field_flag ) + { + return FALSE; + } + + /* Now take care of the case of either or both color fields being different. */ + if ( color_node1->color != color_node2->color ) + { + return FALSE; + } + + /* Then take care of the case of either or both key fields being NULL. */ + if ( color_node1->key == NULL ) + { + return ( color_node2->key == NULL ); + } + else + { + if ( color_node2->key == NULL ) + { + return FALSE; + } + } + + /* Field flags are identical, so now compare the keys. */ + return (strcmp (color_node1->key, color_node2->key) == 0); +} + +/****************************************************************************/ +/* Expand single node into representative color. */ +/****************************************************************************/ +guint +gl_color_node_expand (glColorNode *color_node, + glMergeRecord *record) +{ + gchar *text; + GdkColor *gdk_color; + guint color; + + if (color_node->field_flag) + { + if (record == NULL) + { + return GL_COLOR_NONE; + } + else + { + text = gl_merge_eval_key (record, color_node->key); + if (text != NULL) + { + gdk_color = g_new0 (GdkColor, 1); + if (gdk_color_parse (text, gdk_color)) + { + color = gl_color_from_gdk_color (gdk_color); + g_free (gdk_color); + return color; + } + else + { + g_free (gdk_color); + return GL_COLOR_NONE; + } + } + else + { + return GL_COLOR_NONE; + } + } + } + else + { + return color_node->color; + } +} + +/****************************************************************************/ +/* Free a single color node. */ +/****************************************************************************/ +void +gl_color_node_free (glColorNode **color_node) +{ + if ( *color_node == NULL ) return; + + g_free ((*color_node)->key); + (*color_node)->key = NULL; + g_free (*color_node); + *color_node = NULL; +} diff --git a/glabels2/src/color.h b/glabels2/src/color.h new file mode 100644 index 00000000..c4403ad5 --- /dev/null +++ b/glabels2/src/color.h @@ -0,0 +1,119 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * color.h: various small utilities for dealing with canvas colors + * + * Copyright (C) 2002-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __COLOR_H__ +#define __COLOR_H__ + +#include "merge.h" +#include + +G_BEGIN_DECLS + +/* + * gLabels stores colors as a 32-bit unsigned integer in RGBA format (MSByte = Red) + */ +#define GL_COLOR(r,g,b) ( (((unsigned int) (r) & 0xff) << 24) \ + | (((unsigned int) (g) & 0xff) << 16) \ + | (((unsigned int) (b) & 0xff) << 8) \ + | 0xff ) + +#define GL_COLOR_A(r,g,b,a) ( (((unsigned int) (r) & 0xff) << 24) \ + | (((unsigned int) (g) & 0xff) << 16) \ + | (((unsigned int) (b) & 0xff) << 8) \ + | ( (unsigned int) (a) & 0xff ) ) + + +#define GL_COLOR_NONE GL_COLOR_A(0,0,0,0) +#define GL_COLOR_FILL_MERGE_DEFAULT GL_COLOR_A(255,255,255,128) +#define GL_COLOR_MERGE_DEFAULT GL_COLOR_A(0,0,0,128) +#define GL_COLOR_SHADOW_DEFAULT GL_COLOR(0,0,0) +#define GL_COLOR_SHADOW_MERGE_DEFAULT GL_COLOR_A(0,0,0,255) + + +/* + * Extract components as floating point (0.0 .. 1.0) + */ +#define GL_COLOR_F_RED(x) ( (((x)>>24) & 0xff) / 255.0 ) +#define GL_COLOR_F_GREEN(x) ( (((x)>>16) & 0xff) / 255.0 ) +#define GL_COLOR_F_BLUE(x) ( (((x)>>8) & 0xff) / 255.0 ) +#define GL_COLOR_F_ALPHA(x) ( ( (x) & 0xff) / 255.0 ) + +/* + * Extract arguments for cairo_set_source_rgb() + */ +#define GL_COLOR_RGB_ARGS(x) \ + GL_COLOR_F_RED(x), \ + GL_COLOR_F_GREEN(x), \ + GL_COLOR_F_BLUE(x) + +/* + * Extract arguments for cairo_set_source_rgba() + */ +#define GL_COLOR_RGBA_ARGS(x) \ + GL_COLOR_F_RED(x), \ + GL_COLOR_F_GREEN(x), \ + GL_COLOR_F_BLUE(x), \ + GL_COLOR_F_ALPHA(x) + + + + +guint gl_color_set_opacity (guint color, + gdouble opacity); + +guint gl_color_shadow (guint base_color, + gdouble opacity, + guint object_color); + +/* + * Routines to convert to/from GdkColor. + */ +GdkColor *gl_color_to_gdk_color (guint color); + +guint gl_color_from_gdk_color (GdkColor *gdk_color); + + + +/* + * Color nodes + */ +typedef struct { + gboolean field_flag; + guint color; + gchar *key; +} glColorNode; + +glColorNode *gl_color_node_new_default (void); + +glColorNode *gl_color_node_dup (glColorNode *color_node); +gboolean gl_color_node_equal (glColorNode *color_node1, + glColorNode *color_node2); +guint gl_color_node_expand (glColorNode *color_node, + glMergeRecord *record); +void gl_color_node_free (glColorNode **color_node); + + +G_END_DECLS + +#endif /* __COLOR_H__ */ diff --git a/glabels2/src/critical-error-handler.c b/glabels2/src/critical-error-handler.c new file mode 100644 index 00000000..c35c4e17 --- /dev/null +++ b/glabels2/src/critical-error-handler.c @@ -0,0 +1,83 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * critical-error-handler.c: critical error handler + * + * Copyright (C) 2005 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include + +#include "critical-error-handler.h" + +#include +#include +#include +#include +#include + +static void critical_error_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data); + + +/***************************************************************************/ +/* Initialize error handler. */ +/***************************************************************************/ +void +gl_critical_error_handler_init (void) +{ + g_log_set_handler ("LibGlabels", + G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, + critical_error_handler, + "libglabels"); + + g_log_set_handler (G_LOG_DOMAIN, + G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, + critical_error_handler, + "glabels"); +} + +/*-------------------------------------------------------------------------*/ +/* PRIVATE. Actual error handler. */ +/*-------------------------------------------------------------------------*/ +static void +critical_error_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data) +{ + GtkWidget *dialog; + + dialog = gtk_message_dialog_new (NULL, + GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_NONE, + _("gLabels Fatal Error!")); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + message); + gtk_dialog_add_button (GTK_DIALOG (dialog), + GTK_STOCK_QUIT, 0); + + gtk_dialog_run (GTK_DIALOG (dialog)); + + abort (); +} + diff --git a/glabels2/src/critical-error-handler.h b/glabels2/src/critical-error-handler.h new file mode 100644 index 00000000..890db9b5 --- /dev/null +++ b/glabels2/src/critical-error-handler.h @@ -0,0 +1,36 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * critical-error-handler.h: critical error handler header file + * + * Copyright (C) 2005 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __CRITICAL_ERROR_HANDLER_H__ +#define __CRITICAL_ERROR_HANDLER_H__ + +#include + +G_BEGIN_DECLS + +void gl_critical_error_handler_init (void); + +G_END_DECLS + +#endif diff --git a/glabels2/src/debug.c b/glabels2/src/debug.c new file mode 100644 index 00000000..eea3fe5d --- /dev/null +++ b/glabels2/src/debug.c @@ -0,0 +1,129 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * debug.c: GLabels debug module + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * This file is based on gedit-debug.c from gedit2: + * + * Copyright (C) 1998, 1999 Alex Roberts, Evan Lawrence + * Copyright (C) 2000, 2001 Chema Celorio, Paolo Maggi + * + */ + +#include "debug.h" + +#include +#include +#include +#include + +glDebugSection debug_flags = GLABELS_DEBUG_NONE; + +/****************************************************************************/ +/* Initialize debug flags, based on environmental variables. */ +/****************************************************************************/ +void +gl_debug_init (void) +{ + if (g_getenv ("GLABELS_DEBUG") != NULL) + { + /* enable all debugging */ + debug_flags = ~GLABELS_DEBUG_NONE; + return; + } + + if (g_getenv ("GLABELS_DEBUG_VIEW") != NULL) + debug_flags |= GLABELS_DEBUG_VIEW; + if (g_getenv ("GLABELS_DEBUG_ITEM") != NULL) + debug_flags |= GLABELS_DEBUG_ITEM; + if (g_getenv ("GLABELS_DEBUG_PRINT") != NULL) + debug_flags |= GLABELS_DEBUG_PRINT; + if (g_getenv ("GLABELS_DEBUG_PREFS") != NULL) + debug_flags |= GLABELS_DEBUG_PREFS; + if (g_getenv ("GLABELS_DEBUG_FILE") != NULL) + debug_flags |= GLABELS_DEBUG_FILE; + if (g_getenv ("GLABELS_DEBUG_LABEL") != NULL) + debug_flags |= GLABELS_DEBUG_LABEL; + if (g_getenv ("GLABELS_DEBUG_TEMPLATE") != NULL) + debug_flags |= GLABELS_DEBUG_TEMPLATE; + if (g_getenv ("GLABELS_DEBUG_PAPER") != NULL) + debug_flags |= GLABELS_DEBUG_PAPER; + if (g_getenv ("GLABELS_DEBUG_XML") != NULL) + debug_flags |= GLABELS_DEBUG_XML; + if (g_getenv ("GLABELS_DEBUG_MERGE") != NULL) + debug_flags |= GLABELS_DEBUG_MERGE; + if (g_getenv ("GLABELS_DEBUG_UNDO") != NULL) + debug_flags |= GLABELS_DEBUG_UNDO; + if (g_getenv ("GLABELS_DEBUG_RECENT") != NULL) + debug_flags |= GLABELS_DEBUG_RECENT; + if (g_getenv ("GLABELS_DEBUG_COMMANDS") != NULL) + debug_flags |= GLABELS_DEBUG_COMMANDS; + if (g_getenv ("GLABELS_DEBUG_WINDOW") != NULL) + debug_flags |= GLABELS_DEBUG_WINDOW; + if (g_getenv ("GLABELS_DEBUG_UI") != NULL) + debug_flags |= GLABELS_DEBUG_UI; + if (g_getenv ("GLABELS_DEBUG_PROPERTY_BAR") != NULL) + debug_flags |= GLABELS_DEBUG_PROPERTY_BAR; + if (g_getenv ("GLABELS_DEBUG_MEDIA_SELECT") != NULL) + debug_flags |= GLABELS_DEBUG_MEDIA_SELECT; + if (g_getenv ("GLABELS_DEBUG_MINI_PREVIEW") != NULL) + debug_flags |= GLABELS_DEBUG_MINI_PREVIEW; + if (g_getenv ("GLABELS_DEBUG_PIXBUF_CACHE") != NULL) + debug_flags |= GLABELS_DEBUG_PIXBUF_CACHE; + if (g_getenv ("GLABELS_DEBUG_EDITOR") != NULL) + debug_flags |= GLABELS_DEBUG_EDITOR; + if (g_getenv ("GLABELS_DEBUG_WDGT") != NULL) + debug_flags |= GLABELS_DEBUG_WDGT; + if (g_getenv ("GLABELS_DEBUG_PATH") != NULL) + debug_flags |= GLABELS_DEBUG_PATH; +} + + +/****************************************************************************/ +/* Print debugging information. */ +/****************************************************************************/ +void +gl_debug (glDebugSection section, + const gchar *file, + gint line, + const gchar *function, + const gchar *format, + ...) +{ + if (debug_flags & section) + { + va_list args; + gchar *msg; + + g_return_if_fail (format != NULL); + + va_start (args, format); + msg = g_strdup_vprintf (format, args); + va_end (args); + + g_print ("%s:%d (%s) %s\n", file, line, function, msg); + + g_free (msg); + } + +} diff --git a/glabels2/src/debug.h b/glabels2/src/debug.h new file mode 100644 index 00000000..5840487d --- /dev/null +++ b/glabels2/src/debug.h @@ -0,0 +1,110 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * debug.h: GLabels debug module + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * This file is based on gedit-debug.h from gedit2: + * + * Copyright (C) 1998, 1999 Alex Roberts, Evan Lawrence + * Copyright (C) 2000, 2001 Chema Celorio, Paolo Maggi + * + */ +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +#include + +G_BEGIN_DECLS + +/* + * Set an environmental var of the same name to turn on + * debugging output. Setting GLABELS_DEBUG will turn on all + * sections. + */ + +typedef enum { + GLABELS_DEBUG_NONE = 0, + GLABELS_DEBUG_VIEW = 1 << 0, + GLABELS_DEBUG_ITEM = 1 << 1, + GLABELS_DEBUG_PRINT = 1 << 2, + GLABELS_DEBUG_PREFS = 1 << 3, + GLABELS_DEBUG_FILE = 1 << 4, + GLABELS_DEBUG_LABEL = 1 << 5, + GLABELS_DEBUG_TEMPLATE = 1 << 6, + GLABELS_DEBUG_PAPER = 1 << 7, + GLABELS_DEBUG_XML = 1 << 8, + GLABELS_DEBUG_MERGE = 1 << 9, + GLABELS_DEBUG_UNDO = 1 << 10, + GLABELS_DEBUG_RECENT = 1 << 11, + GLABELS_DEBUG_COMMANDS = 1 << 12, + GLABELS_DEBUG_WINDOW = 1 << 13, + GLABELS_DEBUG_UI = 1 << 14, + GLABELS_DEBUG_PROPERTY_BAR = 1 << 15, + GLABELS_DEBUG_MEDIA_SELECT = 1 << 16, + GLABELS_DEBUG_MINI_PREVIEW = 1 << 17, + GLABELS_DEBUG_PIXBUF_CACHE = 1 << 18, + GLABELS_DEBUG_EDITOR = 1 << 19, + GLABELS_DEBUG_WDGT = 1 << 20, + GLABELS_DEBUG_PATH = 1 << 21, +} glDebugSection; + + +#ifndef __GNUC__ +#define __FUNCTION__ "" +#endif + +#define DEBUG_VIEW GLABELS_DEBUG_VIEW, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_ITEM GLABELS_DEBUG_ITEM, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_PRINT GLABELS_DEBUG_PRINT, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_PREFS GLABELS_DEBUG_PREFS, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_FILE GLABELS_DEBUG_FILE, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_LABEL GLABELS_DEBUG_LABEL, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_TEMPLATE GLABELS_DEBUG_TEMPLATE,__FILE__, __LINE__, __FUNCTION__ +#define DEBUG_PAPER GLABELS_DEBUG_PAPER, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_XML GLABELS_DEBUG_XML, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_MERGE GLABELS_DEBUG_MERGE, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_UNDO GLABELS_DEBUG_UNDO, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_RECENT GLABELS_DEBUG_RECENT, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_COMMANDS GLABELS_DEBUG_COMMANDS,__FILE__, __LINE__, __FUNCTION__ +#define DEBUG_WINDOW GLABELS_DEBUG_WINDOW, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_UI GLABELS_DEBUG_UI, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_PROPERTY_BAR GLABELS_DEBUG_PROPERTY_BAR, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_MEDIA_SELECT GLABELS_DEBUG_MEDIA_SELECT, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_MINI_PREVIEW GLABELS_DEBUG_MINI_PREVIEW, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_PIXBUF_CACHE GLABELS_DEBUG_PIXBUF_CACHE, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_EDITOR GLABELS_DEBUG_EDITOR, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_WDGT GLABELS_DEBUG_WDGT, __FILE__, __LINE__, __FUNCTION__ +#define DEBUG_PATH GLABELS_DEBUG_PATH, __FILE__, __LINE__, __FUNCTION__ + +void gl_debug_init (void); + +void gl_debug (glDebugSection section, + const gchar *file, + gint line, + const gchar *function, + const gchar *format, + ...); + +G_END_DECLS + +#endif /* __DEBUG_H__ */ diff --git a/glabels2/src/file.c b/glabels2/src/file.c new file mode 100644 index 00000000..58dc4916 --- /dev/null +++ b/glabels2/src/file.c @@ -0,0 +1,844 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * file.c: FILE menu dialog module + * + * Copyright (C) 2001 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "file.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "xml-label.h" +#include "recent.h" +#include "util.h" +#include "window.h" +#include "new-label-dialog.h" +#include "libglabels/libglabels.h" +#include "debug.h" + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/* Saved state for new dialog */ +static gchar *page_size = NULL; +static gchar *category = NULL; +static gchar *sheet_name = NULL; +static gboolean rotate_flag = FALSE; + +/* Saved state of file selectors */ +static gchar *open_path = NULL; +static gchar *save_path = NULL; + +/*===========================================*/ +/* Local function prototypes. */ +/*===========================================*/ +static void new_response (GtkDialog *dialog, + gint response, + gpointer user_data); + +static void properties_response (GtkDialog *dialog, + gint response, + gpointer user_data); + +static void open_response (GtkDialog *chooser, + gint response, + glWindow *window); +static void save_as_response (GtkDialog *chooser, + gint response, + glLabel *label); + + +/*****************************************************************************/ +/* "New" menu callback. */ +/*****************************************************************************/ +void +gl_file_new (glWindow *window) +{ + GtkWidget *dialog; + + gl_debug (DEBUG_FILE, "START"); + + g_return_if_fail (window && GTK_IS_WINDOW (window)); + + dialog = gl_new_label_dialog_new (GTK_WINDOW (window)); + gtk_window_set_title (GTK_WINDOW (dialog), _("New Label or Card")); + + g_object_set_data (G_OBJECT (dialog), "parent_window", window); + + g_signal_connect (G_OBJECT(dialog), "response", + G_CALLBACK (new_response), dialog); + + if (page_size != NULL) { + gl_new_label_dialog_set_filter_parameters (GL_NEW_LABEL_DIALOG (dialog), + page_size, + category); + } + if (sheet_name != NULL) { + gl_new_label_dialog_set_template_name (GL_NEW_LABEL_DIALOG (dialog), + sheet_name); + } + gl_new_label_dialog_set_rotate_state (GL_NEW_LABEL_DIALOG (dialog), rotate_flag); + + gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); + gtk_widget_show_all (GTK_WIDGET (dialog)); + + gl_debug (DEBUG_FILE, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. New "ok" button callback. */ +/*---------------------------------------------------------------------------*/ +static void +new_response (GtkDialog *dialog, + gint response, + gpointer user_data) +{ + lglTemplate *template; + glLabel *label; + glWindow *window; + GtkWidget *new_window; + + gl_debug (DEBUG_FILE, "START"); + + switch (response) { + + case GTK_RESPONSE_OK: + + gl_new_label_dialog_get_filter_parameters (GL_NEW_LABEL_DIALOG (dialog), + &page_size, + &category); + + if (sheet_name != NULL) + g_free (sheet_name); + sheet_name = + gl_new_label_dialog_get_template_name (GL_NEW_LABEL_DIALOG (dialog)); + + rotate_flag = + gl_new_label_dialog_get_rotate_state (GL_NEW_LABEL_DIALOG (dialog)); + + template = lgl_db_lookup_template_from_name (sheet_name); + + label = GL_LABEL(gl_label_new ()); + gl_label_set_template (label, template); + gl_label_set_rotate_flag (label, rotate_flag); + + lgl_template_free (template); + + window = + GL_WINDOW (g_object_get_data (G_OBJECT (dialog), + "parent_window")); + if ( gl_window_is_empty (window) ) { + gl_window_set_label (window, label); + } else { + new_window = gl_window_new_from_label (label); + gtk_widget_show_all (new_window); + } + + break; + + default: + break; + } + + gtk_widget_destroy (GTK_WIDGET (dialog)); + + gl_debug (DEBUG_FILE, "END"); +} + +/*****************************************************************************/ +/* "Properties" menu callback. */ +/*****************************************************************************/ +void +gl_file_properties (glLabel *label, + glWindow *window) +{ + GtkWidget *dialog; + gchar *name; + + gl_debug (DEBUG_FILE, "START"); + + g_return_if_fail (label && GL_IS_LABEL (label)); + g_return_if_fail (window && GTK_IS_WINDOW (window)); + + dialog = gl_new_label_dialog_new (GTK_WINDOW (window)); + gtk_window_set_title (GTK_WINDOW (dialog), _("Label properties")); + + g_object_set_data (G_OBJECT (dialog), "label", label); + + g_signal_connect (G_OBJECT(dialog), "response", + G_CALLBACK (properties_response), dialog); + + if (label->template->paper_id != NULL) { + gl_new_label_dialog_set_filter_parameters (GL_NEW_LABEL_DIALOG (dialog), + label->template->paper_id, + NULL); + } + name = lgl_template_get_name (label->template); + if (name != NULL) { + gl_new_label_dialog_set_template_name (GL_NEW_LABEL_DIALOG (dialog), name); + } + g_free (name); + + gl_new_label_dialog_set_rotate_state (GL_NEW_LABEL_DIALOG (dialog), + label->rotate_flag); + + gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); + gtk_widget_show_all (GTK_WIDGET (dialog)); + + gl_debug (DEBUG_FILE, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Properties "ok" button callback. */ +/*---------------------------------------------------------------------------*/ +static void +properties_response (GtkDialog *dialog, + gint response, + gpointer user_data) +{ + lglTemplate *template; + glLabel *label; + + gl_debug (DEBUG_FILE, "START"); + + switch (response) { + + case GTK_RESPONSE_OK: + + gl_new_label_dialog_get_filter_parameters (GL_NEW_LABEL_DIALOG (dialog), + &page_size, + &category); + + if (sheet_name != NULL) + g_free (sheet_name); + sheet_name = + gl_new_label_dialog_get_template_name (GL_NEW_LABEL_DIALOG (dialog)); + + rotate_flag = + gl_new_label_dialog_get_rotate_state (GL_NEW_LABEL_DIALOG (dialog)); + + template = lgl_db_lookup_template_from_name (sheet_name); + + label = GL_LABEL(g_object_get_data (G_OBJECT (dialog), "label")); + gl_label_set_template (label, template); + gl_label_set_rotate_flag (label, rotate_flag); + + break; + + default: + break; + } + + gtk_widget_destroy (GTK_WIDGET (dialog)); + + gl_debug (DEBUG_FILE, "END"); +} + +/*****************************************************************************/ +/* "Open" menu callback. */ +/*****************************************************************************/ +void +gl_file_open (glWindow *window) +{ + GtkWidget *chooser; + GtkFileFilter *filter; + + gl_debug (DEBUG_FILE, "START"); + + g_return_if_fail (window != NULL); + + chooser = gtk_file_chooser_dialog_new ("Open label", + GTK_WINDOW (window), + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + NULL); + + /* Recover state of open dialog */ + if (open_path != NULL) { + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser), + open_path); + } + + filter = gtk_file_filter_new (); + gtk_file_filter_add_pattern (filter, "*"); + gtk_file_filter_set_name (filter, _("All files")); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); + + filter = gtk_file_filter_new (); + gtk_file_filter_add_pattern (filter, "*.glabels"); + gtk_file_filter_set_name (filter, _("gLabels documents")); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); + + gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), filter); + + g_signal_connect (G_OBJECT (chooser), "response", + G_CALLBACK (open_response), window); + + /* show the dialog */ + gtk_widget_show (GTK_WIDGET (chooser)); + + gl_debug (DEBUG_FILE, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Open "response" callback. */ +/*---------------------------------------------------------------------------*/ +static void +open_response (GtkDialog *chooser, + gint response, + glWindow *window) +{ + gchar *raw_filename; + gchar *filename; + GtkWidget *dialog; + + gl_debug (DEBUG_FILE, "START"); + + g_return_if_fail (chooser && GTK_IS_FILE_CHOOSER (chooser)); + g_return_if_fail (window && GTK_IS_WINDOW (window)); + + switch (response) { + + case GTK_RESPONSE_ACCEPT: + /* get the filename */ + raw_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(chooser)); + filename = g_filename_to_utf8 (raw_filename, -1, NULL, NULL, NULL); + + if (!raw_filename || + !filename || + g_file_test (raw_filename, G_FILE_TEST_IS_DIR)) { + + dialog = gtk_message_dialog_new (GTK_WINDOW(chooser), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_CLOSE, + _("Empty file name selection")); + gtk_message_dialog_format_secondary_text ( + GTK_MESSAGE_DIALOG (dialog), + _("Please select a file or supply a valid file name")); + + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + + } else { + + if (!g_file_test (raw_filename, G_FILE_TEST_IS_REGULAR)) { + + dialog = gtk_message_dialog_new (GTK_WINDOW(chooser), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_CLOSE, + _("File does not exist")); + gtk_message_dialog_format_secondary_text ( + GTK_MESSAGE_DIALOG (dialog), + _("Please select a file or supply a valid file name")); + + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + + + } else { + + if ( gl_file_open_real (filename, window) ) { + gtk_widget_destroy (GTK_WIDGET (chooser)); + } + + } + + } + + g_free (filename); + g_free (raw_filename); + break; + + default: + gtk_widget_destroy (GTK_WIDGET (chooser)); + break; + + } + + gl_debug (DEBUG_FILE, "END"); +} + + +/*****************************************************************************/ +/* "Open recent" menu callback. */ +/*****************************************************************************/ +void +gl_file_open_recent (const gchar *filename, + glWindow *window) +{ + gl_debug (DEBUG_FILE, ""); + + if (filename) { + gl_debug (DEBUG_FILE, "open recent: %s", filename); + + gl_file_open_real (filename, window); + } +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Open a file. */ +/*---------------------------------------------------------------------------*/ +gboolean +gl_file_open_real (const gchar *filename, + glWindow *window) +{ + gchar *abs_filename; + glLabel *label; + glXMLLabelStatus status; + GtkWidget *new_window; + + gl_debug (DEBUG_FILE, "START"); + + abs_filename = gl_util_make_absolute (filename); + label = gl_xml_label_open (abs_filename, &status); + if (!label) { + GtkWidget *dialog; + + gl_debug (DEBUG_FILE, "couldn't open file"); + + dialog = gtk_message_dialog_new (GTK_WINDOW (window), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + _("Could not open file \"%s\""), + filename); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + _("Not a supported file format")); + + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + + g_free (abs_filename); + + gl_debug (DEBUG_FILE, "END false"); + + return FALSE; + + } else { + + if ( gl_window_is_empty (GL_WINDOW(window)) ) { + gl_window_set_label (GL_WINDOW(window), label); + } else { + new_window = gl_window_new_from_label (label); + gtk_widget_show_all (new_window); + } + + gl_recent_add_utf8_filename (abs_filename); + + if (open_path != NULL) + g_free (open_path); + open_path = g_path_get_dirname (abs_filename); + g_free (abs_filename); + + gl_debug (DEBUG_FILE, "END true"); + + return TRUE; + + } +} + +/*****************************************************************************/ +/* "Save" menu callback. */ +/*****************************************************************************/ +gboolean +gl_file_save (glLabel *label, + glWindow *window) +{ + glXMLLabelStatus status; + gchar *filename = NULL; + + gl_debug (DEBUG_FILE, ""); + + g_return_val_if_fail (label != NULL, FALSE); + + if (gl_label_is_untitled (label)) + { + gl_debug (DEBUG_FILE, "Untitled"); + + return gl_file_save_as (label, window); + } + + if (!gl_label_is_modified (label)) + { + gl_debug (DEBUG_FILE, "Not modified"); + + return TRUE; + } + + filename = gl_label_get_filename (label); + g_return_val_if_fail (filename != NULL, FALSE); + + gl_xml_label_save (label, filename, &status); + + if (status != XML_LABEL_OK) + { + GtkWidget *dialog; + + gl_debug (DEBUG_FILE, "FAILED"); + + dialog = gtk_message_dialog_new (GTK_WINDOW (window), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + _("Could not save file \"%s\""), + filename); + gtk_message_dialog_format_secondary_text ( + GTK_MESSAGE_DIALOG (dialog), + _("Error encountered during save. The file is still not saved.")); + + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + + g_free (filename); + + return FALSE; + } + else + { + gl_debug (DEBUG_FILE, "OK"); + + gl_recent_add_utf8_filename (filename); + + g_free (filename); + + return TRUE; + } +} + +/*****************************************************************************/ +/* "Save As" menu callback. */ +/*****************************************************************************/ +gboolean +gl_file_save_as (glLabel *label, + glWindow *window) +{ + GtkWidget *chooser; + GtkFileFilter *filter; + gboolean saved_flag = FALSE; + gchar *name, *title; + + gl_debug (DEBUG_FILE, "START"); + + g_return_val_if_fail (label && GL_IS_LABEL(label), FALSE); + g_return_val_if_fail (window && GL_IS_WINDOW(window), FALSE); + + name = gl_label_get_short_name (label); + title = g_strdup_printf (_("Save \"%s\" as"), name); + g_free (name); + + chooser = gtk_file_chooser_dialog_new (title, + GTK_WINDOW (window), + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + NULL); + + gtk_window_set_modal (GTK_WINDOW (chooser), TRUE); + + g_free (title); + + /* Recover proper state of save-as dialog */ + if (save_path != NULL) { + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(chooser), + save_path); + } + + filter = gtk_file_filter_new (); + gtk_file_filter_add_pattern (filter, "*"); + gtk_file_filter_set_name (filter, _("All files")); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); + + filter = gtk_file_filter_new (); + gtk_file_filter_add_pattern (filter, "*.glabels"); + gtk_file_filter_set_name (filter, _("gLabels documents")); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter); + + gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), filter); + + g_signal_connect (G_OBJECT (chooser), "response", + G_CALLBACK (save_as_response), label); + + g_object_set_data (G_OBJECT (chooser), "saved_flag", &saved_flag); + + /* show the dialog */ + gtk_widget_show (GTK_WIDGET (chooser)); + + /* Hold here and process events until we are done with this dialog. */ + /* This is so we can return a boolean result of our save attempt. */ + gtk_main (); + + gl_debug (DEBUG_FILE, "END"); + + /* Return flag as set by one of the above callbacks, TRUE = saved */ + return saved_flag; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. "Save As" ok button callback. */ +/*---------------------------------------------------------------------------*/ +static void +save_as_response (GtkDialog *chooser, + gint response, + glLabel *label) +{ + gchar *raw_filename, *filename, *full_filename; + GtkWidget *dialog; + glXMLLabelStatus status; + gboolean *saved_flag; + gboolean cancel_flag = FALSE; + + gl_debug (DEBUG_FILE, "START"); + + g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser)); + + saved_flag = g_object_get_data (G_OBJECT(chooser), "saved_flag"); + + switch (response) { + + case GTK_RESPONSE_ACCEPT: + /* get the filename */ + raw_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(chooser)); + + gl_debug (DEBUG_FILE, "raw_filename = \"%s\"", raw_filename); + + if (!raw_filename || g_file_test (raw_filename, G_FILE_TEST_IS_DIR)) { + + dialog = gtk_message_dialog_new (GTK_WINDOW(chooser), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_CLOSE, + _("Empty file name selection")); + gtk_message_dialog_format_secondary_text ( + GTK_MESSAGE_DIALOG (dialog), + _("Please supply a valid file name")); + + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + + } else { + + full_filename = gl_util_add_extension (raw_filename); + + filename = g_filename_to_utf8 (full_filename, -1, + NULL, NULL, NULL); + + gl_debug (DEBUG_FILE, "filename = \"%s\"", filename); + + if (g_file_test (full_filename, G_FILE_TEST_IS_REGULAR)) { + gint ret; + + dialog = gtk_message_dialog_new (GTK_WINDOW(chooser), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_YES_NO, + _("Overwrite file \"%s\"?"), + filename); + gtk_message_dialog_format_secondary_text ( + GTK_MESSAGE_DIALOG (dialog), + _("File already exists.")); + + ret = gtk_dialog_run (GTK_DIALOG (dialog)); + if ( ret == GTK_RESPONSE_NO ) { + cancel_flag = TRUE; + } + gtk_widget_destroy (dialog); + } + + if (!cancel_flag) { + + gl_xml_label_save (label, filename, &status); + + gl_debug (DEBUG_FILE, "status of save = %d", status); + + if ( status != XML_LABEL_OK ) { + + dialog = gtk_message_dialog_new ( + GTK_WINDOW(chooser), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + _("Could not save file \"%s\""), + filename); + gtk_message_dialog_format_secondary_text ( + GTK_MESSAGE_DIALOG (dialog), + _("Error encountered during save. The file is still not saved.")); + + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + + } else { + + *saved_flag = TRUE; + + gl_recent_add_utf8_filename (filename); + + if (save_path != NULL) + g_free (save_path); + save_path = g_path_get_dirname (filename); + + gtk_widget_destroy (GTK_WIDGET (chooser)); + gtk_main_quit (); + } + + } + + g_free (filename); + g_free (full_filename); + } + + g_free (raw_filename); + break; + + default: + *saved_flag = FALSE; + gtk_widget_destroy (GTK_WIDGET (chooser)); + gtk_main_quit (); + break; + + } + + gl_debug (DEBUG_FILE, "END"); +} + + +/*****************************************************************************/ +/* "Close" menu callback. */ +/*****************************************************************************/ +gboolean +gl_file_close (glWindow *window) +{ + glView *view; + glLabel *label; + gboolean close = TRUE; + + gl_debug (DEBUG_FILE, "START"); + + g_return_val_if_fail (window && GL_IS_WINDOW(window), TRUE); + + if ( !gl_window_is_empty (window) ) { + + view = GL_VIEW(window->view); + label = view->label; + + if (gl_label_is_modified (label)) { + GtkWidget *dialog; + gchar *fname = NULL; + gint ret; + + fname = gl_label_get_short_name (label); + + dialog = gtk_message_dialog_new (GTK_WINDOW(window), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_NONE, + _("Save changes to document \"%s\" before closing?"), + fname); + gtk_message_dialog_format_secondary_text ( + GTK_MESSAGE_DIALOG (dialog), + _("Your changes will be lost if you don't save them.")); + + gtk_dialog_add_button (GTK_DIALOG (dialog), + _("Close without saving"), + GTK_RESPONSE_NO); + + gtk_dialog_add_button (GTK_DIALOG (dialog), + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + + gtk_dialog_add_button (GTK_DIALOG (dialog), + GTK_STOCK_SAVE, GTK_RESPONSE_YES); + + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES); + + gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); + + ret = gtk_dialog_run (GTK_DIALOG (dialog)); + + gtk_widget_destroy (dialog); + + g_free (fname); + + switch (ret) + { + case GTK_RESPONSE_YES: + close = gl_file_save (label, window); + break; + case GTK_RESPONSE_NO: + close = TRUE; + break; + default: + close = FALSE; + } + + gl_debug (DEBUG_FILE, "CLOSE: %s", close ? "TRUE" : "FALSE"); + } + + } + + if (close) { + gtk_widget_destroy (GTK_WIDGET(window)); + + if ( gl_window_get_window_list () == NULL ) { + + gl_debug (DEBUG_FILE, "All windows closed."); + + gtk_main_quit (); + } + + } + + gl_debug (DEBUG_FILE, "END"); + + return close; +} + +/*****************************************************************************/ +/* "Exit" menu callback. */ +/*****************************************************************************/ +void +gl_file_exit (void) +{ + const GList *window_list; + GList *p, *p_next; + + gl_debug (DEBUG_FILE, "START"); + + window_list = gl_window_get_window_list (); + + for (p=(GList *)window_list; p != NULL; p=p_next) { + p_next = p->next; + + gl_file_close (GL_WINDOW(p->data)); + } + + gl_debug (DEBUG_FILE, "END"); +} diff --git a/glabels2/src/file.h b/glabels2/src/file.h new file mode 100644 index 00000000..ba826075 --- /dev/null +++ b/glabels2/src/file.h @@ -0,0 +1,65 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * file.h: FILE menu dialog module header file + * + * Copyright (C) 2000 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __FILE_H__ +#define __FILE_H__ + +#include + +#include "label.h" +#include "window.h" + +G_BEGIN_DECLS + +void gl_file_new (glWindow *window); + + +void gl_file_properties (glLabel *label, + glWindow *window); + + +void gl_file_open (glWindow *window); + + +void gl_file_open_recent (const gchar *filename, + glWindow *window); + +gboolean gl_file_open_real (const gchar *filename, + glWindow *window); + + +gboolean gl_file_save (glLabel *label, + glWindow *window); + +gboolean gl_file_save_as (glLabel *label, + glWindow *window); + + +gboolean gl_file_close (glWindow *window); + +void gl_file_exit (void); + +G_END_DECLS + +#endif /* __FILE_H__ */ diff --git a/glabels2/src/glabels-batch.c b/glabels2/src/glabels-batch.c new file mode 100644 index 00000000..01e08145 --- /dev/null +++ b/glabels2/src/glabels-batch.c @@ -0,0 +1,171 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * glabels.c: main program module + * + * Copyright (C) 2001 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include +#include + +#include "merge-init.h" +#include "xml-label.h" +#include "print.h" +#include "print-op.h" +#include +#include "util.h" +#include "debug.h" + +/*============================================*/ +/* Private globals */ +/*============================================*/ +static gchar *output = "output.pdf"; +static gint n_copies = 1; +static gint n_sheets = 1; +static gint first = 1; +static gboolean outline_flag = FALSE; +static gboolean reverse_flag = FALSE; +static gboolean crop_marks_flag = FALSE; +static gchar *input = NULL; +static gchar **remaining_args = NULL; + +static GOptionEntry option_entries[] = { + {"output", 'o', 0, G_OPTION_ARG_STRING, &output, + N_("set output filename (default=\"output.pdf\")"), N_("filename")}, + {"sheets", 's', 0, G_OPTION_ARG_INT, &n_sheets, + N_("number of sheets (default=1)"), N_("sheets")}, + {"copies", 'c', 0, G_OPTION_ARG_INT, &n_copies, + N_("number of copies (default=1)"), N_("copies")}, + {"first", 'f', 0, G_OPTION_ARG_INT, &first, + N_("first label on first sheet (default=1)"), N_("first")}, + {"outline", 'l', 0, G_OPTION_ARG_NONE, &outline_flag, + N_("print outlines (to test printer alignment)"), NULL}, + {"reverse", 'r', 0, G_OPTION_ARG_NONE, &reverse_flag, + N_("print in reverse (i.e. a mirror image)"), NULL}, + {"cropmarks", 'C', 0, G_OPTION_ARG_NONE, &crop_marks_flag, + N_("print crop marks"), NULL}, + {"input", 'i', 0, G_OPTION_ARG_STRING, &input, + N_("input file for merging"), N_("filename")}, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, + &remaining_args, NULL, N_("[FILE...]") }, + { NULL } +}; + + + +/*****************************************************************************/ +/* Main */ +/*****************************************************************************/ +int +main (int argc, char **argv) +{ + GOptionContext *option_context; + GnomeProgram *program; + GList *p, *file_list = NULL; + gchar *abs_fn; + glLabel *label = NULL; + glMerge *merge = NULL; + glXMLLabelStatus status; + glPrintOp *print_op; + gchar *utf8_filename; + + bindtextdomain (GETTEXT_PACKAGE, GLABELS_LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + + option_context = g_option_context_new (_("- batch process gLabels label files")); + g_option_context_add_main_entries (option_context, option_entries, GETTEXT_PACKAGE); + + + /* Initialize minimal gnome program */ + program = gnome_program_init ("glabels-batch", VERSION, + LIBGNOME_MODULE, argc, argv, + GNOME_PARAM_GOPTION_CONTEXT, option_context, + GNOME_PROGRAM_STANDARD_PROPERTIES, + NULL); + + /* create file list */ + if (remaining_args != NULL) { + gint i, num_args; + + num_args = g_strv_length (remaining_args); + for (i = 0; i < num_args; ++i) { + utf8_filename = g_filename_to_utf8 (remaining_args[i], -1, NULL, NULL, NULL); + if (utf8_filename) + file_list = g_list_append (file_list, utf8_filename); + } + g_strfreev (remaining_args); + remaining_args = NULL; + } + + /* initialize components */ + gl_debug_init (); + gl_merge_init (); + lgl_db_init (); + + /* now print the files */ + for (p = file_list; p; p = p->next) { + g_print ("LABEL FILE = %s\n", (gchar *) p->data); + label = gl_xml_label_open (p->data, &status); + + + if ( status == XML_LABEL_OK ) { + + if (input != NULL) { + merge = gl_label_get_merge (label); + if (merge != NULL) { + gl_merge_set_src(merge, input); + gl_label_set_merge(label, merge); + } else { + fprintf ( stderr, + _("cannot perform document merge with glabels file %s\n"), + (char *)p->data ); + } + } + abs_fn = gl_util_make_absolute ( output ); + print_op = gl_print_op_new_batch (label, + abs_fn, + n_sheets, + n_copies, + first, + outline_flag, + reverse_flag, + crop_marks_flag); + + gtk_print_operation_run (GTK_PRINT_OPERATION (print_op), + GTK_PRINT_OPERATION_ACTION_EXPORT, + NULL, + NULL); + + g_object_unref (label); + } + else { + fprintf ( stderr, _("cannot open glabels file %s\n"), + (char *)p->data ); + } + } + + g_list_free (file_list); + + return 0; +} + diff --git a/glabels2/src/glabels.c b/glabels2/src/glabels.c new file mode 100644 index 00000000..832b0821 --- /dev/null +++ b/glabels2/src/glabels.c @@ -0,0 +1,218 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/** + * (GLABELS) Label and Business Card Creation program for GNOME + * + * glabels.c: GLabels main module + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include +#include +#include +#include + +#include "warning-handler.h" +#include "critical-error-handler.h" +#include "stock.h" +#include "merge-init.h" +#include "recent.h" +#include +#include "mini-preview-pixbuf-cache.h" +#include "prefs.h" +#include "debug.h" +#include "window.h" +#include "file.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + +/*========================================================*/ +/* Private globals */ +/*========================================================*/ + +/*========================================================*/ +/* Local function prototypes */ +/*========================================================*/ +gboolean save_session_cb (GnomeClient *client, + gint phase, + GnomeRestartStyle save_style, + gint shutdown, + GnomeInteractStyle interact_style, + gint fast, + gpointer client_data); + +void client_die_cb (GnomeClient *client, + gpointer client_data); + +/****************************************************************************/ +/* main program */ +/****************************************************************************/ +int +main (int argc, char **argv) +{ + gchar **remaining_args = NULL; + GOptionEntry option_entries[] = { + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, + &remaining_args, NULL, N_("[FILE...]") }, + { NULL } + }; + + GOptionContext *option_context; + GnomeProgram *program; + gchar *icon_file; + GnomeClient *client; + GList *file_list = NULL, *p; + GtkWidget *win; + gchar *utf8_filename; + + bindtextdomain (GETTEXT_PACKAGE, GLABELS_LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + + option_context = g_option_context_new (_("- gLabels label designer")); + g_option_context_add_main_entries (option_context, option_entries, GETTEXT_PACKAGE); + + + /* Initialize gnome program */ + program = gnome_program_init ("glabels", VERSION, + LIBGNOMEUI_MODULE, argc, argv, + GNOME_PARAM_GOPTION_CONTEXT, option_context, + GNOME_PROGRAM_STANDARD_PROPERTIES, + NULL); + + /* Install GUI handlers for critical error and warning messages */ + gl_critical_error_handler_init(); + gl_warning_handler_init(); + + /* Set default icon */ + icon_file = GLABELS_ICON_DIR "glabels.png"; + if (!g_file_test (icon_file, G_FILE_TEST_EXISTS)) + { + g_message ("Could not find %s", icon_file); + } + else + { + gnome_window_icon_set_default_from_file (icon_file); + } + + + /* Initialize subsystems */ + gl_debug_init (); + gl_stock_init (); + lgl_db_init (); + gl_prefs_init (); + gl_mini_preview_pixbuf_cache_init (); + gl_merge_init (); + gl_recent_init (); + + + client = gnome_master_client(); + + g_signal_connect (G_OBJECT (client), "save_yourself", + G_CALLBACK (save_session_cb), + (gpointer)argv[0]); + + g_signal_connect (G_OBJECT (client), "die", + G_CALLBACK (client_die_cb), NULL); + + + /* Parse args and build the list of files to be loaded at startup */ + if (remaining_args != NULL) { + gint i, num_args; + + num_args = g_strv_length (remaining_args); + for (i = 0; i < num_args; ++i) { + utf8_filename = g_filename_to_utf8 (remaining_args[i], -1, NULL, NULL, NULL); + if (utf8_filename) + file_list = g_list_append (file_list, utf8_filename); + } + g_strfreev (remaining_args); + remaining_args = NULL; + } + + + /* Open files or create empty top-level window. */ + for (p = file_list; p; p = p->next) { + win = gl_window_new_from_file (p->data); + gtk_widget_show_all (win); + g_free (p->data); + } + if ( gl_window_get_window_list() == NULL ) { + win = gl_window_new (); + gtk_widget_show_all (win); + } + g_list_free (file_list); + + + /* Begin main loop */ + gtk_main(); + + g_object_unref (G_OBJECT (program)); + + return 0; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. "Save session" callback. */ +/*---------------------------------------------------------------------------*/ +gboolean save_session_cb (GnomeClient *client, + gint phase, + GnomeRestartStyle save_style, + gint shutdown, + GnomeInteractStyle interact_style, + gint fast, + gpointer client_data) +{ + gchar *argv[128]; + gint argc; + const GList *window_list; + GList *p; + glWindow *window; + glLabel *label; + + argv[0] = (gchar *)client_data; + argc = 1; + + window_list = gl_window_get_window_list(); + for ( p=(GList *)window_list; p != NULL; p=p->next ) { + window = GL_WINDOW(p->data); + if ( !gl_window_is_empty (window) ) { + label = GL_VIEW(window->view)->label; + argv[argc++] = gl_label_get_filename (label); + } + } + gnome_client_set_clone_command(client, argc, argv); + gnome_client_set_restart_command(client, argc, argv); + + return TRUE; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. "Die" callback. */ +/*---------------------------------------------------------------------------*/ +void client_die_cb (GnomeClient *client, + gpointer client_data) +{ + gl_file_exit (); +} + + diff --git a/glabels2/src/hig.h b/glabels2/src/hig.h new file mode 100644 index 00000000..6b4c2494 --- /dev/null +++ b/glabels2/src/hig.h @@ -0,0 +1,35 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * hig.h: HIG inspired dialogs and layout tools + * + * Copyright (C) 2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __HIG_H__ +#define __HIG_H__ + +G_BEGIN_DECLS + +#define GL_HIG_PAD1 6 +#define GL_HIG_PAD2 12 + +G_END_DECLS + +#endif /* __HIG_H__ */ diff --git a/glabels2/src/label-barcode.c b/glabels2/src/label-barcode.c new file mode 100644 index 00000000..9cb08043 --- /dev/null +++ b/glabels2/src/label-barcode.c @@ -0,0 +1,472 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label_barcode.c: GLabels label text object + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "label-barcode.h" + +#include +#include +#include +#include +#include +#include + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + +#define FONT_SCALE (72.0/96.0) + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glLabelBarcodePrivate { + glTextNode *text_node; + gchar *id; + glColorNode *color_node; + gboolean text_flag; + gboolean checksum_flag; + guint format_digits; +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_label_barcode_finalize (GObject *object); + +static void copy (glLabelObject *dst_object, + glLabelObject *src_object); + +static void get_size (glLabelObject *object, + gdouble *w, + gdouble *h); + +static void set_line_color (glLabelObject *object, + glColorNode *line_color); + +static glColorNode *get_line_color (glLabelObject *object); + +static void draw_object (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record); + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glLabelBarcode, gl_label_barcode, GL_TYPE_LABEL_OBJECT); + +static void +gl_label_barcode_class_init (glLabelBarcodeClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + glLabelObjectClass *label_object_class = GL_LABEL_OBJECT_CLASS (class); + + gl_label_barcode_parent_class = g_type_class_peek_parent (class); + + label_object_class->copy = copy; + label_object_class->get_size = get_size; + label_object_class->set_line_color = set_line_color; + label_object_class->get_line_color = get_line_color; + label_object_class->draw_object = draw_object; + label_object_class->draw_shadow = NULL; + + object_class->finalize = gl_label_barcode_finalize; +} + +static void +gl_label_barcode_init (glLabelBarcode *lbc) +{ + lbc->priv = g_new0 (glLabelBarcodePrivate, 1); + lbc->priv->color_node = gl_color_node_new_default (); + lbc->priv->text_node = gl_text_node_new_from_text (""); +} + +static void +gl_label_barcode_finalize (GObject *object) +{ + glLabelBarcode *lbc = GL_LABEL_BARCODE (object); + + g_return_if_fail (object && GL_IS_LABEL_BARCODE (object)); + + gl_text_node_free (&lbc->priv->text_node); + g_free (lbc->priv->id); + gl_color_node_free (&(lbc->priv->color_node)); + g_free (lbc->priv); + + G_OBJECT_CLASS (gl_label_barcode_parent_class)->finalize (object); +} + +/*****************************************************************************/ +/* NEW label "barcode" object. */ +/*****************************************************************************/ +GObject * +gl_label_barcode_new (glLabel *label) +{ + glLabelBarcode *lbc; + + lbc = g_object_new (gl_label_barcode_get_type(), NULL); + + gl_label_object_set_parent (GL_LABEL_OBJECT(lbc), label); + + return G_OBJECT (lbc); +} + +/*****************************************************************************/ +/* Copy object contents. */ +/*****************************************************************************/ +static void +copy (glLabelObject *dst_object, + glLabelObject *src_object) +{ + glLabelBarcode *lbc = (glLabelBarcode *)src_object; + glLabelBarcode *new_lbc = (glLabelBarcode *)dst_object; + glTextNode *text_node; + gchar *id; + gboolean text_flag; + gboolean checksum_flag; + glColorNode *color_node; + guint format_digits; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc)); + g_return_if_fail (new_lbc && GL_IS_LABEL_BARCODE (new_lbc)); + + text_node = gl_label_barcode_get_data (lbc); + gl_label_barcode_get_props (lbc, &id, &text_flag, &checksum_flag, &format_digits); + color_node = get_line_color (src_object); + + gl_label_barcode_set_data (new_lbc, text_node); + gl_label_barcode_set_props (new_lbc, id, text_flag, checksum_flag, format_digits); + set_line_color (dst_object, color_node); + + gl_color_node_free (&color_node); + gl_text_node_free (&text_node); + g_free (id); + + gl_debug (DEBUG_LABEL, "END"); +} + + +/*****************************************************************************/ +/* Set object params. */ +/*****************************************************************************/ +void +gl_label_barcode_set_data (glLabelBarcode *lbc, + glTextNode *text_node) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc)); + + if (!gl_text_node_equal (lbc->priv->text_node, text_node)) { + + gl_text_node_free (&lbc->priv->text_node); + lbc->priv->text_node = gl_text_node_dup (text_node); + + gl_label_object_emit_changed (GL_LABEL_OBJECT(lbc)); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +void +gl_label_barcode_set_props (glLabelBarcode *lbc, + gchar *id, + gboolean text_flag, + gboolean checksum_flag, + guint format_digits) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc)); + + if ( ((lbc->priv->id == NULL) && (id != NULL)) + || (g_strcasecmp (lbc->priv->id, id) != 0) + || (lbc->priv->text_flag != text_flag) + || (lbc->priv->checksum_flag != checksum_flag) + || (lbc->priv->format_digits != format_digits)) { + + lbc->priv->id = g_strdup (id); + lbc->priv->text_flag = text_flag; + lbc->priv->checksum_flag = checksum_flag; + lbc->priv->format_digits = format_digits; + + gl_label_object_emit_changed (GL_LABEL_OBJECT(lbc)); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + + +/*****************************************************************************/ +/* Get object params. */ +/*****************************************************************************/ +glTextNode * +gl_label_barcode_get_data (glLabelBarcode *lbc) +{ + g_return_val_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc), NULL); + + return gl_text_node_dup (lbc->priv->text_node); +} + +void +gl_label_barcode_get_props (glLabelBarcode *lbc, + gchar **id, + gboolean *text_flag, + gboolean *checksum_flag, + guint *format_digits) +{ + g_return_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc)); + + *id = g_strdup (lbc->priv->id); + *text_flag = lbc->priv->text_flag; + *checksum_flag = lbc->priv->checksum_flag; + *format_digits = lbc->priv->format_digits; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Get object size method. */ +/*---------------------------------------------------------------------------*/ +static void +get_size (glLabelObject *object, + gdouble *w, + gdouble *h) +{ + glLabelBarcode *lbc = (glLabelBarcode *)object; + gchar *data; + gdouble w_parent, h_parent; + glBarcode *gbc; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc)); + + gl_label_object_get_raw_size (object, &w_parent, &h_parent); + + if (lbc->priv->text_node->field_flag) { + data = gl_barcode_default_digits (lbc->priv->id, + lbc->priv->format_digits); + } else { + data = gl_text_node_expand (lbc->priv->text_node, NULL); + } + + gbc = gl_barcode_new (lbc->priv->id, + lbc->priv->text_flag, + lbc->priv->checksum_flag, + w_parent, + h_parent, + data); + + if ( gbc == NULL ) { + /* Try again with default digits. */ + data = gl_barcode_default_digits (lbc->priv->id, + lbc->priv->format_digits); + gbc = gl_barcode_new (lbc->priv->id, + lbc->priv->text_flag, + lbc->priv->checksum_flag, + w_parent, + h_parent, + data); + } + + *w = gbc->width; + *h = gbc->height; + + gl_barcode_free (&gbc); + g_free (data); + + gl_debug (DEBUG_LABEL, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Set line color method. */ +/*---------------------------------------------------------------------------*/ +static void +set_line_color (glLabelObject *object, + glColorNode *line_color_node) +{ + glLabelBarcode *lbarcode = (glLabelBarcode *)object; + + g_return_if_fail (lbarcode && GL_IS_LABEL_BARCODE (lbarcode)); + + if ( !gl_color_node_equal(lbarcode->priv->color_node, line_color_node) ) { + + gl_color_node_free (&(lbarcode->priv->color_node)); + lbarcode->priv->color_node = gl_color_node_dup (line_color_node); + gl_label_object_emit_changed (GL_LABEL_OBJECT(lbarcode)); + } +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Get line color method. */ +/*---------------------------------------------------------------------------*/ +static glColorNode* +get_line_color (glLabelObject *object) +{ + glLabelBarcode *lbarcode = (glLabelBarcode *)object; + + g_return_val_if_fail (lbarcode && GL_IS_LABEL_BARCODE (lbarcode), NULL); + + return gl_color_node_dup (lbarcode->priv->color_node); +} + +/*****************************************************************************/ +/* Draw object method. */ +/*****************************************************************************/ +static void +draw_object (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record) +{ + gdouble x0, y0; + cairo_matrix_t matrix; + glBarcode *gbc; + glBarcodeLine *line; + glBarcodeChar *bchar; + GList *li; + gdouble y_offset; + PangoLayout *layout; + PangoFontDescription *desc; + gchar *text, *cstring; + glTextNode *text_node; + gchar *id; + gboolean text_flag; + gboolean checksum_flag; + guint color; + glColorNode *color_node; + guint format_digits; + gdouble w, h; + + gl_debug (DEBUG_LABEL, "START"); + + gl_label_object_get_position (object, &x0, &y0); + gl_label_object_get_matrix (object, &matrix); + + text_node = gl_label_barcode_get_data (GL_LABEL_BARCODE (object)); + gl_label_barcode_get_props (GL_LABEL_BARCODE (object), + &id, &text_flag, &checksum_flag, &format_digits); + + color_node = gl_label_object_get_line_color (object); + color = gl_color_node_expand (color_node, record); + if (color_node->field_flag && screen_flag) + { + color = GL_COLOR_MERGE_DEFAULT; + } + gl_color_node_free (&color_node); + + gl_label_object_get_size (object, &w, &h); + + text_node = gl_label_barcode_get_data(GL_LABEL_BARCODE(object)); + text = gl_text_node_expand (text_node, record); + if (text_node->field_flag && screen_flag) { + text = gl_barcode_default_digits (id, format_digits); + } + + gbc = gl_barcode_new (id, text_flag, checksum_flag, w, h, text); + + cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (color)); + + if (gbc == NULL) { + + layout = pango_cairo_create_layout (cr); + + desc = pango_font_description_new (); + pango_font_description_set_family (desc, GL_BARCODE_FONT_FAMILY); + pango_font_description_set_size (desc, 12 * PANGO_SCALE * FONT_SCALE); + pango_layout_set_font_description (layout, desc); + pango_font_description_free (desc); + + if (text == NULL || *text == '\0') + { + pango_layout_set_text (layout, _("Barcode data empty"), -1); + } + else + { + pango_layout_set_text (layout, _("Invalid barcode data"), -1); + } + + pango_cairo_show_layout (cr, layout); + + g_object_unref (layout); + + } else { + + for (li = gbc->lines; li != NULL; li = li->next) { + line = (glBarcodeLine *) li->data; + + cairo_move_to (cr, line->x, line->y); + cairo_line_to (cr, line->x, line->y + line->length); + cairo_set_line_width (cr, line->width); + cairo_stroke (cr); + } + + for (li = gbc->chars; li != NULL; li = li->next) { + bchar = (glBarcodeChar *) li->data; + + layout = pango_cairo_create_layout (cr); + + desc = pango_font_description_new (); + pango_font_description_set_family (desc, GL_BARCODE_FONT_FAMILY); + pango_font_description_set_size (desc, bchar->fsize * PANGO_SCALE * FONT_SCALE); + pango_layout_set_font_description (layout, desc); + pango_font_description_free (desc); + + cstring = g_strdup_printf ("%c", bchar->c); + pango_layout_set_text (layout, cstring, -1); + g_free (cstring); + + y_offset = 0.2 * bchar->fsize; + + cairo_move_to (cr, bchar->x, bchar->y-y_offset); + pango_cairo_show_layout (cr, layout); + + g_object_unref (layout); + + } + + gl_barcode_free (&gbc); + + } + + g_free (text); + gl_text_node_free (&text_node); + g_free (id); + + gl_debug (DEBUG_LABEL, "END"); +} + diff --git a/glabels2/src/label-barcode.h b/glabels2/src/label-barcode.h new file mode 100644 index 00000000..4eda31da --- /dev/null +++ b/glabels2/src/label-barcode.h @@ -0,0 +1,78 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label_barcode.h: GLabels label barcode object + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __LABEL_BARCODE_H__ +#define __LABEL_BARCODE_H__ + +#include "bc.h" +#include "text-node.h" +#include "label-object.h" + +G_BEGIN_DECLS + + +#define GL_TYPE_LABEL_BARCODE (gl_label_barcode_get_type ()) +#define GL_LABEL_BARCODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_LABEL_BARCODE, glLabelBarcode)) +#define GL_LABEL_BARCODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_LABEL_BARCODE, glLabelBarcodeClass)) +#define GL_IS_LABEL_BARCODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_LABEL_BARCODE)) +#define GL_IS_LABEL_BARCODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_LABEL_BARCODE)) + +typedef struct _glLabelBarcode glLabelBarcode; +typedef struct _glLabelBarcodeClass glLabelBarcodeClass; + +typedef struct _glLabelBarcodePrivate glLabelBarcodePrivate; + +struct _glLabelBarcode { + glLabelObject object; + + glLabelBarcodePrivate *priv; +}; + +struct _glLabelBarcodeClass { + glLabelObjectClass parent_class; +}; + + +GType gl_label_barcode_get_type (void) G_GNUC_CONST; + +GObject *gl_label_barcode_new (glLabel *label); + +void gl_label_barcode_set_data (glLabelBarcode *lbc, + glTextNode *text_node); +void gl_label_barcode_set_props (glLabelBarcode *lbc, + gchar *id, + gboolean text_flag, + gboolean checksum_flag, + guint format_digits); + +glTextNode *gl_label_barcode_get_data (glLabelBarcode *lbc); +void gl_label_barcode_get_props (glLabelBarcode *lbc, + gchar **id, + gboolean *text_flag, + gboolean *checksum_flag, + guint *format_digits); + +G_END_DECLS + +#endif /* __LABEL_BARCODE_H__ */ diff --git a/glabels2/src/label-box.c b/glabels2/src/label-box.c new file mode 100644 index 00000000..a42ad75b --- /dev/null +++ b/glabels2/src/label-box.c @@ -0,0 +1,402 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label_box.c: GLabels label box object + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "label-box.h" + +#include +#include +#include + +#include "debug.h" + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glLabelBoxPrivate { + gdouble line_width; + glColorNode *line_color_node; + glColorNode *fill_color_node; +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_label_box_finalize (GObject *object); + +static void copy (glLabelObject *dst_object, + glLabelObject *src_object); + +static void set_fill_color (glLabelObject *object, + glColorNode *fill_color_node); + +static void set_line_color (glLabelObject *object, + glColorNode *line_color_node); + +static void set_line_width (glLabelObject *object, + gdouble line_width); + +static glColorNode* get_fill_color (glLabelObject *object); + +static glColorNode* get_line_color (glLabelObject *object); + +static gdouble get_line_width (glLabelObject *object); + +static void draw_object (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record); + +static void draw_shadow (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record); + + + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glLabelBox, gl_label_box, GL_TYPE_LABEL_OBJECT); + +static void +gl_label_box_class_init (glLabelBoxClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + glLabelObjectClass *label_object_class = GL_LABEL_OBJECT_CLASS (class); + + gl_label_box_parent_class = g_type_class_peek_parent (class); + + label_object_class->copy = copy; + label_object_class->set_fill_color = set_fill_color; + label_object_class->set_line_color = set_line_color; + label_object_class->set_line_width = set_line_width; + label_object_class->get_fill_color = get_fill_color; + label_object_class->get_line_color = get_line_color; + label_object_class->get_line_width = get_line_width; + label_object_class->draw_object = draw_object; + label_object_class->draw_shadow = draw_shadow; + + object_class->finalize = gl_label_box_finalize; +} + +static void +gl_label_box_init (glLabelBox *lbox) +{ + lbox->priv = g_new0 (glLabelBoxPrivate, 1); + lbox->priv->line_color_node = gl_color_node_new_default (); + lbox->priv->fill_color_node = gl_color_node_new_default (); +} + +static void +gl_label_box_finalize (GObject *object) +{ + glLabelBox *lbox = GL_LABEL_BOX (object); + + g_return_if_fail (object && GL_IS_LABEL_BOX (object)); + + gl_color_node_free (&(lbox->priv->fill_color_node)); + gl_color_node_free (&(lbox->priv->line_color_node)); + g_free (lbox->priv); + + G_OBJECT_CLASS (gl_label_box_parent_class)->finalize (object); +} + +/*****************************************************************************/ +/* NEW label "box" object. */ +/*****************************************************************************/ +GObject * +gl_label_box_new (glLabel *label) +{ + glLabelBox *lbox; + + lbox = g_object_new (gl_label_box_get_type(), NULL); + + gl_label_object_set_parent (GL_LABEL_OBJECT(lbox), label); + + return G_OBJECT (lbox); +} + +/*****************************************************************************/ +/* Copy object contents. */ +/*****************************************************************************/ +static void +copy (glLabelObject *dst_object, + glLabelObject *src_object) +{ + glLabelBox *lbox = (glLabelBox *)src_object; + glLabelBox *new_lbox = (glLabelBox *)dst_object; + gdouble line_width; + glColorNode *line_color_node; + glColorNode *fill_color_node; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (lbox && GL_IS_LABEL_BOX (lbox)); + g_return_if_fail (new_lbox && GL_IS_LABEL_BOX (new_lbox)); + + line_width = get_line_width (src_object); + line_color_node = get_line_color (src_object); + fill_color_node = get_fill_color (src_object); + + set_line_width (dst_object, line_width); + set_line_color (dst_object, line_color_node); + set_fill_color (dst_object, fill_color_node); + + gl_color_node_free (&line_color_node); + gl_color_node_free (&fill_color_node); + + gl_debug (DEBUG_LABEL, "END"); +} + + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Set fill color method. */ +/*---------------------------------------------------------------------------*/ +static void +set_fill_color (glLabelObject *object, + glColorNode *fill_color_node) +{ + glLabelBox *lbox = (glLabelBox *)object; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (lbox && GL_IS_LABEL_BOX (lbox)); + + if (!gl_color_node_equal (lbox->priv->fill_color_node, fill_color_node)) { + + gl_color_node_free (&(lbox->priv->fill_color_node)); + lbox->priv->fill_color_node = gl_color_node_dup (fill_color_node); + + gl_label_object_emit_changed (GL_LABEL_OBJECT(lbox)); + } + gl_debug (DEBUG_LABEL, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Set line color method. */ +/*---------------------------------------------------------------------------*/ +static void +set_line_color (glLabelObject *object, + glColorNode *line_color_node) +{ + glLabelBox *lbox = (glLabelBox *)object; + + g_return_if_fail (lbox && GL_IS_LABEL_BOX (lbox)); + + if ( !gl_color_node_equal (lbox->priv->line_color_node, line_color_node )) { + gl_color_node_free (&(lbox->priv->line_color_node)); + lbox->priv->line_color_node = gl_color_node_dup (line_color_node); + gl_label_object_emit_changed (GL_LABEL_OBJECT(lbox)); + } +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Set line width method. */ +/*---------------------------------------------------------------------------*/ +static void +set_line_width (glLabelObject *object, + gdouble line_width) +{ + glLabelBox *lbox = (glLabelBox *)object; + + g_return_if_fail (lbox && GL_IS_LABEL_BOX (lbox)); + + if ( lbox->priv->line_width != line_width ) { + lbox->priv->line_width = line_width; + gl_label_object_emit_changed (GL_LABEL_OBJECT(lbox)); + } +} + + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Get fill color method. */ +/*---------------------------------------------------------------------------*/ +static gdouble +get_line_width (glLabelObject *object) +{ + glLabelBox *lbox = (glLabelBox *)object; + + g_return_val_if_fail (lbox && GL_IS_LABEL_BOX (lbox), 0.0); + + return lbox->priv->line_width; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Get line color method. */ +/*---------------------------------------------------------------------------*/ +static glColorNode* +get_line_color (glLabelObject *object) +{ + glLabelBox *lbox = (glLabelBox *)object; + + g_return_val_if_fail (lbox && GL_IS_LABEL_BOX (lbox), 0); + + return gl_color_node_dup (lbox->priv->line_color_node); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Get line width method. */ +/*---------------------------------------------------------------------------*/ +static glColorNode* +get_fill_color (glLabelObject *object) +{ + glLabelBox *lbox = (glLabelBox *)object; + + g_return_val_if_fail (lbox && GL_IS_LABEL_BOX (lbox), 0); + + return gl_color_node_dup (lbox->priv->fill_color_node); +} + +/*****************************************************************************/ +/* Draw object method. */ +/*****************************************************************************/ +static void +draw_object (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record) +{ + gdouble w, h; + gdouble line_width; + glColorNode *line_color_node; + glColorNode *fill_color_node; + guint line_color; + guint fill_color; + + gl_debug (DEBUG_LABEL, "START"); + + gl_label_object_get_size (object, &w, &h); + + line_width = gl_label_object_get_line_width (object); + + line_color_node = gl_label_object_get_line_color (object); + fill_color_node = gl_label_object_get_fill_color (object); + line_color = gl_color_node_expand (line_color_node, record); + fill_color = gl_color_node_expand (fill_color_node, record); + if (line_color_node->field_flag && screen_flag) + { + line_color = GL_COLOR_MERGE_DEFAULT; + } + if (fill_color_node->field_flag && screen_flag) + { + fill_color = GL_COLOR_FILL_MERGE_DEFAULT; + } + + + cairo_rectangle (cr, 0.0, 0.0, w, h); + + /* Paint fill color */ + cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (fill_color)); + cairo_fill_preserve (cr); + + /* Draw outline */ + cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (line_color)); + cairo_set_line_width (cr, line_width); + cairo_stroke (cr); + + gl_color_node_free (&line_color_node); + gl_color_node_free (&fill_color_node); + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Draw shadow method. */ +/*****************************************************************************/ +static void +draw_shadow (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record) +{ + gdouble w, h; + gdouble line_width; + glColorNode *line_color_node; + glColorNode *fill_color_node; + guint line_color; + guint fill_color; + glColorNode *shadow_color_node; + guint shadow_color; + gdouble shadow_opacity; + guint shadow_line_color; + guint shadow_fill_color; + + gl_debug (DEBUG_LABEL, "START"); + + gl_label_object_get_size (object, &w, &h); + + line_width = gl_label_object_get_line_width (object); + + line_color_node = gl_label_object_get_line_color (object); + fill_color_node = gl_label_object_get_fill_color (object); + line_color = gl_color_node_expand (line_color_node, record); + fill_color = gl_color_node_expand (fill_color_node, record); + if (line_color_node->field_flag && screen_flag) + { + line_color = GL_COLOR_MERGE_DEFAULT; + } + if (fill_color_node->field_flag && screen_flag) + { + fill_color = GL_COLOR_FILL_MERGE_DEFAULT; + } + + shadow_color_node = gl_label_object_get_shadow_color (object); + shadow_color = gl_color_node_expand (shadow_color_node, record); + if (shadow_color_node->field_flag && screen_flag) + { + shadow_color = GL_COLOR_SHADOW_MERGE_DEFAULT; + } + shadow_opacity = gl_label_object_get_shadow_opacity (object); + shadow_line_color = gl_color_shadow (shadow_color, shadow_opacity, line_color_node->color); + shadow_fill_color = gl_color_shadow (shadow_color, shadow_opacity, fill_color_node->color); + + + cairo_rectangle (cr, 0.0, 0.0, w, h); + + + /* Draw fill shadow */ + cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (shadow_fill_color)); + cairo_fill_preserve (cr); + + /* Draw outline shadow */ + cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (shadow_line_color)); + cairo_set_line_width (cr, line_width); + cairo_stroke (cr); + + + gl_color_node_free (&line_color_node); + gl_color_node_free (&fill_color_node); + gl_color_node_free (&shadow_color_node); + + gl_debug (DEBUG_LABEL, "END"); +} + diff --git a/glabels2/src/label-box.h b/glabels2/src/label-box.h new file mode 100644 index 00000000..93b05a64 --- /dev/null +++ b/glabels2/src/label-box.h @@ -0,0 +1,61 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label_box.h: GLabels label box object + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __LABEL_BOX_H__ +#define __LABEL_BOX_H__ + +#include "label-object.h" + + +G_BEGIN_DECLS + + +#define GL_TYPE_LABEL_BOX (gl_label_box_get_type ()) +#define GL_LABEL_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_LABEL_BOX, glLabelBox)) +#define GL_LABEL_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_LABEL_BOX, glLabelBoxClass)) +#define GL_IS_LABEL_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_LABEL_BOX)) +#define GL_IS_LABEL_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_LABEL_BOX)) + +typedef struct _glLabelBox glLabelBox; +typedef struct _glLabelBoxClass glLabelBoxClass; + +typedef struct _glLabelBoxPrivate glLabelBoxPrivate; + +struct _glLabelBox { + glLabelObject object; + + glLabelBoxPrivate *priv; +}; + +struct _glLabelBoxClass { + glLabelObjectClass parent_class; +}; + +GType gl_label_box_get_type (void) G_GNUC_CONST; + +GObject *gl_label_box_new (glLabel *label); + +G_END_DECLS + +#endif /* __LABEL_BOX_H__ */ diff --git a/glabels2/src/label-ellipse.c b/glabels2/src/label-ellipse.c new file mode 100644 index 00000000..fb21cbf2 --- /dev/null +++ b/glabels2/src/label-ellipse.c @@ -0,0 +1,407 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label_ellipse.c: GLabels label ellipse object + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "label-ellipse.h" + +#include +#include +#include +#include + +#include "cairo-ellipse-path.h" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glLabelEllipsePrivate { + gdouble line_width; + glColorNode *line_color_node; + glColorNode *fill_color_node; +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_label_ellipse_finalize (GObject *object); + +static void copy (glLabelObject *dst_object, + glLabelObject *src_object); + +static void set_fill_color (glLabelObject *object, + glColorNode *fill_color_node); + +static void set_line_color (glLabelObject *object, + glColorNode *line_color_node); + +static void set_line_width (glLabelObject *object, + gdouble line_width); + +static glColorNode* get_fill_color (glLabelObject *object); + +static glColorNode* get_line_color (glLabelObject *object); + +static gdouble get_line_width (glLabelObject *object); + +static void draw_object (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record); + +static void draw_shadow (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record); + + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glLabelEllipse, gl_label_ellipse, GL_TYPE_LABEL_OBJECT); + +static void +gl_label_ellipse_class_init (glLabelEllipseClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + glLabelObjectClass *label_object_class = GL_LABEL_OBJECT_CLASS (class); + + gl_label_ellipse_parent_class = g_type_class_peek_parent (class); + + label_object_class->copy = copy; + label_object_class->set_fill_color = set_fill_color; + label_object_class->set_line_color = set_line_color; + label_object_class->set_line_width = set_line_width; + label_object_class->get_fill_color = get_fill_color; + label_object_class->get_line_color = get_line_color; + label_object_class->get_line_width = get_line_width; + label_object_class->draw_object = draw_object; + label_object_class->draw_shadow = draw_shadow; + + object_class->finalize = gl_label_ellipse_finalize; +} + +static void +gl_label_ellipse_init (glLabelEllipse *lellipse) +{ + lellipse->priv = g_new0 (glLabelEllipsePrivate, 1); + lellipse->priv->line_color_node = gl_color_node_new_default (); + lellipse->priv->fill_color_node = gl_color_node_new_default (); +} + +static void +gl_label_ellipse_finalize (GObject *object) +{ + glLabelEllipse *lellipse = GL_LABEL_ELLIPSE (object); + + g_return_if_fail (object && GL_IS_LABEL_ELLIPSE (object)); + + gl_color_node_free (&(lellipse->priv->line_color_node)); + gl_color_node_free (&(lellipse->priv->fill_color_node)); + g_free (lellipse->priv); + + G_OBJECT_CLASS (gl_label_ellipse_parent_class)->finalize (object); +} + +/*****************************************************************************/ +/* NEW label "ellipse" object. */ +/*****************************************************************************/ +GObject * +gl_label_ellipse_new (glLabel *label) +{ + glLabelEllipse *lellipse; + + lellipse = g_object_new (gl_label_ellipse_get_type(), NULL); + + gl_label_object_set_parent (GL_LABEL_OBJECT(lellipse), label); + + return G_OBJECT (lellipse); +} + +/*****************************************************************************/ +/* Copy object contents. */ +/*****************************************************************************/ +static void +copy (glLabelObject *dst_object, + glLabelObject *src_object) +{ + glLabelEllipse *lellipse = (glLabelEllipse *)src_object; + glLabelEllipse *new_lellipse = (glLabelEllipse *)dst_object; + gdouble line_width; + glColorNode *line_color_node; + glColorNode *fill_color_node; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse)); + g_return_if_fail (new_lellipse && GL_IS_LABEL_ELLIPSE (new_lellipse)); + + line_width = get_line_width (src_object); + line_color_node = get_line_color (src_object); + fill_color_node = get_fill_color (src_object); + + set_line_width (dst_object, line_width); + set_line_color (dst_object, line_color_node); + set_fill_color (dst_object, fill_color_node); + + gl_color_node_free (&line_color_node); + gl_color_node_free (&fill_color_node); + + gl_debug (DEBUG_LABEL, "END"); +} + + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Set fill color method. */ +/*---------------------------------------------------------------------------*/ +static void +set_fill_color (glLabelObject *object, + glColorNode *fill_color_node) +{ + glLabelEllipse *lellipse = (glLabelEllipse *)object; + + g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse)); + + if (!gl_color_node_equal (lellipse->priv->fill_color_node, fill_color_node)) { + + gl_color_node_free (&(lellipse->priv->fill_color_node)); + lellipse->priv->fill_color_node = gl_color_node_dup (fill_color_node); + + gl_label_object_emit_changed (GL_LABEL_OBJECT(lellipse)); + } +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Set line color method. */ +/*---------------------------------------------------------------------------*/ +static void +set_line_color (glLabelObject *object, + glColorNode *line_color_node) +{ + glLabelEllipse *lellipse = (glLabelEllipse *)object; + + g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse)); + + if ( !gl_color_node_equal (lellipse->priv->line_color_node, line_color_node) ) { + + gl_color_node_free (&(lellipse->priv->line_color_node)); + lellipse->priv->line_color_node = gl_color_node_dup (line_color_node); + + gl_label_object_emit_changed (GL_LABEL_OBJECT(lellipse)); + } +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Set line width method. */ +/*---------------------------------------------------------------------------*/ +static void +set_line_width (glLabelObject *object, + gdouble line_width) +{ + glLabelEllipse *lellipse = (glLabelEllipse *)object; + + g_return_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse)); + + if ( lellipse->priv->line_width != line_width ) { + lellipse->priv->line_width = line_width; + gl_label_object_emit_changed (GL_LABEL_OBJECT(lellipse)); + } +} + + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Get fill color method. */ +/*---------------------------------------------------------------------------*/ +static gdouble +get_line_width (glLabelObject *object) +{ + glLabelEllipse *lellipse = (glLabelEllipse *)object; + + g_return_val_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse), 0.0); + + return lellipse->priv->line_width; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Get line color method. */ +/*---------------------------------------------------------------------------*/ +static glColorNode* +get_line_color (glLabelObject *object) +{ + glLabelEllipse *lellipse = (glLabelEllipse *)object; + + g_return_val_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse), 0); + + return gl_color_node_dup (lellipse->priv->line_color_node); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Get line width method. */ +/*---------------------------------------------------------------------------*/ +static glColorNode* +get_fill_color (glLabelObject *object) +{ + glLabelEllipse *lellipse = (glLabelEllipse *)object; + + g_return_val_if_fail (lellipse && GL_IS_LABEL_ELLIPSE (lellipse), 0); + + return gl_color_node_dup (lellipse->priv->fill_color_node); +} + +/*****************************************************************************/ +/* Draw object method. */ +/*****************************************************************************/ +static void +draw_object (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record) +{ + gdouble w, h; + gdouble line_width; + glColorNode *line_color_node; + glColorNode *fill_color_node; + guint line_color; + guint fill_color; + + gl_debug (DEBUG_LABEL, "START"); + + gl_label_object_get_size (object, &w, &h); + + line_width = gl_label_object_get_line_width (object); + + line_color_node = gl_label_object_get_line_color (object); + fill_color_node = gl_label_object_get_fill_color (object); + line_color = gl_color_node_expand (line_color_node, record); + fill_color = gl_color_node_expand (fill_color_node, record); + if (line_color_node->field_flag && screen_flag) + { + line_color = GL_COLOR_MERGE_DEFAULT; + } + if (fill_color_node->field_flag && screen_flag) + { + fill_color = GL_COLOR_FILL_MERGE_DEFAULT; + } + + + gl_cairo_ellipse_path (cr, w/2, h/2); + + /* Paint fill color */ + cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (fill_color)); + cairo_fill_preserve (cr); + + /* Draw outline */ + cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (line_color)); + cairo_set_line_width (cr, line_width); + cairo_stroke (cr); + + gl_color_node_free (&line_color_node); + gl_color_node_free (&fill_color_node); + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Draw shadow method. */ +/*****************************************************************************/ +static void +draw_shadow (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record) +{ + gdouble w, h; + gdouble line_width; + glColorNode *line_color_node; + glColorNode *fill_color_node; + guint line_color; + guint fill_color; + glColorNode *shadow_color_node; + guint shadow_color; + gdouble shadow_opacity; + guint shadow_line_color; + guint shadow_fill_color; + + gl_debug (DEBUG_LABEL, "START"); + + gl_label_object_get_size (object, &w, &h); + + line_width = gl_label_object_get_line_width (object); + + line_color_node = gl_label_object_get_line_color (object); + fill_color_node = gl_label_object_get_fill_color (object); + line_color = gl_color_node_expand (line_color_node, record); + fill_color = gl_color_node_expand (fill_color_node, record); + if (line_color_node->field_flag && screen_flag) + { + line_color = GL_COLOR_MERGE_DEFAULT; + } + if (fill_color_node->field_flag && screen_flag) + { + fill_color = GL_COLOR_FILL_MERGE_DEFAULT; + } + + shadow_color_node = gl_label_object_get_shadow_color (object); + shadow_color = gl_color_node_expand (shadow_color_node, record); + if (shadow_color_node->field_flag && screen_flag) + { + shadow_color = GL_COLOR_SHADOW_MERGE_DEFAULT; + } + shadow_opacity = gl_label_object_get_shadow_opacity (object); + shadow_line_color = gl_color_shadow (shadow_color_node->color, shadow_opacity, line_color_node->color); + shadow_fill_color = gl_color_shadow (shadow_color_node->color, shadow_opacity, fill_color_node->color); + + + gl_cairo_ellipse_path (cr, w/2, h/2); + + + /* Draw fill shadow */ + cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (shadow_fill_color)); + cairo_fill_preserve (cr); + + /* Draw outline shadow */ + cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (shadow_line_color)); + cairo_set_line_width (cr, line_width); + cairo_stroke (cr); + + + gl_color_node_free (&line_color_node); + gl_color_node_free (&fill_color_node); + gl_color_node_free (&shadow_color_node); + + gl_debug (DEBUG_LABEL, "END"); +} + diff --git a/glabels2/src/label-ellipse.h b/glabels2/src/label-ellipse.h new file mode 100644 index 00000000..439ad5f9 --- /dev/null +++ b/glabels2/src/label-ellipse.h @@ -0,0 +1,61 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label_ellipse.h: GLabels label ellipse object + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __LABEL_ELLIPSE_H__ +#define __LABEL_ELLIPSE_H__ + +#include "label-object.h" + + +G_BEGIN_DECLS + + +#define GL_TYPE_LABEL_ELLIPSE (gl_label_ellipse_get_type ()) +#define GL_LABEL_ELLIPSE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_LABEL_ELLIPSE, glLabelEllipse)) +#define GL_LABEL_ELLIPSE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_LABEL_ELLIPSE, glLabelEllipseClass)) +#define GL_IS_LABEL_ELLIPSE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_LABEL_ELLIPSE)) +#define GL_IS_LABEL_ELLIPSE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_LABEL_ELLIPSE)) + +typedef struct _glLabelEllipse glLabelEllipse; +typedef struct _glLabelEllipseClass glLabelEllipseClass; + +typedef struct _glLabelEllipsePrivate glLabelEllipsePrivate; + +struct _glLabelEllipse { + glLabelObject object; + + glLabelEllipsePrivate *priv; +}; + +struct _glLabelEllipseClass { + glLabelObjectClass parent_class; +}; + +GType gl_label_ellipse_get_type (void) G_GNUC_CONST; + +GObject *gl_label_ellipse_new (glLabel *label); + +G_END_DECLS + +#endif /* __LABEL_ELLIPSE_H__ */ diff --git a/glabels2/src/label-image.c b/glabels2/src/label-image.c new file mode 100644 index 00000000..5408dcfd --- /dev/null +++ b/glabels2/src/label-image.c @@ -0,0 +1,326 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label_image.c: GLabels label image object + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "label-image.h" + +#include +#include +#include +#include + +#include "pixmaps/checkerboard.xpm" + +#include "debug.h" + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glLabelImagePrivate { + glTextNode *filename; + GdkPixbuf *pixbuf; +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +static GdkPixbuf *default_pixbuf = NULL; + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_label_image_finalize (GObject *object); + +static void copy (glLabelObject *dst_object, + glLabelObject *src_object); + +static void draw_object (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record); + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glLabelImage, gl_label_image, GL_TYPE_LABEL_OBJECT); + +static void +gl_label_image_class_init (glLabelImageClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + glLabelObjectClass *label_object_class = GL_LABEL_OBJECT_CLASS (class); + + gl_label_image_parent_class = g_type_class_peek_parent (class); + + label_object_class->copy = copy; + label_object_class->draw_object = draw_object; + label_object_class->draw_shadow = NULL; + + object_class->finalize = gl_label_image_finalize; +} + +static void +gl_label_image_init (glLabelImage *limage) +{ + GdkPixbuf *pixbuf; + + if ( default_pixbuf == NULL ) { + pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **)checkerboard_xpm); + default_pixbuf = + gdk_pixbuf_scale_simple (pixbuf, 128, 128, GDK_INTERP_NEAREST); + g_object_unref (pixbuf); + } + + limage->priv = g_new0 (glLabelImagePrivate, 1); + + limage->priv->filename = g_new0 (glTextNode, 1); + + limage->priv->pixbuf = default_pixbuf; +} + +static void +gl_label_image_finalize (GObject *object) +{ + glLabelObject *lobject = GL_LABEL_OBJECT (object); + glLabelImage *limage = GL_LABEL_IMAGE (object);; + GHashTable *pixbuf_cache; + + g_return_if_fail (object && GL_IS_LABEL_IMAGE (object)); + + if (!limage->priv->filename->field_flag) { + pixbuf_cache = gl_label_get_pixbuf_cache (lobject->parent); + gl_pixbuf_cache_remove_pixbuf (pixbuf_cache, + limage->priv->filename->data); + } + gl_text_node_free (&limage->priv->filename); + g_free (limage->priv); + + G_OBJECT_CLASS (gl_label_image_parent_class)->finalize (object); +} + +/*****************************************************************************/ +/* NEW label "image" object. */ +/*****************************************************************************/ +GObject * +gl_label_image_new (glLabel *label) +{ + glLabelImage *limage; + + limage = g_object_new (gl_label_image_get_type(), NULL); + + gl_label_object_set_parent (GL_LABEL_OBJECT(limage), label); + + return G_OBJECT (limage); +} + +/*****************************************************************************/ +/* Copy object contents. */ +/*****************************************************************************/ +static void +copy (glLabelObject *dst_object, + glLabelObject *src_object) +{ + glLabelImage *limage = (glLabelImage *)src_object; + glLabelImage *new_limage = (glLabelImage *)dst_object; + glTextNode *filename; + GdkPixbuf *pixbuf; + GHashTable *pixbuf_cache; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (limage && GL_IS_LABEL_IMAGE (limage)); + g_return_if_fail (new_limage && GL_IS_LABEL_IMAGE (new_limage)); + + filename = gl_label_image_get_filename (limage); + + /* Make sure destination label has data suitably cached. */ + if ( !filename->field_flag && (filename->data != NULL) ) { + pixbuf = limage->priv->pixbuf; + if ( pixbuf != default_pixbuf ) { + pixbuf_cache = gl_label_get_pixbuf_cache (dst_object->parent); + gl_pixbuf_cache_add_pixbuf (pixbuf_cache, filename->data, pixbuf); + } + } + + gl_label_image_set_filename (new_limage, filename); + gl_text_node_free (&filename); + + gl_debug (DEBUG_LABEL, "END"); +} + + +/*****************************************************************************/ +/* Set object params. */ +/*****************************************************************************/ +void +gl_label_image_set_filename (glLabelImage *limage, + glTextNode *filename) +{ + glTextNode *old_filename; + GHashTable *pixbuf_cache; + GdkPixbuf *pixbuf; + gdouble image_w, image_h, aspect_ratio, w, h; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (limage && GL_IS_LABEL_IMAGE (limage)); + g_return_if_fail (filename != NULL); + + old_filename = limage->priv->filename; + + /* If Unchanged don't do anything */ + if ( gl_text_node_equal (filename, old_filename ) ) { + return; + } + + pixbuf_cache = gl_label_get_pixbuf_cache (GL_LABEL_OBJECT(limage)->parent); + + /* Remove reference to previous pixbuf from cache, if needed. */ + if ( !old_filename->field_flag && (old_filename->data != NULL) ) { + gl_pixbuf_cache_remove_pixbuf (pixbuf_cache, old_filename->data); + } + + /* Set new filename. */ + limage->priv->filename = gl_text_node_dup(filename); + gl_text_node_free (&old_filename); + + /* Now set the pixbuf. */ + if ( filename->field_flag || (filename->data == NULL) ) { + + limage->priv->pixbuf = default_pixbuf; + + } else { + + pixbuf = gl_pixbuf_cache_get_pixbuf (pixbuf_cache, filename->data); + + if (pixbuf != NULL) { + limage->priv->pixbuf = pixbuf; + } else { + limage->priv->pixbuf = default_pixbuf; + } + } + + /* Treat current size as a bounding box, scale image to maintain aspect + * ratio while fitting it in this bounding box. */ + image_w = gdk_pixbuf_get_width (limage->priv->pixbuf); + image_h = gdk_pixbuf_get_height (limage->priv->pixbuf); + aspect_ratio = image_h / image_w; + gl_label_object_get_size (GL_LABEL_OBJECT(limage), &w, &h); + if ( h > w*aspect_ratio ) { + h = w * aspect_ratio; + } else { + w = h / aspect_ratio; + } + gl_label_object_set_size (GL_LABEL_OBJECT(limage), w, h); + + gl_label_object_emit_changed (GL_LABEL_OBJECT(limage)); + + gl_debug (DEBUG_LABEL, "END"); +} + + +/*****************************************************************************/ +/* Get object params. */ +/*****************************************************************************/ +glTextNode * +gl_label_image_get_filename (glLabelImage *limage) +{ + g_return_val_if_fail (limage && GL_IS_LABEL_IMAGE (limage), NULL); + + return gl_text_node_dup (limage->priv->filename); +} + +const GdkPixbuf * +gl_label_image_get_pixbuf (glLabelImage *limage, + glMergeRecord *record) +{ + g_return_val_if_fail (limage && GL_IS_LABEL_IMAGE (limage), NULL); + + if ((record != NULL) && limage->priv->filename->field_flag) { + + GdkPixbuf *pixbuf = NULL; + gchar *real_filename; + + /* Indirect filename, re-evaluate for given record. */ + + real_filename = gl_merge_eval_key (record, + limage->priv->filename->data); + + if (real_filename != NULL) { + pixbuf = gdk_pixbuf_new_from_file (real_filename, NULL); + } + if ( pixbuf != NULL ) { + return pixbuf; + } else { + return default_pixbuf; + } + + } + + return limage->priv->pixbuf; + +} + +/*****************************************************************************/ +/* Draw object method. */ +/*****************************************************************************/ +static void +draw_object (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record) +{ + gdouble x0, y0; + gdouble w, h; + const GdkPixbuf *pixbuf; + gint image_w, image_h; + + gl_debug (DEBUG_LABEL, "START"); + + gl_label_object_get_size (object, &w, &h); + gl_label_object_get_position (object, &x0, &y0); + + pixbuf = gl_label_image_get_pixbuf (GL_LABEL_IMAGE (object), record); + image_w = gdk_pixbuf_get_width (pixbuf); + image_h = gdk_pixbuf_get_height (pixbuf); + + cairo_save (cr); + + cairo_rectangle (cr, 0.0, 0.0, w, h); + + cairo_scale (cr, w/image_w, h/image_h); + gdk_cairo_set_source_pixbuf (cr, (GdkPixbuf *)pixbuf, 0, 0); + cairo_fill (cr); + + cairo_restore (cr); + + gl_debug (DEBUG_LABEL, "END"); +} + + + diff --git a/glabels2/src/label-image.h b/glabels2/src/label-image.h new file mode 100644 index 00000000..a45f0c79 --- /dev/null +++ b/glabels2/src/label-image.h @@ -0,0 +1,71 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label_image.h: GLabels label image object + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __LABEL_IMAGE_H__ +#define __LABEL_IMAGE_H__ + +#include "label-object.h" +#include "text-node.h" +#include "merge.h" +#include + +G_BEGIN_DECLS + + +#define GL_TYPE_LABEL_IMAGE (gl_label_image_get_type ()) +#define GL_LABEL_IMAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_LABEL_IMAGE, glLabelImage)) +#define GL_LABEL_IMAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_LABEL_IMAGE, glLabelImageClass)) +#define GL_IS_LABEL_IMAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_LABEL_IMAGE)) +#define GL_IS_LABEL_IMAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_LABEL_IMAGE)) + +typedef struct _glLabelImage glLabelImage; +typedef struct _glLabelImageClass glLabelImageClass; + +typedef struct _glLabelImagePrivate glLabelImagePrivate; + +struct _glLabelImage { + glLabelObject object; + + glLabelImagePrivate *priv; +}; + +struct _glLabelImageClass { + glLabelObjectClass parent_class; +}; + +GType gl_label_image_get_type (void) G_GNUC_CONST; + +GObject *gl_label_image_new (glLabel *label); + +void gl_label_image_set_filename (glLabelImage *limage, + glTextNode *filename); + +glTextNode *gl_label_image_get_filename (glLabelImage *limage); + +const GdkPixbuf *gl_label_image_get_pixbuf (glLabelImage *limage, + glMergeRecord *record); + +G_END_DECLS + +#endif /* __LABEL_IMAGE_H__ */ diff --git a/glabels2/src/label-line.c b/glabels2/src/label-line.c new file mode 100644 index 00000000..b3eae407 --- /dev/null +++ b/glabels2/src/label-line.c @@ -0,0 +1,323 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label_line.c: GLabels label line object + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "label-line.h" + +#include +#include +#include + +#include "debug.h" + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glLabelLinePrivate { + gdouble line_width; + glColorNode *line_color_node; +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_label_line_finalize (GObject *object); + +static void copy (glLabelObject *dst_object, + glLabelObject *src_object); + +static void set_line_color (glLabelObject *object, + glColorNode *line_color_node); + +static void set_line_width (glLabelObject *object, + gdouble line_width); + +static glColorNode *get_line_color (glLabelObject *object); + +static gdouble get_line_width (glLabelObject *object); + +static void draw_object (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record); + +static void draw_shadow (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record); + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glLabelLine, gl_label_line, GL_TYPE_LABEL_OBJECT); + +static void +gl_label_line_class_init (glLabelLineClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + glLabelObjectClass *label_object_class = GL_LABEL_OBJECT_CLASS (class); + + gl_label_line_parent_class = g_type_class_peek_parent (class); + + label_object_class->copy = copy; + label_object_class->set_line_color = set_line_color; + label_object_class->set_line_width = set_line_width; + label_object_class->get_line_color = get_line_color; + label_object_class->get_line_width = get_line_width; + label_object_class->draw_object = draw_object; + label_object_class->draw_shadow = draw_shadow; + + object_class->finalize = gl_label_line_finalize; +} + +static void +gl_label_line_init (glLabelLine *lline) +{ + lline->priv = g_new0 (glLabelLinePrivate, 1); + lline->priv->line_color_node = gl_color_node_new_default (); +} + +static void +gl_label_line_finalize (GObject *object) +{ + glLabelLine *lline = GL_LABEL_LINE (object); + + g_return_if_fail (object && GL_IS_LABEL_LINE (object)); + + gl_color_node_free (&(lline->priv->line_color_node)); + g_free (lline->priv); + + G_OBJECT_CLASS (gl_label_line_parent_class)->finalize (object); +} + +/*****************************************************************************/ +/* NEW label "line" object. */ +/*****************************************************************************/ +GObject * +gl_label_line_new (glLabel *label) +{ + glLabelLine *lline; + + lline = g_object_new (gl_label_line_get_type(), NULL); + + gl_label_object_set_parent (GL_LABEL_OBJECT(lline), label); + + return G_OBJECT (lline); +} + +/*****************************************************************************/ +/* Copy object contents. */ +/*****************************************************************************/ +static void +copy (glLabelObject *dst_object, + glLabelObject *src_object) +{ + glLabelLine *lline = (glLabelLine *)src_object; + glLabelLine *new_lline = (glLabelLine *)dst_object; + gdouble line_width; + glColorNode *line_color_node; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (lline && GL_IS_LABEL_LINE (lline)); + g_return_if_fail (new_lline && GL_IS_LABEL_LINE (new_lline)); + + line_width = get_line_width (src_object); + line_color_node = get_line_color (src_object); + + set_line_width (dst_object, line_width); + set_line_color (dst_object, line_color_node); + + gl_color_node_free (&line_color_node); + + gl_debug (DEBUG_LABEL, "END"); +} + + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Set line color method. */ +/*---------------------------------------------------------------------------*/ +static void +set_line_color (glLabelObject *object, + glColorNode *line_color_node) +{ + glLabelLine *lline = (glLabelLine *)object; + + g_return_if_fail (lline && GL_IS_LABEL_LINE (lline)); + + if ( !gl_color_node_equal (lline->priv->line_color_node, line_color_node)) { + + gl_color_node_free (&(lline->priv->line_color_node )); + lline->priv->line_color_node = gl_color_node_dup (line_color_node); + + gl_label_object_emit_changed (GL_LABEL_OBJECT(lline)); + } +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Set line width method. */ +/*---------------------------------------------------------------------------*/ +static void +set_line_width (glLabelObject *object, + gdouble line_width) +{ + glLabelLine *lline = (glLabelLine *)object; + + g_return_if_fail (lline && GL_IS_LABEL_LINE (lline)); + + if ( lline->priv->line_width != line_width ) { + lline->priv->line_width = line_width; + gl_label_object_emit_changed (GL_LABEL_OBJECT(lline)); + } +} + + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Get line color method. */ +/*---------------------------------------------------------------------------*/ +static gdouble +get_line_width (glLabelObject *object) +{ + glLabelLine *lline = (glLabelLine *)object; + + g_return_val_if_fail (lline && GL_IS_LABEL_LINE (lline), 0.0); + + return lline->priv->line_width; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Get line width method. */ +/*---------------------------------------------------------------------------*/ +static glColorNode* +get_line_color (glLabelObject *object) +{ + glLabelLine *lline = (glLabelLine *)object; + + g_return_val_if_fail (lline && GL_IS_LABEL_LINE (lline), 0); + + return gl_color_node_dup (lline->priv->line_color_node); +} + +/*****************************************************************************/ +/* Draw object method. */ +/*****************************************************************************/ +static void +draw_object (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record) +{ + gdouble w, h; + gdouble line_width; + glColorNode *line_color_node; + guint line_color; + + gl_debug (DEBUG_LABEL, "START"); + + gl_label_object_get_size (GL_LABEL_OBJECT(object), &w, &h); + + line_width = gl_label_object_get_line_width (object); + + line_color_node = gl_label_object_get_line_color (object); + line_color = gl_color_node_expand (line_color_node, record); + if (line_color_node->field_flag && screen_flag) + { + line_color = GL_COLOR_MERGE_DEFAULT; + } + + + cairo_move_to (cr, 0.0, 0.0); + cairo_line_to (cr, w, h); + + + /* Draw line */ + cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (line_color)); + cairo_set_line_width (cr, line_width); + cairo_stroke (cr); + + gl_color_node_free (&line_color_node); + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Draw shadow method. */ +/*****************************************************************************/ +static void +draw_shadow (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record) +{ + gdouble w, h; + gdouble line_width; + glColorNode *line_color_node; + glColorNode *shadow_color_node; + gdouble shadow_opacity; + guint shadow_line_color; + + gl_debug (DEBUG_LABEL, "START"); + + gl_label_object_get_size (GL_LABEL_OBJECT(object), &w, &h); + + line_width = gl_label_object_get_line_width (object); + + line_color_node = gl_label_object_get_line_color (object); + if (line_color_node->field_flag) + { + line_color_node->color = GL_COLOR_MERGE_DEFAULT; + } + + shadow_color_node = gl_label_object_get_shadow_color (object); + if (shadow_color_node->field_flag) + { + shadow_color_node->color = GL_COLOR_SHADOW_MERGE_DEFAULT; + } + shadow_opacity = gl_label_object_get_shadow_opacity (object); + shadow_line_color = gl_color_shadow (shadow_color_node->color, shadow_opacity, line_color_node->color); + + + cairo_move_to (cr, 0.0, 0.0); + cairo_line_to (cr, w, h); + + + /* Draw outline shadow */ + cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (shadow_line_color)); + cairo_set_line_width (cr, line_width); + cairo_stroke (cr); + + + gl_color_node_free (&line_color_node); + gl_color_node_free (&shadow_color_node); + + gl_debug (DEBUG_LABEL, "END"); +} + diff --git a/glabels2/src/label-line.h b/glabels2/src/label-line.h new file mode 100644 index 00000000..3b73e42e --- /dev/null +++ b/glabels2/src/label-line.h @@ -0,0 +1,62 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label_line.h: GLabels label line object + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __LABEL_LINE_H__ +#define __LABEL_LINE_H__ + +#include "label-object.h" + + +G_BEGIN_DECLS + + +#define GL_TYPE_LABEL_LINE (gl_label_line_get_type ()) +#define GL_LABEL_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_LABEL_LINE, glLabelLine)) +#define GL_LABEL_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_LABEL_LINE, glLabelLineClass)) +#define GL_IS_LABEL_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_LABEL_LINE)) +#define GL_IS_LABEL_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_LABEL_LINE)) + +typedef struct _glLabelLine glLabelLine; +typedef struct _glLabelLineClass glLabelLineClass; + +typedef struct _glLabelLinePrivate glLabelLinePrivate; + +struct _glLabelLine { + glLabelObject object; + + glLabelLinePrivate *priv; +}; + +struct _glLabelLineClass { + glLabelObjectClass parent_class; +}; + +GType gl_label_line_get_type (void) G_GNUC_CONST; + +GObject *gl_label_line_new (glLabel *label); + + +G_END_DECLS + +#endif /* __LABEL_LINE_H__ */ diff --git a/glabels2/src/label-object.c b/glabels2/src/label-object.c new file mode 100644 index 00000000..fd79e28a --- /dev/null +++ b/glabels2/src/label-object.c @@ -0,0 +1,1525 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label_object.c: GLabels label object base class + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "label-object.h" + +#include +#include +#include +#include + +#include "marshal.h" + +#include "debug.h" + + +/*========================================================*/ +/* Private defines. */ +/*========================================================*/ + +#define DEFAULT_SHADOW_X_OFFSET (3.6) +#define DEFAULT_SHADOW_Y_OFFSET (3.6) +#define DEFAULT_SHADOW_OPACITY (0.5) + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glLabelObjectPrivate { + gchar *name; + gdouble x, y; + gdouble w, h; + cairo_matrix_t matrix; + + gdouble aspect_ratio; + + gboolean shadow_state; + gdouble shadow_x; + gdouble shadow_y; + glColorNode *shadow_color_node; + gdouble shadow_opacity; +}; + +enum { + CHANGED, + MOVED, + FLIP_ROTATE, + TOP, + BOTTOM, + REMOVED, + LAST_SIGNAL +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +static guint signals[LAST_SIGNAL] = {0}; + +static guint instance = 0; + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_label_object_finalize (GObject *object); + +static void merge_changed_cb (glLabel *label, + glLabelObject *object); + +static void set_size (glLabelObject *object, + gdouble w, + gdouble h); + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glLabelObject, gl_label_object, G_TYPE_OBJECT); + +static void +gl_label_object_class_init (glLabelObjectClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_debug (DEBUG_LABEL, "START"); + + gl_label_object_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_label_object_finalize; + + class->set_size = set_size; + + signals[CHANGED] = + g_signal_new ("changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glLabelObjectClass, changed), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + + signals[MOVED] = + g_signal_new ("moved", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glLabelObjectClass, moved), + NULL, NULL, + gl_marshal_VOID__DOUBLE_DOUBLE, + G_TYPE_NONE, + 2, G_TYPE_DOUBLE, G_TYPE_DOUBLE); + signals[FLIP_ROTATE] = + g_signal_new ("flip_rotate", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glLabelObjectClass, flip_rotate), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + signals[TOP] = + g_signal_new ("top", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glLabelObjectClass, top), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + + signals[BOTTOM] = + g_signal_new ("bottom", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glLabelObjectClass, bottom), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + signals[REMOVED] = + g_signal_new ("removed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glLabelObjectClass, removed), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + + gl_debug (DEBUG_LABEL, "END"); +} + +static void +gl_label_object_init (glLabelObject *object) +{ + gl_debug (DEBUG_LABEL, "START"); + + object->priv = g_new0 (glLabelObjectPrivate, 1); + + object->priv->name = g_strdup_printf ("object%d", instance++); + + cairo_matrix_init_identity (&object->priv->matrix); + + object->priv->shadow_state = FALSE; + object->priv->shadow_x = DEFAULT_SHADOW_X_OFFSET; + object->priv->shadow_y = DEFAULT_SHADOW_Y_OFFSET; + object->priv->shadow_color_node = gl_color_node_new_default (); + object->priv->shadow_opacity = DEFAULT_SHADOW_OPACITY; + + gl_debug (DEBUG_LABEL, "END"); +} + +static void +gl_label_object_finalize (GObject *object) +{ + glLabelObject *label_object = GL_LABEL_OBJECT (object); + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + g_free (label_object->priv->name); + g_free (label_object->priv); + + G_OBJECT_CLASS (gl_label_object_parent_class)->finalize (object); + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* New label object. */ +/*****************************************************************************/ +GObject * +gl_label_object_new (glLabel *label) +{ + glLabelObject *object; + + gl_debug (DEBUG_LABEL, "START"); + + object = g_object_new (gl_label_object_get_type(), NULL); + + gl_label_object_set_parent (object, label); + + gl_debug (DEBUG_LABEL, "END"); + + return G_OBJECT (object); +} + +/*****************************************************************************/ +/* Duplicate object. */ +/*****************************************************************************/ +glLabelObject * +gl_label_object_dup (glLabelObject *src_object, + glLabel *label) +{ + glLabelObject *dst_object; + gdouble x, y, w, h; + cairo_matrix_t matrix; + gboolean shadow_state; + gdouble shadow_x, shadow_y; + glColorNode *shadow_color_node; + gdouble shadow_opacity; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_val_if_fail (src_object && GL_IS_LABEL_OBJECT (src_object), NULL); + + dst_object = g_object_new (G_OBJECT_TYPE(src_object), NULL); + + gl_label_object_set_parent (dst_object, label); + + gl_label_object_get_position (src_object, &x, &y); + gl_label_object_get_size (src_object, &w, &h); + gl_label_object_get_matrix (src_object, &matrix); + gl_label_object_get_shadow_offset (src_object, &shadow_x, &shadow_y); + shadow_color_node = gl_label_object_get_shadow_color (src_object); + shadow_opacity = gl_label_object_get_shadow_opacity (src_object); + shadow_state = gl_label_object_get_shadow_state (src_object); + + gl_label_object_set_position (dst_object, x, y); + gl_label_object_set_size (dst_object, w, h); + gl_label_object_set_matrix (dst_object, &matrix); + gl_label_object_set_shadow_offset (dst_object, shadow_x, shadow_y); + gl_label_object_set_shadow_color (dst_object, shadow_color_node); + gl_label_object_set_shadow_opacity (dst_object, shadow_opacity); + gl_label_object_set_shadow_state (dst_object, shadow_state); + + gl_color_node_free (&shadow_color_node); + + if ( GL_LABEL_OBJECT_GET_CLASS(src_object)->copy != NULL ) { + + /* We have an object specific method, use it */ + GL_LABEL_OBJECT_GET_CLASS(src_object)->copy (dst_object, src_object); + + } + + gl_debug (DEBUG_LABEL, "END"); + + return dst_object; +} + +/*****************************************************************************/ +/* Emit "changed" signal (for derived objects). */ +/*****************************************************************************/ +void +gl_label_object_emit_changed (glLabelObject *object) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + g_signal_emit (G_OBJECT(object), signals[CHANGED], 0); + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Set parent label of object. */ +/*****************************************************************************/ +void +gl_label_object_set_parent (glLabelObject *object, + glLabel *label) +{ + glLabel *old_parent; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + g_return_if_fail (label && GL_IS_LABEL (label)); + + old_parent = object->parent; + if ( old_parent != NULL ) { + g_signal_handlers_disconnect_by_func (old_parent, + G_CALLBACK(merge_changed_cb), + object); + gl_label_remove_object( old_parent, object ); + } + gl_label_add_object( label, object ); + + g_signal_connect (G_OBJECT(label), "merge_changed", + G_CALLBACK(merge_changed_cb), object); + + g_signal_emit (G_OBJECT(object), signals[CHANGED], 0); + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Get parent label of object. */ +/*****************************************************************************/ +glLabel * +gl_label_object_get_parent (glLabelObject *object) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), NULL); + + gl_debug (DEBUG_LABEL, "END"); + + return object->parent; +} + +/*****************************************************************************/ +/* Set remove object from parent. */ +/*****************************************************************************/ +void +gl_label_object_remove (glLabelObject *object) +{ + glLabel *parent; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + parent = object->parent; + if ( parent != NULL ) { + g_signal_handlers_disconnect_by_func (parent, + G_CALLBACK(merge_changed_cb), + object); + gl_label_remove_object (parent, object); + + g_signal_emit (G_OBJECT(object), signals[REMOVED], 0); + + g_object_unref (G_OBJECT(object)); + } + + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Set name of object. */ +/*****************************************************************************/ +void +gl_label_object_set_name (glLabelObject *object, + gchar *name) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + g_free(object->priv->name); + object->priv->name = name; + + g_signal_emit (G_OBJECT(object), signals[CHANGED], 0); + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Get name of object. */ +/*****************************************************************************/ +gchar * +gl_label_object_get_name (glLabelObject *object) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), NULL); + + gl_debug (DEBUG_LABEL, "END"); + + return g_strdup(object->priv->name); +} + +/*****************************************************************************/ +/* Set position of object. */ +/*****************************************************************************/ +void +gl_label_object_set_position (glLabelObject *object, + gdouble x, + gdouble y) +{ + gdouble dx, dy; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( (x != object->priv->x) || (y != object->priv->y) ) { + + dx = x - object->priv->x; + dy = y - object->priv->y; + + object->priv->x = x; + object->priv->y = y; + + g_signal_emit (G_OBJECT(object), signals[MOVED], 0, dx, dy); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Set position of object relative to old position. */ +/*****************************************************************************/ +void +gl_label_object_set_position_relative (glLabelObject *object, + gdouble dx, + gdouble dy) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( (dx != 0.0) || (dy != 0.0) ) { + + object->priv->x += dx; + object->priv->y += dy; + + gl_debug (DEBUG_LABEL, " x = %f, y= %f", + object->priv->x, + object->priv->y); + + g_signal_emit (G_OBJECT(object), signals[MOVED], 0, dx, dy); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Get position of object. */ +/*****************************************************************************/ +void +gl_label_object_get_position (glLabelObject *object, + gdouble *x, + gdouble *y) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + *x = object->priv->x; + *y = object->priv->y; + + gl_debug (DEBUG_LABEL, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Default set size method. */ +/*---------------------------------------------------------------------------*/ +static void +set_size (glLabelObject *object, + gdouble w, + gdouble h) +{ + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( (object->priv->w != w) || (object->priv->h != h) ) { + + object->priv->w = w; + object->priv->h = h; + + g_signal_emit (G_OBJECT(object), signals[CHANGED], 0); + } +} + +/*****************************************************************************/ +/* Set size of object. */ +/*****************************************************************************/ +void +gl_label_object_set_size (glLabelObject *object, + gdouble w, + gdouble h) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_size != NULL ) { + + /* We have an object specific method, use it */ + GL_LABEL_OBJECT_GET_CLASS(object)->set_size (object, w, h); + + object->priv->aspect_ratio = h / w; + + } + + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Set size of object honoring current aspect ratio. */ +/*****************************************************************************/ +void +gl_label_object_set_size_honor_aspect (glLabelObject *object, + gdouble w, + gdouble h) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( h > w*object->priv->aspect_ratio ) { + + h = w * object->priv->aspect_ratio; + + } else { + + w = h / object->priv->aspect_ratio; + + } + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_size != NULL ) { + + /* We have an object specific method, use it */ + GL_LABEL_OBJECT_GET_CLASS(object)->set_size (object, w, h); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Get raw size method (don't let object content adjust size). */ +/*****************************************************************************/ +void +gl_label_object_get_raw_size (glLabelObject *object, + gdouble *w, + gdouble *h) +{ + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + *w = object->priv->w; + *h = object->priv->h; +} + +/*****************************************************************************/ +/* Get size of object. */ +/*****************************************************************************/ +void +gl_label_object_get_size (glLabelObject *object, + gdouble *w, + gdouble *h) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_size != NULL ) { + + /* We have an object specific method, use it */ + GL_LABEL_OBJECT_GET_CLASS(object)->get_size (object, w, h); + + } else { + + gl_label_object_get_raw_size (object, w, h); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Get extent of object. */ +/*****************************************************************************/ +void +gl_label_object_get_extent (glLabelObject *object, + glLabelRegion *region) +{ + gdouble w, h; + gdouble line_w; + gdouble xa1, ya1, xa2, ya2, xa3, ya3, xa4, ya4; + cairo_matrix_t matrix; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + gl_label_object_get_size (object, &w, &h); + line_w = gl_label_object_get_line_width (object); + + /* setup untransformed corners of bounding box, account for line width */ + xa1 = - line_w/2; + ya1 = - line_w/2; + xa2 = w + line_w/2; + ya2 = - line_w/2; + xa3 = w + line_w/2; + ya3 = h + line_w/2; + xa4 = - line_w/2; + ya4 = h + line_w/2; + + /* transform these points */ + gl_label_object_get_matrix (object, &matrix); + cairo_matrix_transform_point (&matrix, &xa1, &ya1); + cairo_matrix_transform_point (&matrix, &xa2, &ya2); + cairo_matrix_transform_point (&matrix, &xa3, &ya3); + cairo_matrix_transform_point (&matrix, &xa4, &ya4); + + /* now find the maximum extent of these points in x and y */ + region->x1 = MIN (xa1, MIN (xa2, MIN (xa3, xa4))) + object->priv->x; + region->y1 = MIN (ya1, MIN (ya2, MIN (ya3, ya4))) + object->priv->y; + region->x2 = MAX (xa1, MAX (xa2, MAX (xa3, xa4))) + object->priv->x; + region->y2 = MAX (ya1, MAX (ya2, MAX (ya3, ya4))) + object->priv->y; + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Can text properties be set for this object? */ +/*****************************************************************************/ +gboolean +gl_label_object_can_text (glLabelObject *object) +{ + gl_debug (DEBUG_LABEL, ""); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_font_family != NULL ) { + + return TRUE; + + } else { + + return FALSE; + + } + +} + +/*****************************************************************************/ +/* Set font family for all text contained in object. */ +/*****************************************************************************/ +void +gl_label_object_set_font_family (glLabelObject *object, + const gchar *font_family) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_font_family != NULL ) { + + /* We have an object specific method, use it */ + GL_LABEL_OBJECT_GET_CLASS(object)->set_font_family (object, font_family); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Set font size for all text contained in object. */ +/****************************************************************************/ +void +gl_label_object_set_font_size (glLabelObject *object, + gdouble font_size) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_font_size != NULL ) { + + /* We have an object specific method, use it */ + GL_LABEL_OBJECT_GET_CLASS(object)->set_font_size (object, font_size); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Set font weight for all text contained in object. */ +/****************************************************************************/ +void +gl_label_object_set_font_weight (glLabelObject *object, + PangoWeight font_weight) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_font_weight != NULL ) { + + /* We have an object specific method, use it */ + GL_LABEL_OBJECT_GET_CLASS(object)->set_font_weight (object, font_weight); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Set font italic flag for all text contained in object. */ +/****************************************************************************/ +void +gl_label_object_set_font_italic_flag (glLabelObject *object, + gboolean font_italic_flag) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_font_italic_flag != NULL ) { + + /* We have an object specific method, use it */ + GL_LABEL_OBJECT_GET_CLASS(object)->set_font_italic_flag (object, + font_italic_flag); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Set text alignment for all text contained in object. */ +/****************************************************************************/ +void +gl_label_object_set_text_alignment (glLabelObject *object, + PangoAlignment text_alignment) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_text_alignment != NULL ) { + + /* We have an object specific method, use it */ + GL_LABEL_OBJECT_GET_CLASS(object)->set_text_alignment (object, + text_alignment); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Set text line spacing for all text contained in object. */ +/****************************************************************************/ +void +gl_label_object_set_text_line_spacing (glLabelObject *object, + gdouble text_line_spacing) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_text_line_spacing != NULL ) { + + /* We have an object specific method, use it */ + GL_LABEL_OBJECT_GET_CLASS(object)->set_text_line_spacing (object, text_line_spacing); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Set text color for all text contained in object. */ +/****************************************************************************/ +void +gl_label_object_set_text_color (glLabelObject *object, + glColorNode *text_color_node) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_text_color != NULL ) { + + /* We have an object specific method, use it */ + GL_LABEL_OBJECT_GET_CLASS(object)->set_text_color (object, text_color_node); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Get font family for all text contained in object. */ +/*****************************************************************************/ +gchar * +gl_label_object_get_font_family (glLabelObject *object) +{ + gchar *ret = NULL; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), NULL); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_font_family != NULL ) { + + /* We have an object specific method, use it */ + ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_font_family (object); + + } + + gl_debug (DEBUG_LABEL, "END"); + + return ret; +} + +/****************************************************************************/ +/* Get font size for all text contained in object. */ +/****************************************************************************/ +gdouble +gl_label_object_get_font_size (glLabelObject *object) +{ + gdouble ret = 0.0; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0.0); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_font_size != NULL ) { + + /* We have an object specific method, use it */ + ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_font_size (object); + + } + + gl_debug (DEBUG_LABEL, "END"); + + return ret; +} + +/****************************************************************************/ +/* Get font weight for all text contained in object. */ +/****************************************************************************/ +PangoWeight +gl_label_object_get_font_weight (glLabelObject *object) +{ + PangoWeight ret = PANGO_WEIGHT_NORMAL; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), PANGO_WEIGHT_NORMAL); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_font_weight != NULL ) { + + /* We have an object specific method, use it */ + ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_font_weight (object); + + } + + gl_debug (DEBUG_LABEL, "END"); + + return ret; +} + +/****************************************************************************/ +/* Get font italic flag for all text contained in object. */ +/****************************************************************************/ +gboolean +gl_label_object_get_font_italic_flag (glLabelObject *object) +{ + gboolean ret = FALSE; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_font_italic_flag != NULL ) { + + /* We have an object specific method, use it */ + ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_font_italic_flag (object); + + } + + gl_debug (DEBUG_LABEL, "END"); + + return ret; +} + +/****************************************************************************/ +/* Get text alignment for all text contained in object. */ +/****************************************************************************/ +PangoAlignment +gl_label_object_get_text_alignment (glLabelObject *object) +{ + PangoAlignment ret = PANGO_ALIGN_LEFT; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), PANGO_ALIGN_LEFT); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_text_alignment != NULL ) { + + /* We have an object specific method, use it */ + ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_text_alignment (object); + + } + + gl_debug (DEBUG_LABEL, "END"); + + return ret; +} + +/****************************************************************************/ +/* Get text line spacing for all text contained in object. */ +/****************************************************************************/ +gdouble +gl_label_object_get_text_line_spacing (glLabelObject *object) +{ + gdouble ret = 0.0; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0.0); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_text_line_spacing != NULL ) { + + /* We have an object specific method, use it */ + ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_text_line_spacing (object); + + } + + gl_debug (DEBUG_LABEL, "END"); + + return ret; +} + +/****************************************************************************/ +/* Get text color for all text contained in object. */ +/****************************************************************************/ +glColorNode* +gl_label_object_get_text_color (glLabelObject *object) +{ + glColorNode *ret = NULL; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_text_color != NULL ) { + + /* We have an object specific method, use it */ + ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_text_color (object); + + } + + gl_debug (DEBUG_LABEL, "END"); + + return ret; +} + +/*****************************************************************************/ +/* Can fill properties be set for this object? */ +/*****************************************************************************/ +gboolean +gl_label_object_can_fill (glLabelObject *object) +{ + gl_debug (DEBUG_LABEL, ""); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_fill_color != NULL ) { + + return TRUE; + + } else { + + return FALSE; + + } + +} + +/****************************************************************************/ +/* Set fill color for object. */ +/****************************************************************************/ +void +gl_label_object_set_fill_color (glLabelObject *object, + glColorNode *fill_color_node) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_fill_color != NULL ) { + + /* We have an object specific method, use it */ + GL_LABEL_OBJECT_GET_CLASS(object)->set_fill_color (object, fill_color_node); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Get fill color for object. */ +/****************************************************************************/ +glColorNode* +gl_label_object_get_fill_color (glLabelObject *object) +{ + glColorNode *ret = NULL; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_fill_color != NULL ) { + + /* We have an object specific method, use it */ + ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_fill_color (object); + + } + + gl_debug (DEBUG_LABEL, "END"); + + return ret; +} + +/*****************************************************************************/ +/* Can line color property be set for this object? */ +/*****************************************************************************/ +gboolean +gl_label_object_can_line_color (glLabelObject *object) +{ + gl_debug (DEBUG_LABEL, ""); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_line_color != NULL ) { + + return TRUE; + + } else { + + return FALSE; + + } + +} + +/****************************************************************************/ +/* Set line color for object. */ +/****************************************************************************/ +void +gl_label_object_set_line_color (glLabelObject *object, + glColorNode *line_color_node) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_line_color != NULL ) { + + /* We have an object specific method, use it */ + GL_LABEL_OBJECT_GET_CLASS(object)->set_line_color (object, line_color_node); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Get line color for object. */ +/****************************************************************************/ +glColorNode* +gl_label_object_get_line_color (glLabelObject *object) +{ + glColorNode *ret = NULL; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_line_color != NULL ) { + + /* We have an object specific method, use it */ + ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_line_color (object); + + } + + gl_debug (DEBUG_LABEL, "END"); + + return ret; +} + +/*****************************************************************************/ +/* Can line width property be set for this object? */ +/*****************************************************************************/ +gboolean +gl_label_object_can_line_width (glLabelObject *object) +{ + gl_debug (DEBUG_LABEL, ""); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_line_width != NULL ) { + + return TRUE; + + } else { + + return FALSE; + + } + +} + +/****************************************************************************/ +/* Set line width for object. */ +/****************************************************************************/ +void +gl_label_object_set_line_width (glLabelObject *object, + gdouble line_width) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->set_line_width != NULL ) { + + /* We have an object specific method, use it */ + GL_LABEL_OBJECT_GET_CLASS(object)->set_line_width (object, line_width); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Get line width for object. */ +/****************************************************************************/ +gdouble +gl_label_object_get_line_width (glLabelObject *object) +{ + gdouble ret = 0.0; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), 0.0); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->get_line_width != NULL ) { + + /* We have an object specific method, use it */ + ret = GL_LABEL_OBJECT_GET_CLASS(object)->get_line_width (object); + + } + + gl_debug (DEBUG_LABEL, "END"); + + return ret; +} + +/****************************************************************************/ +/* Set shadow state of object. */ +/****************************************************************************/ +void +gl_label_object_set_shadow_state (glLabelObject *object, + gboolean state) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if (object->priv->shadow_state != state) + { + object->priv->shadow_state = state; + gl_label_object_emit_changed (object); + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Get shadow state of object. */ +/****************************************************************************/ +gboolean +gl_label_object_get_shadow_state (glLabelObject *object) +{ + gl_debug (DEBUG_LABEL, ""); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE); + + return object->priv->shadow_state; +} + +/****************************************************************************/ +/* Set offset of object's shadow. */ +/****************************************************************************/ +void +gl_label_object_set_shadow_offset (glLabelObject *object, + gdouble x, + gdouble y) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( (x != object->priv->shadow_x) || (y != object->priv->shadow_y) ) + { + object->priv->shadow_x = x; + object->priv->shadow_y = y; + + gl_label_object_emit_changed (object); + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Get offset of object's shadow. */ +/****************************************************************************/ +void +gl_label_object_get_shadow_offset (glLabelObject *object, + gdouble *x, + gdouble *y) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + *x = object->priv->shadow_x; + *y = object->priv->shadow_y; + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Set color of object's shadow. */ +/****************************************************************************/ +void +gl_label_object_set_shadow_color (glLabelObject *object, + glColorNode *color_node) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if ( !gl_color_node_equal (object->priv->shadow_color_node, color_node )) + { + gl_color_node_free (&(object->priv->shadow_color_node)); + object->priv->shadow_color_node = gl_color_node_dup (color_node); + gl_label_object_emit_changed (GL_LABEL_OBJECT(object)); + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Get color of object's shadow. */ +/****************************************************************************/ +glColorNode* +gl_label_object_get_shadow_color (glLabelObject *object) +{ + gl_debug (DEBUG_LABEL, ""); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), NULL); + + return gl_color_node_dup (object->priv->shadow_color_node); +} + +/****************************************************************************/ +/* Set opacity of object's shadow. */ +/****************************************************************************/ +void +gl_label_object_set_shadow_opacity (glLabelObject *object, + gdouble alpha) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if (object->priv->shadow_opacity != alpha) + { + object->priv->shadow_opacity = alpha; + gl_label_object_emit_changed (object); + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Get opacity of object's shadow. */ +/****************************************************************************/ +gdouble +gl_label_object_get_shadow_opacity (glLabelObject *object) +{ + gl_debug (DEBUG_LABEL, ""); + + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE); + + return object->priv->shadow_opacity; +} + +/****************************************************************************/ +/* Flip object horizontally. */ +/****************************************************************************/ +void +gl_label_object_flip_horiz (glLabelObject *object) +{ + cairo_matrix_t flip_matrix; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + cairo_matrix_init_scale (&flip_matrix, -1.0, 1.0); + cairo_matrix_multiply (&object->priv->matrix, &object->priv->matrix, &flip_matrix); + + g_signal_emit (G_OBJECT(object), signals[FLIP_ROTATE], 0); + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Flip object vertically. */ +/****************************************************************************/ +void +gl_label_object_flip_vert (glLabelObject *object) +{ + cairo_matrix_t flip_matrix; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + cairo_matrix_init_scale (&flip_matrix, 1.0, -1.0); + cairo_matrix_multiply (&object->priv->matrix, &object->priv->matrix, &flip_matrix); + + g_signal_emit (G_OBJECT(object), signals[FLIP_ROTATE], 0); + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Rotate object. */ +/****************************************************************************/ +void +gl_label_object_rotate (glLabelObject *object, + gdouble theta_degs) +{ + cairo_matrix_t rotate_matrix; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + cairo_matrix_init_rotate (&rotate_matrix, theta_degs*(G_PI/180.)); + cairo_matrix_multiply (&object->priv->matrix, &object->priv->matrix, &rotate_matrix); + + g_signal_emit (G_OBJECT(object), signals[FLIP_ROTATE], 0); + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Set raw affine */ +/****************************************************************************/ +void +gl_label_object_set_matrix (glLabelObject *object, + cairo_matrix_t *matrix) +{ + gl_debug (DEBUG_LABEL, ""); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + object->priv->matrix = *matrix; +} + +/****************************************************************************/ +/* Get raw affine */ +/****************************************************************************/ +void +gl_label_object_get_matrix (glLabelObject *object, + cairo_matrix_t *matrix) +{ + gl_debug (DEBUG_LABEL, ""); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + *matrix = object->priv->matrix; +} + +/****************************************************************************/ +/* Bring label object to front/top. */ +/****************************************************************************/ +void +gl_label_object_raise_to_top (glLabelObject *object) +{ + glLabel *label; + + gl_debug (DEBUG_LABEL, "START"); + + label = object->parent; + + gl_label_raise_object_to_top (label, object); + + g_signal_emit (G_OBJECT(object), signals[TOP], 0); + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Send label object to rear/bottom. */ +/****************************************************************************/ +void +gl_label_object_lower_to_bottom (glLabelObject *object) +{ + glLabel *label; + + gl_debug (DEBUG_LABEL, "START"); + + label = object->parent; + + gl_label_lower_object_to_bottom (label, object); + + g_signal_emit (G_OBJECT(object), signals[BOTTOM], 0); + + gl_debug (DEBUG_LABEL, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Label's merge data changed callback. */ +/*--------------------------------------------------------------------------*/ +static void +merge_changed_cb (glLabel *label, + glLabelObject *object) +{ + gl_label_object_emit_changed (object); +} + +/*****************************************************************************/ +/* Draw object */ +/*****************************************************************************/ +void +gl_label_object_draw (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record) + +{ + gdouble x0, y0; + cairo_matrix_t matrix; + gboolean shadow_state; + gdouble shadow_x, shadow_y; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + gl_label_object_get_position (object, &x0, &y0); + gl_label_object_get_matrix (object, &matrix); + + cairo_save (cr); + cairo_translate (cr, x0, y0); + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->draw_shadow != NULL ) { + + shadow_state = gl_label_object_get_shadow_state (object); + + if ( shadow_state ) + { + gl_label_object_get_shadow_offset (object, &shadow_x, &shadow_y); + + cairo_save (cr); + cairo_translate (cr, shadow_x, shadow_y); + cairo_transform (cr, &matrix); + + GL_LABEL_OBJECT_GET_CLASS(object)->draw_shadow (object, + cr, + screen_flag, + record); + + cairo_restore (cr); + } + } + + if ( GL_LABEL_OBJECT_GET_CLASS(object)->draw_object != NULL ) { + + cairo_save (cr); + cairo_transform (cr, &matrix); + + GL_LABEL_OBJECT_GET_CLASS(object)->draw_object (object, + cr, + screen_flag, + record); + + cairo_restore (cr); + } + + cairo_restore (cr); + + gl_debug (DEBUG_LABEL, "END"); +} + diff --git a/glabels2/src/label-object.h b/glabels2/src/label-object.h new file mode 100644 index 00000000..5ee0f9ba --- /dev/null +++ b/glabels2/src/label-object.h @@ -0,0 +1,345 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label_object.h: GLabels label object base class + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __LABEL_OBJECT_H__ +#define __LABEL_OBJECT_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +typedef enum { + GL_LABEL_OBJECT_TEXT, + GL_LABEL_OBJECT_BOX, + GL_LABEL_OBJECT_LINE, + GL_LABEL_OBJECT_ELLIPSE, + GL_LABEL_OBJECT_IMAGE, + GL_LABEL_OBJECT_BARCODE, + GL_LABEL_OBJECT_N_TYPES +} glLabelObjectType; + + +#define GL_TYPE_LABEL_OBJECT (gl_label_object_get_type ()) +#define GL_LABEL_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_LABEL_OBJECT, glLabelObject)) +#define GL_LABEL_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_LABEL_OBJECT, glLabelObjectClass)) +#define GL_IS_LABEL_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_LABEL_OBJECT)) +#define GL_IS_LABEL_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_LABEL_OBJECT)) +#define GL_LABEL_OBJECT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), GL_TYPE_LABEL_OBJECT, glLabelObjectClass)) + + +typedef struct _glLabelObject glLabelObject; +typedef struct _glLabelObjectClass glLabelObjectClass; + +typedef struct _glLabelObjectPrivate glLabelObjectPrivate; + +#include "label.h" +#include "color.h" + +struct _glLabelObject { + GObject object; + + glLabel *parent; + + glLabelObjectPrivate *priv; +}; + +struct _glLabelObjectClass { + GObjectClass parent_class; + + /* + * Methods + */ + + void (*set_size) (glLabelObject *object, + gdouble w, + gdouble h); + + void (*get_size) (glLabelObject *object, + gdouble *w, + gdouble *h); + + void (*set_font_family) (glLabelObject *object, + const gchar *font_family); + + void (*set_font_size) (glLabelObject *object, + gdouble font_size); + + void (*set_font_weight) (glLabelObject *object, + PangoWeight font_weight); + + void (*set_font_italic_flag) (glLabelObject *object, + gboolean font_italic_flag); + + void (*set_text_alignment) (glLabelObject *object, + PangoAlignment text_alignment); + + void (*set_text_line_spacing) (glLabelObject *object, + gdouble text_line_spacing); + + void (*set_text_color) (glLabelObject *object, + glColorNode *text_color_node); + + void (*set_fill_color) (glLabelObject *object, + glColorNode *fill_color_node); + + void (*set_line_color) (glLabelObject *object, + glColorNode *line_color_node); + + void (*set_line_width) (glLabelObject *object, + gdouble line_width); + + gchar *(*get_font_family) (glLabelObject *object); + + gdouble (*get_font_size) (glLabelObject *object); + + PangoWeight (*get_font_weight) (glLabelObject *object); + + gboolean (*get_font_italic_flag) (glLabelObject *object); + + PangoAlignment (*get_text_alignment) (glLabelObject *object); + + gdouble (*get_text_line_spacing) (glLabelObject *object); + + glColorNode* (*get_text_color) (glLabelObject *object); + + glColorNode* (*get_fill_color) (glLabelObject *object); + + glColorNode* (*get_line_color) (glLabelObject *object); + + gdouble (*get_line_width) (glLabelObject *object); + + void (*copy) (glLabelObject *dst_object, + glLabelObject *src_object); + + /* + * Draw methods + */ + void (*draw_shadow) (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record); + + void (*draw_object) (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record); + + + /* + * Signals + */ + void (*changed) (glLabelObject *object, + gpointer user_data); + + void (*moved) (glLabelObject *object, + gdouble dx, + gdouble dy, + gpointer user_data); + + void (*flip_rotate) (glLabelObject *object, + gpointer user_data); + + void (*top) (glLabelObject *object, + gpointer user_data); + + void (*bottom) (glLabelObject *object, + gpointer user_data); + + void (*removed) (glLabelObject *object, + gpointer user_data); + +}; + +GType gl_label_object_get_type (void) G_GNUC_CONST; + +GObject *gl_label_object_new (glLabel *label); + + +glLabelObject *gl_label_object_dup (glLabelObject *src_object, + glLabel *label); + +void gl_label_object_emit_changed (glLabelObject *object); + + +void gl_label_object_set_parent (glLabelObject *object, + glLabel *label); + +glLabel *gl_label_object_get_parent (glLabelObject *object); + + +void gl_label_object_remove (glLabelObject *object); + +void gl_label_object_set_name (glLabelObject *object, + gchar *name); + +gchar *gl_label_object_get_name (glLabelObject *object); + + +void gl_label_object_set_position (glLabelObject *object, + gdouble x, + gdouble y); + +void gl_label_object_set_position_relative (glLabelObject *object, + gdouble dx, + gdouble dy); + +void gl_label_object_get_position (glLabelObject *object, + gdouble *x, + gdouble *y); + +void gl_label_object_set_size (glLabelObject *object, + gdouble w, + gdouble h); + +void gl_label_object_set_size_honor_aspect (glLabelObject *object, + gdouble w, + gdouble h); + +void gl_label_object_get_size (glLabelObject *object, + gdouble *w, + gdouble *h); + +void gl_label_object_get_raw_size (glLabelObject *object, + gdouble *w, + gdouble *h); + +void gl_label_object_get_extent (glLabelObject *object, + glLabelRegion *region); + +gboolean gl_label_object_can_text (glLabelObject *object); + +void gl_label_object_set_font_family (glLabelObject *object, + const gchar *font_family); + +void gl_label_object_set_font_size (glLabelObject *object, + gdouble font_size); + +void gl_label_object_set_font_weight (glLabelObject *object, + PangoWeight font_weight); + +void gl_label_object_set_font_italic_flag (glLabelObject *object, + gboolean font_italic_flag); + +void gl_label_object_set_text_alignment (glLabelObject *object, + PangoAlignment text_alignment); + +void gl_label_object_set_text_color (glLabelObject *object, + glColorNode *text_color_node); + +void gl_label_object_set_text_line_spacing (glLabelObject *object, + gdouble text_line_spacing); + + +gchar *gl_label_object_get_font_family (glLabelObject *object); + +gdouble gl_label_object_get_font_size (glLabelObject *object); + +PangoWeight gl_label_object_get_font_weight (glLabelObject *object); + +gboolean gl_label_object_get_font_italic_flag (glLabelObject *object); + +PangoAlignment gl_label_object_get_text_alignment (glLabelObject *object); + +gdouble gl_label_object_get_text_line_spacing (glLabelObject *object); + +glColorNode *gl_label_object_get_text_color (glLabelObject *object); + + +gboolean gl_label_object_can_fill (glLabelObject *object); + +void gl_label_object_set_fill_color (glLabelObject *object, + glColorNode *fill_color_node); + +glColorNode* gl_label_object_get_fill_color (glLabelObject *object); + + +gboolean gl_label_object_can_line_color (glLabelObject *object); + +void gl_label_object_set_line_color (glLabelObject *object, + glColorNode *line_color_node); + +glColorNode *gl_label_object_get_line_color (glLabelObject *object); + +gboolean gl_label_object_can_line_width (glLabelObject *object); + +void gl_label_object_set_line_width (glLabelObject *object, + gdouble line_width); + +gdouble gl_label_object_get_line_width (glLabelObject *object); + + +void gl_label_object_raise_to_top (glLabelObject *object); + +void gl_label_object_lower_to_bottom (glLabelObject *object); + + +void gl_label_object_flip_horiz (glLabelObject *object); + +void gl_label_object_flip_vert (glLabelObject *object); + +void gl_label_object_rotate (glLabelObject *object, + gdouble theta_degs); + +void gl_label_object_set_matrix (glLabelObject *object, + cairo_matrix_t *matrix); + +void gl_label_object_get_matrix (glLabelObject *object, + cairo_matrix_t *matrix); + +void gl_label_object_set_shadow_state (glLabelObject *object, + gboolean state); + +void gl_label_object_set_shadow_offset (glLabelObject *object, + gdouble x, + gdouble y); + +void gl_label_object_set_shadow_color (glLabelObject *object, + glColorNode *color_node); + +void gl_label_object_set_shadow_opacity (glLabelObject *object, + gdouble alpha); + +gboolean gl_label_object_get_shadow_state (glLabelObject *object); + +void gl_label_object_get_shadow_offset (glLabelObject *object, + gdouble *x, + gdouble *y); + +glColorNode* gl_label_object_get_shadow_color (glLabelObject *object); + +gdouble gl_label_object_get_shadow_opacity (glLabelObject *object); + +void gl_label_object_draw (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record); + + + + +G_END_DECLS + +#endif /* __LABEL_OBJECT_H__ */ diff --git a/glabels2/src/label-text.c b/glabels2/src/label-text.c new file mode 100644 index 00000000..b9b0da26 --- /dev/null +++ b/glabels2/src/label-text.c @@ -0,0 +1,1098 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label_text.c: GLabels label text object + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "label-text.h" + +#include +#include +#include +#include +#include + +#include "util.h" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + +#define DEFAULT_FONT_FAMILY "Sans" +#define DEFAULT_FONT_SIZE 14.0 +#define DEFAULT_FONT_WEIGHT PANGO_WEIGHT_NORMAL +#define DEFAULT_FONT_ITALIC_FLAG FALSE +#define DEFAULT_ALIGN PANGO_ALIGN_LEFT +#define DEFAULT_COLOR GL_COLOR (0,0,0) +#define DEFAULT_TEXT_LINE_SPACING 1.0 +#define DEFAULT_AUTO_SHRINK FALSE + +#define FONT_SCALE (72.0/96.0) + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glLabelTextPrivate { + GtkTextTagTable *tag_table; + GtkTextBuffer *buffer; + + gchar *font_family; + gdouble font_size; + PangoWeight font_weight; + gboolean font_italic_flag; + PangoAlignment align; + glColorNode *color_node; + gdouble line_spacing; + gboolean auto_shrink; + + gboolean size_changed; + gdouble w; + gdouble h; +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_label_text_finalize (GObject *object); + +static void copy (glLabelObject *dst_object, + glLabelObject *src_object); + +static void buffer_changed_cb (GtkTextBuffer *textbuffer, + glLabelText *ltext); + +static void get_size (glLabelObject *object, + gdouble *w, + gdouble *h); + +static void set_font_family (glLabelObject *object, + const gchar *font_family); + +static void set_font_size (glLabelObject *object, + gdouble font_size); + +static void set_font_weight (glLabelObject *object, + PangoWeight font_weight); + +static void set_font_italic_flag (glLabelObject *object, + gboolean font_italic_flag); + +static void set_text_alignment (glLabelObject *object, + PangoAlignment text_alignment); + +static void set_text_line_spacing (glLabelObject *object, + gdouble text_line_spacing); + +static void set_text_color (glLabelObject *object, + glColorNode *text_color_node); + +static gchar *get_font_family (glLabelObject *object); + +static gdouble get_font_size (glLabelObject *object); + +static PangoWeight get_font_weight (glLabelObject *object); + +static gboolean get_font_italic_flag (glLabelObject *object); + +static PangoAlignment get_text_alignment (glLabelObject *object); + +static gdouble get_text_line_spacing (glLabelObject *object); + +static glColorNode* get_text_color (glLabelObject *object); + +static void draw_object (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record); + +static void draw_shadow (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record); + +static gdouble auto_shrink_font_size (cairo_t *cr, + gchar *family, + gdouble size, + PangoWeight weight, + PangoStyle style, + gchar *text, + gdouble width); + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glLabelText, gl_label_text, GL_TYPE_LABEL_OBJECT); + +static void +gl_label_text_class_init (glLabelTextClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + glLabelObjectClass *label_object_class = GL_LABEL_OBJECT_CLASS (class); + + gl_label_text_parent_class = g_type_class_peek_parent (class); + + label_object_class->copy = copy; + + label_object_class->get_size = get_size; + + label_object_class->set_font_family = set_font_family; + label_object_class->set_font_size = set_font_size; + label_object_class->set_font_weight = set_font_weight; + label_object_class->set_font_italic_flag = set_font_italic_flag; + label_object_class->set_text_alignment = set_text_alignment; + label_object_class->set_text_line_spacing = set_text_line_spacing; + label_object_class->set_text_color = set_text_color; + label_object_class->get_font_family = get_font_family; + label_object_class->get_font_size = get_font_size; + label_object_class->get_font_weight = get_font_weight; + label_object_class->get_font_italic_flag = get_font_italic_flag; + label_object_class->get_text_alignment = get_text_alignment; + label_object_class->get_text_line_spacing = get_text_line_spacing; + label_object_class->get_text_color = get_text_color; + label_object_class->draw_object = draw_object; + label_object_class->draw_shadow = draw_shadow; + + object_class->finalize = gl_label_text_finalize; +} + +static void +gl_label_text_init (glLabelText *ltext) +{ + ltext->priv = g_new0 (glLabelTextPrivate, 1); + + ltext->priv->tag_table = gtk_text_tag_table_new (); + ltext->priv->buffer = gtk_text_buffer_new (ltext->priv->tag_table); + + ltext->priv->font_family = g_strdup(DEFAULT_FONT_FAMILY); + ltext->priv->font_size = DEFAULT_FONT_SIZE; + ltext->priv->font_weight = DEFAULT_FONT_WEIGHT; + ltext->priv->font_italic_flag = DEFAULT_FONT_ITALIC_FLAG; + ltext->priv->align = DEFAULT_ALIGN; + ltext->priv->color_node = gl_color_node_new_default (); + ltext->priv->color_node->color = DEFAULT_COLOR; + ltext->priv->line_spacing = DEFAULT_TEXT_LINE_SPACING; + ltext->priv->auto_shrink = DEFAULT_AUTO_SHRINK; + + ltext->priv->size_changed = TRUE; + + g_signal_connect (G_OBJECT(ltext->priv->buffer), "changed", + G_CALLBACK(buffer_changed_cb), ltext); +} + +static void +gl_label_text_finalize (GObject *object) +{ + glLabelText *ltext = GL_LABEL_TEXT (object); + + g_return_if_fail (object && GL_IS_LABEL_TEXT (object)); + + g_object_unref (ltext->priv->tag_table); + g_object_unref (ltext->priv->buffer); + g_free (ltext->priv->font_family); + gl_color_node_free (&(ltext->priv->color_node)); + g_free (ltext->priv); + + G_OBJECT_CLASS (gl_label_text_parent_class)->finalize (object); +} + +/*****************************************************************************/ +/* NEW label "text" object. */ +/*****************************************************************************/ +GObject * +gl_label_text_new (glLabel *label) +{ + glLabelText *ltext; + + ltext = g_object_new (gl_label_text_get_type(), NULL); + + gl_label_object_set_parent (GL_LABEL_OBJECT(ltext), label); + + return G_OBJECT (ltext); +} + +/*****************************************************************************/ +/* Copy object contents. */ +/*****************************************************************************/ +static void +copy (glLabelObject *dst_object, + glLabelObject *src_object) +{ + glLabelText *ltext = (glLabelText *)src_object; + glLabelText *new_ltext = (glLabelText *)dst_object; + GList *lines; + glColorNode *text_color_node; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (ltext && GL_IS_LABEL_TEXT (ltext)); + g_return_if_fail (new_ltext && GL_IS_LABEL_TEXT (new_ltext)); + + lines = gl_label_text_get_lines (ltext); + text_color_node = get_text_color (src_object); + gl_label_text_set_lines (new_ltext, lines); + + new_ltext->priv->font_family = g_strdup (ltext->priv->font_family); + new_ltext->priv->font_size = ltext->priv->font_size; + new_ltext->priv->font_weight = ltext->priv->font_weight; + new_ltext->priv->font_italic_flag = ltext->priv->font_italic_flag; + set_text_color (dst_object, text_color_node); + new_ltext->priv->align = ltext->priv->align; + new_ltext->priv->line_spacing = ltext->priv->line_spacing; + new_ltext->priv->auto_shrink = ltext->priv->auto_shrink; + + new_ltext->priv->size_changed = ltext->priv->size_changed; + new_ltext->priv->w = ltext->priv->w; + new_ltext->priv->h = ltext->priv->h; + + gl_color_node_free (&text_color_node); + gl_text_node_lines_free (&lines); + + gl_debug (DEBUG_LABEL, "END"); +} + + +/*****************************************************************************/ +/* Set object params. */ +/*****************************************************************************/ +void +gl_label_text_set_lines (glLabelText *ltext, + GList *lines) +{ + gchar *text; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (ltext && GL_IS_LABEL_TEXT (ltext)); + + text = gl_text_node_lines_expand (lines, NULL); + gtk_text_buffer_set_text (ltext->priv->buffer, text, -1); + g_free (text); + + ltext->priv->size_changed = TRUE; + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Get object params. */ +/*****************************************************************************/ +GtkTextBuffer * +gl_label_text_get_buffer (glLabelText *ltext) +{ + g_return_val_if_fail (ltext && GL_IS_LABEL_TEXT (ltext), NULL); + + return ltext->priv->buffer; +} + +GList * +gl_label_text_get_lines (glLabelText *ltext) +{ + GtkTextIter start, end; + gchar *text; + GList *lines; + + g_return_val_if_fail (ltext && GL_IS_LABEL_TEXT (ltext), NULL); + + gtk_text_buffer_get_bounds (ltext->priv->buffer, &start, &end); + text = gtk_text_buffer_get_text (ltext->priv->buffer, + &start, &end, FALSE); + lines = gl_text_node_lines_new_from_text (text); + g_free (text); + + return lines; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. text buffer "changed" callback. */ +/*---------------------------------------------------------------------------*/ +void buffer_changed_cb (GtkTextBuffer *textbuffer, + glLabelText *ltext) +{ + ltext->priv->size_changed = TRUE; + + gl_label_object_emit_changed (GL_LABEL_OBJECT(ltext)); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. get object size method. */ +/*---------------------------------------------------------------------------*/ +static void +get_size (glLabelObject *object, + gdouble *w, + gdouble *h) +{ + glLabelText *ltext = (glLabelText *)object; + PangoFontMap *fontmap; + PangoContext *context; + cairo_font_options_t *options; + PangoStyle style; + PangoLayout *layout; + PangoFontDescription *desc; + gdouble font_size; + gdouble line_spacing; + GtkTextIter start, end; + gchar *text; + gdouble w_parent, h_parent; + gint iw, ih; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (ltext && GL_IS_LABEL_TEXT (ltext)); + + gl_label_object_get_raw_size (object, &w_parent, &h_parent); + + if ( (w_parent != 0.0) || (h_parent != 0.0) ) { + *w = w_parent; + *h = h_parent; + return; + } + + if (!ltext->priv->size_changed) + { + *w = ltext->priv->w; + *h = ltext->priv->h; + return; + } + + font_size = GL_LABEL_TEXT (object)->priv->font_size * FONT_SCALE; + line_spacing = GL_LABEL_TEXT (object)->priv->line_spacing; + + gtk_text_buffer_get_bounds (ltext->priv->buffer, &start, &end); + text = gtk_text_buffer_get_text (ltext->priv->buffer, + &start, &end, FALSE); + + + fontmap = pango_cairo_font_map_new (); + context = pango_cairo_font_map_create_context (PANGO_CAIRO_FONT_MAP (fontmap)); + options = cairo_font_options_create (); + cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_OFF); + cairo_font_options_set_hint_style (options, CAIRO_HINT_STYLE_NONE); + pango_cairo_context_set_font_options (context, options); + cairo_font_options_destroy (options); + + layout = pango_layout_new (context); + + style = GL_LABEL_TEXT (object)->priv->font_italic_flag ? PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL; + + desc = pango_font_description_new (); + pango_font_description_set_family (desc, GL_LABEL_TEXT (object)->priv->font_family); + pango_font_description_set_weight (desc, GL_LABEL_TEXT (object)->priv->font_weight); + pango_font_description_set_style (desc, style); + pango_font_description_set_size (desc, font_size * PANGO_SCALE); + pango_layout_set_font_description (layout, desc); + pango_font_description_free (desc); + + pango_layout_set_spacing (layout, font_size * (line_spacing-1) * PANGO_SCALE); + pango_layout_set_text (layout, text, -1); + pango_layout_get_size (layout, &iw, &ih); + *w = ltext->priv->w = iw / PANGO_SCALE + 2*GL_LABEL_TEXT_MARGIN; + *h = ltext->priv->h = ih / PANGO_SCALE; + ltext->priv->size_changed = FALSE; + + g_object_unref (layout); + g_object_unref (context); + g_object_unref (fontmap); + g_free (text); + + gl_debug (DEBUG_LABEL, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. set font family method. */ +/*---------------------------------------------------------------------------*/ +static void +set_font_family (glLabelObject *object, + const gchar *font_family) +{ + glLabelText *ltext = (glLabelText *)object; + GList *family_names; + gchar *good_font_family; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (ltext && GL_IS_LABEL_TEXT (ltext)); + g_return_if_fail (font_family); + + family_names = gl_util_get_font_family_list (); + if (g_list_find_custom (family_names, font_family, (GCompareFunc)g_utf8_collate)) { + good_font_family = g_strdup (font_family); + } else { + if (family_names != NULL) { + good_font_family = g_strdup (family_names->data); /* 1st entry */ + } else { + good_font_family = g_strdup (font_family); + } + } + gl_util_font_family_list_free (family_names); + + if (ltext->priv->font_family) { + if (g_strcasecmp (ltext->priv->font_family, good_font_family) == 0) { + g_free (good_font_family); + gl_debug (DEBUG_LABEL, "END (no change)"); + return; + } + g_free (ltext->priv->font_family); + } + ltext->priv->font_family = g_strdup (good_font_family); + g_free (good_font_family); + + gl_debug (DEBUG_LABEL, "new font family = %s", ltext->priv->font_family); + + ltext->priv->size_changed = TRUE; + + gl_label_object_emit_changed (GL_LABEL_OBJECT(ltext)); + + gl_debug (DEBUG_LABEL, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. set font size method. */ +/*---------------------------------------------------------------------------*/ +static void +set_font_size (glLabelObject *object, + gdouble font_size) +{ + glLabelText *ltext = (glLabelText *)object; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (ltext && GL_IS_LABEL_TEXT (ltext)); + + if (ltext->priv->font_size != font_size) { + + ltext->priv->size_changed = TRUE; + + ltext->priv->font_size = font_size; + gl_label_object_emit_changed (GL_LABEL_OBJECT(ltext)); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. set font weight method. */ +/*---------------------------------------------------------------------------*/ +static void +set_font_weight (glLabelObject *object, + PangoWeight font_weight) +{ + glLabelText *ltext = (glLabelText *)object; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (ltext && GL_IS_LABEL_TEXT (ltext)); + + if (ltext->priv->font_weight != font_weight) { + + ltext->priv->size_changed = TRUE; + + ltext->priv->font_weight = font_weight; + gl_label_object_emit_changed (GL_LABEL_OBJECT(ltext)); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. set font italic flag method. */ +/*---------------------------------------------------------------------------*/ +static void +set_font_italic_flag (glLabelObject *object, + gboolean font_italic_flag) +{ + glLabelText *ltext = (glLabelText *)object; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (ltext && GL_IS_LABEL_TEXT (ltext)); + + if (ltext->priv->font_italic_flag != font_italic_flag) { + + ltext->priv->size_changed = TRUE; + + ltext->priv->font_italic_flag = font_italic_flag; + gl_label_object_emit_changed (GL_LABEL_OBJECT(ltext)); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. set text alignment method. */ +/*---------------------------------------------------------------------------*/ +static void +set_text_alignment (glLabelObject *object, + PangoAlignment text_alignment) +{ + glLabelText *ltext = (glLabelText *)object; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (ltext && GL_IS_LABEL_TEXT (ltext)); + + if (ltext->priv->align != text_alignment) { + + ltext->priv->size_changed = TRUE; + + ltext->priv->align = text_alignment; + gl_label_object_emit_changed (GL_LABEL_OBJECT(ltext)); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. set text line spacing method. */ +/*---------------------------------------------------------------------------*/ +static void +set_text_line_spacing (glLabelObject *object, + gdouble line_spacing) +{ + glLabelText *ltext = (glLabelText *)object; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (ltext && GL_IS_LABEL_TEXT (ltext)); + + if (ltext->priv->line_spacing != line_spacing) { + + ltext->priv->size_changed = TRUE; + + ltext->priv->line_spacing = line_spacing; + gl_label_object_emit_changed (GL_LABEL_OBJECT(ltext)); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. set text color method. */ +/*---------------------------------------------------------------------------*/ +static void +set_text_color (glLabelObject *object, + glColorNode *text_color_node) +{ + glLabelText *ltext = (glLabelText *)object; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (ltext && GL_IS_LABEL_TEXT (ltext)); + + if (!gl_color_node_equal (ltext->priv->color_node, text_color_node)) { + + gl_color_node_free (&(ltext->priv->color_node)); + ltext->priv->color_node = gl_color_node_dup (text_color_node); + + gl_label_object_emit_changed (GL_LABEL_OBJECT(ltext)); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. get font family method. */ +/*---------------------------------------------------------------------------*/ +static gchar * +get_font_family (glLabelObject *object) +{ + glLabelText *ltext = (glLabelText *)object; + + gl_debug (DEBUG_LABEL, ""); + + g_return_val_if_fail (ltext && GL_IS_LABEL_TEXT (ltext), NULL); + + return g_strdup (ltext->priv->font_family); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. get font size method. */ +/*---------------------------------------------------------------------------*/ +static gdouble +get_font_size (glLabelObject *object) +{ + glLabelText *ltext = (glLabelText *)object; + + gl_debug (DEBUG_LABEL, ""); + + g_return_val_if_fail (ltext && GL_IS_LABEL_TEXT (ltext), 0.0); + + return ltext->priv->font_size; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. get font weight method. */ +/*---------------------------------------------------------------------------*/ +static PangoWeight +get_font_weight (glLabelObject *object) +{ + glLabelText *ltext = (glLabelText *)object; + + gl_debug (DEBUG_LABEL, ""); + + g_return_val_if_fail (ltext && GL_IS_LABEL_TEXT (ltext), PANGO_WEIGHT_NORMAL); + + return ltext->priv->font_weight; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. get font italic flag method. */ +/*---------------------------------------------------------------------------*/ +static gboolean +get_font_italic_flag (glLabelObject *object) +{ + glLabelText *ltext = (glLabelText *)object; + + gl_debug (DEBUG_LABEL, ""); + + g_return_val_if_fail (ltext && GL_IS_LABEL_TEXT (ltext), FALSE); + + return ltext->priv->font_italic_flag; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. get text alignment method. */ +/*---------------------------------------------------------------------------*/ +static PangoAlignment +get_text_alignment (glLabelObject *object) +{ + glLabelText *ltext = (glLabelText *)object; + + gl_debug (DEBUG_LABEL, ""); + + g_return_val_if_fail (ltext && GL_IS_LABEL_TEXT (ltext), GTK_JUSTIFY_LEFT); + + return ltext->priv->align; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. get text line spacing method. */ +/*---------------------------------------------------------------------------*/ +static gdouble +get_text_line_spacing (glLabelObject *object) +{ + glLabelText *ltext = (glLabelText *)object; + + gl_debug (DEBUG_LABEL, ""); + + g_return_val_if_fail (ltext && GL_IS_LABEL_TEXT (ltext), 0.0); + + return ltext->priv->line_spacing; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. get text color method. */ +/*---------------------------------------------------------------------------*/ +static glColorNode* +get_text_color (glLabelObject *object) +{ + glLabelText *ltext = (glLabelText *)object; + + gl_debug (DEBUG_LABEL, ""); + + g_return_val_if_fail (ltext && GL_IS_LABEL_TEXT (ltext), 0); + + return gl_color_node_dup (ltext->priv->color_node); +} + +/*****************************************************************************/ +/* Set auto shrink flag. */ +/*****************************************************************************/ +void +gl_label_text_set_auto_shrink (glLabelText *ltext, + gboolean auto_shrink) +{ + gl_debug (DEBUG_LABEL, "BEGIN"); + + g_return_if_fail (ltext && GL_IS_LABEL_TEXT (ltext)); + + if (ltext->priv->auto_shrink != auto_shrink) { + + ltext->priv->auto_shrink = auto_shrink; + gl_label_object_emit_changed (GL_LABEL_OBJECT(ltext)); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Query auto shrink flag. */ +/*****************************************************************************/ +gboolean +gl_label_text_get_auto_shrink (glLabelText *ltext) +{ + gl_debug (DEBUG_LABEL, ""); + + g_return_val_if_fail (ltext && GL_IS_LABEL_TEXT (ltext), 0); + + return ltext->priv->auto_shrink; +} + +/*****************************************************************************/ +/* Draw object method. */ +/*****************************************************************************/ +static void +draw_object (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record) +{ + gdouble x0, y0; + cairo_matrix_t matrix; + gdouble object_w, object_h; + gdouble raw_w, raw_h; + gchar *text; + GList *lines; + gchar *font_family; + gdouble font_size; + PangoWeight font_weight; + gboolean font_italic_flag; + glColorNode *color_node; + gboolean auto_shrink; + guint color; + gdouble text_line_spacing; + PangoAlignment alignment; + PangoStyle style; + PangoLayout *layout; + PangoFontDescription *desc; + gdouble scale_x, scale_y; + cairo_font_options_t *font_options; + PangoContext *context; + + + gl_debug (DEBUG_LABEL, "START"); + + gl_label_object_get_position (object, &x0, &y0); + gl_label_object_get_matrix (object, &matrix); + + gl_label_object_get_size (object, &object_w, &object_h); + gl_label_object_get_raw_size (object, &raw_w, &raw_h); + lines = gl_label_text_get_lines (GL_LABEL_TEXT (object)); + font_family = gl_label_object_get_font_family (object); + font_size = gl_label_object_get_font_size (object) * FONT_SCALE; + font_weight = gl_label_object_get_font_weight (object); + font_italic_flag = gl_label_object_get_font_italic_flag (object); + + color_node = gl_label_object_get_text_color (object); + color = gl_color_node_expand (color_node, record); + if (color_node->field_flag && screen_flag) + { + color = GL_COLOR_MERGE_DEFAULT; + } + gl_color_node_free (&color_node); + + alignment = gl_label_object_get_text_alignment (object); + text_line_spacing = + gl_label_object_get_text_line_spacing (object); + auto_shrink = gl_label_text_get_auto_shrink (GL_LABEL_TEXT (object)); + + text = gl_text_node_lines_expand (lines, record); + + style = font_italic_flag ? PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL; + + + if (!screen_flag && record && auto_shrink && (raw_w != 0.0)) + { + font_size = auto_shrink_font_size (cr, + font_family, + font_size, + font_weight, + style, + text, + object_w); + g_print ("Autosize new size = %g\n", font_size); + } + + + /* + * Workaround for pango Bug#341481. + * Render font at device scale and scale font size accordingly. + */ + scale_x = 1.0; + scale_y = 1.0; + cairo_device_to_user_distance (cr, &scale_x, &scale_y); + scale_x = fabs (scale_x); + scale_y = fabs (scale_y); + cairo_save (cr); + cairo_scale (cr, scale_x, scale_y); + + layout = pango_cairo_create_layout (cr); + + font_options = cairo_font_options_create (); + cairo_font_options_set_hint_metrics (font_options, CAIRO_HINT_METRICS_OFF); + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_NONE); + context = pango_layout_get_context (layout); + pango_cairo_context_set_font_options (context, font_options); + cairo_font_options_destroy (font_options); + + desc = pango_font_description_new (); + pango_font_description_set_family (desc, font_family); + pango_font_description_set_weight (desc, font_weight); + pango_font_description_set_style (desc, style); + pango_font_description_set_size (desc, font_size * PANGO_SCALE / scale_x); + pango_layout_set_font_description (layout, desc); + pango_font_description_free (desc); + + pango_layout_set_text (layout, text, -1); + pango_layout_set_spacing (layout, font_size * (text_line_spacing-1) * PANGO_SCALE / scale_x); + if (raw_w == 0.0) + { + pango_layout_set_width (layout, -1); + } + else + { + pango_layout_set_width (layout, object_w * PANGO_SCALE / scale_x); + } + pango_layout_set_wrap (layout, PANGO_WRAP_CHAR); + pango_layout_set_alignment (layout, alignment); + + + cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (color)); + cairo_move_to (cr, GL_LABEL_TEXT_MARGIN/scale_x, 0); + pango_cairo_show_layout (cr, layout); + + cairo_restore (cr); + + g_object_unref (layout); + + + gl_text_node_lines_free (&lines); + g_free (font_family); + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Draw shadow method. */ +/*****************************************************************************/ +static void +draw_shadow (glLabelObject *object, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record) +{ + gdouble x0, y0; + cairo_matrix_t matrix; + gdouble object_w, object_h; + gdouble raw_w, raw_h; + gchar *text; + GList *lines; + gchar *font_family; + gdouble font_size; + PangoWeight font_weight; + gboolean font_italic_flag; + gboolean auto_shrink; + guint color; + glColorNode *color_node; + gdouble text_line_spacing; + glColorNode *shadow_color_node; + gdouble shadow_opacity; + guint shadow_color; + PangoAlignment alignment; + PangoStyle style; + PangoLayout *layout; + PangoFontDescription *desc; + gdouble scale_x, scale_y; + cairo_font_options_t *font_options; + PangoContext *context; + + + gl_debug (DEBUG_LABEL, "START"); + + gl_label_object_get_position (object, &x0, &y0); + gl_label_object_get_matrix (object, &matrix); + + gl_label_object_get_size (object, &object_w, &object_h); + gl_label_object_get_raw_size (object, &raw_w, &raw_h); + lines = gl_label_text_get_lines (GL_LABEL_TEXT (object)); + font_family = gl_label_object_get_font_family (object); + font_size = gl_label_object_get_font_size (object) * FONT_SCALE; + font_weight = gl_label_object_get_font_weight (object); + font_italic_flag = gl_label_object_get_font_italic_flag (object); + + color_node = gl_label_object_get_text_color (object); + color = gl_color_node_expand (color_node, record); + gl_color_node_free (&color_node); + + alignment = gl_label_object_get_text_alignment (object); + text_line_spacing = + gl_label_object_get_text_line_spacing (object); + auto_shrink = gl_label_text_get_auto_shrink (GL_LABEL_TEXT (object)); + + shadow_color_node = gl_label_object_get_shadow_color (object); + if (shadow_color_node->field_flag) + { + shadow_color_node->color = GL_COLOR_SHADOW_MERGE_DEFAULT; + } + shadow_opacity = gl_label_object_get_shadow_opacity (object); + shadow_color = gl_color_shadow (shadow_color_node->color, shadow_opacity, color); + gl_color_node_free (&shadow_color_node); + + text = gl_text_node_lines_expand (lines, record); + + style = font_italic_flag ? PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL; + + + if (!screen_flag && record && auto_shrink && (raw_w != 0.0)) + { + font_size = auto_shrink_font_size (cr, + font_family, + font_size, + font_weight, + style, + text, + object_w); + } + + + /* + * Workaround for pango Bug#341481. + * Render font at device scale and scale font size accordingly. + */ + scale_x = 1.0; + scale_y = 1.0; + cairo_device_to_user_distance (cr, &scale_x, &scale_y); + scale_x = fabs (scale_x); + scale_y = fabs (scale_y); + cairo_save (cr); + cairo_scale (cr, scale_x, scale_y); + + layout = pango_cairo_create_layout (cr); + + font_options = cairo_font_options_create (); + cairo_font_options_set_hint_metrics (font_options, CAIRO_HINT_METRICS_OFF); + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_NONE); + context = pango_layout_get_context (layout); + pango_cairo_context_set_font_options (context, font_options); + cairo_font_options_destroy (font_options); + + desc = pango_font_description_new (); + pango_font_description_set_family (desc, font_family); + pango_font_description_set_weight (desc, font_weight); + pango_font_description_set_style (desc, style); + pango_font_description_set_size (desc, font_size * PANGO_SCALE / scale_x); + pango_layout_set_font_description (layout, desc); + pango_font_description_free (desc); + + pango_layout_set_text (layout, text, -1); + pango_layout_set_spacing (layout, font_size * (text_line_spacing-1) * PANGO_SCALE / scale_x); + if (raw_w == 0.0) + { + pango_layout_set_width (layout, -1); + } + else + { + pango_layout_set_width (layout, object_w * PANGO_SCALE / scale_x); + } + pango_layout_set_wrap (layout, PANGO_WRAP_CHAR); + pango_layout_set_alignment (layout, alignment); + + cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (shadow_color)); + cairo_move_to (cr, GL_LABEL_TEXT_MARGIN/scale_x, 0); + pango_cairo_show_layout (cr, layout); + + + cairo_restore (cr); + + g_object_unref (layout); + + gl_text_node_lines_free (&lines); + g_free (font_family); + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Automatically shrink text size to fit within horizontal width. */ +/*****************************************************************************/ +static gdouble +auto_shrink_font_size (cairo_t *cr, + gchar *family, + gdouble size, + PangoWeight weight, + PangoStyle style, + gchar *text, + gdouble width) +{ + PangoLayout *layout; + PangoFontDescription *desc; + gint iw, ih; + gdouble layout_width; + gdouble new_size; + + layout = pango_cairo_create_layout (cr); + + desc = pango_font_description_new (); + pango_font_description_set_family (desc, family); + pango_font_description_set_weight (desc, weight); + pango_font_description_set_style (desc, style); + pango_font_description_set_size (desc, size * PANGO_SCALE); + + pango_layout_set_font_description (layout, desc); + pango_font_description_free (desc); + + pango_layout_set_text (layout, text, -1); + pango_layout_set_width (layout, -1); + pango_layout_get_size (layout, &iw, &ih); + layout_width = (gdouble)iw / (gdouble)PANGO_SCALE; + + g_object_unref (layout); + + g_print ("Object w = %g, layout w = %g\n", width, layout_width); + + if ( layout_width > width ) + { + /* Scale down. */ + new_size = size * (width-2*GL_LABEL_TEXT_MARGIN)/layout_width; + + /* Round down to nearest 1/2 point */ + new_size = (int)(new_size*2.0) / 2.0; + + /* don't get ridiculously small. */ + if (new_size < 1.0) + { + new_size = 1.0; + } + } + else + { + new_size = size; + } + + return new_size; +} + diff --git a/glabels2/src/label-text.h b/glabels2/src/label-text.h new file mode 100644 index 00000000..95c46230 --- /dev/null +++ b/glabels2/src/label-text.h @@ -0,0 +1,74 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label_text.h: GLabels label text object + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __LABEL_TEXT_H__ +#define __LABEL_TEXT_H__ + +#include +#include "text-node.h" +#include "label-object.h" + +G_BEGIN_DECLS + +#define GL_LABEL_TEXT_MARGIN 3.0 + + +#define GL_TYPE_LABEL_TEXT (gl_label_text_get_type ()) +#define GL_LABEL_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_LABEL_TEXT, glLabelText)) +#define GL_LABEL_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_LABEL_TEXT, glLabelTextClass)) +#define GL_IS_LABEL_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_LABEL_TEXT)) +#define GL_IS_LABEL_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_LABEL_TEXT)) + +typedef struct _glLabelText glLabelText; +typedef struct _glLabelTextClass glLabelTextClass; + +typedef struct _glLabelTextPrivate glLabelTextPrivate; + +struct _glLabelText { + glLabelObject object; + + glLabelTextPrivate *priv; +}; + +struct _glLabelTextClass { + glLabelObjectClass parent_class; +}; + +GType gl_label_text_get_type (void) G_GNUC_CONST; + +GObject *gl_label_text_new (glLabel *label); + +void gl_label_text_set_lines (glLabelText *ltext, + GList *lines); +GtkTextBuffer *gl_label_text_get_buffer (glLabelText *ltext); +GList *gl_label_text_get_lines (glLabelText *ltext); + +void gl_label_text_set_auto_shrink (glLabelText *ltext, + gboolean auto_shrink); +gboolean gl_label_text_get_auto_shrink (glLabelText *ltext); + + +G_END_DECLS + +#endif /* __LABEL_TEXT_H__ */ diff --git a/glabels2/src/label.c b/glabels2/src/label.c new file mode 100644 index 00000000..c886529b --- /dev/null +++ b/glabels2/src/label.c @@ -0,0 +1,674 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label.c: GLabels label module + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "label.h" + +#include + +#include "marshal.h" +#include "prefs.h" +#include "util.h" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glLabelPrivate { + + gchar *filename; + gint compression; + gboolean modified_flag; + gint untitled_instance; + + glMerge *merge; + + GHashTable *pixbuf_cache; +}; + +enum { + CHANGED, + NAME_CHANGED, + MODIFIED_CHANGED, + MERGE_CHANGED, + SIZE_CHANGED, + OBJECT_ADDED, + LAST_SIGNAL +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +static guint signals[LAST_SIGNAL] = {0}; + +static guint untitled = 0; + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_label_finalize (GObject *object); + +static void object_changed_cb (glLabelObject *object, + glLabel *label); + +static void object_moved_cb (glLabelObject *object, + gdouble x, + gdouble y, + glLabel *label); + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glLabel, gl_label, G_TYPE_OBJECT); + +static void +gl_label_class_init (glLabelClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_debug (DEBUG_LABEL, "START"); + + gl_label_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_label_finalize; + + signals[CHANGED] = + g_signal_new ("changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glLabelClass, changed), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + signals[NAME_CHANGED] = + g_signal_new ("name_changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glLabelClass, name_changed), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + signals[MODIFIED_CHANGED] = + g_signal_new ("modified_changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glLabelClass, modified_changed), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + signals[MERGE_CHANGED] = + g_signal_new ("merge_changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glLabelClass, merge_changed), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + signals[SIZE_CHANGED] = + g_signal_new ("size_changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glLabelClass, size_changed), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + signals[OBJECT_ADDED] = + g_signal_new ("object_added", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glLabelClass, object_added), + NULL, NULL, + gl_marshal_VOID__OBJECT, + G_TYPE_NONE, + 1, G_TYPE_OBJECT); + + gl_debug (DEBUG_LABEL, "END"); +} + +static void +gl_label_init (glLabel *label) +{ + gl_debug (DEBUG_LABEL, "START"); + + label->template = NULL; + label->rotate_flag = FALSE; + label->objects = NULL; + + label->priv = g_new0 (glLabelPrivate, 1); + + label->priv->filename = NULL; + label->priv->merge = NULL; + label->priv->pixbuf_cache = gl_pixbuf_cache_new (); + + gl_debug (DEBUG_LABEL, "END"); +} + +static void +gl_label_finalize (GObject *object) +{ + glLabel *label = GL_LABEL (object); + GList *p, *p_next; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (object && GL_IS_LABEL (object)); + + for (p = label->objects; p != NULL; p = p_next) { + p_next = p->next; /* NOTE: p will be left dangling */ + g_object_unref (G_OBJECT(p->data)); + } + + lgl_template_free (label->template); + g_free (label->priv->filename); + if (label->priv->merge != NULL) { + g_object_unref (G_OBJECT(label->priv->merge)); + } + gl_pixbuf_cache_free (label->priv->pixbuf_cache); + + g_free (label->priv); + + G_OBJECT_CLASS (gl_label_parent_class)->finalize (object); + + gl_debug (DEBUG_LABEL, "END"); +} + +GObject * +gl_label_new (void) +{ + glLabel *label; + + gl_debug (DEBUG_LABEL, "START"); + + label = g_object_new (gl_label_get_type(), NULL); + + label->priv->compression = 9; + + label->priv->modified_flag = FALSE; + + gl_debug (DEBUG_LABEL, "END"); + + return G_OBJECT (label); +} + + +/*****************************************************************************/ +/* Add object to label. */ +/*****************************************************************************/ +void +gl_label_add_object (glLabel *label, + glLabelObject *object) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (label && GL_IS_LABEL (label)); + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + object->parent = label; + label->objects = g_list_append (label->objects, g_object_ref (object)); + + label->priv->modified_flag = TRUE; + + g_signal_emit (G_OBJECT(label), signals[OBJECT_ADDED], 0, object); + g_signal_emit (G_OBJECT(label), signals[CHANGED], 0); + g_signal_emit (G_OBJECT(label), signals[MODIFIED_CHANGED], 0); + + g_signal_connect (G_OBJECT(object), "changed", + G_CALLBACK(object_changed_cb), label); + + g_signal_connect (G_OBJECT(object), "moved", + G_CALLBACK(object_moved_cb), label); + + gl_debug (DEBUG_LABEL, "END"); +} + +/*****************************************************************************/ +/* Remove object from label. */ +/*****************************************************************************/ +void +gl_label_remove_object (glLabel *label, + glLabelObject *object) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (label && GL_IS_LABEL (label)); + g_return_if_fail (GL_IS_LABEL_OBJECT (object)); + + object->parent = NULL; + label->objects = g_list_remove (label->objects, object); + + if ( G_OBJECT(label)->ref_count /* not finalized */ ) { + + g_signal_handlers_disconnect_by_func (object, + G_CALLBACK(object_changed_cb), + label); + g_signal_handlers_disconnect_by_func (object, + G_CALLBACK(object_moved_cb), + label); + + label->priv->modified_flag = TRUE; + + g_signal_emit (G_OBJECT(label), signals[CHANGED], 0); + g_signal_emit (G_OBJECT(label), signals[MODIFIED_CHANGED], 0); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Object changed callback. */ +/*---------------------------------------------------------------------------*/ +static void +object_changed_cb (glLabelObject *object, + glLabel *label) +{ + + if ( !label->priv->modified_flag ) { + + label->priv->modified_flag = TRUE; + + g_signal_emit (G_OBJECT(label), signals[MODIFIED_CHANGED], 0); + } + + g_signal_emit (G_OBJECT(label), signals[CHANGED], 0); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Object moved callback. */ +/*---------------------------------------------------------------------------*/ +static void +object_moved_cb (glLabelObject *object, + gdouble x, + gdouble y, + glLabel *label) +{ + + if ( !label->priv->modified_flag ) { + + label->priv->modified_flag = TRUE; + + g_signal_emit (G_OBJECT(label), signals[MODIFIED_CHANGED], 0); + } + + g_signal_emit (G_OBJECT(label), signals[CHANGED], 0); +} + +/****************************************************************************/ +/* Bring label object to front/top. */ +/****************************************************************************/ +void +gl_label_raise_object_to_top (glLabel *label, + glLabelObject *object) +{ + gl_debug (DEBUG_LABEL, "START"); + + /* Move to end of list, representing front most object */ + label->objects = g_list_remove (label->objects, object); + label->objects = g_list_append (label->objects, object); + + label->priv->modified_flag = TRUE; + + g_signal_emit (G_OBJECT(label), signals[MODIFIED_CHANGED], 0); + g_signal_emit (G_OBJECT(label), signals[CHANGED], 0); + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Send label object to rear/bottom. */ +/****************************************************************************/ +void +gl_label_lower_object_to_bottom (glLabel *label, + glLabelObject *object) +{ + gl_debug (DEBUG_LABEL, "START"); + + /* Move to front of list, representing rear most object */ + label->objects = g_list_remove (label->objects, object); + label->objects = g_list_prepend (label->objects, object); + + label->priv->modified_flag = TRUE; + + g_signal_emit (G_OBJECT(label), signals[MODIFIED_CHANGED], 0); + g_signal_emit (G_OBJECT(label), signals[CHANGED], 0); + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* set template. */ +/****************************************************************************/ +extern void +gl_label_set_template (glLabel *label, + lglTemplate *template) +{ + gchar *name; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (label && GL_IS_LABEL (label)); + g_return_if_fail (template); + + if ((label->template == NULL) || + !lgl_template_do_templates_match (template, label->template)) { + + lgl_template_free (label->template); + label->template = lgl_template_dup (template); + + label->priv->modified_flag = TRUE; + + g_signal_emit (G_OBJECT(label), signals[MODIFIED_CHANGED], 0); + g_signal_emit (G_OBJECT(label), signals[SIZE_CHANGED], 0); + g_signal_emit (G_OBJECT(label), signals[CHANGED], 0); + + name = lgl_template_get_name (template); + gl_prefs_add_recent_template (name); + g_free (name); + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* set rotate flag. */ +/****************************************************************************/ +extern void +gl_label_set_rotate_flag (glLabel *label, + gboolean rotate_flag) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (label && GL_IS_LABEL (label)); + + if (rotate_flag != label->rotate_flag) { + + label->rotate_flag = rotate_flag; + + label->priv->modified_flag = TRUE; + + g_signal_emit (G_OBJECT(label), signals[MODIFIED_CHANGED], 0); + g_signal_emit (G_OBJECT(label), signals[SIZE_CHANGED], 0); + g_signal_emit (G_OBJECT(label), signals[CHANGED], 0); + + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Get label size. */ +/****************************************************************************/ +void +gl_label_get_size (glLabel *label, + gdouble *w, + gdouble *h) +{ + lglTemplate *template; + const lglTemplateFrame *frame; + + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (label && GL_IS_LABEL (label)); + + template = label->template; + if ( !template ) { + gl_debug (DEBUG_LABEL, "END -- template NULL"); + *w = *h = 0; + return; + } + frame = (lglTemplateFrame *)template->frames->data; + + if (!label->rotate_flag) { + lgl_template_frame_get_size (frame, w, h); + } else { + lgl_template_frame_get_size (frame, h, w); + } + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* set merge information structure. */ +/****************************************************************************/ +extern void +gl_label_set_merge (glLabel *label, + glMerge *merge) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_if_fail (label && GL_IS_LABEL (label)); + + if ( label->priv->merge != NULL ) { + g_object_unref (G_OBJECT(label->priv->merge)); + } + label->priv->merge = gl_merge_dup (merge); + + label->priv->modified_flag = TRUE; + + g_signal_emit (G_OBJECT(label), signals[MERGE_CHANGED], 0); + g_signal_emit (G_OBJECT(label), signals[MODIFIED_CHANGED], 0); + g_signal_emit (G_OBJECT(label), signals[CHANGED], 0); + + gl_debug (DEBUG_LABEL, "END"); +} + +/****************************************************************************/ +/* Get merge information structure. */ +/****************************************************************************/ +glMerge * +gl_label_get_merge (glLabel *label) +{ + gl_debug (DEBUG_LABEL, "START"); + + g_return_val_if_fail (label && GL_IS_LABEL (label), NULL); + + gl_debug (DEBUG_LABEL, "END"); + + return gl_merge_dup (label->priv->merge); +} + +/****************************************************************************/ +/* return filename. */ +/****************************************************************************/ +gchar * +gl_label_get_filename (glLabel *label) +{ + gl_debug (DEBUG_LABEL, ""); + + return g_strdup ( label->priv->filename ); +} + +/****************************************************************************/ +/* return short filename. */ +/****************************************************************************/ +gchar * +gl_label_get_short_name (glLabel *label) +{ + gl_debug (DEBUG_LABEL, ""); + + if ( label->priv->filename == NULL ) { + + if ( label->priv->untitled_instance == 0 ) { + label->priv->untitled_instance = ++untitled; + } + + return g_strdup_printf ( "%s %d", _("Untitled"), + label->priv->untitled_instance ); + + } else { + gchar *temp_name, *short_name; + + temp_name = g_path_get_basename ( label->priv->filename ); + short_name = gl_util_remove_extension (temp_name); + g_free (temp_name); + + return short_name; + } +} + +/****************************************************************************/ +/* Get pixbuf cache. */ +/****************************************************************************/ +GHashTable * +gl_label_get_pixbuf_cache (glLabel *label) +{ + return label->priv->pixbuf_cache; +} + +/****************************************************************************/ +/* Is label modified? */ +/****************************************************************************/ +gboolean +gl_label_is_modified (glLabel *label) +{ + gl_debug (DEBUG_LABEL, "return %d", label->priv->modified_flag); + return label->priv->modified_flag; +} + +/****************************************************************************/ +/* Is label untitled? */ +/****************************************************************************/ +gboolean +gl_label_is_untitled (glLabel *label) +{ + gl_debug (DEBUG_LABEL, "return %d",(label->priv->filename == NULL)); + return (label->priv->filename == NULL); +} + +/****************************************************************************/ +/* Can undo? */ +/****************************************************************************/ +gboolean +gl_label_can_undo (glLabel *label) +{ + return FALSE; +} + + +/****************************************************************************/ +/* Can redo? */ +/****************************************************************************/ +gboolean +gl_label_can_redo (glLabel *label) +{ + return FALSE; +} + + +/****************************************************************************/ +/* Set filename. */ +/****************************************************************************/ +void +gl_label_set_filename (glLabel *label, + const gchar *filename) +{ + label->priv->filename = g_strdup (filename); + + g_signal_emit (G_OBJECT(label), signals[NAME_CHANGED], 0); +} + +/****************************************************************************/ +/* Clear modified flag. */ +/****************************************************************************/ +void +gl_label_clear_modified (glLabel *label) +{ + + if ( label->priv->modified_flag ) { + + label->priv->modified_flag = FALSE; + + g_signal_emit (G_OBJECT(label), signals[MODIFIED_CHANGED], 0); + } + +} + + +/****************************************************************************/ +/* Set compression level. */ +/****************************************************************************/ +void +gl_label_set_compression (glLabel *label, + gint compression) +{ + gl_debug (DEBUG_LABEL, "set %d", compression); + + /* Older versions of libxml2 always return a -1 for documents "read in," so + * default to 9. Also, default to 9 for anything else out of range. */ + if ((compression < 0) || (compression >9)) { + compression = 9; + } + + gl_debug (DEBUG_LABEL, "actual set %d", compression); + label->priv->compression = compression; +} + + +/****************************************************************************/ +/* Get compression level. */ +/****************************************************************************/ +gint +gl_label_get_compression (glLabel *label) +{ + gl_debug (DEBUG_LABEL, "return %d", label->priv->compression); + return label->priv->compression; +} + + +/****************************************************************************/ +/* Draw label. */ +/****************************************************************************/ +void +gl_label_draw (glLabel *label, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record) +{ + GList *p_obj; + glLabelObject *object; + + g_return_if_fail (label && GL_IS_LABEL (label)); + + for (p_obj = label->objects; p_obj != NULL; p_obj = p_obj->next) + { + object = GL_LABEL_OBJECT (p_obj->data); + + gl_label_object_draw (object, cr, screen_flag, record); + } +} diff --git a/glabels2/src/label.h b/glabels2/src/label.h new file mode 100644 index 00000000..f6e0c23b --- /dev/null +++ b/glabels2/src/label.h @@ -0,0 +1,154 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label.h: GLabels label module header file + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __LABEL_H__ +#define __LABEL_H__ + +#include + +#include +#include "merge.h" +#include "pixbuf-cache.h" +#include + +G_BEGIN_DECLS + +typedef struct { + gdouble x1; + gdouble y1; + gdouble x2; + gdouble y2; +} glLabelRegion; + +#define GL_TYPE_LABEL (gl_label_get_type ()) +#define GL_LABEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_LABEL, glLabel)) +#define GL_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_LABEL, glLabelClass)) +#define GL_IS_LABEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_LABEL)) +#define GL_IS_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_LABEL)) + +typedef struct _glLabel glLabel; +typedef struct _glLabelClass glLabelClass; + +typedef struct _glLabelPrivate glLabelPrivate; + +#include "label-object.h" +struct _glLabel { + GObject object; + + lglTemplate *template; + gboolean rotate_flag; + + GList *objects; + + glLabelPrivate *priv; +}; + +struct _glLabelClass { + GObjectClass parent_class; + + void (*changed) (glLabel *label, gpointer user_data); + + void (*name_changed) (glLabel *label, gpointer user_data); + + void (*modified_changed) (glLabel *label, gpointer user_data); + + void (*merge_changed) (glLabel *label, gpointer user_data); + + void (*size_changed) (glLabel *label, gpointer user_data); + + void (*object_added) (glLabel *label, + glLabelObject *object, + gpointer user_data); + +}; + + +GType gl_label_get_type (void) G_GNUC_CONST; + +GObject *gl_label_new (void); + + +void gl_label_add_object (glLabel *label, + glLabelObject *object); + +void gl_label_remove_object (glLabel *label, + glLabelObject *object); + +void gl_label_raise_object_to_top (glLabel *label, + glLabelObject *object); + +void gl_label_lower_object_to_bottom (glLabel *label, + glLabelObject *object); + + +void gl_label_set_template (glLabel *label, + lglTemplate *template); + +void gl_label_set_rotate_flag (glLabel *label, + gboolean rotate_flag); + +void gl_label_get_size (glLabel *label, + gdouble *w, + gdouble *h); + + +void gl_label_set_merge (glLabel *label, + glMerge *merge); + +glMerge *gl_label_get_merge (glLabel *label); + + +gchar *gl_label_get_filename (glLabel *label); + +gchar *gl_label_get_short_name (glLabel *label); + +GHashTable *gl_label_get_pixbuf_cache (glLabel *label); + +gboolean gl_label_is_modified (glLabel *label); + +gboolean gl_label_is_untitled (glLabel *label); + +gboolean gl_label_can_undo (glLabel *label); + +gboolean gl_label_can_redo (glLabel *label); + + +void gl_label_set_filename (glLabel *label, + const gchar *filename); + +void gl_label_clear_modified (glLabel *label); + +void gl_label_set_compression (glLabel *label, + gint compression); + +gint gl_label_get_compression (glLabel *label); + +void gl_label_draw (glLabel *label, + cairo_t *cr, + gboolean screen_flag, + glMergeRecord *record); + +G_END_DECLS + + +#endif /* __LABEL_H__ */ diff --git a/glabels2/src/marshal.list b/glabels2/src/marshal.list new file mode 100644 index 00000000..ea17eaf3 --- /dev/null +++ b/glabels2/src/marshal.list @@ -0,0 +1,7 @@ +VOID:VOID +VOID:INT +VOID:INT,INT +VOID:INT,UINT +VOID:DOUBLE +VOID:DOUBLE,DOUBLE +VOID:OBJECT diff --git a/glabels2/src/merge-evolution.c b/glabels2/src/merge-evolution.c new file mode 100644 index 00000000..cf5d283e --- /dev/null +++ b/glabels2/src/merge-evolution.c @@ -0,0 +1,509 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * merge_evolution.c: evolution merge backend module + * + * Copyright (C) 2001 Jim Evins . + * and + * Copyright (C) 2005 Austin Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#ifdef HAVE_LIBEBOOK + + +#include "merge-evolution.h" + +#include +#include +#include +#include + +#include "debug.h" + +#define DEFAULT_QUERY "(exists \"full_name\")" + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + +struct _glMergeEvolutionPrivate { + gchar *query; + EBook *book; + GList *contacts; + GList *fields; /* the fields supported by the addressbook */ +}; + +enum { + LAST_SIGNAL +}; + +enum { + ARG_0, + ARG_QUERY, +}; + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void gl_merge_evolution_finalize (GObject *object); + +static void gl_merge_evolution_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec); + +static void gl_merge_evolution_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec); + +static GList *gl_merge_evolution_get_key_list (glMerge *merge); +static gchar *gl_merge_evolution_get_primary_key (glMerge *merge); +static void gl_merge_evolution_open (glMerge *merge); +static void gl_merge_evolution_close (glMerge *merge); +static glMergeRecord *gl_merge_evolution_get_record (glMerge *merge); +static void gl_merge_evolution_copy (glMerge *dst_merge, + glMerge *src_merge); + +/* utility function prototypes go here */ +static void free_field_list (GList *fields); + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glMergeEvolution, gl_merge_evolution, GL_TYPE_MERGE); + +static void +gl_merge_evolution_class_init (glMergeEvolutionClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + glMergeClass *merge_class = GL_MERGE_CLASS (class); + + gl_debug (DEBUG_MERGE, "START"); + + gl_merge_evolution_parent_class = g_type_class_peek_parent (class); + + object_class->set_property = gl_merge_evolution_set_property; + object_class->get_property = gl_merge_evolution_get_property; + + g_object_class_install_property + (object_class, + ARG_QUERY, + g_param_spec_string ("query", NULL, + "Query used to select records from the addressbook", + "(exists \"full_name\")", + (G_PARAM_READABLE | G_PARAM_WRITABLE))); + + object_class->finalize = gl_merge_evolution_finalize; + + merge_class->get_key_list = gl_merge_evolution_get_key_list; + merge_class->get_primary_key = gl_merge_evolution_get_primary_key; + merge_class->open = gl_merge_evolution_open; + merge_class->close = gl_merge_evolution_close; + merge_class->get_record = gl_merge_evolution_get_record; + merge_class->copy = gl_merge_evolution_copy; + + gl_debug (DEBUG_MERGE, "END"); +} + +static void +gl_merge_evolution_init (glMergeEvolution *merge_evolution) +{ + gl_debug (DEBUG_MERGE, "START"); + + merge_evolution->priv = g_new0 (glMergeEvolutionPrivate, 1); + merge_evolution->priv->query = g_strdup(DEFAULT_QUERY); + + gl_debug (DEBUG_MERGE, "END"); +} + +static void +gl_merge_evolution_finalize (GObject *object) +{ + glMergeEvolution *merge_evolution = GL_MERGE_EVOLUTION (object); + + gl_debug (DEBUG_MERGE, "START"); + + g_return_if_fail (object && GL_IS_MERGE_EVOLUTION (object)); + + free_field_list(merge_evolution->priv->fields); + g_free (merge_evolution->priv->query); + g_free (merge_evolution->priv); + + G_OBJECT_CLASS (gl_merge_evolution_parent_class)->finalize (object); + + gl_debug (DEBUG_MERGE, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* Set argument. */ +/*--------------------------------------------------------------------------*/ +static void +gl_merge_evolution_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec) +{ + glMergeEvolution *merge_evolution; + + merge_evolution = GL_MERGE_EVOLUTION (object); + + switch (param_id) { + + case ARG_QUERY: + g_free (merge_evolution->priv->query); + merge_evolution->priv->query = g_value_dup_string (value); + gl_debug (DEBUG_MERGE, "ARG \"query\" = \"%s\"", + merge_evolution->priv->query); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + + } + +} + +/*--------------------------------------------------------------------------*/ +/* Get argument. */ +/*--------------------------------------------------------------------------*/ +static void +gl_merge_evolution_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec) +{ + glMergeEvolution *merge_evolution; + + merge_evolution = GL_MERGE_EVOLUTION (object); + + switch (param_id) { + + case ARG_QUERY: + g_value_set_string (value, merge_evolution->priv->query); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + + } + +} + +/*--------------------------------------------------------------------------*/ +/* Get key list. */ +/*--------------------------------------------------------------------------*/ +static GList * +gl_merge_evolution_get_key_list (glMerge *merge) +{ + glMergeEvolution *merge_evolution; + GList *key_list = NULL; + GList *iter; + + gl_debug (DEBUG_MERGE, "BEGIN"); + + merge_evolution = GL_MERGE_EVOLUTION (merge); + + /* for the previously retrieved supported fileds, go through them and find + * their pretty names */ + for (iter = merge_evolution->priv->fields; + iter != NULL; + iter = g_list_next(iter)) + { + key_list = g_list_prepend (key_list, + g_strdup (e_contact_pretty_name (*(EContactField *)iter->data))); + } + + key_list = g_list_reverse (key_list); + + gl_debug (DEBUG_MERGE, "END"); + + return key_list; +} + +/*--------------------------------------------------------------------------*/ +/* Get "primary" key. */ +/*--------------------------------------------------------------------------*/ +static gchar * +gl_merge_evolution_get_primary_key (glMerge *merge) +{ + return g_strdup (e_contact_pretty_name(E_CONTACT_FILE_AS)); +} + +/*--------------------------------------------------------------------------*/ +/* Open merge source. */ +/*--------------------------------------------------------------------------*/ +static void +gl_merge_evolution_open (glMerge *merge) +{ + glMergeEvolution *merge_evolution; + EBookQuery *query; + gboolean status; + GList *fields, *iter; + EContactField *field_id; + GError *error = NULL; + + gl_debug (DEBUG_MERGE, "BEGIN"); + + merge_evolution = GL_MERGE_EVOLUTION (merge); + + query = e_book_query_from_string(merge_evolution->priv->query); + if (!query) { + g_warning (_("Couldn't construct query")); + return; + } + + merge_evolution->priv->book = e_book_new_system_addressbook(&error); + if (!merge_evolution->priv->book) { + g_warning (_("Couldn't open addressbook.")); + if (error) + { + g_warning ("e_book_new_system_addressbook: %s", error->message); + g_error_free (error); + } + e_book_query_unref(query); + return; + } + + if (!e_book_open(merge_evolution->priv->book, FALSE, &error)) { + g_warning (_("Couldn't open addressbook.")); + if (error) + { + g_warning ("e_book_open: %s", error->message); + g_error_free (error); + } + e_book_query_unref(query); + g_object_unref(merge_evolution->priv->book); + merge_evolution->priv->book = NULL; + return; + } + + /* fetch the list of fields supported by this address book */ + status = e_book_get_supported_fields(merge_evolution->priv->book, &fields, &error); + if (status == FALSE) { + g_warning (_("Couldn't list available fields.")); + if (error) + { + g_warning ("e_book_get_supported_fields: %s", error->message); + g_error_free (error); + } + e_book_query_unref(query); + g_object_unref(merge_evolution->priv->book); + merge_evolution->priv->book = NULL; + return; + } + + /* generate a list of field_ids, and put that into private->fields */ + for (iter = fields; iter != NULL; iter = g_list_next(iter)) { + field_id = g_new(EContactField, 1); + *field_id = e_contact_field_id(iter->data); + + /* above this value, the data aren't strings anymore */ + if (*field_id >= E_CONTACT_LAST_SIMPLE_STRING) { + g_free (field_id); + continue; + } + + merge_evolution->priv->fields = + g_list_prepend(merge_evolution->priv->fields, field_id); + } + free_field_list(fields); /* don't need the list of names anymore */ + + gl_debug(DEBUG_MERGE, "Field list length: %d", g_list_length(merge_evolution->priv->fields)); + + /* finally retrieve the contacts */ + status = e_book_get_contacts (merge_evolution->priv->book, + query, + &merge_evolution->priv->contacts, + &error); + if (status == FALSE) { + g_warning (_("Couldn't get contacts.")); + if (error) + { + g_warning ("e_book_get_contacts: %s", error->message); + g_error_free (error); + } + e_book_query_unref(query); + free_field_list(merge_evolution->priv->fields); + g_object_unref(merge_evolution->priv->book); + merge_evolution->priv->book = NULL; + + return; + } + + e_book_query_unref(query); + + gl_debug (DEBUG_MERGE, "END"); + + return; + /* XXX I should probably sort the list by name (or the file-as element)*/ +} + +/*--------------------------------------------------------------------------*/ +/* Close merge source. */ +/*--------------------------------------------------------------------------*/ +static void +gl_merge_evolution_close (glMerge *merge) +{ + glMergeEvolution *merge_evolution; + GList *iter; + + merge_evolution = GL_MERGE_EVOLUTION (merge); + + /* unref all of the objects created in _open */ + g_object_unref(merge_evolution->priv->book); + merge_evolution->priv->book = NULL; + + for (iter = merge_evolution->priv->contacts; + iter != NULL; + iter = g_list_next(iter)) + { + EContact *contact = E_CONTACT (iter->data); + + g_object_unref(contact); + } + g_list_free(merge_evolution->priv->contacts); + merge_evolution->priv->contacts = NULL; +} + +/*--------------------------------------------------------------------------*/ +/* Get next record from merge source, NULL if no records left (i.e EOF) */ +/*--------------------------------------------------------------------------*/ +static glMergeRecord * +gl_merge_evolution_get_record (glMerge *merge) +{ + glMergeEvolution *merge_evolution; + glMergeRecord *record; + glMergeField *field; + EContactField field_id; + + GList *head, *iter; + EContact *contact; + + merge_evolution = GL_MERGE_EVOLUTION (merge); + + head = merge_evolution->priv->contacts; + if (head == NULL) { + return NULL; /* past the last record */ + } + contact = E_CONTACT(head->data); + + record = g_new0 (glMergeRecord, 1); + record->select_flag = TRUE; + + /* Take the interesting fields one by one from the contact, and put them + * into the glMergeRecord structure. When done, free up the resources for + * that contact */ + + /* iterate through the supported fields, and add them to the list */ + for (iter = merge_evolution->priv->fields; + iter != NULL; + iter = g_list_next(iter)) + { + gchar *value; + field_id = *(EContactField *)iter->data; + value = g_strdup (e_contact_get_const (contact, field_id)); + + if (value) { + field = g_new0 (glMergeField, 1); + field->key = g_strdup (e_contact_pretty_name (field_id)); + field->value = value; + record->field_list = g_list_prepend (record->field_list, field); + } + } + + record->field_list = g_list_reverse (record->field_list); + + /* do a destructive read */ + g_object_unref (contact); + merge_evolution->priv->contacts = + g_list_remove_link (merge_evolution->priv->contacts, head); + g_list_free_1 (head); + + return record; +} + +/*---------------------------------------------------------------------------*/ +/* Copy merge_evolution specific fields. */ +/*---------------------------------------------------------------------------*/ +static void +gl_merge_evolution_copy (glMerge *dst_merge, + glMerge *src_merge) +{ + GList *src_iter, *dst_iter; + + gl_debug (DEBUG_MERGE, "BEGIN"); + + glMergeEvolution *dst_merge_evolution; + glMergeEvolution *src_merge_evolution; + + dst_merge_evolution = GL_MERGE_EVOLUTION (dst_merge); + src_merge_evolution = GL_MERGE_EVOLUTION (src_merge); + + dst_merge_evolution->priv->query = g_strdup(src_merge_evolution->priv->query); + + dst_merge_evolution->priv->fields = g_list_copy(src_merge_evolution->priv->fields); + for (src_iter = src_merge_evolution->priv->fields, + dst_iter = dst_merge_evolution->priv->fields; + src_iter != NULL && dst_iter != NULL; + src_iter = g_list_next(src_iter), dst_iter = g_list_next(dst_iter)) + { + dst_iter->data = g_new(EContactField, 1); + if (src_iter->data) { /* this better not be null, but... */ + memcpy(dst_iter->data, src_iter->data, sizeof(EContactField)); + } + } + + /* I don't know that there's a good way to do a deep copy of the various + * libebook structures/objects, so I'm just going to leave them out. They + * are all regenerated on gl_merge_evolution_open, anyway */ + + gl_debug (DEBUG_MERGE, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* Free the list of supported fields */ +/*---------------------------------------------------------------------------*/ +static void +free_field_list (GList *fields) +{ + GList *iter; + + for (iter = fields; iter != NULL; iter = g_list_next(iter)) + { + if (iter->data) { + g_free(iter->data); + } + } + g_list_free(fields); + fields = NULL; +} + + +#endif /* HAVE_LIBEBOOK */ diff --git a/glabels2/src/merge-evolution.h b/glabels2/src/merge-evolution.h new file mode 100644 index 00000000..26468abc --- /dev/null +++ b/glabels2/src/merge-evolution.h @@ -0,0 +1,70 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * merge_evolution.h: evolution merge backend module header file + * + * Copyright (C) 2002 Jim Evins . + * and + * Copyright (C) 2005 Austin Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __MERGE_EVOLUTION_H__ +#define __MERGE_EVOLUTION_H__ + +#include "merge.h" + +G_BEGIN_DECLS + +/* The following object arguments are available: + * + * name type description + * --------------------------------------------------------------------------- + * query gchar* The query used to select records + * + */ + +#define GL_TYPE_MERGE_EVOLUTION (gl_merge_evolution_get_type ()) +#define GL_MERGE_EVOLUTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_MERGE_EVOLUTION, glMergeEvolution)) +#define GL_MERGE_EVOLUTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_MERGE_EVOLUTION, glMergeEvolutionClass)) +#define GL_IS_MERGE_EVOLUTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_MERGE_EVOLUTION)) +#define GL_IS_MERGE_EVOLUTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_MERGE_EVOLUTION)) +#define GL_MERGE_EVOLUTION_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), GL_TYPE_MERGE_EVOLUTION, glMergeEvolutionClass)) + + +typedef struct _glMergeEvolution glMergeEvolution; +typedef struct _glMergeEvolutionClass glMergeEvolutionClass; + +typedef struct _glMergeEvolutionPrivate glMergeEvolutionPrivate; + + +struct _glMergeEvolution { + glMerge object; + + glMergeEvolutionPrivate *priv; +}; + +struct _glMergeEvolutionClass { + glMergeClass parent_class; +}; + + +GType gl_merge_evolution_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __MERGE_EVOLUTION_H__ */ diff --git a/glabels2/src/merge-init.c b/glabels2/src/merge-init.c new file mode 100644 index 00000000..b62551be --- /dev/null +++ b/glabels2/src/merge-init.c @@ -0,0 +1,94 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * merge.c: document merge initialization + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include + +#include "merge-init.h" +#include "merge-text.h" +#ifdef HAVE_LIBEBOOK +#include "merge-evolution.h" +#include "merge-vcard.h" +#endif /* HAVE_LIBEBOOK */ + +#include "debug.h" + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + + +/*****************************************************************************/ +/* Initailize document merge module, by registering all available backends. */ +/*****************************************************************************/ +void +gl_merge_init (void) +{ + + gl_merge_register_backend (GL_TYPE_MERGE_TEXT, + "Text/Comma", + _("Text file with comma delimeters (CSV)"), + GL_MERGE_SRC_IS_FILE, + "delim", ',', + NULL); + + gl_merge_register_backend (GL_TYPE_MERGE_TEXT, + "Text/Colon", + _("Text file with colon delimeters"), + GL_MERGE_SRC_IS_FILE, + "delim", ':', + NULL); + + gl_merge_register_backend (GL_TYPE_MERGE_TEXT, + "Text/Tab", + _("Text file with tab delimeters"), + GL_MERGE_SRC_IS_FILE, + "delim", '\t', + NULL); + +#ifdef HAVE_LIBEBOOK + + gl_merge_register_backend (GL_TYPE_MERGE_EVOLUTION, + "ebook/eds", + _("Data from default Evolution Addressbook"), + GL_MERGE_SRC_IS_FIXED, + NULL); + + gl_merge_register_backend (GL_TYPE_MERGE_VCARD, + "ebook/vcard", + _("Data from a file containing VCards"), + GL_MERGE_SRC_IS_FILE, + NULL); + +#endif /* HAVE_LIBEBOOK */ + +} diff --git a/glabels2/src/merge-init.h b/glabels2/src/merge-init.h new file mode 100644 index 00000000..7bd57eef --- /dev/null +++ b/glabels2/src/merge-init.h @@ -0,0 +1,35 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * merge-init.h: document merge initialization header file + * + * Copyright (C) 2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __MERGE_INIT_H__ +#define __MERGE_INIT_H__ + +#include "merge.h" + +G_BEGIN_DECLS + +void gl_merge_init (void); + +G_END_DECLS + +#endif diff --git a/glabels2/src/merge-properties-dialog.c b/glabels2/src/merge-properties-dialog.c new file mode 100644 index 00000000..d5f3508d --- /dev/null +++ b/glabels2/src/merge-properties-dialog.c @@ -0,0 +1,659 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * merge-properties-dialog.c: document merge properties dialog module + * + * Copyright (C) 2001 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "merge-properties-dialog.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "label.h" +#include "merge.h" +#include "util.h" +#include "hig.h" + +#include "debug.h" + +/*===========================================*/ +/* Private data types */ +/*===========================================*/ + +struct _glMergePropertiesDialogPrivate { + + glLabel *label; + glMerge *merge; + + GtkWidget *type_combo; + GtkWidget *location_vbox; + GtkWidget *src_entry; + + GtkTreeStore *store; + GtkWidget *treeview; + + GtkWidget *select_all_button; + GtkWidget *unselect_all_button; + + gchar *saved_src; + +}; + +enum { + /* Real columns */ + SELECT_COLUMN, + RECORD_FIELD_COLUMN, + VALUE_COLUMN, + + /* Invisible columns */ + IS_RECORD_COLUMN, + DATA_COLUMN, /* points to glMergeRecord */ + + N_COLUMNS +}; + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void gl_merge_properties_dialog_finalize (GObject *object); +static void gl_merge_properties_dialog_construct (glMergePropertiesDialog *dialog, + glLabel *label, + GtkWindow *window); + +static void type_changed_cb (GtkWidget *widget, + glMergePropertiesDialog *dialog); + +static void src_changed_cb (GtkWidget *widget, + glMergePropertiesDialog *dialog); + +static void response_cb (glMergePropertiesDialog *dialog, + gint response, + gpointer user_data); + +static void load_tree (GtkTreeStore *store, + glMerge *merge); + +static void record_select_toggled_cb (GtkCellRendererToggle *cell, + gchar *path_str, + GtkTreeStore *store); + +static void select_all_button_clicked_cb (GtkWidget *widget, + glMergePropertiesDialog *dialog); + +static void unselect_all_button_clicked_cb (GtkWidget *widget, + glMergePropertiesDialog *dialog); + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glMergePropertiesDialog, gl_merge_properties_dialog, GTK_TYPE_DIALOG); + +static void +gl_merge_properties_dialog_class_init (glMergePropertiesDialogClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_debug (DEBUG_MERGE, ""); + + gl_merge_properties_dialog_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_merge_properties_dialog_finalize; +} + +static void +gl_merge_properties_dialog_init (glMergePropertiesDialog *dialog) +{ + gl_debug (DEBUG_MERGE, "START"); + + dialog->priv = g_new0 (glMergePropertiesDialogPrivate, 1); + + gtk_container_set_border_width (GTK_CONTAINER(dialog), GL_HIG_PAD2); + + gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE); + gtk_dialog_add_buttons (GTK_DIALOG (dialog), + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); + + g_signal_connect(G_OBJECT (dialog), "response", + G_CALLBACK (response_cb), NULL); + + + gl_debug (DEBUG_MERGE, "END"); +} + +static void +gl_merge_properties_dialog_finalize (GObject *object) +{ + glMergePropertiesDialog* dialog = GL_MERGE_PROPERTIES_DIALOG (object); + + gl_debug (DEBUG_MERGE, "START"); + + g_return_if_fail (object != NULL); + g_return_if_fail (GL_IS_MERGE_PROPERTIES_DIALOG (dialog)); + g_return_if_fail (dialog->priv != NULL); + + if (dialog->priv->merge != NULL) { + g_object_unref (G_OBJECT (dialog->priv->merge)); + } + g_free (dialog->priv); + + G_OBJECT_CLASS (gl_merge_properties_dialog_parent_class)->finalize (object); + gl_debug (DEBUG_MERGE, "END"); +} + +/*****************************************************************************/ +/* NEW merge properties dialog. */ +/*****************************************************************************/ +GtkWidget* +gl_merge_properties_dialog_new (glLabel *label, + GtkWindow *window) +{ + GtkWidget *dialog; + + gl_debug (DEBUG_MERGE, "START"); + + dialog = GTK_WIDGET (g_object_new (GL_TYPE_MERGE_PROPERTIES_DIALOG, NULL)); + + gl_merge_properties_dialog_construct (GL_MERGE_PROPERTIES_DIALOG (dialog), + label, window); + + gl_debug (DEBUG_MERGE, "END"); + + return dialog; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Create merge widgets. */ +/*--------------------------------------------------------------------------*/ +static void +gl_merge_properties_dialog_construct (glMergePropertiesDialog *dialog, + glLabel *label, + GtkWindow *window) +{ + GladeXML *gui; + gchar *description; + glMergeSrcType src_type; + gchar *src; + gchar *name, *title; + GList *texts; + GtkWidget *vbox; + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + GtkTreeSelection *selection; + + gl_debug (DEBUG_MERGE, "START"); + + g_return_if_fail (GL_IS_MERGE_PROPERTIES_DIALOG (dialog)); + g_return_if_fail (dialog->priv != NULL); + + if (window) { + gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(window)); + gtk_window_set_destroy_with_parent (GTK_WINDOW(dialog), TRUE); + } + + gui = glade_xml_new (GLABELS_GLADE_DIR "merge-properties-dialog.glade", + "merge_properties_vbox", NULL); + + if (!gui) { + g_critical ("Could not open merge-properties-dialog.glade. gLabels may not be installed correctly!"); + return; + } + + vbox = glade_xml_get_widget (gui, "merge_properties_vbox"); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox); + + dialog->priv->type_combo = glade_xml_get_widget (gui, "type_combo"); + dialog->priv->location_vbox = glade_xml_get_widget (gui, "location_vbox"); + dialog->priv->treeview = glade_xml_get_widget (gui, "treeview"); + + dialog->priv->select_all_button = glade_xml_get_widget (gui, "select_all_button"); + dialog->priv->unselect_all_button = glade_xml_get_widget (gui, "unselect_all_button"); + + g_object_unref (gui); + + gl_util_combo_box_add_text_model (GTK_COMBO_BOX (dialog->priv->type_combo)); + + dialog->priv->label = label; + + dialog->priv->merge = gl_label_get_merge (dialog->priv->label); + description = gl_merge_get_description (dialog->priv->merge); + src_type = gl_merge_get_src_type (dialog->priv->merge); + src = gl_merge_get_src (dialog->priv->merge); + + /* --- Window title --- */ + name = gl_label_get_short_name (label); + title = g_strdup_printf ("%s %s", name, _("Merge Properties")); + gtk_window_set_title (GTK_WINDOW (dialog), title); + g_free (name); + g_free (title); + + texts = gl_merge_get_descriptions (); + gl_debug (DEBUG_MERGE, "DESCRIPTIONS:"); + { + GList *p; + + for (p=texts; p!=NULL; p=p->next) { + gl_debug (DEBUG_MERGE, " \"%s\"", p->data); + } + } + gl_util_combo_box_set_strings (GTK_COMBO_BOX (dialog->priv->type_combo), + texts); + gl_merge_free_descriptions (&texts); + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (dialog->priv->type_combo), + description); + g_signal_connect (G_OBJECT (dialog->priv->type_combo), "changed", + G_CALLBACK (type_changed_cb), dialog); + + gl_debug (DEBUG_MERGE, "Src_type = %d", src_type); + switch (src_type) { + case GL_MERGE_SRC_IS_FILE: + dialog->priv->src_entry = + gtk_file_chooser_button_new (_("Select merge-database source"), + GTK_FILE_CHOOSER_ACTION_OPEN); + gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog->priv->src_entry), + src); + g_signal_connect (G_OBJECT (dialog->priv->src_entry), + "selection-changed", + G_CALLBACK (src_changed_cb), dialog); + break; + default: + dialog->priv->src_entry = gtk_label_new (_("N/A")); + gtk_misc_set_alignment (GTK_MISC (dialog->priv->src_entry), 0.0, 0.5); + break; + } + gtk_box_pack_start (GTK_BOX (dialog->priv->location_vbox), + dialog->priv->src_entry, FALSE, FALSE, 0); + gtk_widget_show_all (GTK_WIDGET (dialog->priv->location_vbox)); + + dialog->priv->store = gtk_tree_store_new (N_COLUMNS, + G_TYPE_BOOLEAN, /* Record selector */ + G_TYPE_STRING, /* Record/Field name */ + G_TYPE_STRING, /* Field value */ + G_TYPE_BOOLEAN, /* Is Record? */ + G_TYPE_POINTER /* Pointer to record */); + load_tree (dialog->priv->store, dialog->priv->merge); + + gtk_tree_view_set_model (GTK_TREE_VIEW (dialog->priv->treeview), + GTK_TREE_MODEL (dialog->priv->store)); + + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (dialog->priv->treeview), + TRUE); + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->priv->treeview)); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE); + renderer = gtk_cell_renderer_toggle_new (); + g_signal_connect (G_OBJECT (renderer), "toggled", + G_CALLBACK (record_select_toggled_cb), dialog->priv->store); + column = gtk_tree_view_column_new_with_attributes (_("Select"), renderer, + "active", SELECT_COLUMN, + "visible", IS_RECORD_COLUMN, + NULL); + gtk_tree_view_column_set_clickable (column, TRUE); + gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->priv->treeview), column); + renderer = gtk_cell_renderer_text_new (); + gtk_object_set (GTK_OBJECT (renderer), "yalign", 0.0, NULL); + column = gtk_tree_view_column_new_with_attributes (_("Record/Field"), renderer, + "text", RECORD_FIELD_COLUMN, + NULL); + gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->priv->treeview), column); + gtk_tree_view_set_expander_column (GTK_TREE_VIEW (dialog->priv->treeview), column); + renderer = gtk_cell_renderer_text_new (); + gtk_object_set (GTK_OBJECT (renderer), "yalign", 0.0, NULL); + column = gtk_tree_view_column_new_with_attributes (_("Data"), renderer, + "text", VALUE_COLUMN, + NULL); + gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_append_column (GTK_TREE_VIEW (dialog->priv->treeview), column); + + g_signal_connect (G_OBJECT (dialog->priv->select_all_button), + "clicked", + G_CALLBACK (select_all_button_clicked_cb), dialog); + + g_signal_connect (G_OBJECT (dialog->priv->unselect_all_button), + "clicked", + G_CALLBACK (unselect_all_button_clicked_cb), dialog); + + + g_free (src); + g_free (description); + + gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); + + gl_debug (DEBUG_MERGE, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. type "changed" callback. */ +/*--------------------------------------------------------------------------*/ +static void +type_changed_cb (GtkWidget *widget, + glMergePropertiesDialog *dialog) +{ + gchar *description; + gchar *name; + gchar *src; + glMergeSrcType src_type; + + gl_debug (DEBUG_MERGE, "START"); + + description = gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->type_combo)); + name = gl_merge_description_to_name (description); + + src = gl_merge_get_src (dialog->priv->merge); /* keep current src if possible */ + if ( src != NULL ) { + gl_debug (DEBUG_MERGE, "Saving src = \"%s\"", src); + g_free (dialog->priv->saved_src); + dialog->priv->saved_src = src; + } + + if (dialog->priv->merge != NULL) { + g_object_unref (G_OBJECT(dialog->priv->merge)); + } + dialog->priv->merge = gl_merge_new (name); + + gtk_widget_destroy (dialog->priv->src_entry); + src_type = gl_merge_get_src_type (dialog->priv->merge); + switch (src_type) { + case GL_MERGE_SRC_IS_FILE: + dialog->priv->src_entry = + gtk_file_chooser_button_new (_("Select merge-database source"), + GTK_FILE_CHOOSER_ACTION_OPEN); + if (dialog->priv->saved_src != NULL) { + gl_debug (DEBUG_MERGE, "Setting src = \"%s\"", dialog->priv->saved_src); + gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog->priv->src_entry), + dialog->priv->saved_src); + gl_merge_set_src (dialog->priv->merge, dialog->priv->saved_src); + } + g_signal_connect (G_OBJECT (dialog->priv->src_entry), + "selection-changed", + G_CALLBACK (src_changed_cb), dialog); + break; + case GL_MERGE_SRC_IS_FIXED: + dialog->priv->src_entry = gtk_label_new (_("Fixed")); + gtk_misc_set_alignment (GTK_MISC (dialog->priv->src_entry), 0.0, 0.5); + + gl_debug (DEBUG_MERGE, "Setting src = \"%s\"", dialog->priv->saved_src); + gl_merge_set_src (dialog->priv->merge, "Fixed"); + break; + default: + dialog->priv->src_entry = gtk_label_new (_("N/A")); + gtk_misc_set_alignment (GTK_MISC (dialog->priv->src_entry), 0.0, 0.5); + break; + } + gtk_box_pack_start( GTK_BOX (dialog->priv->location_vbox), + dialog->priv->src_entry, FALSE, FALSE, 0); + gtk_widget_show_all (dialog->priv->location_vbox); + + load_tree (dialog->priv->store, dialog->priv->merge); + + g_free (description); + g_free (name); + + gl_debug (DEBUG_MERGE, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. source "changed" callback. */ +/*--------------------------------------------------------------------------*/ +static void +src_changed_cb (GtkWidget *widget, + glMergePropertiesDialog *dialog) +{ + gchar *src, *orig_src; + + gl_debug (DEBUG_MERGE, "START"); + + orig_src = gl_merge_get_src (dialog->priv->merge); + src = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog->priv->src_entry)); + + gl_debug (DEBUG_MERGE, "orig=\"%s\", new=\"%s\"\n", orig_src, src); + + if (((orig_src == NULL) && (src != NULL)) || + ((orig_src != NULL) && (src == NULL)) || + ((orig_src != NULL) && (src != NULL) && strcmp (src, orig_src))) + { + gl_merge_set_src (dialog->priv->merge, src); + load_tree (dialog->priv->store, dialog->priv->merge); + } + + g_free (orig_src); + g_free (src); + + + gl_debug (DEBUG_MERGE, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. response callback. */ +/*--------------------------------------------------------------------------*/ +static void +response_cb (glMergePropertiesDialog *dialog, + gint response, + gpointer user_data) +{ + gl_debug (DEBUG_MERGE, "START"); + + switch (response) { + + case GTK_RESPONSE_OK: + gl_label_set_merge (dialog->priv->label, dialog->priv->merge); + gtk_widget_hide (GTK_WIDGET (dialog)); + break; + case GTK_RESPONSE_CANCEL: + /* Let the dialog get rebuilt next time to recover state. */ + gtk_widget_destroy (GTK_WIDGET (dialog)); + break; + case GTK_RESPONSE_DELETE_EVENT: + break; + default: + g_print ("response = %d", response); + g_assert_not_reached (); + } + + gl_debug (DEBUG_MERGE, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Load tree store from merge data. */ +/*--------------------------------------------------------------------------*/ +static void +load_tree (GtkTreeStore *store, + glMerge *merge) +{ + const GList *record_list; + GList *p_rec, *p_field; + glMergeRecord *record; + glMergeField *field; + GtkTreeIter iter1, iter2; + gchar *primary_key; + gchar *primary_value; + + gl_debug (DEBUG_MERGE, "START"); + + gtk_tree_store_clear (store); + + primary_key = gl_merge_get_primary_key (merge); + record_list = gl_merge_get_record_list (merge); + + for ( p_rec=(GList *)record_list; p_rec!=NULL; p_rec=p_rec->next ) { + record = (glMergeRecord *)p_rec->data; + + primary_value = gl_merge_eval_key (record, primary_key); + + gtk_tree_store_append (store, &iter1, NULL); + gtk_tree_store_set (store, &iter1, + SELECT_COLUMN, record->select_flag, + RECORD_FIELD_COLUMN, primary_value, + IS_RECORD_COLUMN, TRUE, + DATA_COLUMN, record, + -1); + + g_free (primary_value); + + for ( p_field=record->field_list; p_field!=NULL; p_field=p_field->next ) { + field = (glMergeField *)p_field->data; + + gtk_tree_store_append (store, &iter2, &iter1); + gtk_tree_store_set (store, &iter2, + RECORD_FIELD_COLUMN, field->key, + VALUE_COLUMN, field->value, + IS_RECORD_COLUMN, FALSE, + -1); + } + } + + g_free (primary_key); + + gl_debug (DEBUG_MERGE, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Record select toggled. */ +/*--------------------------------------------------------------------------*/ +static void +record_select_toggled_cb (GtkCellRendererToggle *cell, + gchar *path_str, + GtkTreeStore *store) +{ + GtkTreePath *path; + GtkTreeIter iter; + glMergeRecord *record; + + gl_debug (DEBUG_MERGE, "START"); + + /* get toggled iter */ + path = gtk_tree_path_new_from_string (path_str); + gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path); + + /* get current data */ + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, + DATA_COLUMN, &record, + -1); + + /* toggle the select flag within the record */ + record->select_flag ^= 1; + + /* set new value in store */ + gtk_tree_store_set (store, &iter, + SELECT_COLUMN, record->select_flag, + -1); + + /* clean up */ + gtk_tree_path_free (path); + + gl_debug (DEBUG_MERGE, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. "Select All" button callback. */ +/*--------------------------------------------------------------------------*/ +static void +select_all_button_clicked_cb (GtkWidget *widget, + glMergePropertiesDialog *dialog) +{ + GtkTreeModel *store = GTK_TREE_MODEL (dialog->priv->store); + GtkTreeIter iter; + glMergeRecord *record; + gboolean good; + + gl_debug (DEBUG_MERGE, "START"); + + for ( good = gtk_tree_model_get_iter_first (store, &iter); + good; + good = gtk_tree_model_iter_next (store, &iter) ) + { + + /* get current data */ + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, + DATA_COLUMN, &record, + -1); + + + /* Set select flag within the record */ + record->select_flag = TRUE; + + /* set new value in store */ + gtk_tree_store_set (GTK_TREE_STORE (store), &iter, + SELECT_COLUMN, record->select_flag, + -1); + + } + + gl_debug (DEBUG_MERGE, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. "Unselect All" button callback. */ +/*--------------------------------------------------------------------------*/ +static void +unselect_all_button_clicked_cb (GtkWidget *widget, + glMergePropertiesDialog *dialog) +{ + GtkTreeModel *store = GTK_TREE_MODEL (dialog->priv->store); + GtkTreeIter iter; + glMergeRecord *record; + gboolean good; + + gl_debug (DEBUG_MERGE, "START"); + + for ( good = gtk_tree_model_get_iter_first (store, &iter); + good; + good = gtk_tree_model_iter_next (store, &iter) ) + { + + /* get current data */ + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, + DATA_COLUMN, &record, + -1); + + + /* Set select flag within the record */ + record->select_flag = FALSE; + + /* set new value in store */ + gtk_tree_store_set (GTK_TREE_STORE (store), &iter, + SELECT_COLUMN, record->select_flag, + -1); + + } + + gl_debug (DEBUG_MERGE, "END"); +} diff --git a/glabels2/src/merge-properties-dialog.h b/glabels2/src/merge-properties-dialog.h new file mode 100644 index 00000000..f98ea7bf --- /dev/null +++ b/glabels2/src/merge-properties-dialog.h @@ -0,0 +1,66 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * merge-properties-dialog.h: document merge properties dialog module header file + * + * Copyright (C) 2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __MERGE_PROPERTIES_DIALOG_H__ +#define __MERGE_PROPERTIES_DIALOG_H__ + +#include +#include +#include "label.h" + +G_BEGIN_DECLS + +#define GL_TYPE_MERGE_PROPERTIES_DIALOG (gl_merge_properties_dialog_get_type ()) +#define GL_MERGE_PROPERTIES_DIALOG(obj) (GTK_CHECK_CAST ((obj), GL_TYPE_MERGE_PROPERTIES_DIALOG, glMergePropertiesDialog)) +#define GL_MERGE_PROPERTIES_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GL_TYPE_MERGE_PROPERTIES_DIALOG, glMergePropertiesDialogClass)) +#define GL_IS_MERGE_PROPERTIES_DIALOG(obj) (GTK_CHECK_TYPE ((obj), GL_TYPE_MERGE_PROPERTIES_DIALOG)) +#define GL_IS_MERGE_PROPERTIES_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GL_TYPE_MERGE_PROPERTIES_DIALOG)) +#define GL_MERGE_PROPERTIES_DIALOG_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), GL_TYPE_MERGE_PROPERTIES_DIALOG, glMergePropertiesDialogClass)) + + +typedef struct _glMergePropertiesDialog glMergePropertiesDialog; +typedef struct _glMergePropertiesDialogClass glMergePropertiesDialogClass; + +typedef struct _glMergePropertiesDialogPrivate glMergePropertiesDialogPrivate; + +struct _glMergePropertiesDialog +{ + GtkDialog parent_instance; + + glMergePropertiesDialogPrivate *priv; + +}; + +struct _glMergePropertiesDialogClass +{ + GtkDialogClass parent_class; +}; + +GType gl_merge_properties_dialog_get_type (void) G_GNUC_CONST; + +GtkWidget *gl_merge_properties_dialog_new (glLabel *label, + GtkWindow *window); + +G_END_DECLS + +#endif diff --git a/glabels2/src/merge-text.c b/glabels2/src/merge-text.c new file mode 100644 index 00000000..674e81d1 --- /dev/null +++ b/glabels2/src/merge-text.c @@ -0,0 +1,694 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * merge_text.c: text-file merge backend module + * + * Copyright (C) 2001 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "merge-text.h" + +#include + +#include "debug.h" + +#define LINE_BUF_LEN 1024 + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + +struct _glMergeTextPrivate { + gchar delim; + FILE *fp; +}; + +enum { + LAST_SIGNAL +}; + +enum { + ARG_0, + ARG_DELIM, +}; + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void gl_merge_text_finalize (GObject *object); + +static void gl_merge_text_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec); + +static void gl_merge_text_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec); + +static GList *gl_merge_text_get_key_list (glMerge *merge); +static gchar *gl_merge_text_get_primary_key (glMerge *merge); +static void gl_merge_text_open (glMerge *merge); +static void gl_merge_text_close (glMerge *merge); +static glMergeRecord *gl_merge_text_get_record (glMerge *merge); +static void gl_merge_text_copy (glMerge *dst_merge, + glMerge *src_merge); + +static GList *parse_line (FILE *fp, + gchar delim); +static gchar *parse_field (gchar *raw_field); +static void free_fields (GList **fields); + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glMergeText, gl_merge_text, GL_TYPE_MERGE); + +static void +gl_merge_text_class_init (glMergeTextClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + glMergeClass *merge_class = GL_MERGE_CLASS (class); + + gl_debug (DEBUG_MERGE, "START"); + + gl_merge_text_parent_class = g_type_class_peek_parent (class); + + object_class->set_property = gl_merge_text_set_property; + object_class->get_property = gl_merge_text_get_property; + + g_object_class_install_property + (object_class, + ARG_DELIM, + g_param_spec_char ("delim", NULL, NULL, + 0, 0x7F, ',', + (G_PARAM_READABLE | G_PARAM_WRITABLE))); + + object_class->finalize = gl_merge_text_finalize; + + merge_class->get_key_list = gl_merge_text_get_key_list; + merge_class->get_primary_key = gl_merge_text_get_primary_key; + merge_class->open = gl_merge_text_open; + merge_class->close = gl_merge_text_close; + merge_class->get_record = gl_merge_text_get_record; + merge_class->copy = gl_merge_text_copy; + + gl_debug (DEBUG_MERGE, "END"); +} + +static void +gl_merge_text_init (glMergeText *merge_text) +{ + gl_debug (DEBUG_MERGE, "START"); + + merge_text->priv = g_new0 (glMergeTextPrivate, 1); + + gl_debug (DEBUG_MERGE, "END"); +} + +static void +gl_merge_text_finalize (GObject *object) +{ + glMergeText *merge_text = GL_MERGE_TEXT (object); + + gl_debug (DEBUG_MERGE, "START"); + + g_return_if_fail (object && GL_IS_MERGE_TEXT (object)); + + g_free (merge_text->priv); + + G_OBJECT_CLASS (gl_merge_text_parent_class)->finalize (object); + + gl_debug (DEBUG_MERGE, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* Set argument. */ +/*--------------------------------------------------------------------------*/ +static void +gl_merge_text_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec) +{ + glMergeText *merge_text; + + merge_text = GL_MERGE_TEXT (object); + + switch (param_id) { + + case ARG_DELIM: + merge_text->priv->delim = g_value_get_char (value); + gl_debug (DEBUG_MERGE, "ARG \"delim\" = \"%c\"", + merge_text->priv->delim); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + + } + +} + +/*--------------------------------------------------------------------------*/ +/* Get argument. */ +/*--------------------------------------------------------------------------*/ +static void +gl_merge_text_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec) +{ + glMergeText *merge_text; + + merge_text = GL_MERGE_TEXT (object); + + switch (param_id) { + + case ARG_DELIM: + g_value_set_char (value, merge_text->priv->delim); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + + } + +} + +/*--------------------------------------------------------------------------*/ +/* Get key list. */ +/*--------------------------------------------------------------------------*/ +static GList * +gl_merge_text_get_key_list (glMerge *merge) +{ + glMergeText *merge_text; + GList *record_list, *p_rec; + glMergeRecord *record; + GList *p_field; + gint i_field, n_fields, n_fields_max = 0; + GList *key_list; + + /* Field keys are simply column numbers. */ + + gl_debug (DEBUG_MERGE, "BEGIN"); + + merge_text = GL_MERGE_TEXT (merge); + + record_list = (GList *)gl_merge_get_record_list (merge); + + for ( p_rec=record_list; p_rec!=NULL; p_rec=p_rec->next ) { + record = (glMergeRecord *)p_rec->data; + + n_fields = 0; + for ( p_field=record->field_list; p_field!=NULL; p_field=p_field->next ) { + n_fields++; + } + if ( n_fields > n_fields_max ) n_fields_max = n_fields; + } + + key_list = NULL; + for (i_field=1; i_field <= n_fields_max; i_field++) { + key_list = g_list_append (key_list, g_strdup_printf ("%d", i_field)); + } + + + gl_debug (DEBUG_MERGE, "END"); + + return key_list; +} + +/*--------------------------------------------------------------------------*/ +/* Get "primary" key. */ +/*--------------------------------------------------------------------------*/ +static gchar * +gl_merge_text_get_primary_key (glMerge *merge) +{ + /* For now, let's always assume the first column is the primary key. */ + return g_strdup ("1"); +} + +/*--------------------------------------------------------------------------*/ +/* Open merge source. */ +/*--------------------------------------------------------------------------*/ +static void +gl_merge_text_open (glMerge *merge) +{ + glMergeText *merge_text; + gchar *src; + + merge_text = GL_MERGE_TEXT (merge); + + src = gl_merge_get_src (merge); + + if (src != NULL) { + merge_text->priv->fp = fopen (src, "r"); + } + + g_free (src); +} + +/*--------------------------------------------------------------------------*/ +/* Close merge source. */ +/*--------------------------------------------------------------------------*/ +static void +gl_merge_text_close (glMerge *merge) +{ + glMergeText *merge_text; + + merge_text = GL_MERGE_TEXT (merge); + + if (merge_text->priv->fp != NULL) { + + fclose (merge_text->priv->fp); + merge_text->priv->fp = NULL; + + } +} + +/*--------------------------------------------------------------------------*/ +/* Get next record from merge source, NULL if no records left (i.e EOF) */ +/*--------------------------------------------------------------------------*/ +static glMergeRecord * +gl_merge_text_get_record (glMerge *merge) +{ + glMergeText *merge_text; + gchar delim; + FILE *fp; + glMergeRecord *record; + GList *fields, *p; + gint i_field; + glMergeField *field; + + merge_text = GL_MERGE_TEXT (merge); + + delim = merge_text->priv->delim; + fp = merge_text->priv->fp; + + if (fp == NULL) { + return NULL; + } + + fields = parse_line (fp, delim); + if ( fields == NULL ) { + return NULL; + } + + record = g_new0 (glMergeRecord, 1); + record->select_flag = TRUE; + i_field = 1; + for (p=fields; p != NULL; p=p->next) { + + field = g_new0 (glMergeField, 1); + field->key = g_strdup_printf ("%d", i_field++); +#ifndef CSV_ALWAYS_UTF8 + field->value = g_locale_to_utf8 (p->data, -1, NULL, NULL, NULL); +#else + field->value = g_strdup (p->data); +#endif + + record->field_list = g_list_append (record->field_list, field); + } + free_fields (&fields); + + return record; +} + +/*---------------------------------------------------------------------------*/ +/* Copy merge_text specific fields. */ +/*---------------------------------------------------------------------------*/ +static void +gl_merge_text_copy (glMerge *dst_merge, + glMerge *src_merge) +{ + glMergeText *dst_merge_text; + glMergeText *src_merge_text; + + dst_merge_text = GL_MERGE_TEXT (dst_merge); + src_merge_text = GL_MERGE_TEXT (src_merge); + + dst_merge_text->priv->delim = src_merge_text->priv->delim; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Parse line. */ +/* */ +/* Attempt to be a robust parser of various CSV (and similar) formats. */ +/* */ +/* Split into fields, accounting for: */ +/* - delimeters may be embedded in quoted text (") */ +/* - delimeters may be "escaped" by a leading backslash (\) */ +/* - quotes may be embedded in quoted text as two adjacent quotes ("") */ +/* - quotes may be "escaped" either within or outside of quoted text. */ +/* - newlines may be embedded in quoted text, allowing a field to span */ +/* more than one line. */ +/* */ +/* This function does not do any parsing of the individual fields, other */ +/* than to correctly interpet delimeters. Actual parsing of the individual */ +/* fields is done in parse_field(). */ +/* */ +/* Returns a list of fields. A blank line is considered a line with one */ +/* empty field. Returns empty (NULL) when done. */ +/*---------------------------------------------------------------------------*/ +static GList * +parse_line (FILE *fp, + gchar delim ) +{ + GList *list = NULL; + GString *string; + gint c; + enum { BEGIN, NORMAL, QUOTED, QUOTED_QUOTE1, + NORMAL_ESCAPED, QUOTED_ESCAPED, DONE } state; + + state = BEGIN; + string = g_string_new( "" ); + while ( state != DONE ) { + c=getc (fp); + + switch (state) { + + case BEGIN: + if ( c == delim ) + { + /* first field is empty. */ + list = g_list_append (list, g_strdup ("")); + state = NORMAL; + break; + } + switch (c) { + case '"': + string = g_string_append_c (string, c); + state = QUOTED; + break; + case '\\': + string = g_string_append_c (string, c); + state = NORMAL_ESCAPED; + break; + case '\n': + /* treat as one empty field. */ + list = g_list_append (list, g_strdup ("")); + state = DONE; + break; + case EOF: + /* end of file, no more lines. */ + state = DONE; + break; + default: + string = g_string_append_c (string, c); + state = NORMAL; + break; + } + break; + + case NORMAL: + if ( c == delim ) + { + list = g_list_append (list, parse_field (string->str)); + string = g_string_assign( string, "" ); + state = NORMAL; + break; + } + switch (c) { + case '"': + string = g_string_append_c (string, c); + state = QUOTED; + break; + case '\\': + string = g_string_append_c (string, c); + state = NORMAL_ESCAPED; + break; + case '\n': + case EOF: + list = g_list_append (list, parse_field (string->str)); + state = DONE; + break; + default: + string = g_string_append_c (string, c); + state = NORMAL; + break; + } + break; + + case QUOTED: + switch (c) { + case '"': + string = g_string_append_c (string, c); + state = QUOTED_QUOTE1; + break; + case '\\': + string = g_string_append_c (string, c); + state = QUOTED_ESCAPED; + break; + case EOF: + /* File ended mid way through quoted item */ + list = g_list_append (list, parse_field (string->str)); + state = DONE; + break; + default: + string = g_string_append_c (string, c); + break; + } + break; + + case QUOTED_QUOTE1: + if ( c == delim ) + { + list = g_list_append (list, parse_field (string->str)); + string = g_string_assign( string, "" ); + state = NORMAL; + break; + } + switch (c) { + case '"': + /* insert quotes in string, stay quoted. */ + string = g_string_append_c (string, c); + state = QUOTED; + break; + case '\n': + case EOF: + /* line or file ended after quoted item */ + list = g_list_append (list, parse_field (string->str)); + state = DONE; + break; + default: + string = g_string_append_c (string, c); + state = NORMAL; + break; + } + break; + + case NORMAL_ESCAPED: + switch (c) { + case EOF: + /* File ended mid way through quoted item */ + list = g_list_append (list, parse_field (string->str)); + state = DONE; + break; + default: + string = g_string_append_c (string, c); + state = NORMAL; + break; + } + break; + + case QUOTED_ESCAPED: + switch (c) { + case EOF: + /* File ended mid way through quoted item */ + list = g_list_append (list, parse_field (string->str)); + state = DONE; + break; + default: + string = g_string_append_c (string, c); + state = QUOTED; + break; + } + break; + + default: + g_assert_not_reached(); + break; + } + + } + g_string_free( string, TRUE ); + + return list; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Parse field. */ +/* */ +/* - Strip leading and trailing white space, unless quoted. */ +/* - Strip CR, unless escaped. */ +/* - Expand '\n' and '\t' into newline and tab characters. */ +/* - Remove quotes, unless escaped (\" anywhere or "" within quotes) */ +/*---------------------------------------------------------------------------*/ +static gchar * +parse_field (gchar *raw_field) +{ + GString *string; + gchar *pass1_field, *c, *field; + enum { NORMAL, NORMAL_ESCAPED, QUOTED, QUOTED_ESCAPED, QUOTED_QUOTE1} state; + + + /* + * Pass 1: remove leading and trailing spaces. + */ + pass1_field = g_strdup (raw_field); + g_strstrip (pass1_field); + + /* + * Pass 2: resolve quoting and escaping. + */ + state = NORMAL; + string = g_string_new( "" ); + for ( c=pass1_field; *c != 0; c++ ) + { + switch (state) { + + case NORMAL: + switch (*c) { + case '\\': + state = NORMAL_ESCAPED; + break; + case '"': + state = QUOTED; + break; + case '\r': + /* Strip CR. */ + break; + default: + string = g_string_append_c (string, *c); + break; + } + break; + + case NORMAL_ESCAPED: + switch (*c) { + case 'n': + string = g_string_append_c (string, '\n'); + state = NORMAL; + break; + case 't': + string = g_string_append_c (string, '\t'); + state = NORMAL; + break; + default: + string = g_string_append_c (string, *c); + state = NORMAL; + break; + } + break; + + case QUOTED: + switch (*c) { + case '\\': + state = QUOTED_ESCAPED; + break; + case '"': + state = QUOTED_QUOTE1; + break; + case '\r': + /* Strip CR. */ + break; + default: + string = g_string_append_c (string, *c); + break; + } + break; + + case QUOTED_ESCAPED: + switch (*c) { + case 'n': + string = g_string_append_c (string, '\n'); + state = QUOTED; + break; + case 't': + string = g_string_append_c (string, '\t'); + state = QUOTED; + break; + default: + string = g_string_append_c (string, *c); + state = QUOTED; + break; + } + break; + + case QUOTED_QUOTE1: + switch (*c) { + case '"': + /* insert quotes in string, stay quoted. */ + string = g_string_append_c (string, *c); + state = QUOTED; + break; + case '\r': + /* Strip CR, return to QUOTED. */ + state = QUOTED; + break; + default: + string = g_string_append_c (string, *c); + state = NORMAL; + break; + } + break; + + default: + g_assert_not_reached(); + break; + } + + } + + field = g_strdup (string->str); + g_string_free( string, TRUE ); + g_free (pass1_field); + + return field; +} + +/*---------------------------------------------------------------------------*/ +/* Free list of fields. */ +/*---------------------------------------------------------------------------*/ +void +free_fields (GList ** list) +{ + GList *p; + + for (p = *list; p != NULL; p = p->next) { + g_free (p->data); + p->data = NULL; + } + + g_list_free (*list); + *list = NULL; +} + diff --git a/glabels2/src/merge-text.h b/glabels2/src/merge-text.h new file mode 100644 index 00000000..65bad54d --- /dev/null +++ b/glabels2/src/merge-text.h @@ -0,0 +1,68 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * merge_text.h: text-file merge backend module header file + * + * Copyright (C) 2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __MERGE_TEXT_H__ +#define __MERGE_TEXT_H__ + +#include "merge.h" + +G_BEGIN_DECLS + +/* The following object arguments are available: + * + * name type description + * --------------------------------------------------------------------------- + * delim gchar Field delimiter. + * + */ + +#define GL_TYPE_MERGE_TEXT (gl_merge_text_get_type ()) +#define GL_MERGE_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_MERGE_TEXT, glMergeText)) +#define GL_MERGE_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_MERGE_TEXT, glMergeTextClass)) +#define GL_IS_MERGE_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_MERGE_TEXT)) +#define GL_IS_MERGE_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_MERGE_TEXT)) +#define GL_MERGE_TEXT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), GL_TYPE_MERGE_TEXT, glMergeTextClass)) + + +typedef struct _glMergeText glMergeText; +typedef struct _glMergeTextClass glMergeTextClass; + +typedef struct _glMergeTextPrivate glMergeTextPrivate; + + +struct _glMergeText { + glMerge object; + + glMergeTextPrivate *priv; +}; + +struct _glMergeTextClass { + glMergeClass parent_class; +}; + + +GType gl_merge_text_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif diff --git a/glabels2/src/merge-vcard.c b/glabels2/src/merge-vcard.c new file mode 100644 index 00000000..c0eb1449 --- /dev/null +++ b/glabels2/src/merge-vcard.c @@ -0,0 +1,383 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * merge_vcard.c: vcard merge backend module + * + * Copyright (C) 2001 Jim Evins . + * and + * Copyright (C) 2005 Austin Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#ifdef HAVE_LIBEBOOK + + +#include "merge-vcard.h" +#include + +#include +#include +#include + +#include "debug.h" + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + +struct _glMergeVCardPrivate { + FILE *fp; +}; + +enum { + LAST_SIGNAL +}; + +enum { + ARG_0, +}; + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void gl_merge_vcard_finalize (GObject *object); + +static void gl_merge_vcard_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec); + +static void gl_merge_vcard_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec); + +static GList *gl_merge_vcard_get_key_list (glMerge *merge); +static gchar *gl_merge_vcard_get_primary_key (glMerge *merge); +static void gl_merge_vcard_open (glMerge *merge); +static void gl_merge_vcard_close (glMerge *merge); +static glMergeRecord *gl_merge_vcard_get_record (glMerge *merge); +static void gl_merge_vcard_copy (glMerge *dst_merge, + glMerge *src_merge); +static char * parse_next_vcard (FILE *fp); + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glMergeVCard, gl_merge_vcard, GL_TYPE_MERGE); + +static void +gl_merge_vcard_class_init (glMergeVCardClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + glMergeClass *merge_class = GL_MERGE_CLASS (class); + + gl_debug (DEBUG_MERGE, "START"); + + gl_merge_vcard_parent_class = g_type_class_peek_parent (class); + + object_class->set_property = gl_merge_vcard_set_property; + object_class->get_property = gl_merge_vcard_get_property; + + object_class->finalize = gl_merge_vcard_finalize; + + merge_class->get_key_list = gl_merge_vcard_get_key_list; + merge_class->get_primary_key = gl_merge_vcard_get_primary_key; + merge_class->open = gl_merge_vcard_open; + merge_class->close = gl_merge_vcard_close; + merge_class->get_record = gl_merge_vcard_get_record; + merge_class->copy = gl_merge_vcard_copy; + + gl_debug (DEBUG_MERGE, "END"); +} + +static void +gl_merge_vcard_init (glMergeVCard *merge_vcard) +{ + gl_debug (DEBUG_MERGE, "START"); + + merge_vcard->priv = g_new0 (glMergeVCardPrivate, 1); + + gl_debug (DEBUG_MERGE, "END"); +} + +static void +gl_merge_vcard_finalize (GObject *object) +{ + glMergeVCard *merge_vcard = GL_MERGE_VCARD (object); + + gl_debug (DEBUG_MERGE, "START"); + + g_return_if_fail (object && GL_IS_MERGE_VCARD (object)); + + g_free (merge_vcard->priv); + + G_OBJECT_CLASS (gl_merge_vcard_parent_class)->finalize (object); + + gl_debug (DEBUG_MERGE, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* Set argument. */ +/*--------------------------------------------------------------------------*/ +static void +gl_merge_vcard_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec) +{ + glMergeVCard *merge_vcard; + + merge_vcard = GL_MERGE_VCARD (object); + + switch (param_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} + +/*--------------------------------------------------------------------------*/ +/* Get argument. */ +/*--------------------------------------------------------------------------*/ +static void +gl_merge_vcard_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec) +{ + glMergeVCard *merge_vcard; + + merge_vcard = GL_MERGE_VCARD (object); + + switch (param_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } + +} + +/* TODO */ +/*--------------------------------------------------------------------------*/ +/* Get key list. */ +/*--------------------------------------------------------------------------*/ +static GList * +gl_merge_vcard_get_key_list (glMerge *merge) +{ + glMergeVCard *merge_vcard; + GList *key_list; + + gl_debug (DEBUG_MERGE, "BEGIN"); + + merge_vcard = GL_MERGE_VCARD (merge); + + /* extremely simple approach until I can list the available keys from the + * server, and return them. */ + key_list = NULL; + key_list = g_list_append (key_list, g_strdup ("full_name")); + key_list = g_list_append (key_list, g_strdup ("home_address")); + key_list = g_list_append (key_list, g_strdup ("work_address")); + + gl_debug (DEBUG_MERGE, "END"); + + return key_list; +} + +/* TODO? */ +/*--------------------------------------------------------------------------*/ +/* Get "primary" key. */ +/*--------------------------------------------------------------------------*/ +static gchar * +gl_merge_vcard_get_primary_key (glMerge *merge) +{ + /* For now, let's always assume the full name is the primary key. */ + return g_strdup ("full_name"); +} + +/*--------------------------------------------------------------------------*/ +/* Open merge source. */ +/*--------------------------------------------------------------------------*/ +static void +gl_merge_vcard_open (glMerge *merge) +{ + glMergeVCard *merge_vcard; + gchar *src; + + merge_vcard = GL_MERGE_VCARD (merge); + + src = gl_merge_get_src (merge); + + if (src != NULL) { + merge_vcard->priv->fp = fopen (src, "r"); + } + + g_free (src); + + return; +} + +/*--------------------------------------------------------------------------*/ +/* Close merge source. */ +/*--------------------------------------------------------------------------*/ +static void +gl_merge_vcard_close (glMerge *merge) +{ + glMergeVCard *merge_vcard; + + merge_vcard = GL_MERGE_VCARD (merge); + + if (merge_vcard->priv->fp != NULL) { + fclose (merge_vcard->priv->fp); + merge_vcard->priv->fp = NULL; + } +} + +/*--------------------------------------------------------------------------*/ +/* Get next record from merge source, NULL if no records left (i.e EOF) */ +/*--------------------------------------------------------------------------*/ +static glMergeRecord * +gl_merge_vcard_get_record (glMerge *merge) +{ + glMergeVCard *merge_vcard; + glMergeRecord *record; + glMergeField *field; + + char *vcard; + EContact *contact; + + merge_vcard = GL_MERGE_VCARD (merge); + + vcard = parse_next_vcard(merge_vcard->priv->fp); + if (vcard == NULL || vcard[0] == '\0') { + return NULL; /* EOF */ + } + contact = e_contact_new_from_vcard(vcard); + if (contact == NULL) { + return NULL; /* invalid vcard */ + } + + record = g_new0 (glMergeRecord, 1); + record->select_flag = TRUE; + + /* Take the interesting fields one by one from the contact, and put them + * into the glMergeRecord structure. When done, free up the resources for + * that contact */ + + /* get the full name */ + field = g_new0 (glMergeField, 1); + field->key = g_strdup ("full_name"); + field->value = g_strdup (e_contact_get_const(contact, E_CONTACT_FULL_NAME)); + + record->field_list = g_list_append (record->field_list, field); + + /* get the home address */ + field = g_new0 (glMergeField, 1); + field->key = g_strdup ("home_address"); + field->value = g_strdup (e_contact_get_const(contact, E_CONTACT_ADDRESS_LABEL_HOME)); + + record->field_list = g_list_append (record->field_list, field); + + /* get the work address */ + field = g_new0 (glMergeField, 1); + field->key = g_strdup ("work_address"); + field->value = g_strdup (e_contact_get_const(contact, E_CONTACT_ADDRESS_LABEL_WORK)); + + record->field_list = g_list_append (record->field_list, field); + + /* free the contact */ + g_object_unref (contact); + g_free(vcard); + + return record; +} + +/*---------------------------------------------------------------------------*/ +/* Copy merge_vcard specific fields. */ +/*---------------------------------------------------------------------------*/ +static void +gl_merge_vcard_copy (glMerge *dst_merge, + glMerge *src_merge) +{ + glMergeVCard *dst_merge_vcard; + glMergeVCard *src_merge_vcard; + + dst_merge_vcard = GL_MERGE_VCARD (dst_merge); + src_merge_vcard = GL_MERGE_VCARD (src_merge); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE: pull out a full VCard from the open file */ +/* Arguments: */ +/* fp - an open stream to parse in put from */ +/* Returns: */ +/* a pointer to the buffer containing the vcard, the empty string on */ +/* end-of-file or error, this buffer needs to be free by the caller */ +/*---------------------------------------------------------------------------*/ +static char * +parse_next_vcard (FILE *fp) +{ + gboolean found_begin = FALSE; + gboolean found_end = FALSE; + char *vcard; + char line[512]; + int size = 2048; + int cursize = 0; + + /* if no source has been set up, don't try to read from the file */ + if (!fp) { + return NULL; + } + + vcard = g_malloc0(size); + + while (fgets(line, sizeof(line), fp) && found_end == FALSE) { + if (found_begin == TRUE) { + if (g_str_has_prefix(line, "END:VCARD")) { found_end = TRUE; } + } else { + if (g_str_has_prefix(line, "BEGIN:VCARD")) { found_begin = TRUE; } + else { continue; }/* skip lines not in a vcard */ + } + + /* if the buffer passed us isn't big enough, reallocate it */ + cursize += strlen(line); + if (cursize >= size) { + size *= 2; + vcard = (char *)g_realloc(vcard, size); /* aborts program on error */ + } + + /* add the line (or portion thereof) to the vcard */ + strncat(vcard, line, size); + } + + return vcard; +} + + + +#endif /* HAVE_LIBEBOOK */ diff --git a/glabels2/src/merge-vcard.h b/glabels2/src/merge-vcard.h new file mode 100644 index 00000000..7ede444f --- /dev/null +++ b/glabels2/src/merge-vcard.h @@ -0,0 +1,70 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * merge_vcard.h: vcard merge backend module header file + * + * Copyright (C) 2002 Jim Evins . + * and + * Copyright (C) 2005 Austin Henry + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __MERGE_VCARD_H__ +#define __MERGE_VCARD_H__ + +#include "merge.h" + +G_BEGIN_DECLS + +/* The following object arguments are available: + * + * name type description + * --------------------------------------------------------------------------- + * + */ + +#define GL_TYPE_MERGE_VCARD (gl_merge_vcard_get_type ()) +#define GL_MERGE_VCARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_MERGE_VCARD, glMergeVCard)) +#define GL_MERGE_VCARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_MERGE_VCARD, glMergeVCardClass)) +#define GL_IS_MERGE_VCARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_MERGE_VCARD)) +#define GL_IS_MERGE_VCARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_MERGE_VCARD)) +#define GL_MERGE_VCARD_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), GL_TYPE_MERGE_VCARD, glMergeVCardClass)) + + +typedef struct _glMergeVCard glMergeVCard; +typedef struct _glMergeVCardClass glMergeVCardClass; + +typedef struct _glMergeVCardPrivate glMergeVCardPrivate; + + +struct _glMergeVCard { + glMerge object; + + glMergeVCardPrivate *priv; +}; + +struct _glMergeVCardClass { + glMergeClass parent_class; +}; + + +GType gl_merge_vcard_get_type (void) G_GNUC_CONST; + +G_END_DECLS + + +#endif /* __MERGE_VCARD_H__ */ diff --git a/glabels2/src/merge.c b/glabels2/src/merge.c new file mode 100644 index 00000000..8af027fc --- /dev/null +++ b/glabels2/src/merge.c @@ -0,0 +1,791 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * merge.c: document merge module + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "merge.h" + +#include +#include +#include + +#include "debug.h" + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glMergePrivate { + gchar *name; + gchar *description; + gchar *src; + glMergeSrcType src_type; + + GList *record_list; +}; + +enum { + LAST_SIGNAL +}; + +typedef struct { + + GType type; + gchar *name; + gchar *description; + glMergeSrcType src_type; + + guint n_params; + GParameter *params; + +} Backend; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +static GList *backends = NULL; + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_merge_finalize (GObject *object); + +static void merge_open (glMerge *merge); + +static void merge_close (glMerge *merge); + +static glMergeRecord *merge_get_record (glMerge *merge); + +static void merge_free_record (glMergeRecord **record); + +static glMergeRecord *merge_dup_record (glMergeRecord *record); + +static void merge_free_record_list (GList **record_list); + +static GList *merge_dup_record_list (GList *record_list); + + + + +/*****************************************************************************/ +/* Register a new merge backend. */ +/*****************************************************************************/ +void +gl_merge_register_backend (GType type, + gchar *name, + gchar *description, + glMergeSrcType src_type, + const gchar *first_arg_name, + ...) +{ + Backend *backend; + va_list args; + const gchar *pname; + GObjectClass *class; + GParamSpec *pspec; + GParameter *params; + guint n_params = 0, n_alloced_params = 16; + + backend = g_new0 (Backend, 1); + + backend->type = type; + backend->name = g_strdup (name); + backend->description = g_strdup (description); + backend->src_type = src_type; + + params = g_new (GParameter, n_alloced_params); + va_start (args, first_arg_name); + for ( pname=first_arg_name; pname != NULL; pname=va_arg (args,gchar *) ) { + gchar *error = NULL; + + class = g_type_class_ref (type); + if (class == NULL) { + g_message ("%s: unknown object type %d", + G_STRLOC, (int)type); + break; + } + pspec = g_object_class_find_property (class, pname); + if (pspec == NULL) { + g_message ("%s: object class `%s' has no property named `%s'", + G_STRLOC, g_type_name (type), pname); + break; + } + if (n_params >= n_alloced_params) { + n_alloced_params += 16; + params = g_renew (GParameter, params, n_alloced_params); + } + params[n_params].name = pname; + params[n_params].value.g_type = 0; + g_value_init (¶ms[n_params].value, pspec->value_type); + G_VALUE_COLLECT (¶ms[n_params].value, args, 0, &error); + if (error) { + g_message ("%s: %s", G_STRLOC, error); + g_free (error); + break; + } + + n_params++; + } + va_end (args); + + backend->n_params = n_params; + backend->params = params; + + backends = g_list_append (backends, backend); + +} + +/*****************************************************************************/ +/* Get list of registered backend descriptions. */ +/*****************************************************************************/ +GList * +gl_merge_get_descriptions (void) +{ + GList *descriptions = NULL; + GList *p; + Backend *backend; + + descriptions = g_list_append (descriptions, g_strdup(_("None"))); + + for ( p=backends; p!=NULL; p=p->next) { + backend = (Backend *)p->data; + descriptions = g_list_append (descriptions, + g_strdup(backend->description)); + } + + return descriptions; +} + +/*****************************************************************************/ +/* Free list of descriptions. */ +/*****************************************************************************/ +void +gl_merge_free_descriptions (GList **descriptions) +{ + GList *p; + + gl_debug (DEBUG_MERGE, "START"); + + for (p = *descriptions; p != NULL; p = p->next) { + g_free (p->data); + p->data = NULL; + } + + g_list_free (*descriptions); + *descriptions = NULL; + + gl_debug (DEBUG_MERGE, "END"); +} + +/*****************************************************************************/ +/* Lookup name of backend from description. */ +/*****************************************************************************/ +gchar * +gl_merge_description_to_name (gchar *description) +{ + GList *p; + Backend *backend; + + if (g_strcasecmp(description, _("None")) == 0) { + return g_strdup("None"); + } + + for ( p=backends; p!=NULL; p=p->next) { + backend = (Backend *)p->data; + if (g_strcasecmp(description, backend->description) == 0) { + return g_strdup(backend->name); + } + } + + return g_strdup("None"); +} + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glMerge, gl_merge, G_TYPE_OBJECT); + +static void +gl_merge_class_init (glMergeClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_debug (DEBUG_MERGE, "START"); + + gl_merge_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_merge_finalize; + + gl_debug (DEBUG_MERGE, "END"); +} + +static void +gl_merge_init (glMerge *merge) +{ + gl_debug (DEBUG_MERGE, "START"); + + merge->priv = g_new0 (glMergePrivate, 1); + + gl_debug (DEBUG_MERGE, "END"); +} + +static void +gl_merge_finalize (GObject *object) +{ + glMerge *merge = GL_MERGE (object); + + gl_debug (DEBUG_MERGE, "START"); + + g_return_if_fail (object && GL_IS_MERGE (object)); + + merge_free_record_list (&merge->priv->record_list); + g_free (merge->priv->name); + g_free (merge->priv->description); + g_free (merge->priv->src); + g_free (merge->priv); + + G_OBJECT_CLASS (gl_merge_parent_class)->finalize (object); + + gl_debug (DEBUG_MERGE, "END"); +} + +/*****************************************************************************/ +/* New merge object. */ +/*****************************************************************************/ +glMerge * +gl_merge_new (gchar *name) +{ + glMerge *merge = NULL; + GList *p; + Backend *backend; + + gl_debug (DEBUG_MERGE, "START"); + + for (p=backends; p!=NULL; p=p->next) { + backend = (Backend *)p->data; + + if (g_strcasecmp(name, backend->name) == 0) { + + merge = GL_MERGE (g_object_newv (backend->type, + backend->n_params, + backend->params)); + + merge->priv->name = g_strdup (name); + merge->priv->description = g_strdup (backend->description); + merge->priv->src_type = backend->src_type; + + break; + } + } + + if ( (merge == NULL) && (g_strcasecmp (name, "None") != 0)) { + g_message ("Unknown merge backend \"%s\"", name); + } + + gl_debug (DEBUG_MERGE, "END"); + + return merge; +} + +/*****************************************************************************/ +/* Duplicate merge. */ +/*****************************************************************************/ +glMerge * +gl_merge_dup (glMerge *src_merge) +{ + glMerge *dst_merge; + + gl_debug (DEBUG_MERGE, "START"); + + if (src_merge == NULL) { + gl_debug (DEBUG_MERGE, "END (NULL)"); + return NULL; + } + + g_return_val_if_fail (GL_IS_MERGE (src_merge), NULL); + + dst_merge = g_object_new (G_OBJECT_TYPE(src_merge), NULL); + dst_merge->priv->name = g_strdup (src_merge->priv->name); + dst_merge->priv->description = g_strdup (src_merge->priv->description); + dst_merge->priv->src = g_strdup (src_merge->priv->src); + dst_merge->priv->src_type = src_merge->priv->src_type; + dst_merge->priv->record_list + = merge_dup_record_list (src_merge->priv->record_list); + + if ( GL_MERGE_GET_CLASS(src_merge)->copy != NULL ) { + + /* We have an object specific method, use it */ + GL_MERGE_GET_CLASS(src_merge)->copy (dst_merge, src_merge); + + } + + gl_debug (DEBUG_MERGE, "END"); + + return dst_merge; +} + +/*****************************************************************************/ +/* Get name of merge. */ +/*****************************************************************************/ +gchar * +gl_merge_get_name (glMerge *merge) +{ + gl_debug (DEBUG_MERGE, ""); + + if (merge == NULL) { + return g_strdup("None"); + } + + g_return_val_if_fail (GL_IS_MERGE (merge), g_strdup("None")); + + return g_strdup(merge->priv->name); +} + +/*****************************************************************************/ +/* Get description of merge. */ +/*****************************************************************************/ +gchar * +gl_merge_get_description (glMerge *merge) +{ + gl_debug (DEBUG_MERGE, ""); + + if (merge == NULL) { + return g_strdup(_("None")); + } + + g_return_val_if_fail (GL_IS_MERGE (merge), g_strdup(_("None"))); + + return g_strdup(merge->priv->description); +} + +/*****************************************************************************/ +/* Get source type of merge. */ +/*****************************************************************************/ +glMergeSrcType +gl_merge_get_src_type (glMerge *merge) +{ + gl_debug (DEBUG_MERGE, ""); + + if (merge == NULL) { + return GL_MERGE_SRC_IS_FIXED; + } + + g_return_val_if_fail (GL_IS_MERGE (merge), GL_MERGE_SRC_IS_FIXED); + + return merge->priv->src_type; +} + +/*****************************************************************************/ +/* Set src of merge. */ +/*****************************************************************************/ +void +gl_merge_set_src (glMerge *merge, + gchar *src) +{ + GList *record_list = NULL; + glMergeRecord *record; + + gl_debug (DEBUG_MERGE, "START"); + + if (merge == NULL) + { + gl_debug (DEBUG_MERGE, "END (NULL)"); + return; + } + + g_return_if_fail (GL_IS_MERGE (merge)); + + if ( src == NULL) + { + + if ( merge->priv->src != NULL ) + { + g_free (merge->priv->src); + } + merge->priv->src = NULL; + merge_free_record_list (&merge->priv->record_list); + + } + else + { + + if ( merge->priv->src != NULL ) + { + g_free(merge->priv->src); + } + merge->priv->src = g_strdup (src); + + merge_free_record_list (&merge->priv->record_list); + + merge_open (merge); + while ( (record = merge_get_record (merge)) != NULL ) + { + record_list = g_list_append( record_list, record ); + } + merge_close (merge); + merge->priv->record_list = record_list; + + } + + + gl_debug (DEBUG_MERGE, "END"); +} + +/*****************************************************************************/ +/* Get src of merge. */ +/*****************************************************************************/ +gchar * +gl_merge_get_src (glMerge *merge) +{ + gl_debug (DEBUG_MERGE, ""); + + if (merge == NULL) { + return NULL; + } + + g_return_val_if_fail (GL_IS_MERGE (merge), NULL); + + return g_strdup(merge->priv->src); +} + +/*****************************************************************************/ +/* Get Key List. */ +/*****************************************************************************/ +GList * +gl_merge_get_key_list (glMerge *merge) +{ + GList *key_list = NULL; + + gl_debug (DEBUG_MERGE, "START"); + + if (merge == NULL) { + return NULL; + } + + g_return_val_if_fail (GL_IS_MERGE (merge), NULL); + + if ( GL_MERGE_GET_CLASS(merge)->get_key_list != NULL ) { + + key_list = GL_MERGE_GET_CLASS(merge)->get_key_list (merge); + + } + + gl_debug (DEBUG_MERGE, "END"); + + return key_list; +} + +/*****************************************************************************/ +/* Free a list of keys. */ +/*****************************************************************************/ +void +gl_merge_free_key_list (GList **key_list) +{ + GList *p; + + gl_debug (DEBUG_MERGE, "START"); + + for (p = *key_list; p != NULL; p = p->next) { + g_free (p->data); + p->data = NULL; + } + + g_list_free (*key_list); + *key_list = NULL; + + gl_debug (DEBUG_MERGE, "END"); +} + +/*****************************************************************************/ +/* Get Key List. */ +/*****************************************************************************/ +gchar * +gl_merge_get_primary_key (glMerge *merge) +{ + gchar *key = NULL; + + gl_debug (DEBUG_MERGE, "START"); + + if (merge == NULL) { + return NULL; + } + + g_return_val_if_fail (GL_IS_MERGE (merge), NULL); + + if ( GL_MERGE_GET_CLASS(merge)->get_primary_key != NULL ) { + + key = GL_MERGE_GET_CLASS(merge)->get_primary_key (merge); + + } + + gl_debug (DEBUG_MERGE, "END"); + + return key; +} + +/*---------------------------------------------------------------------------*/ +/* Open merge source. */ +/*---------------------------------------------------------------------------*/ +static void +merge_open (glMerge *merge) +{ + gl_debug (DEBUG_MERGE, "START"); + + g_return_if_fail (merge && GL_IS_MERGE (merge)); + + if ( GL_MERGE_GET_CLASS(merge)->open != NULL ) { + + GL_MERGE_GET_CLASS(merge)->open (merge); + + } + + gl_debug (DEBUG_MERGE, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* Close merge source. */ +/*---------------------------------------------------------------------------*/ +static void +merge_close (glMerge *merge) +{ + gl_debug (DEBUG_MERGE, "START"); + + g_return_if_fail (merge && GL_IS_MERGE (merge)); + + if ( GL_MERGE_GET_CLASS(merge)->close != NULL ) { + + GL_MERGE_GET_CLASS(merge)->close (merge); + + } + + gl_debug (DEBUG_MERGE, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* Get next record (list of fields) from opened merge source. */ +/*---------------------------------------------------------------------------*/ +static glMergeRecord * +merge_get_record (glMerge *merge) +{ + glMergeRecord *record = NULL; + + gl_debug (DEBUG_MERGE, "START"); + + g_return_val_if_fail (merge && GL_IS_MERGE (merge), NULL); + + if ( GL_MERGE_GET_CLASS(merge)->get_record != NULL ) { + + record = GL_MERGE_GET_CLASS(merge)->get_record (merge); + + } + + gl_debug (DEBUG_MERGE, "END"); + + return record; +} + +/*---------------------------------------------------------------------------*/ +/* Free a merge record (list of fields) */ +/*---------------------------------------------------------------------------*/ +static void +merge_free_record (glMergeRecord **record) +{ + GList *p; + glMergeField *field; + + gl_debug (DEBUG_MERGE, "START"); + + for (p = (*record)->field_list; p != NULL; p = p->next) { + field = (glMergeField *) p->data; + + g_free (field->key); + field->key = NULL; + g_free (field->value); + field->value = NULL; + + g_free (p->data); + p->data = NULL; + + } + g_list_free ((*record)->field_list); + (*record)->field_list = NULL; + + g_free (*record); + *record = NULL; + + gl_debug (DEBUG_MERGE, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* Duplicate a merge record (list of fields) */ +/*---------------------------------------------------------------------------*/ +static glMergeRecord * +merge_dup_record (glMergeRecord *record) +{ + glMergeRecord *dest_record; + GList *p; + glMergeField *dest_field, *field; + + gl_debug (DEBUG_MERGE, "START"); + + dest_record = g_new0 (glMergeRecord, 1); + dest_record->select_flag = record->select_flag; + + for (p = record->field_list; p != NULL; p = p->next) { + field = (glMergeField *) p->data; + + dest_field = g_new0 (glMergeField, 1); + + dest_field->key = g_strdup (field->key); + dest_field->value = g_strdup (field->value); + + dest_record->field_list = + g_list_append (dest_record->field_list, dest_field); + + } + + gl_debug (DEBUG_MERGE, "END"); + + return dest_record; +} + +/*****************************************************************************/ +/* Find key in given record and evaluate. */ +/*****************************************************************************/ +gchar * +gl_merge_eval_key (glMergeRecord *record, + gchar *key) + +{ + GList *p; + glMergeField *field; + gchar *val = NULL; + + gl_debug (DEBUG_MERGE, "START"); + + if ( (record != NULL) ) { + for (p = record->field_list; p != NULL; p = p->next) { + field = (glMergeField *) p->data; + + if (strcmp (key, field->key) == 0) { + val = g_strdup (field->value); + } + + } + } + + gl_debug (DEBUG_MERGE, "END"); + + return val; +} + +/*****************************************************************************/ +/* Read all records from merge source. */ +/*****************************************************************************/ +const GList * +gl_merge_get_record_list (glMerge *merge) +{ + gl_debug (DEBUG_MERGE, ""); + + if ( merge != NULL ) { + return merge->priv->record_list; + } else { + return NULL; + } +} + +/*---------------------------------------------------------------------------*/ +/* Free a list of records. */ +/*---------------------------------------------------------------------------*/ +static void +merge_free_record_list (GList **record_list) +{ + GList *p; + glMergeRecord *record; + + gl_debug (DEBUG_MERGE, "START"); + + for (p = *record_list; p != NULL; p = p->next) { + record = (glMergeRecord *) p->data; + + merge_free_record( &record ); + + } + + g_list_free (*record_list); + *record_list = NULL; + + gl_debug (DEBUG_MERGE, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* Duplicate a list of records. */ +/*---------------------------------------------------------------------------*/ +static GList * +merge_dup_record_list (GList *record_list) +{ + GList *dest_list = NULL, *p; + glMergeRecord *dest_record, *record; + + gl_debug (DEBUG_MERGE, "START"); + + for (p = record_list; p != NULL; p = p->next) { + record = (glMergeRecord *) p->data; + + dest_record = merge_dup_record( record ); + dest_list = g_list_append (dest_list, dest_record); + } + + + gl_debug (DEBUG_MERGE, "END"); + + return dest_list; +} + +/*****************************************************************************/ +/* Count selected records. */ +/*****************************************************************************/ +gint +gl_merge_get_record_count (glMerge *merge) +{ + GList *p; + glMergeRecord *record; + gint count; + + gl_debug (DEBUG_MERGE, "START"); + + count = 0; + for ( p=merge->priv->record_list; p!=NULL; p=p->next ) { + record = (glMergeRecord *)p->data; + + if ( record->select_flag ) count ++; + } + + gl_debug (DEBUG_MERGE, "END"); + + return count; +} + + diff --git a/glabels2/src/merge.h b/glabels2/src/merge.h new file mode 100644 index 00000000..819ca25b --- /dev/null +++ b/glabels2/src/merge.h @@ -0,0 +1,130 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * merge.h: document merge module header file + * + * Copyright (C) 2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __MERGE_H__ +#define __MERGE_H__ + +#include + +G_BEGIN_DECLS + +typedef enum { + GL_MERGE_SRC_IS_FIXED, + GL_MERGE_SRC_IS_FILE, +} glMergeSrcType; + +typedef struct { + gchar *key; + gchar *value; +} glMergeField; + +typedef struct { + gboolean select_flag; + GList *field_list; /* List of glMergeFields */ +} glMergeRecord; + + +#define GL_TYPE_MERGE (gl_merge_get_type ()) +#define GL_MERGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_MERGE, glMerge)) +#define GL_MERGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_MERGE, glMergeClass)) +#define GL_IS_MERGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_MERGE)) +#define GL_IS_MERGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_MERGE)) +#define GL_MERGE_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), GL_TYPE_MERGE, glMergeClass)) + + +typedef struct _glMerge glMerge; +typedef struct _glMergeClass glMergeClass; + +typedef struct _glMergePrivate glMergePrivate; + + +struct _glMerge { + GObject object; + + glMergePrivate *priv; +}; + +struct _glMergeClass { + GObjectClass parent_class; + + GList *(*get_key_list) (glMerge *merge); + + gchar *(*get_primary_key) (glMerge *merge); + + void (*open) (glMerge *merge); + + void (*close) (glMerge *merge); + + glMergeRecord *(*get_record) (glMerge *merge); + + void (*copy) (glMerge *dst_merge, + glMerge *src_merge); +}; + + +void gl_merge_register_backend (GType type, + gchar *name, + gchar *description, + glMergeSrcType src_type, + const gchar *first_arg_name, + ...); + +GList *gl_merge_get_descriptions (void); + +void gl_merge_free_descriptions (GList **descriptions); + +gchar *gl_merge_description_to_name (gchar *description); + +GType gl_merge_get_type (void) G_GNUC_CONST; + +glMerge *gl_merge_new (gchar *name); + +glMerge *gl_merge_dup (glMerge *orig); + +gchar *gl_merge_get_name (glMerge *merge); + +gchar *gl_merge_get_description (glMerge *merge); + +glMergeSrcType gl_merge_get_src_type (glMerge *merge); + +void gl_merge_set_src (glMerge *merge, + gchar *src); + +gchar *gl_merge_get_src (glMerge *merge); + +GList *gl_merge_get_key_list (glMerge *merge); + +void gl_merge_free_key_list (GList **keys); + +gchar *gl_merge_get_primary_key (glMerge *merge); + +gchar *gl_merge_eval_key (glMergeRecord *record, + gchar *key); + +const GList *gl_merge_get_record_list (glMerge *merge); + +gint gl_merge_get_record_count (glMerge *merge); + +G_END_DECLS + +#endif diff --git a/glabels2/src/mini-preview-pixbuf-cache.c b/glabels2/src/mini-preview-pixbuf-cache.c new file mode 100644 index 00000000..c7d3afa3 --- /dev/null +++ b/glabels2/src/mini-preview-pixbuf-cache.c @@ -0,0 +1,149 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * mini-preview-pixbuf-cache.c: GLabels mini-preview pixbuf cache module + * + * Copyright (C) 2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "mini-preview-pixbuf-cache.h" +#include "mini-preview-pixbuf.h" + +#include "libglabels/db.h" + +#include +#include + +#include "debug.h" + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +static GHashTable *mini_preview_pixbuf_cache = NULL; + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + + +/*****************************************************************************/ +/* Create a new hash table to keep track of cached mini preview pixbufs. */ +/*****************************************************************************/ +void +gl_mini_preview_pixbuf_cache_init (void) +{ + GList *names = NULL; + GList *p; + lglTemplate *template; + + gl_debug (DEBUG_PIXBUF_CACHE, "START"); + + mini_preview_pixbuf_cache = g_hash_table_new (g_str_hash, g_str_equal); + + names = lgl_db_get_template_name_list_unique (NULL, NULL, NULL); + for ( p=names; p != NULL; p=p->next ) + { + gl_debug (DEBUG_PIXBUF_CACHE, "name = \"%s\"", p->data); + + template = lgl_db_lookup_template_from_name (p->data); + gl_mini_preview_pixbuf_cache_add_by_template (template); + lgl_template_free (template); + } + lgl_db_free_template_name_list (names); + + gl_debug (DEBUG_PIXBUF_CACHE, "END pixbuf_cache=%p", mini_preview_pixbuf_cache); +} + +/*****************************************************************************/ +/* Add pixbuf to cache by template. */ +/*****************************************************************************/ +void +gl_mini_preview_pixbuf_cache_add_by_template (lglTemplate *template) +{ + GdkPixbuf *pixbuf; + GList *p; + lglTemplateAlias *alias; + gchar *name; + + gl_debug (DEBUG_PIXBUF_CACHE, "START"); + + pixbuf = gl_mini_preview_pixbuf_new (template, 72, 72); + + for ( p=template->aliases; p != NULL; p=p->next ) + { + alias = (lglTemplateAlias *)p->data; + + name = g_strdup_printf ("%s %s", alias->brand, alias->part); + g_hash_table_insert (mini_preview_pixbuf_cache, name, g_object_ref (pixbuf)); + } + + g_object_unref (pixbuf); + + gl_debug (DEBUG_PIXBUF_CACHE, "END"); +} + +/*****************************************************************************/ +/* Add pixbuf to cache by name. */ +/*****************************************************************************/ +void +gl_mini_preview_pixbuf_cache_add_by_name (gchar *name) +{ + lglTemplate *template; + GdkPixbuf *pixbuf; + + gl_debug (DEBUG_PIXBUF_CACHE, "START"); + + template = lgl_db_lookup_template_from_name (name); + pixbuf = gl_mini_preview_pixbuf_new (template, 72, 72); + lgl_template_free (template); + + g_hash_table_insert (mini_preview_pixbuf_cache, g_strdup (name), pixbuf); + + gl_debug (DEBUG_PIXBUF_CACHE, "END"); +} + +/*****************************************************************************/ +/* Get pixbuf. */ +/*****************************************************************************/ +GdkPixbuf * +gl_mini_preview_pixbuf_cache_get_pixbuf (gchar *name) +{ + GdkPixbuf *pixbuf; + + gl_debug (DEBUG_PIXBUF_CACHE, "START pixbuf_cache=%p", mini_preview_pixbuf_cache); + + pixbuf = g_hash_table_lookup (mini_preview_pixbuf_cache, name); + + if (!pixbuf) + { + gl_mini_preview_pixbuf_cache_add_by_name (name); + pixbuf = g_hash_table_lookup (mini_preview_pixbuf_cache, name); + } + + gl_debug (DEBUG_PIXBUF_CACHE, "END"); + + return g_object_ref (pixbuf); +} + diff --git a/glabels2/src/mini-preview-pixbuf-cache.h b/glabels2/src/mini-preview-pixbuf-cache.h new file mode 100644 index 00000000..092d5692 --- /dev/null +++ b/glabels2/src/mini-preview-pixbuf-cache.h @@ -0,0 +1,42 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * mini-preview-pixbuf-cache.h: GLabels mini-preview pixbuf cache module + * + * Copyright (C) 2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __MINI_PREVIEW_PIXBUF_CACHE_H__ +#define __MINI_PREVIEW_PIXBUF_CACHE_H__ + +#include +#include + +G_BEGIN_DECLS + +void gl_mini_preview_pixbuf_cache_init (void); + +void gl_mini_preview_pixbuf_cache_add_by_name (gchar *name); +void gl_mini_preview_pixbuf_cache_add_by_template (lglTemplate *template); + +GdkPixbuf *gl_mini_preview_pixbuf_cache_get_pixbuf (gchar *name); + + +G_END_DECLS + +#endif /*__MINI_PREVIEW_PIXBUF_CACHE_H__ */ diff --git a/glabels2/src/mini-preview-pixbuf.c b/glabels2/src/mini-preview-pixbuf.c new file mode 100644 index 00000000..a4642525 --- /dev/null +++ b/glabels2/src/mini-preview-pixbuf.c @@ -0,0 +1,225 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * mini-preview-pixbuf.c: mini preview pixbuf module + * + * Copyright (C) 2006 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "mini-preview-pixbuf.h" +#include "cairo-label-path.h" + +#include +#include + +#include "debug.h" + +/*===========================================*/ +/* Private macros and constants. */ +/*===========================================*/ + +#define PAPER_RGB_ARGS 0.95, 0.95, 0.95 +#define PAPER_OUTLINE_RGB_ARGS 0.0, 0.0, 0.0 +#define LABEL_RGB_ARGS 1.0, 1.0, 1.0 +#define LABEL_OUTLINE_RGB_ARGS 0.25, 0.25, 0.25 + +#define PAPER_OUTLINE_WIDTH_PIXELS 1.0 +#define LABEL_OUTLINE_WIDTH_PIXELS 1.0 + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void draw_paper (cairo_t *cr, + lglTemplate *template, + gdouble scale); + +static void draw_label_outlines (cairo_t *cr, + lglTemplate *template, + gdouble scale); + +static void draw_label_outline (cairo_t *cr, + lglTemplate *template, + gdouble x0, + gdouble y0); + + + + +/****************************************************************************/ +/* Create new pixbuf with mini preview of template */ +/****************************************************************************/ +GdkPixbuf * +gl_mini_preview_pixbuf_new (lglTemplate *template, + gint width, + gint height) +{ + cairo_surface_t *surface; + cairo_t *cr; + GdkPixbuf *pixbuf; + gdouble scale; + gdouble w, h; + gdouble offset_x, offset_y; + + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + /* Create pixbuf and cairo context. */ + pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, width, height); + surface = cairo_image_surface_create_for_data (gdk_pixbuf_get_pixels (pixbuf), + CAIRO_FORMAT_RGB24, + gdk_pixbuf_get_width (pixbuf), + gdk_pixbuf_get_height (pixbuf), + gdk_pixbuf_get_rowstride (pixbuf)); + + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + /* Clear pixbuf */ + cairo_save (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); + cairo_paint (cr); + cairo_restore (cr); + + cairo_set_antialias (cr, CAIRO_ANTIALIAS_GRAY); + + /* Set scale and offset */ + w = width - 1; + h = height - 1; + if ( (w/template->page_width) > (h/template->page_height) ) { + scale = h / template->page_height; + } else { + scale = w / template->page_width; + } + offset_x = (width/scale - template->page_width) / 2.0; + offset_y = (height/scale - template->page_height) / 2.0; + cairo_identity_matrix (cr); + cairo_scale (cr, scale, scale); + cairo_translate (cr, offset_x, offset_y); + + /* Draw paper and label outlines */ + draw_paper (cr, template, scale); + draw_label_outlines (cr, template, scale); + + /* Cleanup */ + cairo_destroy (cr); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); + + return pixbuf; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Draw paper and paper outline. */ +/*--------------------------------------------------------------------------*/ +static void +draw_paper (cairo_t *cr, + lglTemplate *template, + gdouble scale) +{ + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + cairo_save (cr); + cairo_rectangle (cr, 0.0, 0.0, template->page_width, template->page_height); + cairo_set_source_rgb (cr, PAPER_RGB_ARGS); + cairo_fill_preserve (cr); + cairo_set_line_width (cr, PAPER_OUTLINE_WIDTH_PIXELS/scale); + cairo_set_source_rgb (cr, PAPER_OUTLINE_RGB_ARGS); + cairo_stroke (cr); + cairo_restore (cr); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Draw label outlines. */ +/*--------------------------------------------------------------------------*/ +static void +draw_label_outlines (cairo_t *cr, + lglTemplate *template, + gdouble scale) +{ + const lglTemplateFrame *frame; + gint i, n_labels; + lglTemplateOrigin *origins; + + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + cairo_save (cr); + + cairo_set_line_width (cr, LABEL_OUTLINE_WIDTH_PIXELS/scale); + + frame = (lglTemplateFrame *)template->frames->data; + + n_labels = lgl_template_frame_get_n_labels (frame); + origins = lgl_template_frame_get_origins (frame); + + for ( i=0; i < n_labels; i++ ) { + + draw_label_outline(cr, template, origins[i].x, origins[i].y); + + } + + g_free (origins); + + cairo_restore (cr); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Draw label outline. */ +/*--------------------------------------------------------------------------*/ +static void +draw_label_outline (cairo_t *cr, + lglTemplate *template, + gdouble x0, + gdouble y0) +{ + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + cairo_save (cr); + + cairo_translate (cr, x0, y0); + + gl_cairo_label_path (cr, template, FALSE, FALSE); + + cairo_set_source_rgb (cr, LABEL_RGB_ARGS); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_fill_preserve (cr); + + cairo_set_source_rgb (cr, LABEL_OUTLINE_RGB_ARGS); + cairo_stroke (cr); + + cairo_restore (cr); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); +} + diff --git a/glabels2/src/mini-preview-pixbuf.h b/glabels2/src/mini-preview-pixbuf.h new file mode 100644 index 00000000..ddad146b --- /dev/null +++ b/glabels2/src/mini-preview-pixbuf.h @@ -0,0 +1,40 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * mini-preview-pixbuf.h: mini-preview pixbuf module header file + * + * Copyright (C) 2006 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __MINI_PREVIEW_PIXBUF_H__ +#define __MINI_PREVIEW_PIXBUF_H__ + + +#include +#include + +G_BEGIN_DECLS + +GdkPixbuf *gl_mini_preview_pixbuf_new (lglTemplate *template, + gint width, + gint height); + +G_END_DECLS + +#endif diff --git a/glabels2/src/mygal/Makefile.am b/glabels2/src/mygal/Makefile.am new file mode 100644 index 00000000..c4f29d46 --- /dev/null +++ b/glabels2/src/mygal/Makefile.am @@ -0,0 +1,41 @@ +INCLUDES = \ + $(GLABELS_CFLAGS) + + +noinst_LTLIBRARIES = libmygal.la + +libmygal_la_SOURCES = \ + widget-color-combo.c \ + widget-color-combo.h \ + e-util.h \ + e-colors.c \ + e-colors.h \ + mygal-combo-box.c \ + mygal-combo-box.h \ + color-palette.c \ + color-palette.h \ + color-group.c \ + color-group.h \ + e-marshal.c \ + e-marshal.h + +marshal_sources = \ + e-marshal.c \ + e-marshal.h + +$(libmygal_la_OBJECTS) : $(marshal_sources) + +e-marshal.h: e-marshal.list $(GLIB_GENMARSHAL) + $(GLIB_GENMARSHAL) $< --header --prefix=e_marshal > $@ +e-marshal.c: e-marshal.list $(GLIB_GENMARSHAL) + $(GLIB_GENMARSHAL) $< --body --prefix=e_marshal > $@ + +EXTRA_DIST = e-marshal.list +CLEANFILES = $(marshal_sources) + +DONT_DIST_SOURCE = $(marshal_sources) + +dist-hook: + for file in $(DONT_DIST_SOURCE) ; do \ + rm -f $(distdir)/$$file ; \ + done diff --git a/glabels2/src/mygal/color-group.c b/glabels2/src/mygal/color-group.c new file mode 100644 index 00000000..3f35257c --- /dev/null +++ b/glabels2/src/mygal/color-group.c @@ -0,0 +1,333 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * color-group.c - Utility to keep a shered memory of custom colors + * between arbitrary widgets. + * Copyright 2000, Michael Levy + * Copyright 2001, Almer S. Tigelaar + * + * Authors: + * Michael Levy (mlevy@genoscope.cns.fr) + * Revised and polished by: + * Almer S. Tigelaar + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License, version 2, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#include "color-group.h" +#include +#include +#include "e-util.h" +#include + +#define PARENT_TYPE G_TYPE_OBJECT + +enum { + CUSTOM_COLOR_ADD, + LAST_SIGNAL +}; + +static GObjectClass *parent_class; + +static GQuark color_group_signals [LAST_SIGNAL] = { 0 }; + +static void color_group_finalize (GObject *obj); + +static void +color_group_class_init (ColorGroupClass *klass) +{ + GObjectClass *object_class; + + object_class = (GObjectClass*) klass; + + object_class->finalize = &color_group_finalize; + parent_class = g_type_class_peek (PARENT_TYPE); + + color_group_signals [CUSTOM_COLOR_ADD] = + g_signal_new ("custom_color_add", + COLOR_GROUP_TYPE, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ColorGroupClass, custom_color_add), + (GSignalAccumulator) NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, + 1, G_TYPE_POINTER); +} + +static void +color_group_init (ColorGroup *cg) +{ + cg->name = NULL; + cg->history = NULL; + cg->history_size = 0; +} + +E_MAKE_TYPE(color_group, + "ColorGroup", + ColorGroup, + color_group_class_init, + color_group_init, + PARENT_TYPE) + + +/* Hash table used to ensure unicity in newly created names*/ +static GHashTable *group_names = NULL; + +static guint +cg_hash (gconstpointer key) +{ + /* Do NOT use smart type checking it will not work for the tmp_key */ + return g_str_hash (((ColorGroup *)key)->name); +} + +static gint +cg_cmp (gconstpointer a, gconstpointer b) +{ + /* Do NOT use smart type checking it will not work for the tmp_key */ + ColorGroup const *cg_a = (ColorGroup *)a; + ColorGroup const *cg_b = (ColorGroup *)b; + if (cg_a == cg_b) + return TRUE; + if (cg_a->context != cg_b->context) + return FALSE; + return g_str_equal (cg_a->name, cg_b->name); +} + +static void +initialize_group_names (void) +{ + g_assert (group_names == NULL); + group_names = g_hash_table_new (cg_hash, cg_cmp); +} + +/** + * color_group_get : + * @name : + * @context : + * + * Look up the name/context specific color-group. Return NULL if it is not found. + * No reference is added if it is found. + */ +ColorGroup * +color_group_get (const gchar * name, gpointer context) +{ + ColorGroup tmp_key; + gpointer res; + + g_assert(group_names); + + g_return_val_if_fail(name != NULL, NULL); + + tmp_key.name = (char *)name; + tmp_key.context = context; + res = g_hash_table_lookup (group_names, &tmp_key); + + if (res != NULL) + return COLOR_GROUP (res); + else + return NULL; +} + +static gchar * +create_unique_name (gpointer context) +{ + const gchar *prefix = "__cg_autogen_name__"; + static gint latest_suff = 0; + gchar *new_name; + + for(;;latest_suff++) { + new_name = g_strdup_printf("%s%i", prefix, latest_suff); + if (color_group_get (new_name, context) == NULL) + return new_name; + else + g_free(new_name); + } + g_assert_not_reached(); +} + +static void +color_group_finalize (GObject *obj) +{ + ColorGroup *cg; + + g_return_if_fail(obj != NULL); + g_return_if_fail(IS_COLOR_GROUP(obj)); + g_assert(group_names != NULL); + + cg = COLOR_GROUP (obj); + + /* make this name available */ + if (cg->name) { + g_hash_table_remove (group_names, cg); + g_free (cg->name); + cg->name = NULL; + } + + if (cg->history) { + /* Free the whole colour history */ + while ((int) cg->history->len > 0) + gdk_color_free ((GdkColor *) + g_ptr_array_remove_index (cg->history, 0)); + g_ptr_array_free (cg->history, TRUE); + cg->history = NULL; + } + + if (parent_class->finalize) + (parent_class->finalize) (obj); +} + +/* + * color_group_get_history_size: + * Get the size of the custom color history + */ +gint +color_group_get_history_size (ColorGroup *cg) +{ + g_return_val_if_fail (cg != NULL, 0); + + return cg->history_size; +} + +/* + * Change the size of the custom color history. + */ +void +color_group_set_history_size (ColorGroup *cg, gint size) +{ + g_return_if_fail(cg != NULL); + g_return_if_fail(size >= 0); + + /* Remove excess elements (begin with kicking out the oldest) */ + while ((int) cg->history->len > size) + gdk_color_free ((GdkColor *) g_ptr_array_remove_index (cg->history, 0)); +} + +/* + * color_group_fetch : + * @name : + * @context : + * + * if name is NULL or a name not currently in use by another group + * then a new group is created and returned. If name was NULL + * then the new group is given a unique name prefixed by "__cg_autogen_name__" + * (thereby insuring namespace separation). + * If name was already used by a group then the reference count is + * incremented and a pointer to the group is returned. + */ +ColorGroup * +color_group_fetch (const gchar *name, gpointer context) +{ + ColorGroup *cg; + gchar *new_name; + + if (group_names == NULL) + initialize_group_names(); + + if (name == NULL) + new_name = create_unique_name (context); + else + new_name = g_strdup (name); + + cg = color_group_get (new_name, context); + if (cg != NULL) { + g_free (new_name); + g_object_ref (G_OBJECT (cg)); + return cg; + } + + /* Take care of creating the new object */ + cg = g_object_new (color_group_get_type (), NULL); + g_return_val_if_fail(cg != NULL, NULL); + + cg->name = new_name; + cg->context = context; + + /* Create history */ + cg->history = g_ptr_array_new (); + + /* FIXME: Why not 8? We never use more then 8 on the palette, + * maybe we can't free colors while they are still on the palette and + * need to be sure they are not on it when we free them and thus we + * make the upper limit twice the size of the number of displayed items + * (2 * 8) ? + */ + cg->history_size = 16; + + /* lastly register this name */ + g_hash_table_insert (group_names, cg, cg); + + return cg; +} + +/* + * color_group_get_custom_colors: + * Retrieve all custom colors currently in the history using a callback + * mechanism. The custom colors will be passed from the oldest to the newest. + */ +void +color_group_get_custom_colors (ColorGroup *cg, CbCustomColors callback, gpointer user_data) +{ + int i; + + g_return_if_fail (cg != NULL); + + /* Invoke the callback for our full history */ + for (i = 0; i < (int) cg->history->len; i++) { + GdkColor const * const color = g_ptr_array_index (cg->history, i); + + callback (color, user_data); + } +} + +/* + * color_group_add_color: + * Changes the colors. The color to be set should always be a custom + * color! It has no use adding a color which is already in the default + * palette. + */ +void +color_group_add_color (ColorGroup *cg, GdkColor const * const color) +{ + int i; + + g_return_if_fail(cg != NULL); + g_return_if_fail(color != NULL); /* Can't be NULL */ + + /* Let's be smart and see if it's already in our history, no need to add it again*/ + for (i = 0; i < (int) cg->history->len; i++) { + GdkColor *current = g_ptr_array_index (cg->history, i); + + if (gdk_color_equal (color, current)) + return; + } + + /* + * We make our own private copy of the color passed and put + * it in the history, this is freed later. + */ + if (cg->history_size > 0) + g_ptr_array_add (cg->history, gdk_color_copy (color)); + + /* Shift out the oldest item if we grow beyond our set size */ + if ((int) cg->history->len > cg->history_size) + gdk_color_free ((GdkColor *) g_ptr_array_remove_index (cg->history, 0)); + + /* Tell color-palette's that use this group that + * a new custom color was added. + */ + g_signal_emit (G_OBJECT(cg), + color_group_signals [CUSTOM_COLOR_ADD], + 0, + color); +} diff --git a/glabels2/src/mygal/color-group.h b/glabels2/src/mygal/color-group.h new file mode 100644 index 00000000..b35ad614 --- /dev/null +++ b/glabels2/src/mygal/color-group.h @@ -0,0 +1,77 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * color-group.h - Utility to keep a shered memory of custom colors + * between arbitrary widgets. + * Copyright 2000, Michael Levy + * Copyright 2001, Almer S. Tigelaar + * + * Authors: + * Michael Levy (mlevy@genoscope.cns.fr) + * Revised and polished by: + * Almer S. Tigelaar + * + * Modified for gLabels by: + * Jim Evins + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License, version 2, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#ifndef GNOME_APP_LIB__COLOR_GROUP_H +#define GNOME_APP_LIB__COLOR_GROUP_H + +#include +#include +#include + +G_BEGIN_DECLS + +typedef gboolean (* CbCustomColors) (GdkColor const * const color, gpointer data); + +typedef struct _ColorGroup { + GObject parent; + + gchar *name; + gpointer context; + + GPtrArray *history; /* The custom color history */ + gint history_size; /* length of color_history */ +} ColorGroup; + +typedef struct { + GObjectClass parent_class; + + /* Signals emited by this object */ + void (*custom_color_add) (ColorGroup *color_group, GdkColor const * const color); +} ColorGroupClass; + +#define COLOR_GROUP_TYPE (color_group_get_type ()) +#define COLOR_GROUP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COLOR_GROUP_TYPE, ColorGroup)) +#define COLOR_GROUP_CLASS(k) (G_TYPE_CHECK_CLASS_CAST (k), COLOR_GROUP_TYPE) +#define IS_COLOR_GROUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), COLOR_GROUP_TYPE)) + +GType color_group_get_type (void); +ColorGroup *color_group_fetch (const gchar *name, gpointer context); +ColorGroup *color_group_get (const gchar *name, gpointer context); + +void color_group_set_history_size (ColorGroup *cg, gint size); +gint color_group_get_history_size (ColorGroup *cg); + +void color_group_get_custom_colors (ColorGroup *cg, CbCustomColors callback, + gpointer user_data); +void color_group_add_color (ColorGroup *cg, GdkColor const * const color); + +G_END_DECLS + +#endif /* GNOME_APP_LIB__COLOR_GROUP_H */ diff --git a/glabels2/src/mygal/color-palette.c b/glabels2/src/mygal/color-palette.c new file mode 100644 index 00000000..49d47795 --- /dev/null +++ b/glabels2/src/mygal/color-palette.c @@ -0,0 +1,661 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * color-palette.c - A color selector palette + * Copyright 2000, 2001, Ximian, Inc. + * + * Authors: + * This code was extracted from widget-color-combo.c + * written by Miguel de Icaza (miguel@kernel.org) and + * Dom Lachowicz (dominicl@seas.upenn.edu). The extracted + * code was re-packaged into a separate object by + * Michael Levy (mlevy@genoscope.cns.fr) + * And later revised and polished by + * Almer S. Tigelaar (almer@gnome.org) + * + * Modified for gLabels by: + * Jim Evins + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License, version 2, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "e-util.h" +#include "color-group.h" +#include "color-palette.h" +#include "e-colors.h" + +#define COLOR_PREVIEW_WIDTH 15 +#define COLOR_PREVIEW_HEIGHT 15 + +enum { + COLOR_CHANGED, + LAST_SIGNAL +}; + +struct _ColorNamePair { + char *color; /* rgb color or otherwise - eg. "#FFFFFF" */ + char *name; /* english name - eg. "white" */ +}; + +static guint color_palette_signals [LAST_SIGNAL] = { 0, }; + +#define PARENT_TYPE GTK_TYPE_VBOX +static GObjectClass *color_palette_parent_class; + +#define make_color(P,COL) (((COL) != NULL) ? (COL) : ((P) ? ((P)->default_color) : NULL)) + +static void +color_palette_destroy (GtkObject *object) +{ + ColorPalette *P = COLOR_PALETTE (object); + GtkObjectClass *klass = (GtkObjectClass *)color_palette_parent_class; + + if (P->tool_tip) { + g_object_unref (P->tool_tip); + P->tool_tip = NULL; + } + + if (P->current_color) { + gdk_color_free (P->current_color); + P->current_color = NULL; + } + + color_palette_set_group (P, NULL); + + memset (P->items, 0, P->total * sizeof (GnomeCanvasItem *)); + + if (klass->destroy) + klass->destroy (object); +} + +static void +color_palette_finalize (GObject *object) +{ + ColorPalette *P = COLOR_PALETTE (object); + + g_free (P->items); + + (*color_palette_parent_class->finalize) (object); +} + +static void +color_palette_class_init (GObjectClass *object_class) +{ + object_class->finalize = color_palette_finalize; + ((GtkObjectClass *)object_class)->destroy = color_palette_destroy; + + color_palette_parent_class = g_type_class_peek_parent (object_class); + + color_palette_signals [COLOR_CHANGED] = + g_signal_new ("color_changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ColorPaletteClass, color_changed), + NULL, NULL, + e_marshal_NONE__POINTER_BOOLEAN_BOOLEAN_BOOLEAN, + G_TYPE_NONE, 4, G_TYPE_POINTER, + G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN); +} + +E_MAKE_TYPE (color_palette, + "ColorPalette", + ColorPalette, + color_palette_class_init, + NULL, + PARENT_TYPE) + +static void +emit_color_changed (ColorPalette *P, GdkColor *color, + gboolean custom, gboolean by_user, gboolean is_default) +{ + GdkColor *new = make_color (P, color); + + if (new != NULL) + new = gdk_color_copy (new); + if (P->current_color) + gdk_color_free (P->current_color); + P->current_color = new; + P->current_is_default = is_default; + + /* Only add custom colors to the group */ + if (custom && color) + color_group_add_color (P->color_group, color); + + g_signal_emit (P, color_palette_signals [COLOR_CHANGED], 0, + color, custom, by_user, is_default); +} + + +/* + * Add the new custom color as the first custom color in the custom color rows + * and shift all of the others 'one step down' + * + * Also take care of setting up the GtkColorButton 'display' + */ +static void +color_palette_change_custom_color (ColorPalette *P, GdkColor const * const new) +{ + int index; + GnomeCanvasItem *item; + GnomeCanvasItem *next_item; + + g_return_if_fail (P != NULL); + g_return_if_fail (new != NULL); + g_return_if_fail (P->picker); + + /* make sure there is room */ + if (P->custom_color_pos == -1) + return; + + for (index = P->custom_color_pos; index < P->total - 1; index++) { + GdkColor *color; + GdkColor *outline; + item = P->items[index]; + next_item = P->items[index + 1]; + + g_object_get (G_OBJECT (next_item), + "fill_color_gdk", &color, + "outline_color_gdk", &outline, + NULL); + gnome_canvas_item_set (item, + "fill_color_gdk", color, + "outline_color_gdk", outline, + NULL); + gdk_color_free (color); + gdk_color_free (outline); + } + item = P->items[index]; + gnome_canvas_item_set (item, + "fill_color_gdk", new, + "outline_color_gdk", new, + NULL); + gtk_color_button_set_color (P->picker, new); +} + +/* + * The custom color box was clicked. Find out its value and emit it + * And add it to the custom color row + */ +static void +cust_color_set (GtkWidget *color_picker, ColorPalette *P) +{ + GdkColor c_color; + + gtk_color_button_get_color (GTK_COLOR_BUTTON (color_picker), &c_color); + + e_color_alloc_gdk (NULL, &c_color); + emit_color_changed (P, &c_color, TRUE, TRUE, FALSE); +} + +static void +cb_default_clicked (GtkWidget *button, ColorPalette *P) +{ + emit_color_changed (P, P->default_color, FALSE, TRUE, TRUE); +} + +/* + * Something in our table was clicked. Find out what and emit it + */ +static void +color_clicked (GtkWidget *button, ColorPalette *P) +{ + int index; + GnomeCanvasItem *item; + GdkColor *gdk_color; + + index = GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (button))); + item = P->items[index]; + + g_object_get (item, + "fill_color_gdk", &gdk_color, + NULL); + + emit_color_changed (P, gdk_color, FALSE, TRUE, FALSE); + + gdk_color_free (gdk_color); +} + +/* + * The color group sent the 'custom_color_add' signal + */ +static void +cb_group_custom_color_add (GtkObject *cg, GdkColor *color, ColorPalette *P) +{ + GdkColor *new; + + new = make_color (P, color); + color_palette_change_custom_color (P, new); +} + +/* + * Find out if a color is in the default palette (not in the custom colors!) + * + * Utility function + */ +static gboolean +color_in_palette (ColorNamePair *set, GdkColor *color) +{ + int i; + + g_return_val_if_fail (set != NULL, FALSE); + + if (color == NULL) + return TRUE; + + /* Iterator over all the colors and try to find + * if we can find @color + */ + for (i = 0; set[i].color != NULL; i++) { + GdkColor current; + + gdk_color_parse (set[i].color, ¤t); + + if (gdk_color_equal (color, ¤t)) + return TRUE; + } + + return FALSE; +} + +/* + * Create the individual color buttons + * + * Utility function + */ +static GnomeCanvasItem * +color_palette_button_new(ColorPalette *P, GtkTable* table, + GtkTooltips *tool_tip, ColorNamePair* color_name, + gint col, gint row, int data) +{ + GtkWidget *button; + GtkWidget *canvas; + GnomeCanvasItem *item; + + button = gtk_button_new (); + gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE); + + canvas = gnome_canvas_new (); + + gtk_widget_set_usize (canvas, COLOR_PREVIEW_WIDTH, COLOR_PREVIEW_HEIGHT); + gtk_container_add (GTK_CONTAINER (button), canvas); + + item = gnome_canvas_item_new (GNOME_CANVAS_GROUP (gnome_canvas_root + (GNOME_CANVAS (canvas))), + gnome_canvas_rect_get_type (), + "x1", 0.0, + "y1", 0.0, + "x2", (double) COLOR_PREVIEW_WIDTH, + "y2", (double) COLOR_PREVIEW_HEIGHT, + "fill_color", color_name->color, + NULL); + + gtk_tooltips_set_tip (tool_tip, button, _(color_name->name), + "Private+Unused"); + + gtk_table_attach (table, button, + col, col+1, row, row+1, GTK_FILL, GTK_FILL, 1, 1); + + g_signal_connect (button, "clicked", + G_CALLBACK (color_clicked), P); + gtk_object_set_user_data (GTK_OBJECT (button), + GINT_TO_POINTER (data)); + return item; +} + +static void +cb_custom_colors (GdkColor const * const color, gpointer data) +{ + ColorPalette *P = data; + + if (color) + color_palette_change_custom_color (P, color); +} + +/* + * gets history information from the group + */ +static void +custom_color_history_setup(ColorPalette *P) +{ + g_return_if_fail (P != NULL); + g_return_if_fail (P->color_group != NULL); + + /* Sync our own palette with all the custom colors in the group */ + color_group_get_custom_colors (P->color_group, (CbCustomColors) cb_custom_colors, P); +} + +/* + * Creates the color table + */ +static GtkWidget * +color_palette_setup (ColorPalette *P, + char const * const no_color_label, + int ncols, int nrows, + ColorNamePair *color_names) +{ + GtkWidget *default_button; + GtkWidget *cust_label; + GtkWidget *table; + GtkTooltips *tool_tip; + int total, row, col; + + table = gtk_table_new (ncols, nrows, FALSE); + + if (no_color_label != NULL) { + default_button = gtk_button_new_with_label (no_color_label); + + gtk_table_attach (GTK_TABLE (table), default_button, + 0, ncols, 0, 1, GTK_FILL | GTK_EXPAND, 0, 0, 0); + g_signal_connect (default_button, "clicked", + G_CALLBACK (cb_default_clicked), P); + } + + P->tool_tip = tool_tip = gtk_tooltips_new (); + g_object_ref (P->tool_tip); + gtk_object_sink (GTK_OBJECT (P->tool_tip)); + + P->custom_color_pos = -1; + total = 0; + + for (row = 0; row < nrows; row++) { + for (col = 0; col < ncols; col++) { + int pos; + + pos = row * ncols + col; + /* + * If we are done with all of the colors in color_names + */ + if (color_names [pos].color == NULL) { + /* This is the default custom color */ + ColorNamePair color_name = {"#000", N_("custom")}; + row++; + if (col == 0 || row < nrows) { + /* Add a full row for custom colors */ + for (col = 0; col < ncols; col++) { + /* Have we set custom pos yet ? */ + if (P->custom_color_pos == -1) { + P->custom_color_pos = total; + } + P->items[total] = + color_palette_button_new( + P, + GTK_TABLE (table), + GTK_TOOLTIPS (tool_tip), + &(color_name), + col, + row + 1, + total); + total++; + } + } + /* Break out of two for-loops. */ + row = nrows; + break; + } + + P->items[total] = + color_palette_button_new ( + P, + GTK_TABLE (table), + GTK_TOOLTIPS (tool_tip), + &(color_names [pos]), + col, + row + 1, + total); + total++; + } + } + P->total = total; + + + /* "Custom" color - we'll pop up a GtkColorButton */ + cust_label = gtk_label_new (_("Custom Color:")); + gtk_table_attach (GTK_TABLE (table), cust_label, 0, ncols - 3 , + row + 1, row + 2, GTK_FILL | GTK_EXPAND, 0, 0, 0); + /* + Keep a pointer to the picker so that we can update it's color + to keep it in synch with that of other members of the group + */ + P->picker = GTK_COLOR_BUTTON (gtk_color_button_new ()); + gtk_color_button_set_title (P->picker, _("Choose Custom Color")); + gtk_table_attach (GTK_TABLE (table), GTK_WIDGET (P->picker), ncols - 3, ncols, + row + 1, row + 2, GTK_FILL | GTK_EXPAND, 0, 0, 0); + g_signal_connect (P->picker, "color-set", + G_CALLBACK (cust_color_set), P); + return table; +} + +void +color_palette_set_color_to_default (ColorPalette *P) +{ + g_return_if_fail (P != NULL); + g_return_if_fail (IS_COLOR_GROUP (P->color_group)); + + emit_color_changed (P, P->default_color, FALSE, TRUE, TRUE); +} + +void +color_palette_set_current_color (ColorPalette *P, GdkColor *color) +{ + g_return_if_fail (P != NULL); + g_return_if_fail (IS_COLOR_GROUP (P->color_group)); + + if (color) + emit_color_changed + (P, color, color_in_palette (P->default_set, color), + FALSE, FALSE); + else + color_palette_set_color_to_default (P); +} + +GdkColor * +color_palette_get_current_color (ColorPalette *P, gboolean *is_default) +{ + g_return_val_if_fail (P != NULL, NULL); + g_return_val_if_fail (IS_COLOR_GROUP (P->color_group), NULL); + + if (is_default != NULL) + *is_default = P->current_is_default; + + return P->current_color ? gdk_color_copy (P->current_color) : NULL; +} + +GtkWidget * +color_palette_get_color_picker (ColorPalette *P) +{ + g_return_val_if_fail (IS_COLOR_PALETTE (P), NULL); + + return GTK_WIDGET (P->picker); +} + + +/* + * Where the actual construction goes on + */ +static void +color_palette_construct (ColorPalette *P, + char const * const no_color_label, + int ncols, int nrows) +{ + GtkWidget * table; + g_return_if_fail (P != NULL); + g_return_if_fail (IS_COLOR_PALETTE (P)); + + P->items = g_malloc (sizeof (GnomeCanvasItem *) * ncols * nrows); + + /* + * Our table selector + */ + table = color_palette_setup (P, no_color_label, ncols, + nrows, P->default_set); + gtk_container_add (GTK_CONTAINER(P), table); +} + +/* + * More verbose constructor. Allows for specifying the rows, columns, and + * Colors this palette will contain + * + * Note that if after placing all of the color_names there remains an entire + * row available then a row of custum colors (initialized to black) is added + * + */ +static GtkWidget* +color_palette_new_with_vals (char const * const no_color_label, + int ncols, int nrows, ColorNamePair *color_names, + GdkColor *default_color, + ColorGroup *cg) +{ + ColorPalette *P; + + g_return_val_if_fail (color_names != NULL, NULL); + + P = g_object_new (COLOR_PALETTE_TYPE, NULL); + + P->default_set = color_names; + P->default_color = default_color; + P->current_color = default_color ? gdk_color_copy (default_color) : NULL; + P->current_is_default = TRUE; + color_palette_set_group (P, cg); + + color_palette_construct (P, no_color_label, ncols, nrows); + custom_color_history_setup(P); + + return GTK_WIDGET (P); +} + +/** + * color_palette_set_group : absorbs the reference to the group + */ +void +color_palette_set_group (ColorPalette *P, ColorGroup *cg) +{ + if (P->color_group == cg) + return; + + if (P->color_group) { + g_signal_handlers_disconnect_by_func ( + G_OBJECT (P->color_group), + G_CALLBACK (cb_group_custom_color_add), + P); + g_object_unref (G_OBJECT (P->color_group)); + P->color_group = NULL; + } + if (cg != NULL) { + P->color_group = COLOR_GROUP (cg); + g_signal_connect (G_OBJECT (cg), "custom_color_add", + G_CALLBACK (cb_group_custom_color_add), + P); + + } +} + +static ColorNamePair default_color_set [] = { + {"#000000", N_("black")}, + {"#993300", N_("light brown")}, + {"#333300", N_("brown gold")}, + {"#003300", N_("dark green #2")}, + {"#003366", N_("navy")}, + {"#000080", N_("dark blue")}, + {"#333399", N_("purple #2")}, + {"#333333", N_("very dark gray")}, + + + {"#800000", N_("dark red")}, + {"#FF6600", N_("red-orange")}, + {"#808000", N_("gold")}, + {"#008000", N_("dark green")}, + {"#008080", N_("dull blue")}, + {"#0000FF", N_("blue")}, + {"#666699", N_("dull purple")}, + {"#808080", N_("dark grey")}, + + + {"#FF0000", N_("red")}, + {"#FF9900", N_("orange")}, + {"#99CC00", N_("lime")}, + {"#339966", N_("dull green")}, + {"#33CCCC",N_("dull blue #2")}, + {"#3366FF", N_("sky blue #2")}, + {"#800080", N_("purple")}, + {"#969696", N_("gray")}, + + + {"#FF00FF", N_("magenta")}, + {"#FFCC00", N_("bright orange")}, + {"#FFFF00", N_("yellow")}, + {"#00FF00", N_("green")}, + {"#00FFFF", N_("cyan")}, + {"#00CCFF", N_("bright blue")}, + {"#993366", N_("red purple")}, + {"#C0C0C0", N_("light grey")}, + + + {"#FF99CC", N_("pink")}, + {"#FFCC99", N_("light orange")}, + {"#FFFF99", N_("light yellow")}, + {"#CCFFCC", N_("light green")}, + {"#CCFFFF", N_("light cyan")}, + {"#99CCFF", N_("light blue")}, + {"#CC99FF", N_("light purple")}, + {"#FFFFFF", N_("white")}, + + /* Disable these for now, they are mostly repeats */ + {NULL, NULL}, + + {"#9999FF", N_("purplish blue")}, + {"#993366", N_("red purple")}, + {"#FFFFCC", N_("light yellow")}, + {"#CCFFFF", N_("light blue")}, + {"#660066", N_("dark purple")}, + {"#FF8080", N_("pink")}, + {"#0066CC", N_("sky blue")}, + {"#CCCCFF", N_("light purple")}, + + {"#000080", N_("dark blue")}, + {"#FF00FF", N_("magenta")}, + {"#FFFF00", N_("yellow")}, + {"#00FFFF", N_("cyan")}, + {"#800080", N_("purple")}, + {"#800000", N_("dark red")}, + {"#008080", N_("dull blue")}, + {"#0000FF", N_("blue")}, + + {NULL, NULL} +}; + + + +/* + * Default constructor. Pass an optional label for + * the no/auto color button. + * + */ +GtkWidget* +color_palette_new (const char *no_color_label, + GdkColor *default_color, ColorGroup *color_group) +{ + /* specify 6 rows to allow for a row of custom colors */ + return color_palette_new_with_vals (no_color_label, + 8, 6, + default_color_set, default_color, + color_group); +} diff --git a/glabels2/src/mygal/color-palette.h b/glabels2/src/mygal/color-palette.h new file mode 100644 index 00000000..b2b281c7 --- /dev/null +++ b/glabels2/src/mygal/color-palette.h @@ -0,0 +1,113 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * color-palette.h - A color selector palette + * Copyright 2000, 2001, Ximian, Inc. + * + * Authors: + * This code was extracted from widget-color-combo.c + * written by Miguel de Icaza (miguel@kernel.org) and + * Dom Lachowicz (dominicl@seas.upenn.edu). The extracted + * code was re-packaged into a separate object by + * Michael Levy (mlevy@genoscope.cns.fr) + * And later revised and polished by + * Almer S. Tigelaar (almer@gnome.org) + * + * Modified for gLabels by: + * Jim Evins + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License, version 2, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#ifndef GNUMERIC_COLOR_PALETTE_H +#define GNUMERIC_COLOR_PALETTE_H + +#include +#include +#include +#include +#include +#include "color-group.h" + +G_BEGIN_DECLS + +typedef struct _ColorNamePair ColorNamePair; + +typedef struct _ColorPalette { + GtkVBox vbox; + GtkTooltips *tool_tip; + GtkColorButton *picker; + /* + * Array of colors + */ + GnomeCanvasItem **items; + /* The (potentially NULL) default color */ + GdkColor *default_color; + + /* The current color */ + GdkColor *current_color; + gboolean current_is_default; + + /* + * Position of the last possible position + * for custom colors in **items + * (i.e. custom colors go from items[custom_color_pos] + * to items[total - 1]) + * + * If custom_color_pos == -1, there is no room for custom colors + */ + int custom_color_pos; + /* + * Number of default colors in **items + */ + int total; + + /* The table with our default color names */ + ColorNamePair *default_set; + + /* The color group to which we belong */ + ColorGroup *color_group; +} ColorPalette; + +typedef struct { + GtkVBoxClass parent_class; + + /* Signals emited by this widget */ + void (* color_changed) (ColorPalette *color_palette, GdkColor *color, + gboolean custom, gboolean by_user, gboolean is_default); +} ColorPaletteClass; + +#define COLOR_PALETTE_TYPE (color_palette_get_type ()) +#define COLOR_PALETTE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), COLOR_PALETTE_TYPE, ColorPalette)) +#define COLOR_PALETTE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST(k), COLOR_PALETTE_TYPE) +#define IS_COLOR_PALETTE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), COLOR_PALETTE_TYPE)) + +GtkType color_palette_get_type (void); + +GtkWidget *color_palette_new (const char *no_color_label, + GdkColor *default_color, + ColorGroup *color_group); +void color_palette_set_group (ColorPalette *P, + ColorGroup *cg); + +void color_palette_set_current_color (ColorPalette *P, GdkColor *color); +void color_palette_set_color_to_default (ColorPalette *P); +GdkColor *color_palette_get_current_color (ColorPalette *P, gboolean *is_default); +GtkWidget *color_palette_get_color_picker (ColorPalette *P); + +G_END_DECLS + +#endif /* GNUMERIC_PALETTE_H */ + + diff --git a/glabels2/src/mygal/e-colors.c b/glabels2/src/mygal/e-colors.c new file mode 100644 index 00000000..fc4bf483 --- /dev/null +++ b/glabels2/src/mygal/e-colors.c @@ -0,0 +1,106 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * e-colors.c - General color allocation utilities + * Copyright 2000, 2001, Ximian, Inc. + * + * Authors: + * Miguel de Icaza (miguel@kernel.org) + * + * Modified for gLabels by: + * Jim Evins + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License, version 2, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +/* We keep our own color context, as the color allocation might take + * place before things are realized. + */ + +#include +#include +#include "e-colors.h" + +GdkColor e_white, e_dark_gray, e_black; + +gulong +e_color_alloc (gushort red, gushort green, gushort blue) +{ + e_color_init (); + + red >>= 8; + green >>= 8; + blue >>= 8; + return gdk_rgb_xpixel_from_rgb ( + ((red & 0xff) << 16) | ((green & 0xff) << 8) | + (blue & 0xff)); +} + +void +e_color_alloc_gdk (GtkWidget *widget, GdkColor *c) +{ + GdkColormap *map; + + e_color_init (); + + if (widget) + map = gtk_widget_get_colormap (widget); + else /* FIXME: multi depth broken ? */ + map = gtk_widget_get_default_colormap (); + + gdk_rgb_find_color (map, c); +} + +void +e_color_alloc_name (GtkWidget *widget, const char *name, GdkColor *c) +{ + GdkColormap *map; + + e_color_init (); + + gdk_color_parse (name, c); + + if (widget) + map = gtk_widget_get_colormap (widget); + else /* FIXME: multi depth broken ? */ + map = gtk_widget_get_default_colormap (); + + gdk_rgb_find_color (map, c); +} + +void +e_color_init (void) +{ + static gboolean e_color_inited = FALSE; + + /* It's surprisingly easy to end up calling this twice. Survive. */ + if (e_color_inited) + return; + + e_color_inited = TRUE; + + /* Allocate the default colors */ + e_white.red = 65535; + e_white.green = 65535; + e_white.blue = 65535; + e_color_alloc_gdk (NULL, &e_white); + + e_black.red = 0; + e_black.green = 0; + e_black.blue = 0; + e_color_alloc_gdk (NULL, &e_black); + + e_color_alloc_name (NULL, "gray20", &e_dark_gray); +} + diff --git a/glabels2/src/mygal/e-colors.h b/glabels2/src/mygal/e-colors.h new file mode 100644 index 00000000..13665046 --- /dev/null +++ b/glabels2/src/mygal/e-colors.h @@ -0,0 +1,47 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * e-colors.h + * Copyright 2000, 2001, Ximian, Inc. + * + * Authors: + * Miguel de Icaza (miguel@kernel.org) + * + * Modified for gLabels by: + * Jim Evins + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License, version 2, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#ifndef GNOME_APP_LIBS_COLOR_H +#define GNOME_APP_LIBS_COLOR_H + +#include +#include +#include + +G_BEGIN_DECLS + +void e_color_init (void); + +/* Return the pixel value for the given red, green and blue */ +gulong e_color_alloc (gushort red, gushort green, gushort blue); +void e_color_alloc_name (GtkWidget *widget, const char *name, GdkColor *color); +void e_color_alloc_gdk (GtkWidget *widget, GdkColor *color); + +extern GdkColor e_white, e_dark_gray, e_black; + +G_END_DECLS + +#endif /* GNOME_APP_LIBS_COLOR_H */ diff --git a/glabels2/src/mygal/e-marshal.list b/glabels2/src/mygal/e-marshal.list new file mode 100644 index 00000000..92496dbd --- /dev/null +++ b/glabels2/src/mygal/e-marshal.list @@ -0,0 +1,51 @@ +BOOLEAN:INT,INT,OBJECT,INT,INT,UINT +BOOLEAN:INT,POINTER,INT,OBJECT,INT,INT,UINT +BOOLEAN:NONE +BOOLEAN:OBJECT +BOOLEAN:OBJECT,DOUBLE,DOUBLE,BOOLEAN +BOOLEAN:POINTER,POINTER,INT,INT,INT +BOOLEAN:POINTER,POINTER,POINTER,INT,INT,INT +BOOLEAN:STRING,INT +DOUBLE:OBJECT,DOUBLE,DOUBLE,BOOLEAN +INT:BOXED +INT:INT +INT:INT,INT,BOXED +INT:INT,POINTER,INT,BOXED +INT:OBJECT,BOXED +INT:POINTER +NONE:BOXED +NONE:BOXED,INT +NONE:BOXED,INT,INT +NONE:DOUBLE +NONE:INT +NONE:INT,INT +NONE:INT,INT,BOXED +NONE:INT,INT,OBJECT +NONE:INT,INT,OBJECT,BOXED,UINT,UINT +NONE:INT,INT,OBJECT,INT,INT,BOXED,UINT,UINT +NONE:INT,INT,OBJECT,POINTER,UINT,UINT +NONE:INT,INT,OBJECT,UINT +NONE:INT,INT,STRING,STRING +NONE:INT,INT,STRING,STRING,POINTER +NONE:INT,POINTER +NONE:INT,POINTER,INT,BOXED +NONE:INT,POINTER,INT,OBJECT +NONE:INT,POINTER,INT,OBJECT,BOXED,UINT,UINT +NONE:INT,POINTER,INT,OBJECT,INT,INT,BOXED,UINT,UINT +NONE:INT,POINTER,INT,OBJECT,UINT +NONE:INT,STRING +NONE:NONE +NONE:OBJECT +NONE:OBJECT,OBJECT +NONE:OBJECT,DOUBLE,DOUBLE,BOOLEAN +NONE:POINTER +NONE:POINTER,BOOLEAN +NONE:POINTER,BOOLEAN,BOOLEAN,BOOLEAN +NONE:POINTER,INT +NONE:POINTER,INT,INT +NONE:POINTER,INT,INT,INT +NONE:POINTER,INT,OBJECT +NONE:POINTER,POINTER +NONE:POINTER,POINTER,INT +OBJECT:OBJECT,DOUBLE,DOUBLE,BOOLEAN +POINTER:NONE diff --git a/glabels2/src/mygal/e-util.h b/glabels2/src/mygal/e-util.h new file mode 100644 index 00000000..7bc39783 --- /dev/null +++ b/glabels2/src/mygal/e-util.h @@ -0,0 +1,234 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * e-util.h + * Copyright 2000, 2001, Ximian, Inc. + * + * Authors: + * Chris Lahey + * + * Modified for gLabels by: + * Jim Evins + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License, version 2, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#ifndef _E_UTIL_H_ +#define _E_UTIL_H_ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +#include "e-marshal.h" + +#define E_MAKE_TYPE(l,str,t,ci,i,parent) \ +GType l##_get_type(void)\ +{\ + static GType type = 0; \ + if (!type){ \ + static GTypeInfo const object_info = { \ + sizeof (t##Class), \ + \ + (GBaseInitFunc) NULL, \ + (GBaseFinalizeFunc) NULL, \ + \ + (GClassInitFunc) ci, \ + (GClassFinalizeFunc) NULL, \ + NULL, /* class_data */ \ + \ + sizeof (t), \ + 0, /* n_preallocs */ \ + (GInstanceInitFunc) i, \ + }; \ + type = g_type_register_static (parent, str, &object_info, 0); \ + } \ + return type; \ +} + + +#define E_MAKE_X_TYPE(l,str,t,ci,i,parent,poa_init,offset) \ +GtkType l##_get_type(void) \ +{ \ + static GtkType type = 0; \ + if (!type){ \ + GTypeInfo info = { \ + sizeof (t##Class), \ + \ + (GBaseInitFunc) NULL, \ + (GBaseFinalizeFunc) NULL, \ + \ + (GClassInitFunc) ci, \ + (GClassFinalizeFunc) NULL, \ + \ + NULL, /* class_data */ \ + \ + sizeof (t), \ + 0, /* n_preallocs */ \ + (GInstanceInitFunc) i, \ + }; \ + type = bonobo_x_type_unique ( \ + parent, poa_init, NULL, \ + offset, &info, str); \ + } \ + return type; \ +} + +#define GET_STRING_ARRAY_FROM_ELLIPSIS(labels, first_string) \ + { \ + va_list args; \ + int i; \ + char *s; \ + \ + va_start (args, (first_string)); \ + \ + i = 0; \ + for (s = (first_string); s; s = va_arg (args, char *)) \ + i++; \ + va_end (args); \ + \ + (labels) = g_new (char *, i + 1); \ + \ + va_start (args, (first_string)); \ + i = 0; \ + for (s = (first_string); s; s = va_arg (args, char *)) \ + (labels)[i++] = s; \ + \ + va_end (args); \ + (labels)[i] = NULL; \ + } + + +#define GET_DUPLICATED_STRING_ARRAY_FROM_ELLIPSIS(labels, first_string) \ + { \ + int i; \ + GET_STRING_ARRAY_FROM_ELLIPSIS ((labels), (first_string)); \ + for (i = 0; labels[i]; i++) \ + labels[i] = g_strdup (labels[i]); \ + } + + +#if 0 +# define E_OBJECT_CLASS_ADD_SIGNALS(oc,sigs,last) \ + gtk_object_class_add_signals (oc, sigs, last) +# define E_OBJECT_CLASS_TYPE(oc) (oc)->type +#else +# define E_OBJECT_CLASS_ADD_SIGNALS(oc,sigs,last) +# define E_OBJECT_CLASS_TYPE(oc) G_TYPE_FROM_CLASS (oc) +#endif + + +typedef enum { + E_FOCUS_NONE, + E_FOCUS_CURRENT, + E_FOCUS_START, + E_FOCUS_END +} EFocus; +int g_str_compare (const void *x, + const void *y); +int g_collate_compare (const void *x, + const void *y); +int g_int_compare (const void *x, + const void *y); +char *e_strdup_strip (const char *string); +void e_free_object_list (GList *list); +void e_free_object_slist (GSList *list); +void e_free_string_list (GList *list); +void e_free_string_slist (GSList *list); +char *e_read_file (const char *filename); +int e_write_file (const char *filename, + const char *data, + int flags); +int e_write_file_mkstemp (char *filename, + const char *data); +int e_mkdir_hier (const char *path, + mode_t mode); + +gchar **e_strsplit (const gchar *string, + const gchar *delimiter, + gint max_tokens); +gchar *e_strstrcase (const gchar *haystack, + const gchar *needle); +/* This only makes a filename safe for usage as a filename. It still may have shell meta-characters in it. */ +void e_filename_make_safe (gchar *string); +gchar *e_format_number (gint number); +gchar *e_format_number_float (gfloat number); +gboolean e_create_directory (gchar *directory); +gchar **e_strdupv (const gchar **str_array); + + +typedef int (*ESortCompareFunc) (const void *first, + const void *second, + gpointer closure); +void e_sort (void *base, + size_t nmemb, + size_t size, + ESortCompareFunc compare, + gpointer closure); +void e_bsearch (const void *key, + const void *base, + size_t nmemb, + size_t size, + ESortCompareFunc compare, + gpointer closure, + size_t *start, + size_t *end); +size_t e_strftime_fix_am_pm (char *s, + size_t max, + const char *fmt, + const struct tm *tm); + +size_t e_strftime (char *s, + size_t max, + const char *fmt, + const struct tm *tm); + +size_t e_utf8_strftime_fix_am_pm (char *s, + size_t max, + const char *fmt, + const struct tm *tm); + +size_t e_utf8_strftime (char *s, + size_t max, + const char *fmt, + const struct tm *tm); + +/* String to/from double conversion functions */ +gdouble e_flexible_strtod (const gchar *nptr, + gchar **endptr); + +/* 29 bytes should enough for all possible values that + * g_ascii_dtostr can produce with the %.17g format. + * Then add 10 for good measure */ +#define E_ASCII_DTOSTR_BUF_SIZE (DBL_DIG + 12 + 10) +gchar *e_ascii_dtostr (gchar *buffer, + gint buf_len, + const gchar *format, + gdouble d); + +/* Alternating char * and int arguments with a NULL char * to end. + Less than 0 for the int means copy the whole string. */ +gchar *e_strdup_append_strings (gchar *first_string, + ...); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _E_UTIL_H_ */ diff --git a/glabels2/src/mygal/mygal-combo-box.c b/glabels2/src/mygal/mygal-combo-box.c new file mode 100644 index 00000000..adf1c648 --- /dev/null +++ b/glabels2/src/mygal/mygal-combo-box.c @@ -0,0 +1,837 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * mygal-combo-box.c - a customizable combobox + * Copyright 2000, 2001, Ximian, Inc. + * + * Authors: + * Miguel de Icaza (miguel@gnu.org) + * Adrian E Feiguin (feiguin@ifir.edu.ar) + * Paolo Molnaro (lupus@debian.org). + * Jon K Hellan (hellan@acm.org) + * + * Modified for gLabels by: + * Jim Evins + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License, version 2, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mygal-combo-box.h" +#include "e-util.h" + +#define PARENT_TYPE GTK_TYPE_HBOX +static GObjectClass *mygal_combo_box_parent_class; + +static int mygal_combo_toggle_pressed (GtkToggleButton *tbutton, + MygalComboBox *combo_box); +static void mygal_combo_popup_tear_off (MygalComboBox *combo, + gboolean set_position); +static void mygal_combo_set_tearoff_state (MygalComboBox *combo, + gboolean torn_off); +static void mygal_combo_popup_reparent (GtkWidget *popup, GtkWidget *new_parent, + gboolean unrealize); +static gboolean cb_popup_delete (GtkWidget *w, GdkEventAny *event, + MygalComboBox *combo); +static void mygal_combo_tearoff_bg_copy (MygalComboBox *combo); + +enum { + POP_DOWN_WIDGET, + POP_DOWN_DONE, + PRE_POP_DOWN, + POST_POP_HIDE, + LAST_SIGNAL +}; + +static guint mygal_combo_box_signals [LAST_SIGNAL] = { 0, }; + +struct _MygalComboBoxPrivate { + GtkWidget *pop_down_widget; + GtkWidget *display_widget; + + /* + * Internal widgets used to implement the ComboBox + */ + GtkWidget *frame; + GtkWidget *arrow_button; + + GtkWidget *toplevel; /* Popup's toplevel when not torn off */ + GtkWidget *tearoff_window; /* Popup's toplevel when torn off */ + guint torn_off; + + GtkWidget *tearable; /* The tearoff "button" */ + GtkWidget *popup; /* Popup */ + + /* + * Closure for invoking the callbacks above + */ + void *closure; +}; + +static void +mygal_combo_box_finalize (GObject *object) +{ + MygalComboBox *combo_box = MYGAL_COMBO_BOX (object); + + g_free (combo_box->priv); + + mygal_combo_box_parent_class->finalize (object); +} + +static void +mygal_combo_box_destroy (GtkObject *object) +{ + GtkObjectClass *klass = (GtkObjectClass *)mygal_combo_box_parent_class; + MygalComboBox *combo_box = MYGAL_COMBO_BOX (object); + + if (combo_box->priv->toplevel) { + gtk_object_destroy (GTK_OBJECT (combo_box->priv->toplevel)); + combo_box->priv->toplevel = NULL; + } + + if (combo_box->priv->tearoff_window) { + gtk_object_destroy (GTK_OBJECT (combo_box->priv->tearoff_window)); + combo_box->priv->tearoff_window = NULL; + } + + if (klass->destroy) + klass->destroy (object); +} + +static gboolean +mygal_combo_box_mnemonic_activate (GtkWidget *w, gboolean group_cycling) +{ + MygalComboBox *combo_box = MYGAL_COMBO_BOX (w); + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (combo_box->priv->arrow_button), TRUE); + return TRUE; +} + +static void +mygal_combo_box_class_init (GObjectClass *object_class) +{ + GtkWidgetClass *widget_class = (GtkWidgetClass *)object_class; + mygal_combo_box_parent_class = g_type_class_peek_parent (object_class); + + object_class->finalize = mygal_combo_box_finalize; + widget_class->mnemonic_activate = mygal_combo_box_mnemonic_activate; + ((GtkObjectClass *)object_class)->destroy = mygal_combo_box_destroy; + + mygal_combo_box_signals [POP_DOWN_WIDGET] = g_signal_new ( + "pop_down_widget", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (MygalComboBoxClass, pop_down_widget), + NULL, NULL, + e_marshal_POINTER__NONE, + G_TYPE_POINTER, 0, G_TYPE_NONE); + + mygal_combo_box_signals [POP_DOWN_DONE] = g_signal_new ( + "pop_down_done", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (MygalComboBoxClass, pop_down_done), + NULL, NULL, + e_marshal_BOOLEAN__OBJECT, + G_TYPE_BOOLEAN, 1, G_TYPE_OBJECT); + + mygal_combo_box_signals [PRE_POP_DOWN] = g_signal_new ( + "pre_pop_down", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (MygalComboBoxClass, pre_pop_down), + NULL, NULL, + e_marshal_NONE__NONE, + G_TYPE_NONE, 0); + + mygal_combo_box_signals [POST_POP_HIDE] = g_signal_new ( + "post_pop_hide", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (MygalComboBoxClass, post_pop_hide), + NULL, NULL, + e_marshal_NONE__NONE, + G_TYPE_NONE, 0); +} + +static void +deactivate_arrow (MygalComboBox *combo_box) +{ + GtkToggleButton *arrow; + + arrow = GTK_TOGGLE_BUTTON (combo_box->priv->arrow_button); + g_signal_handlers_block_matched (arrow, + G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, + 0, 0, NULL, + mygal_combo_toggle_pressed, combo_box); + + gtk_toggle_button_set_active (arrow, FALSE); + + g_signal_handlers_unblock_matched (arrow, + G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, + 0, 0, NULL, + mygal_combo_toggle_pressed, combo_box); +} + +/** + * mygal_combo_box_popup_hide_unconditional + * @combo_box: Combo box + * + * Hide popup, whether or not it is torn off. + */ +static void +mygal_combo_box_popup_hide_unconditional (MygalComboBox *combo_box) +{ + gboolean popup_info_destroyed = FALSE; + + g_return_if_fail (combo_box != NULL); + g_return_if_fail (MYGAL_IS_COMBO_BOX (combo_box)); + + gtk_widget_hide (combo_box->priv->toplevel); + gtk_widget_hide (combo_box->priv->popup); + if (combo_box->priv->torn_off) { + GTK_TEAROFF_MENU_ITEM (combo_box->priv->tearable)->torn_off + = FALSE; + mygal_combo_set_tearoff_state (combo_box, FALSE); + } + + gtk_grab_remove (combo_box->priv->toplevel); + gdk_pointer_ungrab (GDK_CURRENT_TIME); + + g_object_ref (combo_box->priv->pop_down_widget); + g_signal_emit (combo_box, + mygal_combo_box_signals [POP_DOWN_DONE], 0, + combo_box->priv->pop_down_widget, &popup_info_destroyed); + + if (popup_info_destroyed){ + gtk_container_remove ( + GTK_CONTAINER (combo_box->priv->frame), + combo_box->priv->pop_down_widget); + combo_box->priv->pop_down_widget = NULL; + } + g_object_unref (combo_box->priv->pop_down_widget); + deactivate_arrow (combo_box); + + g_signal_emit (combo_box, mygal_combo_box_signals [POST_POP_HIDE], 0); +} + +/** + * mygal_combo_box_popup_hide: + * @combo_box: Combo box + * + * Hide popup, but not when it is torn off. + * This is the external interface - for subclasses and apps which expect a + * regular combo which doesn't do tearoffs. + */ +void +mygal_combo_box_popup_hide (MygalComboBox *combo_box) +{ + if (!combo_box->priv->torn_off) + mygal_combo_box_popup_hide_unconditional (combo_box); + else if (GTK_WIDGET_VISIBLE (combo_box->priv->toplevel)) { + /* Both popup and tearoff window present. Get rid of just + the popup shell. */ + mygal_combo_popup_tear_off (combo_box, FALSE); + deactivate_arrow (combo_box); + } +} + +/* + * Find best location for displaying + */ +void +mygal_combo_box_get_pos (MygalComboBox *combo_box, int *x, int *y) +{ + GtkWidget *wcombo = GTK_WIDGET (combo_box); + int ph, pw; + + gdk_window_get_origin (wcombo->window, x, y); + *y += wcombo->allocation.height + wcombo->allocation.y; + *x += wcombo->allocation.x; + + ph = combo_box->priv->popup->allocation.height; + pw = combo_box->priv->popup->allocation.width; + + if ((*y + ph) > gdk_screen_height ()) + *y = gdk_screen_height () - ph; + + if ((*x + pw) > gdk_screen_width ()) + *x = gdk_screen_width () - pw; +} + +static void +mygal_combo_box_popup_display (MygalComboBox *combo_box) +{ + int x, y; + + g_return_if_fail (combo_box != NULL); + g_return_if_fail (MYGAL_IS_COMBO_BOX (combo_box)); + + /* + * If we have no widget to display on the popdown, + * create it + */ + if (!combo_box->priv->pop_down_widget){ + GtkWidget *pw = NULL; + + g_signal_emit (combo_box, + mygal_combo_box_signals [POP_DOWN_WIDGET], 0, &pw); + g_assert (pw != NULL); + combo_box->priv->pop_down_widget = pw; + gtk_container_add (GTK_CONTAINER (combo_box->priv->frame), pw); + } + + g_signal_emit (combo_box, mygal_combo_box_signals [PRE_POP_DOWN], 0); + + if (combo_box->priv->torn_off) { + /* To give the illusion that tearoff still displays the + * popup, we copy the image in the popup window to the + * background. Thus, it won't be blank after reparenting */ + mygal_combo_tearoff_bg_copy (combo_box); + + /* We force an unrealize here so that we don't trigger + * redrawing/ clearing code - we just want to reveal our + * backing pixmap. + */ + mygal_combo_popup_reparent (combo_box->priv->popup, + combo_box->priv->toplevel, TRUE); + } + + mygal_combo_box_get_pos (combo_box, &x, &y); + + gtk_widget_set_uposition (combo_box->priv->toplevel, x, y); + gtk_widget_realize (combo_box->priv->popup); + gtk_widget_show (combo_box->priv->popup); + gtk_widget_realize (combo_box->priv->toplevel); + gtk_widget_show (combo_box->priv->toplevel); + + gtk_grab_add (combo_box->priv->toplevel); + gdk_pointer_grab (combo_box->priv->toplevel->window, TRUE, + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_POINTER_MOTION_MASK, + NULL, NULL, GDK_CURRENT_TIME); +} + +static int +mygal_combo_toggle_pressed (GtkToggleButton *tbutton, MygalComboBox *combo_box) +{ + if (tbutton->active) + mygal_combo_box_popup_display (combo_box); + else + mygal_combo_box_popup_hide_unconditional (combo_box); + + return TRUE; +} + +static gint +mygal_combo_box_button_press (GtkWidget *widget, GdkEventButton *event, MygalComboBox *combo_box) +{ + GtkWidget *child; + + child = gtk_get_event_widget ((GdkEvent *) event); + if (child != widget){ + while (child){ + if (child == widget) + return FALSE; + child = child->parent; + } + } + + mygal_combo_box_popup_hide (combo_box); + return TRUE; +} + +/** + * mygal_combo_box_key_press + * @widget: Widget + * @event: Event + * @combo_box: Combo box + * + * Key press handler which dismisses popup on escape. + * Popup is dismissed whether or not popup is torn off. + */ +static gint +mygal_combo_box_key_press (GtkWidget *widget, GdkEventKey *event, + MygalComboBox *combo_box) +{ + if (event->keyval == GDK_Escape) { + mygal_combo_box_popup_hide_unconditional (combo_box); + return TRUE; + } else + return FALSE; +} + +static void +cb_state_change (GtkWidget *widget, GtkStateType old_state, MygalComboBox *combo_box) +{ + GtkStateType const new_state = GTK_WIDGET_STATE(widget); + gtk_widget_set_state (combo_box->priv->display_widget, new_state); +} + +static void +mygal_combo_box_init (MygalComboBox *combo_box) +{ + GtkWidget *arrow; + GdkCursor *cursor; + + combo_box->priv = g_new0 (MygalComboBoxPrivate, 1); + + /* + * Create the arrow + */ + combo_box->priv->arrow_button = gtk_toggle_button_new (); + gtk_button_set_relief (GTK_BUTTON (combo_box->priv->arrow_button), GTK_RELIEF_NONE); + GTK_WIDGET_UNSET_FLAGS (combo_box->priv->arrow_button, GTK_CAN_FOCUS); + + arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER (combo_box->priv->arrow_button), arrow); + gtk_box_pack_end (GTK_BOX (combo_box), combo_box->priv->arrow_button, FALSE, FALSE, 0); + g_signal_connect (combo_box->priv->arrow_button, "toggled", + G_CALLBACK (mygal_combo_toggle_pressed), combo_box); + gtk_widget_show_all (combo_box->priv->arrow_button); + + /* + * prelight the display widget when mousing over the arrow. + */ + g_signal_connect (combo_box->priv->arrow_button, "state-changed", + G_CALLBACK (cb_state_change), combo_box); + + /* + * The pop-down container + */ + + combo_box->priv->toplevel = gtk_window_new (GTK_WINDOW_POPUP); + gtk_widget_ref (combo_box->priv->toplevel); + gtk_object_sink (GTK_OBJECT (combo_box->priv->toplevel)); + gtk_window_set_policy (GTK_WINDOW (combo_box->priv->toplevel), + FALSE, TRUE, FALSE); + + combo_box->priv->popup = gtk_event_box_new (); + gtk_container_add (GTK_CONTAINER (combo_box->priv->toplevel), + combo_box->priv->popup); + gtk_widget_show (combo_box->priv->popup); + + gtk_widget_realize (combo_box->priv->popup); + cursor = gdk_cursor_new (GDK_TOP_LEFT_ARROW); + gdk_window_set_cursor (combo_box->priv->popup->window, cursor); + gdk_cursor_unref (cursor); + + combo_box->priv->torn_off = FALSE; + combo_box->priv->tearoff_window = NULL; + + combo_box->priv->frame = gtk_frame_new (NULL); + gtk_container_add (GTK_CONTAINER (combo_box->priv->popup), + combo_box->priv->frame); + gtk_frame_set_shadow_type (GTK_FRAME (combo_box->priv->frame), GTK_SHADOW_OUT); + + g_signal_connect (combo_box->priv->toplevel, "button_press_event", + G_CALLBACK (mygal_combo_box_button_press), combo_box); + g_signal_connect (combo_box->priv->toplevel, "key_press_event", + G_CALLBACK (mygal_combo_box_key_press), combo_box); +} + +E_MAKE_TYPE (mygal_combo_box, + "MygalComboBox", + MygalComboBox, + mygal_combo_box_class_init, + mygal_combo_box_init, + PARENT_TYPE) + +/** + * mygal_combo_box_set_display: + * @combo_box: the Combo Box to modify + * @display_widget: The widget to be displayed + + * Sets the displayed widget for the @combo_box to be @display_widget + */ +void +mygal_combo_box_set_display (MygalComboBox *combo_box, GtkWidget *display_widget) +{ + g_return_if_fail (combo_box != NULL); + g_return_if_fail (MYGAL_IS_COMBO_BOX (combo_box)); + g_return_if_fail (display_widget != NULL); + g_return_if_fail (GTK_IS_WIDGET (display_widget)); + + if (combo_box->priv->display_widget && + combo_box->priv->display_widget != display_widget) + gtk_container_remove (GTK_CONTAINER (combo_box), + combo_box->priv->display_widget); + + combo_box->priv->display_widget = display_widget; + + gtk_box_pack_start (GTK_BOX (combo_box), display_widget, TRUE, TRUE, 0); +} + +static gboolean +cb_tearable_enter_leave (GtkWidget *w, GdkEventCrossing *event, gpointer data) +{ + gboolean const flag = GPOINTER_TO_INT(data); + gtk_widget_set_state (w, flag ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL); + return FALSE; +} + +/** + * mygal_combo_popup_tear_off + * @combo: Combo box + * @set_position: Set to position of popup shell if true + * + * Tear off the popup + * + * FIXME: + * Gtk popup menus are toplevel windows, not dialogs. I think this is wrong, + * and make the popups dialogs. But may be there should be a way to make + * them toplevel. We can do this after creating: + * GTK_WINDOW (tearoff)->type = GTK_WINDOW_TOPLEVEL; + */ +static void +mygal_combo_popup_tear_off (MygalComboBox *combo, gboolean set_position) +{ + int x, y; + + if (!combo->priv->tearoff_window) { + GtkWidget *tearoff; + gchar *title; + + /* FIXME: made this a toplevel, not a dialog ! */ + tearoff = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_widget_ref (tearoff); + gtk_object_sink (GTK_OBJECT (tearoff)); + combo->priv->tearoff_window = tearoff; + gtk_widget_set_app_paintable (tearoff, TRUE); + g_signal_connect (tearoff, "key_press_event", + G_CALLBACK (mygal_combo_box_key_press), + combo); + gtk_widget_realize (tearoff); + title = g_object_get_data (G_OBJECT (combo), + "gtk-combo-title"); + if (title) + gdk_window_set_title (tearoff->window, title); + gtk_window_set_policy (GTK_WINDOW (tearoff), + FALSE, TRUE, FALSE); + gtk_window_set_transient_for + (GTK_WINDOW (tearoff), + GTK_WINDOW (gtk_widget_get_toplevel + GTK_WIDGET (combo))); + } + + if (GTK_WIDGET_VISIBLE (combo->priv->popup)) { + gtk_widget_hide (combo->priv->toplevel); + + gtk_grab_remove (combo->priv->toplevel); + gdk_pointer_ungrab (GDK_CURRENT_TIME); + } + + mygal_combo_popup_reparent (combo->priv->popup, + combo->priv->tearoff_window, FALSE); + + /* It may have got confused about size */ + gtk_widget_queue_resize (GTK_WIDGET (combo->priv->popup)); + + if (set_position) { + mygal_combo_box_get_pos (combo, &x, &y); + gtk_widget_set_uposition (combo->priv->tearoff_window, x, y); + } + gtk_widget_show (GTK_WIDGET (combo->priv->popup)); + gtk_widget_show (combo->priv->tearoff_window); + +} + +/** + * mygal_combo_set_tearoff_state + * @combo_box: Combo box + * @torn_off: TRUE: Tear off. FALSE: Pop down and reattach + * + * Set the tearoff state of the popup + * + * Compare with gtk_menu_set_tearoff_state in gtk/gtkmenu.c + */ +static void +mygal_combo_set_tearoff_state (MygalComboBox *combo, + gboolean torn_off) +{ + g_return_if_fail (combo != NULL); + g_return_if_fail (MYGAL_IS_COMBO_BOX (combo)); + + if (combo->priv->torn_off != torn_off) { + combo->priv->torn_off = torn_off; + + if (combo->priv->torn_off) { + mygal_combo_popup_tear_off (combo, TRUE); + deactivate_arrow (combo); + } else { + gtk_widget_hide (combo->priv->tearoff_window); + mygal_combo_popup_reparent (combo->priv->popup, + combo->priv->toplevel, + FALSE); + } + } +} + +/** + * mygal_combo_tearoff_bg_copy + * @combo_box: Combo box + * + * Copy popup window image to the tearoff window. + */ +static void +mygal_combo_tearoff_bg_copy (MygalComboBox *combo) +{ + GdkPixmap *pixmap; + GdkGC *gc; + GdkGCValues gc_values; + + GtkWidget *widget = combo->priv->popup; + + if (combo->priv->torn_off) { + gc_values.subwindow_mode = GDK_INCLUDE_INFERIORS; + gc = gdk_gc_new_with_values (widget->window, + &gc_values, GDK_GC_SUBWINDOW); + + pixmap = gdk_pixmap_new (widget->window, + widget->allocation.width, + widget->allocation.height, + -1); + + gdk_draw_drawable (pixmap, gc, + widget->window, + 0, 0, 0, 0, -1, -1); + gdk_gc_unref (gc); + + gtk_widget_set_usize (combo->priv->tearoff_window, + widget->allocation.width, + widget->allocation.height); + + gdk_window_set_back_pixmap + (combo->priv->tearoff_window->window, pixmap, FALSE); + gdk_drawable_unref (pixmap); + } +} + +/** + * mygal_combo_popup_reparent + * @popup: Popup + * @new_parent: New parent + * @unrealize: Unrealize popup if TRUE. + * + * Reparent the popup, taking care of the refcounting + * + * Compare with gtk_menu_reparent in gtk/gtkmenu.c + */ +static void +mygal_combo_popup_reparent (GtkWidget *popup, + GtkWidget *new_parent, + gboolean unrealize) +{ + GtkObject *object = GTK_OBJECT (popup); + gboolean was_floating = GTK_OBJECT_FLOATING (object); + + g_object_ref (object); + gtk_object_sink (object); + + if (unrealize) { + g_object_ref (object); + gtk_container_remove (GTK_CONTAINER (popup->parent), popup); + gtk_container_add (GTK_CONTAINER (new_parent), popup); + g_object_unref (object); + } + else + gtk_widget_reparent (GTK_WIDGET (popup), new_parent); + gtk_widget_set_usize (new_parent, -1, -1); + + if (was_floating) + GTK_OBJECT_SET_FLAGS (object, GTK_FLOATING); + else + g_object_unref (object); +} + +/** + * cb_tearable_button_release + * @w: Widget + * @event: Event + * @combo: Combo box + * + * Toggle tearoff state. + */ +static gboolean +cb_tearable_button_release (GtkWidget *w, GdkEventButton *event, + MygalComboBox *combo) +{ + GtkTearoffMenuItem *tearable; + + g_return_val_if_fail (w != NULL, FALSE); + g_return_val_if_fail (GTK_IS_TEAROFF_MENU_ITEM (w), FALSE); + + tearable = GTK_TEAROFF_MENU_ITEM (w); + tearable->torn_off = !tearable->torn_off; + + if (!combo->priv->torn_off) { + gboolean need_connect; + + need_connect = (!combo->priv->tearoff_window); + mygal_combo_set_tearoff_state (combo, TRUE); + if (need_connect) + g_signal_connect (combo->priv->tearoff_window, + "delete_event", + G_CALLBACK (cb_popup_delete), + combo); + } else + mygal_combo_box_popup_hide_unconditional (combo); + + return TRUE; +} + +static gboolean +cb_popup_delete (GtkWidget *w, GdkEventAny *event, MygalComboBox *combo) +{ + mygal_combo_box_popup_hide_unconditional (combo); + return TRUE; +} + +void +mygal_combo_box_construct (MygalComboBox *combo_box, GtkWidget *display_widget, GtkWidget *pop_down_widget) +{ + GtkWidget *tearable; + GtkWidget *vbox; + + g_return_if_fail (combo_box != NULL); + g_return_if_fail (MYGAL_IS_COMBO_BOX (combo_box)); + g_return_if_fail (display_widget != NULL); + g_return_if_fail (GTK_IS_WIDGET (display_widget)); + + GTK_BOX (combo_box)->spacing = 0; + GTK_BOX (combo_box)->homogeneous = FALSE; + + combo_box->priv->pop_down_widget = pop_down_widget; + combo_box->priv->display_widget = NULL; + + vbox = gtk_vbox_new (FALSE, 5); + tearable = gtk_tearoff_menu_item_new (); + g_signal_connect (tearable, "enter-notify-event", + G_CALLBACK (cb_tearable_enter_leave), + GINT_TO_POINTER (TRUE)); + g_signal_connect (tearable, "leave-notify-event", + G_CALLBACK (cb_tearable_enter_leave), + GINT_TO_POINTER (FALSE)); + g_signal_connect (tearable, "button-release-event", + G_CALLBACK (cb_tearable_button_release), + (gpointer) combo_box); + gtk_box_pack_start (GTK_BOX (vbox), tearable, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox), pop_down_widget, TRUE, TRUE, 0); + combo_box->priv->tearable = tearable; + + /* + * Finish setup + */ + mygal_combo_box_set_display (combo_box, display_widget); + + gtk_container_add (GTK_CONTAINER (combo_box->priv->frame), vbox); + gtk_widget_show_all (combo_box->priv->frame); +} + +GtkWidget * +mygal_combo_box_new (GtkWidget *display_widget, GtkWidget *optional_popdown) +{ + MygalComboBox *combo_box; + + g_return_val_if_fail (display_widget != NULL, NULL); + g_return_val_if_fail (GTK_IS_WIDGET (display_widget), NULL); + + combo_box = g_object_new (MYGAL_COMBO_BOX_TYPE, NULL); + mygal_combo_box_construct (combo_box, display_widget, optional_popdown); + return GTK_WIDGET (combo_box); +} + +void +mygal_combo_box_set_arrow_relief (MygalComboBox *cc, GtkReliefStyle relief) +{ + g_return_if_fail (cc != NULL); + g_return_if_fail (MYGAL_IS_COMBO_BOX (cc)); + + gtk_button_set_relief (GTK_BUTTON (cc->priv->arrow_button), relief); +} + +/** + * mygal_combo_box_set_title + * @combo: Combo box + * @title: Title + * + * Set a title to display over the tearoff window. + * + * FIXME: + * + * This should really change the title even when the popup is already torn off. + * I guess the tearoff window could attach a listener to title change or + * something. But I don't think we need the functionality, so I didn't bother + * to investigate. + */ +void +mygal_combo_box_set_title (MygalComboBox *combo, + const gchar *title) +{ + g_return_if_fail (combo != NULL); + g_return_if_fail (MYGAL_IS_COMBO_BOX (combo)); + + g_object_set_data_full (G_OBJECT (combo), "gtk-combo-title", + g_strdup (title), (GDestroyNotify) g_free); +} + +/** + * mygal_combo_box_set_arrow_sensitive + * @combo: Combo box + * @sensitive: Sensitivity value + * + * Toggle the sensitivity of the arrow button + */ + +void +mygal_combo_box_set_arrow_sensitive (MygalComboBox *combo, + gboolean sensitive) +{ + g_return_if_fail (combo != NULL); + + gtk_widget_set_sensitive (combo->priv->arrow_button, sensitive); +} + +/** + * mygal_combo_box_set_tearable: + * @combo: Combo box + * @tearable: whether to allow the @combo to be tearable + * + * controls whether the combo box's pop up widget can be torn off. + */ +void +mygal_combo_box_set_tearable (MygalComboBox *combo, gboolean tearable) +{ + g_return_if_fail (combo != NULL); + g_return_if_fail (MYGAL_IS_COMBO_BOX (combo)); + + if (tearable){ + gtk_widget_show (combo->priv->tearable); + } else { + mygal_combo_set_tearoff_state (combo, FALSE); + gtk_widget_hide (combo->priv->tearable); + } +} diff --git a/glabels2/src/mygal/mygal-combo-box.h b/glabels2/src/mygal/mygal-combo-box.h new file mode 100644 index 00000000..e1785f2d --- /dev/null +++ b/glabels2/src/mygal/mygal-combo-box.h @@ -0,0 +1,94 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * mygal-combo-box.h - a customizable combobox + * Copyright 2000, 2001, Ximian, Inc. + * + * Authors: + * Miguel de Icaza + * + * Modified for gLabels by: + * Jim Evins + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License, version 2, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#ifndef _MYGAL_COMBO_BOX_H_ +#define _MYGAL_COMBO_BOX_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define MYGAL_COMBO_BOX_TYPE (mygal_combo_box_get_type()) +#define MYGAL_COMBO_BOX(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, mygal_combo_box_get_type (), MygalComboBox) +#define MYGAL_COMBO_BOX_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, mygal_combo_box_get_type (), MygalComboBoxClass) +#define MYGAL_IS_COMBO_BOX(obj) G_TYPE_CHECK_INSTANCE_TYPE (obj, mygal_combo_box_get_type ()) + +typedef struct _MygalComboBox MygalComboBox; +typedef struct _MygalComboBoxPrivate MygalComboBoxPrivate; +typedef struct _MygalComboBoxClass MygalComboBoxClass; + +struct _MygalComboBox { + GtkHBox hbox; + MygalComboBoxPrivate *priv; +}; + +struct _MygalComboBoxClass { + GtkHBoxClass parent_class; + + GtkWidget *(*pop_down_widget) (MygalComboBox *cbox); + + /* + * invoked when the popup has been hidden, if the signal + * returns TRUE, it means it should be killed from the + */ + gboolean *(*pop_down_done) (MygalComboBox *cbox, GtkWidget *); + + /* + * Notification signals. + */ + void (*pre_pop_down) (MygalComboBox *cbox); + void (*post_pop_hide) (MygalComboBox *cbox); +}; + +GtkType mygal_combo_box_get_type (void); +void mygal_combo_box_construct (MygalComboBox *combo_box, + GtkWidget *display_widget, + GtkWidget *optional_pop_down_widget); +void mygal_combo_box_get_pos (MygalComboBox *combo_box, int *x, int *y); + +GtkWidget *mygal_combo_box_new (GtkWidget *display_widget, + GtkWidget *optional_pop_down_widget); +void mygal_combo_box_popup_hide (MygalComboBox *combo_box); + +void mygal_combo_box_set_display (MygalComboBox *combo_box, + GtkWidget *display_widget); + +void mygal_combo_box_set_title (MygalComboBox *combo, + const gchar *title); + +void mygal_combo_box_set_tearable (MygalComboBox *combo, + gboolean tearable); +void mygal_combo_box_set_arrow_sensitive (MygalComboBox *combo, + gboolean sensitive); +void mygal_combo_box_set_arrow_relief (MygalComboBox *cc, + GtkReliefStyle relief); +#ifdef __cplusplus +}; +#endif /* __cplusplus */ + +#endif /* _MYGAL_COMBO_BOX_H_ */ diff --git a/glabels2/src/mygal/widget-color-combo.c b/glabels2/src/mygal/widget-color-combo.c new file mode 100644 index 00000000..5ca2708f --- /dev/null +++ b/glabels2/src/mygal/widget-color-combo.c @@ -0,0 +1,335 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * widget-color-combo.c - A color selector combo box + * Copyright 2000, 2001, Ximian, Inc. + * + * Authors: + * Miguel de Icaza (miguel@kernel.org) + * Dom Lachowicz (dominicl@seas.upenn.edu) + * + * Reworked and split up into a separate ColorPalette object: + * Michael Levy (mlevy@genoscope.cns.fr) + * + * And later revised and polished by: + * Almer S. Tigelaar (almer@gnome.org) + * + * Modified for gLabels by: + * Jim Evins + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License, version 2, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#include + +#include +#include +#include +#include "e-util.h" +#include "e-colors.h" +#include "widget-color-combo.h" + +enum { + CHANGED, + LAST_SIGNAL +}; + +static guint color_combo_signals [LAST_SIGNAL] = { 0, }; + +#define PARENT_TYPE MYGAL_COMBO_BOX_TYPE +static GObjectClass *color_combo_parent_class; + +#define make_color(CC,COL) (((COL) != NULL) ? (COL) : ((CC) ? ((CC)->default_color) : NULL)) +#define RGBA_TO_UINT(r,g,b,a) ((((guint)(r))<<24)|(((guint)(g))<<16)|(((guint)(b))<<8)|(guint)(a)) +#define GDK_TO_UINT(c) RGBA_TO_UINT(((c).red>>8), ((c).green>>8), ((c).blue>>8), 0xff) + +#define PREVIEW_SIZE 20 + +static void +color_combo_set_color_internal (ColorCombo *cc, GdkColor *color) +{ + guint color_y, color_height; + guint height, width; + GdkPixbuf *pixbuf; + GdkPixbuf *color_pixbuf; + GdkColor *new_color; + GdkColor *outline_color; + + new_color = make_color (cc,color); + /* If the new and the default are NULL draw an outline */ + outline_color = (new_color) ? new_color : &e_dark_gray; + + pixbuf = gtk_image_get_pixbuf (GTK_IMAGE (cc->preview_image)); + + if (!pixbuf) + return; + + width = gdk_pixbuf_get_width (pixbuf); + height = gdk_pixbuf_get_height (pixbuf); + + if (cc->preview_is_icon) { + color_y = height - 4; + color_height = 4; + } + else { + color_y = 0; + color_height = height; + } + + color_pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, + TRUE, 8, + width, + color_height); + gdk_pixbuf_fill (color_pixbuf, GDK_TO_UINT (*outline_color)); + gdk_pixbuf_copy_area (color_pixbuf, 0, 0, width, color_height, + pixbuf, 0, color_y); + + if (new_color != NULL) + gdk_pixbuf_fill (color_pixbuf, GDK_TO_UINT (*new_color)); + else + gdk_pixbuf_fill (color_pixbuf, 0xffffff00); + gdk_pixbuf_copy_area (color_pixbuf, 0, 0, width - 2, color_height -2, + pixbuf, 1, color_y + 1); + + g_object_unref (color_pixbuf); + + gtk_widget_queue_draw (GTK_WIDGET (cc)); +} + +static void +color_combo_class_init (GObjectClass *object_class) +{ + color_combo_parent_class = g_type_class_ref (PARENT_TYPE); + + color_combo_signals [CHANGED] = + g_signal_new ("color_changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ColorComboClass, color_changed), + NULL, NULL, + e_marshal_NONE__POINTER_BOOLEAN_BOOLEAN_BOOLEAN, + G_TYPE_NONE, 4, G_TYPE_POINTER, + G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN); +} + +E_MAKE_TYPE (color_combo, + "ColorCombo", + ColorCombo, + color_combo_class_init, + NULL, + PARENT_TYPE) + +/* + * Fires signal "color_changed" with the current color as its param + */ +static void +emit_color_changed (ColorCombo *cc, GdkColor *color, + gboolean is_custom, gboolean by_user, gboolean is_default) +{ + g_signal_emit (cc, + color_combo_signals [CHANGED], 0, + color, is_custom, by_user, is_default); + mygal_combo_box_popup_hide (MYGAL_COMBO_BOX (cc)); +} + +static void +cb_palette_color_changed (ColorPalette *P, GdkColor *color, + gboolean custom, gboolean by_user, gboolean is_default, + ColorCombo *cc) +{ + color_combo_set_color_internal (cc, color); + emit_color_changed (cc, color, custom, by_user, is_default); +} + +static void +preview_clicked (GtkWidget *button, ColorCombo *cc) +{ + gboolean is_default; + GdkColor *color = color_palette_get_current_color (cc->palette, &is_default); + emit_color_changed (cc, color, FALSE, TRUE, is_default); + if (color) + gdk_color_free (color); +} + +static void +cb_cust_color_clicked (GtkWidget *widget, ColorCombo *cc) +{ + mygal_combo_box_popup_hide (MYGAL_COMBO_BOX (cc)); +} + +/* + * Creates the color table + */ +static void +color_table_setup (ColorCombo *cc, + char const *no_color_label, ColorGroup *color_group) +{ + g_return_if_fail (cc != NULL); + + /* Tell the palette that we will be changing it's custom colors */ + cc->palette = + COLOR_PALETTE (color_palette_new (no_color_label, + cc->default_color, + color_group)); + + { + GtkWidget *picker = color_palette_get_color_picker (cc->palette); + g_signal_connect (picker, "clicked", + G_CALLBACK (cb_cust_color_clicked), cc); + } + + g_signal_connect (cc->palette, "color_changed", + G_CALLBACK (cb_palette_color_changed), cc); + + gtk_widget_show_all (GTK_WIDGET (cc->palette)); + + return; +} + +void +color_combo_box_set_preview_relief (ColorCombo *cc, GtkReliefStyle relief) +{ + g_return_if_fail (cc != NULL); + g_return_if_fail (IS_COLOR_COMBO (cc)); + + gtk_button_set_relief (GTK_BUTTON (cc->preview_button), relief); +} + +/* + * Where the actual construction goes on + */ +static void +color_combo_construct (ColorCombo *cc, GdkPixbuf *icon, + char const *no_color_label, + ColorGroup *color_group) +{ + GdkColor *color; + GdkPixbuf *pixbuf = NULL; + + g_return_if_fail (cc != NULL); + g_return_if_fail (IS_COLOR_COMBO (cc)); + + /* + * Our button with the gtk_image preview + */ + cc->preview_button = gtk_button_new (); + cc->preview_is_icon = FALSE; + + if (icon) + /* use icon only if size > 4*4 */ + if ((gdk_pixbuf_get_width (icon) > 4) && + (gdk_pixbuf_get_height (icon) > 4)) + { + cc->preview_is_icon = TRUE; + pixbuf = gdk_pixbuf_copy (icon); + } + + if (pixbuf == NULL) + pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, + TRUE, 8, + PREVIEW_SIZE, + PREVIEW_SIZE); + + cc->preview_image = gtk_image_new_from_pixbuf (pixbuf); + g_object_unref (pixbuf); + + gtk_button_set_relief (GTK_BUTTON (cc->preview_button), GTK_RELIEF_NONE); + gtk_widget_show (cc->preview_image); + + gtk_container_add (GTK_CONTAINER (cc->preview_button), cc->preview_image); + g_signal_connect (cc->preview_button, "clicked", + G_CALLBACK (preview_clicked), cc); + + color_table_setup (cc, no_color_label, color_group); + + gtk_widget_show_all (cc->preview_button); + + mygal_combo_box_construct (MYGAL_COMBO_BOX (cc), + cc->preview_button, + GTK_WIDGET (cc->palette)); + + mygal_combo_box_set_tearable (MYGAL_COMBO_BOX (cc), FALSE); + + color = color_palette_get_current_color (cc->palette, NULL); + color_combo_set_color_internal (cc, color); + if (color) gdk_color_free (color); +} + +/* color_combo_get_color: + * + * Return current color, result must be freed with gdk_color_free ! + */ +GdkColor * +color_combo_get_color (ColorCombo *cc, gboolean *is_default) +{ + return color_palette_get_current_color (cc->palette, is_default); +} + +/** + * color_combo_set_color + * @cc The combo + * @color The color + * + * Set the color of the combo to the given color. Causes the color_changed + * signal to be emitted. + */ +void +color_combo_set_color (ColorCombo *cc, GdkColor *color) +{ + /* This will change the color on the palette than it will invoke + * cb_palette_color_changed which will call emit_color_changed and + * set_color_internal which will change the color on our preview and + * will let the users of the combo know that the current color has + * changed + */ + if (color != NULL) + gdk_rgb_find_color (gtk_widget_get_colormap (GTK_WIDGET (cc)), color); + color_palette_set_current_color (cc->palette, color); +} + +/** + * color_combo_set_color_to_default + * @cc The combo + * + * Set the color of the combo to the default color. Causes the color_changed + * signal to be emitted. + */ +void +color_combo_set_color_to_default (ColorCombo *cc) +{ + color_palette_set_color_to_default (cc->palette); +} + +/** + * color_combo_new : + * icon : optionally NULL. + * , const char *no_color_label, + * Default constructor. Pass an optional icon and an optional label for the + * no/auto color button. + */ +GtkWidget * +color_combo_new (GdkPixbuf *icon, char const *no_color_label, + GdkColor *default_color, + ColorGroup *color_group) +{ + ColorCombo *cc; + + cc = g_object_new (COLOR_COMBO_TYPE, NULL); + + cc->default_color = default_color; + + color_combo_construct (cc, icon, no_color_label, color_group); + + return GTK_WIDGET (cc); +} diff --git a/glabels2/src/mygal/widget-color-combo.h b/glabels2/src/mygal/widget-color-combo.h new file mode 100644 index 00000000..3fb283c7 --- /dev/null +++ b/glabels2/src/mygal/widget-color-combo.h @@ -0,0 +1,86 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * widget-color-combo.h - A color selector combo box + * Copyright 2000, 2001, Ximian, Inc. + * + * Authors: + * Miguel de Icaza (miguel@kernel.org) + * Dom Lachowicz (dominicl@seas.upenn.edu) + * + * Reworked and split up into a separate ColorPalette object: + * Michael Levy (mlevy@genoscope.cns.fr) + * + * And later revised and polished by: + * Almer S. Tigelaar (almer@gnome.org) + * + * Modified for gLabels by: + * Jim Evins + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License, version 2, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#ifndef GNUMERIC_WIDGET_COLOR_COMBO_H +#define GNUMERIC_WIDGET_COLOR_COMBO_H + +#include +#include "mygal-combo-box.h" +#include "color-palette.h" + +G_BEGIN_DECLS + +typedef struct _ColorCombo { + MygalComboBox combo_box; + + /* + * GtkImage where we display + */ + GtkWidget *preview_button; + GtkWidget *preview_image; + gboolean preview_is_icon; + + ColorPalette *palette; + + GdkColor *default_color; + gboolean trigger; +} ColorCombo; + +typedef struct { + MygalComboBoxClass parent_class; + + /* Signals emited by this widget */ + void (* color_changed) (ColorCombo *color_combo, GdkColor *color, + gboolean custom, gboolean by_user, gboolean is_default); +} ColorComboClass; + +#define COLOR_COMBO_TYPE (color_combo_get_type ()) +#define COLOR_COMBO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), COLOR_COMBO_TYPE, ColorCombo)) +#define COLOR_COMBO_CLASS(k) (G_TYPE_CHECK_CLASS_CAST(k), COLOR_COMBO_TYPE) +#define IS_COLOR_COMBO(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), COLOR_COMBO_TYPE)) + +GtkType color_combo_get_type (void); +GtkWidget *color_combo_new (GdkPixbuf *icon, + char const *no_color_label, + GdkColor *default_color, + ColorGroup *color_group); +void color_combo_set_color (ColorCombo *cc, + GdkColor *color); +void color_combo_set_color_to_default (ColorCombo *cc); +GdkColor *color_combo_get_color (ColorCombo *cc, gboolean *is_default); + +void color_combo_box_set_preview_relief (ColorCombo *cc, GtkReliefStyle relief); + +G_END_DECLS + +#endif /* GNUMERIC_WIDGET_COLOR_COMBO_H */ diff --git a/glabels2/src/new-label-dialog.c b/glabels2/src/new-label-dialog.c new file mode 100644 index 00000000..038ed43b --- /dev/null +++ b/glabels2/src/new-label-dialog.c @@ -0,0 +1,289 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * new-label-dialog.c: New label dialog module + * + * Copyright (C) 2006 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "new-label-dialog.h" + +#include +#include +#include +#include + +#include "hig.h" +#include "wdgt-media-select.h" +#include "wdgt-rotate-label.h" + +#include "debug.h" + +/*===========================================*/ +/* Private data types */ +/*===========================================*/ + +struct _glNewLabelDialogPrivate { + + GtkWidget *media_select; + GtkWidget *rotate_label; + +}; + + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void gl_new_label_dialog_finalize (GObject *object); + +static void gl_new_label_dialog_construct (glNewLabelDialog *dialog, + GtkWindow *win); + +static void template_changed_cb (glWdgtMediaSelect *select, + gpointer data); + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glNewLabelDialog, gl_new_label_dialog, GTK_TYPE_DIALOG); + +static void +gl_new_label_dialog_class_init (glNewLabelDialogClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_debug (DEBUG_FILE, ""); + + gl_new_label_dialog_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_new_label_dialog_finalize; +} + +static void +gl_new_label_dialog_init (glNewLabelDialog *dialog) +{ + gl_debug (DEBUG_FILE, "START"); + + g_return_if_fail (GL_IS_NEW_LABEL_DIALOG (dialog)); + + dialog->priv = g_new0 (glNewLabelDialogPrivate, 1); + + gtk_container_set_border_width (GTK_CONTAINER(dialog), GL_HIG_PAD2); + + gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE); + gtk_dialog_add_buttons (GTK_DIALOG(dialog), + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE); + gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); + + gl_debug (DEBUG_FILE, "END"); +} + +static void +gl_new_label_dialog_finalize (GObject *object) +{ + glNewLabelDialog* dialog = GL_NEW_LABEL_DIALOG (object);; + + gl_debug (DEBUG_FILE, "START"); + + g_return_if_fail (object != NULL); + g_return_if_fail (GL_IS_NEW_LABEL_DIALOG (dialog)); + g_return_if_fail (dialog->priv != NULL); + + g_free (dialog->priv); + + G_OBJECT_CLASS (gl_new_label_dialog_parent_class)->finalize (object); + + gl_debug (DEBUG_FILE, "END"); + +} + +/*****************************************************************************/ +/* NEW object properties dialog. */ +/*****************************************************************************/ +GtkWidget * +gl_new_label_dialog_new (GtkWindow *win) +{ + GtkWidget *dialog; + + gl_debug (DEBUG_FILE, ""); + + dialog = GTK_WIDGET (g_object_new (GL_TYPE_NEW_LABEL_DIALOG, NULL)); + + gl_new_label_dialog_construct (GL_NEW_LABEL_DIALOG(dialog), win); + + return dialog; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Construct dialog. */ +/*--------------------------------------------------------------------------*/ +static void +gl_new_label_dialog_construct (glNewLabelDialog *dialog, + GtkWindow *win) +{ + GladeXML *gui; + GtkWidget *vbox, *media_select_vbox, *rotate_label_vbox; + gchar *name; + + gl_debug (DEBUG_FILE, "START"); + + gtk_window_set_transient_for (GTK_WINDOW (dialog), win); + + gui = glade_xml_new (GLABELS_GLADE_DIR "new-label-dialog.glade", + "new_label_dialog_vbox", NULL); + + if (!gui) { + g_critical ("Could not open new-label-dialog.glade. gLabels may not be installed correctly!"); + return; + } + + vbox = glade_xml_get_widget (gui, "new_label_dialog_vbox"); + gtk_box_pack_start (GTK_BOX( GTK_DIALOG (dialog)->vbox), vbox, FALSE, FALSE, 0); + + media_select_vbox = glade_xml_get_widget (gui, "media_select_vbox"); + rotate_label_vbox = glade_xml_get_widget (gui, "rotate_label_vbox"); + + g_object_unref (gui); + + dialog->priv->media_select = gl_wdgt_media_select_new (); + gtk_box_pack_start (GTK_BOX (media_select_vbox), + dialog->priv->media_select, FALSE, FALSE, 0); + + dialog->priv->rotate_label = gl_wdgt_rotate_label_new (); + gtk_box_pack_start (GTK_BOX (rotate_label_vbox), + dialog->priv->rotate_label, FALSE, FALSE, 0); + + /* Sync template name from media select with rotate widget. */ + name = gl_wdgt_media_select_get_name (GL_WDGT_MEDIA_SELECT (dialog->priv->media_select)); + gl_wdgt_rotate_label_set_template_name (GL_WDGT_ROTATE_LABEL (dialog->priv->rotate_label), + name); + + g_signal_connect (G_OBJECT (dialog->priv->media_select), "changed", + G_CALLBACK (template_changed_cb), dialog); + + gl_debug (DEBUG_FILE, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. New template changed callback. */ +/*---------------------------------------------------------------------------*/ +static void +template_changed_cb (glWdgtMediaSelect *select, + gpointer data) +{ + glNewLabelDialog *dialog = GL_NEW_LABEL_DIALOG (data); + gchar *name; + + gl_debug (DEBUG_FILE, "START"); + + name = gl_wdgt_media_select_get_name (GL_WDGT_MEDIA_SELECT (select)); + + gl_wdgt_rotate_label_set_template_name (GL_WDGT_ROTATE_LABEL (dialog->priv->rotate_label), + name); + + gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), + GTK_RESPONSE_OK, + (name != NULL)); + + g_free (name); + + gl_debug (DEBUG_FILE, "END"); +} + +/*****************************************************************************/ +/* Get template name. */ +/*****************************************************************************/ +gchar * +gl_new_label_dialog_get_template_name (glNewLabelDialog *dialog) +{ + gchar *name; + + name = gl_wdgt_media_select_get_name (GL_WDGT_MEDIA_SELECT (dialog->priv->media_select)); + + return name; +} + +/*****************************************************************************/ +/* Set template name. */ +/*****************************************************************************/ +void +gl_new_label_dialog_set_template_name (glNewLabelDialog *dialog, + gchar *name) +{ + gl_wdgt_media_select_set_name (GL_WDGT_MEDIA_SELECT (dialog->priv->media_select), name); +} + +/*****************************************************************************/ +/* Get current filter parameters. */ +/*****************************************************************************/ +void +gl_new_label_dialog_get_filter_parameters (glNewLabelDialog *dialog, + gchar **page_size_id, + gchar **category_id) +{ + gl_wdgt_media_select_get_filter_parameters ( + GL_WDGT_MEDIA_SELECT (dialog->priv->media_select), + page_size_id, category_id); +} + +/*****************************************************************************/ +/* Set current filter parameters. */ +/*****************************************************************************/ +void +gl_new_label_dialog_set_filter_parameters (glNewLabelDialog *dialog, + const gchar *page_size_id, + const gchar *category_id) +{ + gl_wdgt_media_select_set_filter_parameters ( + GL_WDGT_MEDIA_SELECT (dialog->priv->media_select), + page_size_id, category_id); +} + +/*****************************************************************************/ +/* Get rotate state. */ +/*****************************************************************************/ +gboolean +gl_new_label_dialog_get_rotate_state (glNewLabelDialog *dialog) +{ + return gl_wdgt_rotate_label_get_state ( + GL_WDGT_ROTATE_LABEL (dialog->priv->rotate_label)); +} + +/*****************************************************************************/ +/* Set rotate state. */ +/*****************************************************************************/ +void +gl_new_label_dialog_set_rotate_state (glNewLabelDialog *dialog, + gboolean state) +{ + gl_wdgt_rotate_label_set_state ( + GL_WDGT_ROTATE_LABEL (dialog->priv->rotate_label), state); +} + diff --git a/glabels2/src/new-label-dialog.h b/glabels2/src/new-label-dialog.h new file mode 100644 index 00000000..a38a48d9 --- /dev/null +++ b/glabels2/src/new-label-dialog.h @@ -0,0 +1,84 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * new-label-dialog.h: New label dialog module header file + * + * Copyright (C) 2006 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __NEW_LABEL_DIALOG_H__ +#define __NEW_LABEL_DIALOG_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GL_TYPE_NEW_LABEL_DIALOG (gl_new_label_dialog_get_type ()) +#define GL_NEW_LABEL_DIALOG(obj) (GTK_CHECK_CAST ((obj), GL_TYPE_NEW_LABEL_DIALOG, glNewLabelDialog)) +#define GL_NEW_LABEL_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GL_TYPE_NEW_LABEL_DIALOG, glNewLabelDialogClass)) +#define GL_IS_NEW_LABEL_DIALOG(obj) (GTK_CHECK_TYPE ((obj), GL_TYPE_NEW_LABEL_DIALOG)) +#define GL_IS_NEW_LABEL_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GL_TYPE_NEW_LABEL_DIALOG)) +#define GL_NEW_LABEL_DIALOG_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), GL_TYPE_NEW_LABEL_DIALOG, glNewLabelDialogClass)) + + +typedef struct _glNewLabelDialog glNewLabelDialog; +typedef struct _glNewLabelDialogClass glNewLabelDialogClass; + +typedef struct _glNewLabelDialogPrivate glNewLabelDialogPrivate; + +struct _glNewLabelDialog +{ + GtkDialog parent_instance; + + glNewLabelDialogPrivate *priv; + +}; + +struct _glNewLabelDialogClass +{ + GtkDialogClass parent_class; +}; + + +GType gl_new_label_dialog_get_type (void) G_GNUC_CONST; + +GtkWidget *gl_new_label_dialog_new (GtkWindow *win); + +gchar *gl_new_label_dialog_get_template_name (glNewLabelDialog *dialog); + +void gl_new_label_dialog_set_template_name (glNewLabelDialog *dialog, + gchar *name); + +void gl_new_label_dialog_get_filter_parameters (glNewLabelDialog *dialog, + gchar **page_size_id, + gchar **category_id); + +void gl_new_label_dialog_set_filter_parameters (glNewLabelDialog *dialog, + const gchar *page_size_id, + const gchar *category_id); + +gboolean gl_new_label_dialog_get_rotate_state (glNewLabelDialog *dialog); + +void gl_new_label_dialog_set_rotate_state (glNewLabelDialog *dialog, + gboolean state); + + +G_END_DECLS + +#endif diff --git a/glabels2/src/object-editor-bc-page.c b/glabels2/src/object-editor-bc-page.c new file mode 100644 index 00000000..464029e0 --- /dev/null +++ b/glabels2/src/object-editor-bc-page.c @@ -0,0 +1,426 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * object-editor.c: object properties editor module + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "object-editor.h" + +#include +#include +#include +#include +#include +#include + +#include "prefs.h" +#include "mygal/widget-color-combo.h" +#include "color.h" +#include "util.h" + +#include "object-editor-private.h" + +#include "debug.h" + +/*===========================================*/ +/* Private macros */ +/*===========================================*/ + +/*===========================================*/ +/* Private data types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void style_changed_cb (glObjectEditor *editor); +static void bc_radio_toggled_cb (glObjectEditor *editor); + + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Prepare size page. */ +/*--------------------------------------------------------------------------*/ +void +gl_object_editor_prepare_bc_page (glObjectEditor *editor) +{ + GList *styles = NULL; + + gl_debug (DEBUG_EDITOR, "START"); + + /* Extract widgets from XML tree. */ + editor->priv->bc_page_vbox = + glade_xml_get_widget (editor->priv->gui, "bc_page_vbox"); + editor->priv->bc_style_combo = + glade_xml_get_widget (editor->priv->gui, "bc_style_combo"); + editor->priv->bc_text_check = + glade_xml_get_widget (editor->priv->gui, "bc_text_check"); + editor->priv->bc_cs_check = + glade_xml_get_widget (editor->priv->gui, "bc_cs_check"); + editor->priv->bc_color_combo = + glade_xml_get_widget (editor->priv->gui, "bc_color_combo"); + editor->priv->bc_key_combo = + glade_xml_get_widget (editor->priv->gui, "bc_key_combo"); + editor->priv->bc_key_radio = + glade_xml_get_widget (editor->priv->gui, "bc_key_radio"); + editor->priv->bc_color_radio = + glade_xml_get_widget (editor->priv->gui, "bc_color_radio"); + editor->priv->data_format_label = + glade_xml_get_widget (editor->priv->gui, "data_format_label"); + editor->priv->data_ex_label = + glade_xml_get_widget (editor->priv->gui, "data_ex_label"); + editor->priv->data_digits_label = + glade_xml_get_widget (editor->priv->gui, "data_digits_label"); + editor->priv->data_digits_spin = + glade_xml_get_widget (editor->priv->gui, "data_digits_spin"); + + editor->priv->data_format_fixed_flag = FALSE; + + gl_util_combo_box_add_text_model ( GTK_COMBO_BOX(editor->priv->bc_style_combo)); + gl_util_combo_box_add_text_model ( GTK_COMBO_BOX(editor->priv->bc_key_combo)); + + /* Load barcode styles */ + styles = gl_barcode_get_styles_list (); + gl_util_combo_box_set_strings (GTK_COMBO_BOX(editor->priv->bc_style_combo), + styles); + gl_barcode_free_styles_list (styles); + + /* Modify widgets */ + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->bc_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE); + + /* Un-hide */ + gtk_widget_show_all (editor->priv->bc_page_vbox); + + /* Connect signals */ + g_signal_connect_swapped (G_OBJECT (editor->priv->bc_style_combo), + "changed", + G_CALLBACK (style_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->bc_text_check), + "toggled", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->bc_cs_check), + "toggled", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->bc_color_combo), + "color_changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->bc_key_combo), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->bc_color_radio), + "toggled", + G_CALLBACK (bc_radio_toggled_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->bc_key_radio), + "toggled", + G_CALLBACK (bc_radio_toggled_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->data_digits_spin), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Callback for when style has changed. */ +/*--------------------------------------------------------------------------*/ +static void +style_changed_cb (glObjectEditor *editor) +{ + gchar *style_string = NULL; + const gchar *id; + gchar *ex_string = NULL; + guint digits; + + if (editor->priv->stop_signals) return; + + style_string = + gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->bc_style_combo)); + + /* Don't emit if entry is empty. */ + if ( *style_string != 0 ) { + id = gl_barcode_name_to_id (style_string); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(editor->priv->bc_text_check), + gl_barcode_can_text (id)); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(editor->priv->bc_cs_check), + gl_barcode_can_csum (id)); + + gtk_widget_set_sensitive (editor->priv->bc_text_check, + gl_barcode_text_optional (id)); + gtk_widget_set_sensitive (editor->priv->bc_cs_check, + gl_barcode_csum_optional (id)); + + editor->priv->data_format_fixed_flag = !gl_barcode_can_freeform (id); + digits = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->data_digits_spin)); + if (editor->priv->data_format_fixed_flag) { + digits = gl_barcode_get_prefered_n(id); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->data_digits_spin), + digits); + } + + ex_string = gl_barcode_default_digits (id, digits); + gtk_label_set_text (GTK_LABEL(editor->priv->data_ex_label), ex_string); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->data_literal_radio))) { + gtk_widget_set_sensitive (editor->priv->data_format_label, FALSE); + gtk_widget_set_sensitive (editor->priv->data_ex_label, FALSE); + gtk_widget_set_sensitive (editor->priv->data_digits_label, FALSE); + gtk_widget_set_sensitive (editor->priv->data_digits_spin, FALSE); + } else { + gtk_widget_set_sensitive (editor->priv->data_format_label, TRUE); + gtk_widget_set_sensitive (editor->priv->data_ex_label, TRUE); + gtk_widget_set_sensitive (editor->priv->data_digits_label, + !editor->priv->data_format_fixed_flag); + gtk_widget_set_sensitive (editor->priv->data_digits_spin, + !editor->priv->data_format_fixed_flag); + } + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0); + } + + g_free (style_string); + g_free (ex_string); +} + +/*****************************************************************************/ +/* Set barcode style. */ +/*****************************************************************************/ +void +gl_object_editor_set_bc_style (glObjectEditor *editor, + gchar *id, + gboolean text_flag, + gboolean checksum_flag, + guint format_digits) +{ + const gchar *style_string; + gchar *ex_string; + + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + style_string = gl_barcode_id_to_name (id); + + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (editor->priv->bc_style_combo), + style_string); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->bc_text_check), + text_flag); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->bc_cs_check), + checksum_flag); + + gtk_widget_set_sensitive (editor->priv->bc_text_check, + gl_barcode_text_optional (id)); + gtk_widget_set_sensitive (editor->priv->bc_cs_check, + gl_barcode_csum_optional (id)); + + editor->priv->data_format_fixed_flag = !gl_barcode_can_freeform (id); + + if (editor->priv->data_format_fixed_flag) { + format_digits = gl_barcode_get_prefered_n (id); + } + + ex_string = gl_barcode_default_digits (id, format_digits); + gtk_label_set_text (GTK_LABEL(editor->priv->data_ex_label), ex_string); + g_free (ex_string); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->data_digits_spin), + format_digits); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->data_literal_radio))) { + gtk_widget_set_sensitive (editor->priv->data_format_label, FALSE); + gtk_widget_set_sensitive (editor->priv->data_ex_label, FALSE); + gtk_widget_set_sensitive (editor->priv->data_digits_label, FALSE); + gtk_widget_set_sensitive (editor->priv->data_digits_spin, FALSE); + } else { + gtk_widget_set_sensitive (editor->priv->data_format_label, TRUE); + gtk_widget_set_sensitive (editor->priv->data_ex_label, TRUE); + gtk_widget_set_sensitive (editor->priv->data_digits_label, + !editor->priv->data_format_fixed_flag); + gtk_widget_set_sensitive (editor->priv->data_digits_spin, + !editor->priv->data_format_fixed_flag); + } + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query barcode style. */ +/*****************************************************************************/ +void +gl_object_editor_get_bc_style (glObjectEditor *editor, + gchar **id, + gboolean *text_flag, + gboolean *checksum_flag, + guint *format_digits) +{ + gchar *style_string; + + gl_debug (DEBUG_EDITOR, "START"); + + style_string = + gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->bc_style_combo)); + *id = g_strdup (gl_barcode_name_to_id (style_string)); + + *text_flag = + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->bc_text_check)); + + *checksum_flag = + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->bc_cs_check)); + + + *format_digits = + gtk_spin_button_get_value (GTK_SPIN_BUTTON(editor->priv->data_digits_spin)); + + g_free (style_string); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Set bc color. */ +/*****************************************************************************/ +void +gl_object_editor_set_bc_color (glObjectEditor *editor, + gboolean merge_flag, + glColorNode *color_node) +{ + GdkColor *gdk_color; + + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + gtk_widget_set_sensitive (editor->priv->bc_key_radio, merge_flag); + + if ( color_node->color == GL_COLOR_NONE ) { + + color_combo_set_color_to_default (COLOR_COMBO(editor->priv->bc_color_combo)); + + } else { + + gdk_color = gl_color_to_gdk_color (color_node->color); + color_combo_set_color (COLOR_COMBO(editor->priv->bc_color_combo), + gdk_color); + g_free (gdk_color); + } + + if (!color_node->field_flag) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->bc_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE); + + } else { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->bc_key_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->bc_color_combo, FALSE); + gtk_widget_set_sensitive (editor->priv->bc_key_combo, TRUE); + + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (editor->priv->bc_key_combo), + color_node->key); + } + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query bc color. */ +/*****************************************************************************/ +glColorNode* +gl_object_editor_get_bc_color (glObjectEditor *editor) +{ + GdkColor *gdk_color; + glColorNode *color_node; + gboolean is_default; + + gl_debug (DEBUG_EDITOR, "START"); + + color_node = gl_color_node_new_default (); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->bc_key_radio))) { + color_node->field_flag = TRUE; + color_node->color = gl_prefs->default_line_color; + color_node->key = + gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->bc_key_combo)); + } else { + color_node->field_flag = FALSE; + color_node->key = NULL; + gdk_color = color_combo_get_color (COLOR_COMBO(editor->priv->bc_color_combo), + &is_default); + + if (is_default) { + color_node->color = gl_prefs->default_line_color; + } else { + color_node->color = gl_color_from_gdk_color (gdk_color); + } + } + + gl_debug (DEBUG_EDITOR, "END"); + + return color_node; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. barcode color radio callback. */ +/*--------------------------------------------------------------------------*/ +static void +bc_radio_toggled_cb (glObjectEditor *editor) +{ + if (editor->priv->stop_signals) return; + + gl_debug (DEBUG_EDITOR, "START"); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->bc_color_radio))) { + gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE); + } else { + gtk_widget_set_sensitive (editor->priv->bc_color_combo, FALSE); + gtk_widget_set_sensitive (editor->priv->bc_key_combo, TRUE); + + } + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0); + + gl_debug (DEBUG_EDITOR, "END"); +} diff --git a/glabels2/src/object-editor-data-page.c b/glabels2/src/object-editor-data-page.c new file mode 100644 index 00000000..449d3e28 --- /dev/null +++ b/glabels2/src/object-editor-data-page.c @@ -0,0 +1,232 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * object-editor.c: object properties editor module + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "object-editor.h" + +#include +#include +#include +#include +#include +#include + +#include "prefs.h" +#include "util.h" + +#include "object-editor-private.h" + +#include "debug.h" + +/*===========================================*/ +/* Private macros */ +/*===========================================*/ + +/*===========================================*/ +/* Private data types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void data_radio_toggled_cb (glObjectEditor *editor); + + + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Prepare data page. */ +/*--------------------------------------------------------------------------*/ +void +gl_object_editor_prepare_data_page (glObjectEditor *editor) +{ + gl_debug (DEBUG_EDITOR, "START"); + + /* Extract widgets from XML tree. */ + editor->priv->data_page_vbox = glade_xml_get_widget (editor->priv->gui, + "data_page_vbox"); + editor->priv->data_literal_radio = glade_xml_get_widget (editor->priv->gui, + "data_literal_radio"); + editor->priv->data_key_radio = glade_xml_get_widget (editor->priv->gui, + "data_key_radio"); + editor->priv->data_text_entry = glade_xml_get_widget (editor->priv->gui, + "data_text_entry"); + editor->priv->data_key_combo = glade_xml_get_widget (editor->priv->gui, + "data_key_combo"); + + gl_util_combo_box_add_text_model ( GTK_COMBO_BOX(editor->priv->data_key_combo)); + + /* Un-hide */ + gtk_widget_show_all (editor->priv->data_page_vbox); + + /* Connect signals */ + g_signal_connect_swapped (G_OBJECT (editor->priv->data_text_entry), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->data_key_combo), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->data_literal_radio), + "toggled", + G_CALLBACK (data_radio_toggled_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->data_key_radio), + "toggled", + G_CALLBACK (data_radio_toggled_cb), + G_OBJECT (editor)); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. data radio callback. */ +/*--------------------------------------------------------------------------*/ +static void +data_radio_toggled_cb (glObjectEditor *editor) +{ + if (editor->priv->stop_signals) return; + + gl_debug (DEBUG_WDGT, "START"); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->data_literal_radio))) { + gtk_widget_set_sensitive (editor->priv->data_text_entry, TRUE); + gtk_widget_set_sensitive (editor->priv->data_key_combo, FALSE); + gtk_widget_set_sensitive (editor->priv->data_format_label, FALSE); + gtk_widget_set_sensitive (editor->priv->data_ex_label, FALSE); + gtk_widget_set_sensitive (editor->priv->data_digits_label, FALSE); + gtk_widget_set_sensitive (editor->priv->data_digits_spin, FALSE); + } else { + gtk_widget_set_sensitive (editor->priv->data_text_entry, FALSE); + gtk_widget_set_sensitive (editor->priv->data_key_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->data_format_label, TRUE); + gtk_widget_set_sensitive (editor->priv->data_ex_label, TRUE); + gtk_widget_set_sensitive (editor->priv->data_digits_label, + !editor->priv->data_format_fixed_flag); + gtk_widget_set_sensitive (editor->priv->data_digits_spin, + !editor->priv->data_format_fixed_flag); + } + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0); + + gl_debug (DEBUG_WDGT, "END"); +} + +/*****************************************************************************/ +/* Set data. */ +/*****************************************************************************/ +void +gl_object_editor_set_data (glObjectEditor *editor, + gboolean merge_flag, + glTextNode *text_node) +{ + gint pos; + + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + gtk_widget_set_sensitive (editor->priv->data_key_radio, merge_flag); + + if (!text_node->field_flag) { + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->data_literal_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->data_text_entry, TRUE); + gtk_widget_set_sensitive (editor->priv->data_key_combo, FALSE); + gtk_widget_set_sensitive (editor->priv->data_format_label, FALSE); + gtk_widget_set_sensitive (editor->priv->data_ex_label, FALSE); + gtk_widget_set_sensitive (editor->priv->data_digits_spin, FALSE); + gtk_widget_set_sensitive (editor->priv->data_digits_label, FALSE); + + gtk_editable_delete_text (GTK_EDITABLE (editor->priv->data_text_entry), 0, -1); + pos = 0; + if (text_node->data != NULL ) { + gtk_editable_insert_text (GTK_EDITABLE (editor->priv->data_text_entry), + text_node->data, + strlen (text_node->data), + &pos); + } + + } else { + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->data_key_radio), TRUE); + + gtk_widget_set_sensitive (editor->priv->data_text_entry, FALSE); + gtk_widget_set_sensitive (editor->priv->data_key_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->data_format_label, TRUE); + gtk_widget_set_sensitive (editor->priv->data_ex_label, TRUE); + gtk_widget_set_sensitive (editor->priv->data_digits_label, + !editor->priv->data_format_fixed_flag); + gtk_widget_set_sensitive (editor->priv->data_digits_spin, + !editor->priv->data_format_fixed_flag); + + + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (editor->priv->data_key_combo), + text_node->data); + } + + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query data. */ +/*****************************************************************************/ +glTextNode * +gl_object_editor_get_data (glObjectEditor *editor) +{ + glTextNode *text_node; + + gl_debug (DEBUG_EDITOR, "START"); + + text_node = g_new0(glTextNode,1); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->data_literal_radio))) { + text_node->field_flag = FALSE; + text_node->data = + gtk_editable_get_chars (GTK_EDITABLE (editor->priv->data_text_entry), + 0, -1); + } else { + text_node->field_flag = TRUE; + text_node->data = + gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->data_key_combo)); + } + + gl_debug (DEBUG_EDITOR, "text_node: field_flag=%d, data=%s", + text_node->field_flag, text_node->data); + + gl_debug (DEBUG_EDITOR, "END"); + + return text_node; +} diff --git a/glabels2/src/object-editor-edit-page.c b/glabels2/src/object-editor-edit-page.c new file mode 100644 index 00000000..0a21e8d6 --- /dev/null +++ b/glabels2/src/object-editor-edit-page.c @@ -0,0 +1,133 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * object-editor.c: object properties editor module + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "object-editor.h" + +#include +#include +#include +#include + +#include "prefs.h" +#include "mygal/widget-color-combo.h" +#include "color.h" +#include "util.h" + +#include "object-editor-private.h" + +#include "debug.h" + +/*===========================================*/ +/* Private macros */ +/*===========================================*/ + +/*===========================================*/ +/* Private data types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void insert_button_cb (glObjectEditor *editor); + + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Prepare size page. */ +/*--------------------------------------------------------------------------*/ +void +gl_object_editor_prepare_edit_page (glObjectEditor *editor) +{ + gl_debug (DEBUG_EDITOR, "START"); + + /* Extract widgets from XML tree. */ + editor->priv->edit_page_vbox = + glade_xml_get_widget (editor->priv->gui, "edit_page_vbox"); + editor->priv->edit_text_view = + glade_xml_get_widget (editor->priv->gui, "edit_text_view"); + editor->priv->edit_key_label = + glade_xml_get_widget (editor->priv->gui, "edit_key_label"); + editor->priv->edit_key_combo = + glade_xml_get_widget (editor->priv->gui, "edit_key_combo"); + editor->priv->edit_insert_field_button = + glade_xml_get_widget (editor->priv->gui, "edit_insert_field_button"); + + gl_util_combo_box_add_text_model ( GTK_COMBO_BOX(editor->priv->edit_key_combo)); + + /* Un-hide */ + gtk_widget_show_all (editor->priv->edit_page_vbox); + + /* Connect signals */ + g_signal_connect_swapped (G_OBJECT (editor->priv->edit_insert_field_button), + "clicked", + G_CALLBACK (insert_button_cb), + G_OBJECT (editor)); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Alignment togglebutton callback. */ +/*--------------------------------------------------------------------------*/ +static void +insert_button_cb (glObjectEditor *editor) +{ + GtkTextBuffer *buffer; + gchar *key, *field; + + gl_debug (DEBUG_EDITOR, "START"); + + key = gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->edit_key_combo)); + field = g_strdup_printf ("${%s}", key); + gl_debug (DEBUG_WDGT, "Inserting %s", field); + + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (editor->priv->edit_text_view)); + gtk_text_buffer_insert_at_cursor (buffer, field, -1); + + g_free (field); + g_free (key); + + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Set text buffer as model for text view/editor. */ +/*****************************************************************************/ +void +gl_object_editor_set_text_buffer (glObjectEditor *editor, + GtkTextBuffer *buffer) +{ + gl_debug (DEBUG_EDITOR, "START"); + + gtk_text_view_set_buffer (GTK_TEXT_VIEW(editor->priv->edit_text_view), buffer); + + gl_debug (DEBUG_EDITOR, "END"); +} + diff --git a/glabels2/src/object-editor-fill-page.c b/glabels2/src/object-editor-fill-page.c new file mode 100644 index 00000000..c40f8a17 --- /dev/null +++ b/glabels2/src/object-editor-fill-page.c @@ -0,0 +1,224 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * object-editor.c: object properties editor module + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "object-editor.h" + +#include +#include +#include +#include + +#include "prefs.h" +#include "mygal/widget-color-combo.h" +#include "color.h" +#include "util.h" + +#include "object-editor-private.h" + +#include "debug.h" + +/*===========================================*/ +/* Private macros */ +/*===========================================*/ + +/*===========================================*/ +/* Private data types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void fill_radio_toggled_cb (glObjectEditor *editor); + + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Prepare fill page. */ +/*--------------------------------------------------------------------------*/ +void +gl_object_editor_prepare_fill_page (glObjectEditor *editor) +{ + GdkColor *gdk_color; + + gl_debug (DEBUG_EDITOR, "START"); + + /* Extract widgets from XML tree. */ + editor->priv->fill_page_vbox = glade_xml_get_widget (editor->priv->gui, + "fill_page_vbox"); + editor->priv->fill_color_combo = glade_xml_get_widget (editor->priv->gui, + "fill_color_combo"); + editor->priv->fill_key_combo = glade_xml_get_widget (editor->priv->gui, + "fill_key_combo"); + editor->priv->fill_key_radio = glade_xml_get_widget (editor->priv->gui, + "fill_key_radio"); + editor->priv->fill_color_radio = glade_xml_get_widget (editor->priv->gui, + "fill_color_radio"); + + + gl_util_combo_box_add_text_model ( GTK_COMBO_BOX(editor->priv->fill_key_combo)); + + /* Modify widgets based on configuration */ + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->fill_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->fill_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->fill_key_combo, FALSE); + gdk_color = gl_color_to_gdk_color (gl_prefs->default_fill_color); + color_combo_set_color (COLOR_COMBO(editor->priv->fill_color_combo), gdk_color); + g_free (gdk_color); + + /* Un-hide */ + gtk_widget_show_all (editor->priv->fill_page_vbox); + + /* Connect signals */ + g_signal_connect_swapped (G_OBJECT (editor->priv->fill_color_combo), + "color_changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->fill_key_combo), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->fill_color_radio), + "toggled", + G_CALLBACK (fill_radio_toggled_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->fill_key_radio), + "toggled", + G_CALLBACK (fill_radio_toggled_cb), + G_OBJECT (editor)); + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Set fill color. */ +/*****************************************************************************/ +void +gl_object_editor_set_fill_color (glObjectEditor *editor, + gboolean merge_flag, + glColorNode *color_node) +{ + GdkColor *gdk_color; + + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + gtk_widget_set_sensitive (editor->priv->fill_key_radio, merge_flag); + + if ( color_node->color == GL_COLOR_NONE ) { + + color_combo_set_color_to_default (COLOR_COMBO(editor->priv->fill_color_combo)); + + } else { + + gdk_color = gl_color_to_gdk_color (color_node->color); + color_combo_set_color (COLOR_COMBO(editor->priv->fill_color_combo), + gdk_color); + g_free (gdk_color); + + } + + if (!color_node->field_flag) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->fill_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->fill_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->fill_key_combo, FALSE); + + } else { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->fill_key_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->fill_color_combo, FALSE); + gtk_widget_set_sensitive (editor->priv->fill_key_combo, TRUE); + + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (editor->priv->fill_key_combo), + color_node->key); + } + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query fill color. */ +/*****************************************************************************/ +glColorNode* +gl_object_editor_get_fill_color (glObjectEditor *editor) +{ + GdkColor *gdk_color; + gboolean is_default; + glColorNode *color_node; + + gl_debug (DEBUG_EDITOR, "START"); + + color_node = gl_color_node_new_default (); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->fill_key_radio))) { + color_node->field_flag = TRUE; + color_node->key = + gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->fill_key_combo)); + } else { + color_node->field_flag = FALSE; + color_node->key = NULL; + gdk_color = color_combo_get_color (COLOR_COMBO(editor->priv->fill_color_combo), + &is_default); + + if (!is_default) { + color_node->color = gl_color_from_gdk_color (gdk_color); + } + } + + gl_debug (DEBUG_EDITOR, "END"); + + return color_node; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. fill radio callback. */ +/*--------------------------------------------------------------------------*/ +static void +fill_radio_toggled_cb (glObjectEditor *editor) +{ + if (editor->priv->stop_signals) return; + + gl_debug (DEBUG_EDITOR, "START"); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->fill_color_radio))) { + gtk_widget_set_sensitive (editor->priv->fill_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->fill_key_combo, FALSE); + } else { + gtk_widget_set_sensitive (editor->priv->fill_color_combo, FALSE); + gtk_widget_set_sensitive (editor->priv->fill_key_combo, TRUE); + + } + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0); + + gl_debug (DEBUG_EDITOR, "END"); +} diff --git a/glabels2/src/object-editor-image-page.c b/glabels2/src/object-editor-image-page.c new file mode 100644 index 00000000..a975ab29 --- /dev/null +++ b/glabels2/src/object-editor-image-page.c @@ -0,0 +1,350 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * object-editor.c: object properties editor module + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "object-editor.h" + +#include +#include +#include +#include +#include +#include + +#include "prefs.h" +#include "util.h" + +#include "object-editor-private.h" + +#include "debug.h" + +/*===========================================*/ +/* Private macros */ +/*===========================================*/ + +/*===========================================*/ +/* Private data types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void img_radio_toggled_cb (glObjectEditor *editor); + +static void update_preview_cb (GtkFileChooser *file_chooser, + gpointer data); +static void add_image_filters_to_chooser (GtkFileChooser *file_chooser); + +static void img_selection_changed_cb (glObjectEditor *editor); + + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Prepare image page. */ +/*--------------------------------------------------------------------------*/ +void +gl_object_editor_prepare_image_page (glObjectEditor *editor) +{ + GtkWidget *preview; + + + gl_debug (DEBUG_EDITOR, "START"); + + /* Extract widgets from XML tree. */ + editor->priv->img_page_vbox = glade_xml_get_widget (editor->priv->gui, + "img_page_vbox"); + editor->priv->img_file_radio = glade_xml_get_widget (editor->priv->gui, + "img_file_radio"); + editor->priv->img_key_radio = glade_xml_get_widget (editor->priv->gui, + "img_key_radio"); + editor->priv->img_file_button = glade_xml_get_widget (editor->priv->gui, + "img_file_button"); + editor->priv->img_key_combo = glade_xml_get_widget (editor->priv->gui, + "img_key_combo"); + + gl_util_combo_box_add_text_model ( GTK_COMBO_BOX(editor->priv->img_key_combo)); + + /* Modify file button properties. */ + add_image_filters_to_chooser (GTK_FILE_CHOOSER (editor->priv->img_file_button)); + preview = gtk_image_new (); + gtk_file_chooser_set_preview_widget (GTK_FILE_CHOOSER (editor->priv->img_file_button), preview); + g_signal_connect (G_OBJECT (editor->priv->img_file_button), + "update-preview", + G_CALLBACK (update_preview_cb), preview); + + /* Un-hide */ + gtk_widget_show_all (editor->priv->img_page_vbox); + + /* Connect signals */ + g_signal_connect_swapped (G_OBJECT (editor->priv->img_file_button), + "selection-changed", + G_CALLBACK (img_selection_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->img_key_combo), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->img_file_radio), + "toggled", + G_CALLBACK (img_radio_toggled_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->img_key_radio), + "toggled", + G_CALLBACK (img_radio_toggled_cb), + G_OBJECT (editor)); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. image radio callback. */ +/*--------------------------------------------------------------------------*/ +static void +img_radio_toggled_cb (glObjectEditor *editor) +{ + if (editor->priv->stop_signals) return; + + gl_debug (DEBUG_WDGT, "START"); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->img_file_radio))) { + gtk_widget_set_sensitive (editor->priv->img_file_button, TRUE); + gtk_widget_set_sensitive (editor->priv->img_key_combo, FALSE); + } else { + gtk_widget_set_sensitive (editor->priv->img_file_button, FALSE); + gtk_widget_set_sensitive (editor->priv->img_key_combo, TRUE); + } + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0); + + gl_debug (DEBUG_WDGT, "END"); +} + +/*****************************************************************************/ +/* Set image. */ +/*****************************************************************************/ +void +gl_object_editor_set_image (glObjectEditor *editor, + gboolean merge_flag, + glTextNode *text_node) +{ + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + gtk_widget_set_sensitive (editor->priv->img_key_radio, merge_flag); + + if (!text_node->field_flag) { + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->img_file_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->img_file_button, TRUE); + gtk_widget_set_sensitive (editor->priv->img_key_combo, FALSE); + + if (text_node->data != NULL ) { + gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(editor->priv->img_file_button), + text_node->data); + } else { + gtk_file_chooser_unselect_all (GTK_FILE_CHOOSER(editor->priv->img_file_button)); + } + } else { + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->img_key_radio), TRUE); + + gtk_widget_set_sensitive (editor->priv->img_file_button, FALSE); + gtk_widget_set_sensitive (editor->priv->img_key_combo, TRUE); + + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (editor->priv->img_key_combo), + text_node->data); + } + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query image. */ +/*****************************************************************************/ +glTextNode * +gl_object_editor_get_image (glObjectEditor *editor) +{ + glTextNode *text_node; + + gl_debug (DEBUG_EDITOR, "START"); + + text_node = g_new0(glTextNode,1); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->img_file_radio))) { + text_node->field_flag = FALSE; + text_node->data = + gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(editor->priv->img_file_button)); + } else { + text_node->field_flag = TRUE; + text_node->data = + gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->img_key_combo)); + } + + gl_debug (DEBUG_EDITOR, "text_node: field_flag=%d, data=%s", + text_node->field_flag, text_node->data); + + gl_debug (DEBUG_EDITOR, "END"); + + return text_node; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Update preview image. */ +/*--------------------------------------------------------------------------*/ +static void +update_preview_cb (GtkFileChooser *file_chooser, gpointer data) +{ + GtkWidget *preview; + char *filename; + GdkPixbuf *pixbuf; + gboolean have_preview; + + preview = GTK_WIDGET (data); + filename = gtk_file_chooser_get_preview_filename (file_chooser); + + if (filename) { + pixbuf = gdk_pixbuf_new_from_file_at_size (filename, 128, 128, NULL); + have_preview = (pixbuf != NULL); + g_free (filename); + + gtk_image_set_from_pixbuf (GTK_IMAGE (preview), pixbuf); + if (pixbuf) + gdk_pixbuf_unref (pixbuf); + + gtk_file_chooser_set_preview_widget_active (file_chooser, + have_preview); + } else { + gtk_file_chooser_set_preview_widget_active (file_chooser, FALSE); + } +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add filters to file chooser. */ +/* Based on eog's eog_file_selection_add_filter(). */ +/*--------------------------------------------------------------------------*/ +static void +add_image_filters_to_chooser (GtkFileChooser *chooser) +{ + GtkFileFilter *all_file_filter; + GtkFileFilter *all_img_filter; + GSList *formats; + GSList *it; + GtkFileFilter *filter; + GSList *filters = NULL; + gchar **mime_types, **pattern, *tmp; + int i; + + /* All Files Filter */ + all_file_filter = gtk_file_filter_new (); + gtk_file_filter_set_name (all_file_filter, _("All Files")); + gtk_file_filter_add_pattern (all_file_filter, "*"); + + /* All Image Filter */ + all_img_filter = gtk_file_filter_new (); + gtk_file_filter_set_name (all_img_filter, _("All Images")); + + /* Individual image filters */ + formats = gdk_pixbuf_get_formats (); + for (it = formats; it != NULL; it = it->next) { + gchar *filter_name; + GdkPixbufFormat *format; + filter = gtk_file_filter_new (); + gchar *description, *name; + + format = (GdkPixbufFormat*) it->data; + + /* Filter name: First description then file extension, eg. "The PNG-Format (*.png)".*/ + description = gdk_pixbuf_format_get_description (format); + name = gdk_pixbuf_format_get_name (format); + filter_name = g_strdup_printf (_("%s (*.%s)"), description, name); + g_free (description); + g_free (name); + gtk_file_filter_set_name (filter, filter_name); + g_free (filter_name); + + mime_types = gdk_pixbuf_format_get_mime_types ((GdkPixbufFormat *) it->data); + for (i = 0; mime_types[i] != NULL; i++) { + gtk_file_filter_add_mime_type (filter, mime_types[i]); + gtk_file_filter_add_mime_type (all_img_filter, mime_types[i]); + } + g_strfreev (mime_types); + + pattern = gdk_pixbuf_format_get_extensions ((GdkPixbufFormat *) it->data); + for (i = 0; pattern[i] != NULL; i++) { + tmp = g_strconcat ("*.", pattern[i], NULL); + gtk_file_filter_add_pattern (filter, tmp); + gtk_file_filter_add_pattern (all_img_filter, tmp); + g_free (tmp); + } + g_strfreev (pattern); + + filters = g_slist_prepend (filters, filter); + } + g_slist_free (formats); + + /* Add filter to filechooser */ + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), all_file_filter); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), all_img_filter); + gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), all_img_filter); + + for (it = filters; it != NULL; it = it->next) { + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), + GTK_FILE_FILTER (it->data)); + } + g_slist_free (filters); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Selection changed callback. */ +/*--------------------------------------------------------------------------*/ +static void +img_selection_changed_cb (glObjectEditor *editor) +{ + gchar *filename; + + if (editor->priv->stop_signals) return; + + gl_debug (DEBUG_EDITOR, "START"); + + filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(editor->priv->img_file_button)); + if (filename != NULL) + { + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0); + } + g_free (filename); + + gl_debug (DEBUG_EDITOR, "END"); +} + diff --git a/glabels2/src/object-editor-line-page.c b/glabels2/src/object-editor-line-page.c new file mode 100644 index 00000000..a9daf766 --- /dev/null +++ b/glabels2/src/object-editor-line-page.c @@ -0,0 +1,271 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * object-editor.c: object properties editor module + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "object-editor.h" + +#include +#include +#include +#include +#include +#include + +#include "prefs.h" +#include "mygal/widget-color-combo.h" +#include "color.h" +#include "util.h" + +#include "object-editor-private.h" + +#include "debug.h" + +/*===========================================*/ +/* Private macros */ +/*===========================================*/ + +/*===========================================*/ +/* Private data types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ +static void line_radio_toggled_cb (glObjectEditor *editor); + + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Prepare line page. */ +/*--------------------------------------------------------------------------*/ +void +gl_object_editor_prepare_line_page (glObjectEditor *editor) +{ + GdkColor *gdk_color; + + gl_debug (DEBUG_EDITOR, "START"); + + /* Extract widgets from XML tree. */ + editor->priv->line_page_vbox = glade_xml_get_widget (editor->priv->gui, + "line_page_vbox"); + editor->priv->line_width_spin = glade_xml_get_widget (editor->priv->gui, + "line_width_spin"); + editor->priv->line_color_combo = glade_xml_get_widget (editor->priv->gui, + "line_color_combo"); + editor->priv->line_key_combo = glade_xml_get_widget (editor->priv->gui, + "line_key_combo"); + editor->priv->line_key_radio = glade_xml_get_widget (editor->priv->gui, + "line_key_radio"); + editor->priv->line_color_radio = glade_xml_get_widget (editor->priv->gui, + "line_color_radio"); + + gl_util_combo_box_add_text_model ( GTK_COMBO_BOX(editor->priv->line_key_combo)); + + /* Modify widgets based on configuration */ + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->line_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->line_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->line_key_combo, FALSE); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->line_width_spin), + gl_prefs->default_line_width); + gdk_color = gl_color_to_gdk_color (gl_prefs->default_line_color); + color_combo_set_color (COLOR_COMBO(editor->priv->line_color_combo), gdk_color); + g_free (gdk_color); + + /* Un-hide */ + gtk_widget_show_all (editor->priv->line_page_vbox); + + /* Connect signals */ + g_signal_connect_swapped (G_OBJECT (editor->priv->line_width_spin), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->line_color_combo), + "color_changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->line_key_combo), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->line_color_radio), + "toggled", + G_CALLBACK (line_radio_toggled_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->line_key_radio), + "toggled", + G_CALLBACK (line_radio_toggled_cb), + G_OBJECT (editor)); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Set line width. */ +/*****************************************************************************/ +void +gl_object_editor_set_line_width (glObjectEditor *editor, + gdouble width) +{ + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + /* Set widget values */ + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->line_width_spin), + width); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query line width. */ +/*****************************************************************************/ +gdouble +gl_object_editor_get_line_width (glObjectEditor *editor) +{ + gdouble w; + + gl_debug (DEBUG_EDITOR, "START"); + + w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(editor->priv->line_width_spin)); + + gl_debug (DEBUG_EDITOR, "END"); + + return w; +} + +/*****************************************************************************/ +/* Set line color. */ +/*****************************************************************************/ +void +gl_object_editor_set_line_color (glObjectEditor *editor, + gboolean merge_flag, + glColorNode *color_node) +{ + GdkColor *gdk_color; + + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + gl_debug (DEBUG_EDITOR, "color field %s(%d) / %X", color_node->key, color_node->field_flag, color_node->color); + gtk_widget_set_sensitive (editor->priv->line_key_radio, merge_flag); + + if ( color_node->color == GL_COLOR_NONE ) { + + color_combo_set_color_to_default (COLOR_COMBO(editor->priv->line_color_combo)); + + } else { + + gdk_color = gl_color_to_gdk_color (color_node->color); + color_combo_set_color (COLOR_COMBO(editor->priv->line_color_combo), + gdk_color); + g_free (gdk_color); + + } + + if (!color_node->field_flag) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->line_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->line_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->line_key_combo, FALSE); + + } else { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->line_key_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->line_color_combo, FALSE); + gtk_widget_set_sensitive (editor->priv->line_key_combo, TRUE); + + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (editor->priv->line_key_combo), + color_node->key); + } + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query line color. */ +/*****************************************************************************/ +glColorNode* +gl_object_editor_get_line_color (glObjectEditor *editor) +{ + GdkColor *gdk_color; + gboolean is_default; + glColorNode *color_node; + + gl_debug (DEBUG_EDITOR, "START"); + + color_node = gl_color_node_new_default (); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->line_key_radio))) { + color_node->field_flag = TRUE; + color_node->key = + gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->line_key_combo)); + } else { + color_node->field_flag = FALSE; + color_node->key = NULL; + gdk_color = color_combo_get_color (COLOR_COMBO(editor->priv->line_color_combo), + &is_default); + + if (!is_default) { + color_node->color = gl_color_from_gdk_color (gdk_color); + } + } + + gl_debug (DEBUG_EDITOR, "END"); + + return color_node; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. line color radio callback. */ +/*--------------------------------------------------------------------------*/ +static void +line_radio_toggled_cb (glObjectEditor *editor) +{ + if (editor->priv->stop_signals) return; + + gl_debug (DEBUG_EDITOR, "START"); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->line_color_radio))) { + gtk_widget_set_sensitive (editor->priv->line_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->line_key_combo, FALSE); + } else { + gtk_widget_set_sensitive (editor->priv->line_color_combo, FALSE); + gtk_widget_set_sensitive (editor->priv->line_key_combo, TRUE); + + } + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0); + + gl_debug (DEBUG_EDITOR, "END"); +} diff --git a/glabels2/src/object-editor-lsize-page.c b/glabels2/src/object-editor-lsize-page.c new file mode 100644 index 00000000..f2bbadfa --- /dev/null +++ b/glabels2/src/object-editor-lsize-page.c @@ -0,0 +1,254 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * object-editor.c: object properties editor module + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "object-editor.h" + +#include +#include +#include +#include + +#include "prefs.h" + +#include "object-editor-private.h" + +#include "debug.h" + +/*===========================================*/ +/* Private macros */ +/*===========================================*/ + +#define LENGTH(x,y) sqrt( (x)*(x) + (y)*(y) ) +#define ANGLE(x,y) ( (180.0/G_PI)*atan2( -(y), (x) ) ) +#define COMP_X(l,a) ( (l) * cos( (G_PI/180.0)*(a) ) ) +#define COMP_Y(l,a) ( -(l) * sin( (G_PI/180.0)*(a) ) ) + + +/*===========================================*/ +/* Private data types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + + + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Prepare line size page. */ +/*--------------------------------------------------------------------------*/ +void +gl_object_editor_prepare_lsize_page (glObjectEditor *editor) +{ + const gchar *units_string; + gdouble climb_rate; + gint digits; + + gl_debug (DEBUG_EDITOR, "START"); + + /* Extract widgets from XML tree. */ + editor->priv->lsize_page_vbox = + glade_xml_get_widget (editor->priv->gui, "lsize_page_vbox"); + editor->priv->lsize_r_spin = + glade_xml_get_widget (editor->priv->gui, "lsize_r_spin"); + editor->priv->lsize_theta_spin = + glade_xml_get_widget (editor->priv->gui, "lsize_theta_spin"); + editor->priv->lsize_r_units_label = + glade_xml_get_widget (editor->priv->gui, "lsize_r_units_label"); + + /* Get configuration information */ + units_string = gl_prefs_get_units_string (); + editor->priv->units_per_point = gl_prefs_get_units_per_point (); + climb_rate = gl_prefs_get_units_step_size (); + digits = gl_prefs_get_units_precision (); + + /* Modify widgets based on configuration */ + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(editor->priv->lsize_r_spin), digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(editor->priv->lsize_r_spin), + climb_rate, 10.0*climb_rate); + gtk_label_set_text (GTK_LABEL(editor->priv->lsize_r_units_label), units_string); + + /* Un-hide */ + gtk_widget_show_all (editor->priv->lsize_page_vbox); + + /* Connect signals */ + g_signal_connect_swapped (G_OBJECT (editor->priv->lsize_r_spin), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->lsize_theta_spin), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Set line size. */ +/*****************************************************************************/ +void +gl_object_editor_set_lsize (glObjectEditor *editor, + gdouble dx, + gdouble dy) +{ + gdouble r, theta; + + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + /* save a copy in internal units */ + editor->priv->dx = dx; + editor->priv->dy = dy; + + /* convert internal units to displayed units */ + gl_debug (DEBUG_EDITOR, "internal dx,dy = %g, %g", dx, dy); + dx *= editor->priv->units_per_point; + dy *= editor->priv->units_per_point; + gl_debug (DEBUG_EDITOR, "display dx,dy = %g, %g", dx, dy); + + r = LENGTH (dx, dy); + theta = ANGLE (dx, dy); + + /* Set widget values */ + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->lsize_r_spin), r); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->lsize_theta_spin), + theta); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Set maximum line size. */ +/*****************************************************************************/ +void +gl_object_editor_set_max_lsize (glObjectEditor *editor, + gdouble dx_max, + gdouble dy_max) +{ + gdouble tmp; + + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + /* save a copy in internal units */ + editor->priv->dx_max = dx_max; + editor->priv->dy_max = dy_max; + + /* convert internal units to displayed units */ + gl_debug (DEBUG_EDITOR, "internal dx_max,dy_max = %g, %g", dx_max, dy_max); + dx_max *= editor->priv->units_per_point; + dy_max *= editor->priv->units_per_point; + gl_debug (DEBUG_EDITOR, "display dx_max,dy_max = %g, %g", dx_max, dy_max); + + /* Set widget values */ + tmp = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->lsize_r_spin)); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (editor->priv->lsize_r_spin), + 0.0, 2.0*LENGTH (dx_max, dy_max)); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->lsize_r_spin), tmp); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query line size. */ +/*****************************************************************************/ +void +gl_object_editor_get_lsize (glObjectEditor *editor, + gdouble *dx, + gdouble *dy) +{ + gdouble r, theta; + + gl_debug (DEBUG_EDITOR, "START"); + + /* Get values from widgets */ + r = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->lsize_r_spin)); + theta = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->lsize_theta_spin)); + + /* convert everything back to our internal units (points) */ + r /= editor->priv->units_per_point; + + *dx = COMP_X (r, theta); + *dy = COMP_Y (r, theta); + + /* save a copy in internal units */ + editor->priv->dx = *dx; + editor->priv->dy = *dy; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* PRIVATE. Prefs changed callback. Update units related items. */ +/*****************************************************************************/ +void +lsize_prefs_changed_cb (glObjectEditor *editor) +{ + const gchar *units_string; + gdouble climb_rate; + gint digits; + + gl_debug (DEBUG_EDITOR, "START"); + + /* Get new configuration information */ + units_string = gl_prefs_get_units_string (); + editor->priv->units_per_point = gl_prefs_get_units_per_point (); + climb_rate = gl_prefs_get_units_step_size (); + digits = gl_prefs_get_units_precision (); + + /* Update characteristics of r_spin */ + editor->priv->stop_signals = TRUE; + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(editor->priv->lsize_r_spin), + digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(editor->priv->lsize_r_spin), + climb_rate, 10.0*climb_rate); + editor->priv->stop_signals = FALSE; + + /* Update r_units_label */ + gtk_label_set_text (GTK_LABEL(editor->priv->lsize_r_units_label), + units_string); + + /* Update values of r_spin/theta_spin */ + gl_object_editor_set_lsize (editor, + editor->priv->dx, + editor->priv->dy); + gl_object_editor_set_max_lsize (editor, + editor->priv->dx_max, + editor->priv->dy_max); + + gl_debug (DEBUG_EDITOR, "END"); +} + diff --git a/glabels2/src/object-editor-position-page.c b/glabels2/src/object-editor-position-page.c new file mode 100644 index 00000000..e72036e0 --- /dev/null +++ b/glabels2/src/object-editor-position-page.c @@ -0,0 +1,253 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * object-editor.c: object properties editor module + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "object-editor.h" + +#include +#include +#include +#include + +#include "prefs.h" + +#include "object-editor-private.h" + +#include "debug.h" + +/*===========================================*/ +/* Private macros */ +/*===========================================*/ + +/*===========================================*/ +/* Private data types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Prepare position page. */ +/*--------------------------------------------------------------------------*/ +void +gl_object_editor_prepare_position_page (glObjectEditor *editor) +{ + const gchar *units_string; + gdouble climb_rate; + gint digits; + + gl_debug (DEBUG_EDITOR, "START"); + + /* Extract widgets from XML tree. */ + editor->priv->pos_page_vbox = glade_xml_get_widget (editor->priv->gui, + "pos_page_vbox"); + editor->priv->pos_x_spin = glade_xml_get_widget (editor->priv->gui, + "pos_x_spin"); + editor->priv->pos_y_spin = glade_xml_get_widget (editor->priv->gui, + "pos_y_spin"); + editor->priv->pos_x_units_label = glade_xml_get_widget (editor->priv->gui, + "pos_x_units_label"); + editor->priv->pos_y_units_label = glade_xml_get_widget (editor->priv->gui, + "pos_y_units_label"); + + /* Get configuration information */ + units_string = gl_prefs_get_units_string (); + editor->priv->units_per_point = gl_prefs_get_units_per_point (); + climb_rate = gl_prefs_get_units_step_size (); + digits = gl_prefs_get_units_precision (); + + /* Modify widgets based on configuration */ + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(editor->priv->pos_x_spin), digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(editor->priv->pos_x_spin), + climb_rate, 10.0*climb_rate); + gtk_label_set_text (GTK_LABEL(editor->priv->pos_x_units_label), units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(editor->priv->pos_y_spin), digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(editor->priv->pos_y_spin), + climb_rate, 10.0*climb_rate); + gtk_label_set_text (GTK_LABEL(editor->priv->pos_y_units_label), units_string); + + /* Un-hide */ + gtk_widget_show_all (editor->priv->pos_page_vbox); + + /* Connect signals */ + g_signal_connect_swapped (G_OBJECT (editor->priv->pos_x_spin), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->pos_y_spin), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Set position. */ +/*****************************************************************************/ +void +gl_object_editor_set_position (glObjectEditor *editor, + gdouble x, + gdouble y) +{ + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + /* save a copy in internal units */ + editor->priv->x = x; + editor->priv->y = y; + + /* convert internal units to displayed units */ + gl_debug (DEBUG_EDITOR, "internal x,y = %g, %g", x, y); + x *= editor->priv->units_per_point; + y *= editor->priv->units_per_point; + gl_debug (DEBUG_EDITOR, "display x,y = %g, %g", x, y); + + /* Set widget values */ + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->pos_x_spin), x); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->pos_y_spin), y); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Set maximum position. */ +/*****************************************************************************/ +void +gl_object_editor_set_max_position (glObjectEditor *editor, + gdouble x_max, + gdouble y_max) +{ + gdouble tmp; + + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + /* save a copy in internal units */ + editor->priv->x_max = x_max; + editor->priv->y_max = y_max; + + /* convert internal units to displayed units */ + gl_debug (DEBUG_EDITOR, "internal x_max,y_max = %g, %g", x_max, y_max); + x_max *= editor->priv->units_per_point; + y_max *= editor->priv->units_per_point; + gl_debug (DEBUG_EDITOR, "display x_max,y_max = %g, %g", x_max, y_max); + + /* Set widget values */ + tmp = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->pos_x_spin)); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (editor->priv->pos_x_spin), + -x_max, 2.0*x_max); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->pos_x_spin), tmp); + tmp = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->pos_y_spin)); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (editor->priv->pos_y_spin), + -y_max, 2.0*y_max); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->pos_y_spin), tmp); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query position. */ +/*****************************************************************************/ +void +gl_object_editor_get_position (glObjectEditor *editor, + gdouble *x, + gdouble *y) +{ + gl_debug (DEBUG_EDITOR, "START"); + + /* Get values from widgets */ + *x = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->pos_x_spin)); + *y = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->pos_y_spin)); + + /* convert everything back to our internal units (points) */ + *x /= editor->priv->units_per_point; + *y /= editor->priv->units_per_point; + + /* save a copy in internal units */ + editor->priv->x = *x; + editor->priv->y = *y; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* PRIVATE. Prefs changed callback. Update units related items. */ +/*****************************************************************************/ +void +position_prefs_changed_cb (glObjectEditor *editor) +{ + const gchar *units_string; + gdouble climb_rate; + gint digits; + + gl_debug (DEBUG_EDITOR, "START"); + + /* Get new configuration information */ + units_string = gl_prefs_get_units_string (); + editor->priv->units_per_point = gl_prefs_get_units_per_point (); + climb_rate = gl_prefs_get_units_step_size (); + digits = gl_prefs_get_units_precision (); + + /* Update characteristics of x_spin/y_spin */ + editor->priv->stop_signals = TRUE; + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(editor->priv->pos_x_spin), + digits); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(editor->priv->pos_y_spin), + digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(editor->priv->pos_x_spin), + climb_rate, 10.0*climb_rate); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(editor->priv->pos_y_spin), + climb_rate, 10.0*climb_rate); + editor->priv->stop_signals = FALSE; + + /* Update units_labels */ + gtk_label_set_text (GTK_LABEL(editor->priv->pos_x_units_label), + units_string); + gtk_label_set_text (GTK_LABEL(editor->priv->pos_y_units_label), + units_string); + + /* Update values of x_spin/y_spin */ + gl_object_editor_set_position (editor, + editor->priv->x, + editor->priv->y); + gl_object_editor_set_max_position (editor, + editor->priv->x_max, + editor->priv->y_max); + + gl_debug (DEBUG_EDITOR, "END"); +} + diff --git a/glabels2/src/object-editor-private.h b/glabels2/src/object-editor-private.h new file mode 100644 index 00000000..3a69497b --- /dev/null +++ b/glabels2/src/object-editor-private.h @@ -0,0 +1,202 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * object-editor-private.h: object properties editor module private header file + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __OBJECT_EDITOR_PRIVATE_H__ +#define __OBJECT_EDITOR_PRIVATE_H__ + +#include +#include + +G_BEGIN_DECLS + +struct _glObjectEditorPrivate { + + GladeXML *gui; + GtkWidget *editor_vbox; + + gdouble units_per_point; + + GtkWidget *title_image; + GtkWidget *title_label; + GtkWidget *notebook; + + GtkWidget *pos_page_vbox; + GtkWidget *pos_x_spin; + GtkWidget *pos_y_spin; + GtkWidget *pos_x_units_label; + GtkWidget *pos_y_units_label; + gdouble x; + gdouble y; + gdouble x_max; + gdouble y_max; + + GtkWidget *size_page_vbox; + GtkWidget *size_w_spin; + GtkWidget *size_h_spin; + GtkWidget *size_w_units_label; + GtkWidget *size_h_units_label; + GtkWidget *size_aspect_checkbutton; + GtkWidget *size_reset_image_button; + gdouble size_aspect_ratio; + gdouble w; + gdouble h; + gdouble w_max; + gdouble h_max; + gdouble w_base; + gdouble h_base; + + GtkWidget *lsize_page_vbox; + GtkWidget *lsize_r_spin; + GtkWidget *lsize_theta_spin; + GtkWidget *lsize_r_units_label; + gdouble dx; + gdouble dy; + gdouble dx_max; + gdouble dy_max; + + GtkWidget *fill_page_vbox; + GtkWidget *fill_color_combo; + GtkWidget *fill_key_combo; + GtkWidget *fill_key_radio; + GtkWidget *fill_color_radio; + + GtkWidget *line_page_vbox; + GtkWidget *line_width_spin; + GtkWidget *line_color_radio; + GtkWidget *line_color_combo; + GtkWidget *line_key_radio; + GtkWidget *line_key_combo; + + GtkWidget *img_page_vbox; + GtkWidget *img_file_radio; + GtkWidget *img_key_radio; + GtkWidget *img_file_button; + GtkWidget *img_key_combo; + + GtkWidget *text_page_vbox; + GtkWidget *text_family_combo; + GtkWidget *text_size_spin; + GtkWidget *text_bold_toggle; + GtkWidget *text_italic_toggle; + GtkWidget *text_color_radio; + GtkWidget *text_color_combo; + GtkWidget *text_color_key_radio; + GtkWidget *text_color_key_combo; + GtkWidget *text_left_toggle; + GtkWidget *text_center_toggle; + GtkWidget *text_right_toggle; + GtkWidget *text_line_spacing_spin; + GtkWidget *text_auto_shrink_check; + + GtkWidget *edit_page_vbox; + GtkWidget *edit_text_view; + GtkWidget *edit_key_label; + GtkWidget *edit_key_combo; + GtkWidget *edit_insert_field_button; + + GtkWidget *bc_page_vbox; + GtkWidget *bc_style_combo; + GtkWidget *bc_text_check; + GtkWidget *bc_cs_check; + GtkWidget *bc_color_radio; + GtkWidget *bc_color_combo; + GtkWidget *bc_key_radio; + GtkWidget *bc_key_combo; + + GtkWidget *data_page_vbox; + GtkWidget *data_literal_radio; + GtkWidget *data_key_radio; + GtkWidget *data_text_entry; + GtkWidget *data_key_combo; + GtkWidget *data_format_label; + GtkWidget *data_ex_label; + GtkWidget *data_digits_label; + GtkWidget *data_digits_spin; + gboolean data_format_fixed_flag; + + GtkWidget *shadow_page_vbox; + GtkWidget *shadow_enable_check; + GtkWidget *shadow_controls_table; + GtkWidget *shadow_x_spin; + GtkWidget *shadow_y_spin; + GtkWidget *shadow_x_units_label; + GtkWidget *shadow_y_units_label; + GtkWidget *shadow_color_radio; + GtkWidget *shadow_key_radio; + GtkWidget *shadow_color_combo; + GtkWidget *shadow_key_combo; + GtkWidget *shadow_opacity_spin; + gdouble shadow_x; + gdouble shadow_y; + gdouble shadow_x_max; + gdouble shadow_y_max; + + /* Prevent recursion */ + gboolean stop_signals; +}; + +enum { + CHANGED, + SIZE_CHANGED, + LAST_SIGNAL +}; + +extern gint gl_object_editor_signals[LAST_SIGNAL]; + + + +void gl_object_editor_prepare_position_page (glObjectEditor *editor); + +void gl_object_editor_prepare_size_page (glObjectEditor *editor, + glObjectEditorOption option); + +void gl_object_editor_prepare_lsize_page (glObjectEditor *editor); + +void gl_object_editor_prepare_fill_page (glObjectEditor *editor); + +void gl_object_editor_prepare_line_page (glObjectEditor *editor); + +void gl_object_editor_prepare_image_page (glObjectEditor *editor); + +void gl_object_editor_prepare_text_page (glObjectEditor *editor); + +void gl_object_editor_prepare_edit_page (glObjectEditor *editor); + +void gl_object_editor_prepare_bc_page (glObjectEditor *editor); + +void gl_object_editor_prepare_data_page (glObjectEditor *editor); + +void gl_object_editor_prepare_shadow_page (glObjectEditor *editor); + + +void gl_object_editor_changed_cb (glObjectEditor *editor); +void gl_object_editor_size_changed_cb (glObjectEditor *editor); + +void lsize_prefs_changed_cb (glObjectEditor *editor); +void size_prefs_changed_cb (glObjectEditor *editor); +void position_prefs_changed_cb (glObjectEditor *editor); +void shadow_prefs_changed_cb (glObjectEditor *editor); + +G_END_DECLS + +#endif diff --git a/glabels2/src/object-editor-shadow-page.c b/glabels2/src/object-editor-shadow-page.c new file mode 100644 index 00000000..1396d36b --- /dev/null +++ b/glabels2/src/object-editor-shadow-page.c @@ -0,0 +1,489 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * object-editor.c: object properties editor module + * + * Copyright (C) 2006 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "object-editor.h" + +#include +#include +#include +#include +#include +#include + +#include "prefs.h" +#include "mygal/widget-color-combo.h" +#include "color.h" +#include "util.h" + +#include "object-editor-private.h" + +#include "debug.h" + +/*===========================================*/ +/* Private macros */ +/*===========================================*/ + +/*===========================================*/ +/* Private data types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void shadow_enable_check_toggled_cb (glObjectEditor *editor); +static void shadow_color_radio_toggled_cb (glObjectEditor *editor); + + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Prepare shadow page. */ +/*--------------------------------------------------------------------------*/ +void +gl_object_editor_prepare_shadow_page (glObjectEditor *editor) +{ + const gchar *units_string; + gdouble climb_rate; + gint digits; + + gl_debug (DEBUG_EDITOR, "START"); + + /* Extract widgets from XML tree. */ + editor->priv->shadow_page_vbox + = glade_xml_get_widget (editor->priv->gui, "shadow_page_vbox"); + editor->priv->shadow_enable_check + = glade_xml_get_widget (editor->priv->gui, "shadow_enable_check"); + editor->priv->shadow_controls_table + = glade_xml_get_widget (editor->priv->gui, "shadow_controls_table"); + editor->priv->shadow_x_spin + = glade_xml_get_widget (editor->priv->gui, "shadow_x_spin"); + editor->priv->shadow_y_spin + = glade_xml_get_widget (editor->priv->gui, "shadow_y_spin"); + editor->priv->shadow_x_units_label + = glade_xml_get_widget (editor->priv->gui, "shadow_x_units_label"); + editor->priv->shadow_y_units_label + = glade_xml_get_widget (editor->priv->gui, "shadow_y_units_label"); + editor->priv->shadow_color_radio + = glade_xml_get_widget (editor->priv->gui, "shadow_color_radio"); + editor->priv->shadow_key_radio + = glade_xml_get_widget (editor->priv->gui, "shadow_key_radio"); + editor->priv->shadow_color_combo + = glade_xml_get_widget (editor->priv->gui, "shadow_color_combo"); + editor->priv->shadow_key_combo + = glade_xml_get_widget (editor->priv->gui, "shadow_key_combo"); + editor->priv->shadow_opacity_spin + = glade_xml_get_widget (editor->priv->gui, "shadow_opacity_spin"); + + gl_util_combo_box_add_text_model ( GTK_COMBO_BOX(editor->priv->shadow_key_combo)); + + /* Get configuration information */ + units_string = gl_prefs_get_units_string (); + editor->priv->units_per_point = gl_prefs_get_units_per_point (); + climb_rate = gl_prefs_get_units_step_size (); + digits = gl_prefs_get_units_precision (); + + /* Modify widgets based on configuration */ + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(editor->priv->shadow_x_spin), digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(editor->priv->shadow_x_spin), + climb_rate, 10.0*climb_rate); + gtk_label_set_text (GTK_LABEL(editor->priv->shadow_x_units_label), units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(editor->priv->shadow_y_spin), digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(editor->priv->shadow_y_spin), + climb_rate, 10.0*climb_rate); + gtk_label_set_text (GTK_LABEL(editor->priv->shadow_y_units_label), units_string); + + /* Un-hide */ + gtk_widget_show_all (editor->priv->shadow_page_vbox); + + /* Connect signals */ + g_signal_connect_swapped (G_OBJECT (editor->priv->shadow_enable_check), + "toggled", + G_CALLBACK (shadow_enable_check_toggled_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->shadow_x_spin), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->shadow_y_spin), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->shadow_color_combo), + "color_changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->shadow_key_combo), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->shadow_color_radio), + "toggled", + G_CALLBACK (shadow_color_radio_toggled_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->shadow_key_radio), + "toggled", + G_CALLBACK (shadow_color_radio_toggled_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->shadow_opacity_spin), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Set shadow parameters. */ +/*****************************************************************************/ +void +gl_object_editor_set_shadow_state (glObjectEditor *editor, + gboolean state) +{ + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->shadow_enable_check), + state); + gtk_widget_set_sensitive (editor->priv->shadow_controls_table, state); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +void +gl_object_editor_set_shadow_offset (glObjectEditor *editor, + gdouble x, + gdouble y) +{ + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + /* save a copy in internal units */ + editor->priv->shadow_x = x; + editor->priv->shadow_y = y; + + /* convert internal units to displayed units */ + gl_debug (DEBUG_EDITOR, "internal x,y = %g, %g", x, y); + x *= editor->priv->units_per_point; + y *= editor->priv->units_per_point; + gl_debug (DEBUG_EDITOR, "display x,y = %g, %g", x, y); + + /* Set widget values */ + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->shadow_x_spin), x); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->shadow_y_spin), y); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +void +gl_object_editor_set_shadow_color (glObjectEditor *editor, + gboolean merge_flag, + glColorNode *color_node) +{ + GdkColor *gdk_color; + + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + gtk_widget_set_sensitive (editor->priv->shadow_key_radio, merge_flag); + + if ( color_node->color == GL_COLOR_NONE ) { + + color_combo_set_color_to_default (COLOR_COMBO(editor->priv->shadow_color_combo)); + + } else { + + gdk_color = gl_color_to_gdk_color (color_node->color); + color_combo_set_color (COLOR_COMBO(editor->priv->shadow_color_combo), + gdk_color); + g_free (gdk_color); + + } + + if (!color_node->field_flag) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->shadow_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->shadow_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->shadow_key_combo, FALSE); + + } else { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->shadow_key_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->shadow_color_combo, FALSE); + gtk_widget_set_sensitive (editor->priv->shadow_key_combo, TRUE); + + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (editor->priv->shadow_key_combo), + color_node->key); + } + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +void +gl_object_editor_set_shadow_opacity (glObjectEditor *editor, + gdouble alpha) +{ + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->shadow_opacity_spin), + alpha * 100.0); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + + +/*****************************************************************************/ +/* Set maximum shadow offset. */ +/*****************************************************************************/ +void +gl_object_editor_set_max_shadow_offset (glObjectEditor *editor, + gdouble x_max, + gdouble y_max) +{ + gdouble tmp; + + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + /* save a copy in internal units */ + editor->priv->shadow_x_max = x_max; + editor->priv->shadow_y_max = y_max; + + /* convert internal units to displayed units */ + gl_debug (DEBUG_EDITOR, "internal x_max,y_max = %g, %g", x_max, y_max); + x_max *= editor->priv->units_per_point; + y_max *= editor->priv->units_per_point; + gl_debug (DEBUG_EDITOR, "display x_max,y_max = %g, %g", x_max, y_max); + + /* Set widget values */ + tmp = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->shadow_x_spin)); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (editor->priv->shadow_x_spin), + -x_max, x_max); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->shadow_x_spin), tmp); + tmp = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->shadow_y_spin)); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (editor->priv->shadow_y_spin), + -y_max, y_max); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->shadow_y_spin), tmp); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query shadow parameters. */ +/*****************************************************************************/ +gboolean +gl_object_editor_get_shadow_state (glObjectEditor *editor) +{ + gboolean state; + + gl_debug (DEBUG_EDITOR, "START"); + + state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->shadow_enable_check)); + + gl_debug (DEBUG_EDITOR, "END"); + + return state; +} + +void +gl_object_editor_get_shadow_offset (glObjectEditor *editor, + gdouble *x, + gdouble *y) +{ + gl_debug (DEBUG_EDITOR, "START"); + + /* Get values from widgets */ + *x = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->shadow_x_spin)); + *y = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->shadow_y_spin)); + + /* convert everything back to our internal units (points) */ + *x /= editor->priv->units_per_point; + *y /= editor->priv->units_per_point; + + /* save a copy in internal units */ + editor->priv->shadow_x = *x; + editor->priv->shadow_y = *y; + + gl_debug (DEBUG_EDITOR, "END"); +} + +glColorNode* +gl_object_editor_get_shadow_color (glObjectEditor *editor) +{ + GdkColor *gdk_color; + gboolean is_default; + glColorNode *color_node; + + gl_debug (DEBUG_EDITOR, "START"); + + color_node = gl_color_node_new_default (); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->shadow_key_radio))) { + color_node->field_flag = TRUE; + color_node->key = + gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->shadow_key_combo)); + } else { + color_node->field_flag = FALSE; + color_node->key = NULL; + gdk_color = color_combo_get_color (COLOR_COMBO(editor->priv->shadow_color_combo), + &is_default); + + if (!is_default) { + color_node->color = gl_color_from_gdk_color (gdk_color); + } + } + + gl_debug (DEBUG_EDITOR, "END"); + + return color_node; +} + +gdouble +gl_object_editor_get_shadow_opacity (glObjectEditor *editor) +{ + gdouble alpha; + + gl_debug (DEBUG_EDITOR, "START"); + + alpha = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->shadow_opacity_spin)); + + gl_debug (DEBUG_EDITOR, "END"); + + return alpha / 100.0; +} + + +/*****************************************************************************/ +/* PRIVATE. Prefs changed callback. Update units related items. */ +/*****************************************************************************/ +void +shadow_prefs_changed_cb (glObjectEditor *editor) +{ + const gchar *units_string; + gdouble climb_rate; + gint digits; + + gl_debug (DEBUG_EDITOR, "START"); + + /* Get new configuration information */ + units_string = gl_prefs_get_units_string (); + editor->priv->units_per_point = gl_prefs_get_units_per_point (); + climb_rate = gl_prefs_get_units_step_size (); + digits = gl_prefs_get_units_precision (); + + /* Update characteristics of x_spin/y_spin */ + editor->priv->stop_signals = TRUE; + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(editor->priv->shadow_x_spin), + digits); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(editor->priv->shadow_y_spin), + digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(editor->priv->shadow_x_spin), + climb_rate, 10.0*climb_rate); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(editor->priv->shadow_y_spin), + climb_rate, 10.0*climb_rate); + editor->priv->stop_signals = FALSE; + + /* Update units_labels */ + gtk_label_set_text (GTK_LABEL(editor->priv->shadow_x_units_label), + units_string); + gtk_label_set_text (GTK_LABEL(editor->priv->shadow_y_units_label), + units_string); + + /* Update values of x_spin/y_spin */ + gl_object_editor_set_shadow_offset (editor, + editor->priv->shadow_x, + editor->priv->shadow_y); + gl_object_editor_set_max_shadow_offset (editor, + editor->priv->shadow_x_max, + editor->priv->shadow_y_max); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. shadow enable check callback. */ +/*--------------------------------------------------------------------------*/ +static void +shadow_enable_check_toggled_cb (glObjectEditor *editor) +{ + gboolean state; + + if (editor->priv->stop_signals) return; + + gl_debug (DEBUG_EDITOR, "START"); + + state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->shadow_enable_check)); + + gtk_widget_set_sensitive (editor->priv->shadow_controls_table, state); + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0); + + gl_debug (DEBUG_EDITOR, "END"); +} + + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. shadow color radio callback. */ +/*--------------------------------------------------------------------------*/ +static void +shadow_color_radio_toggled_cb (glObjectEditor *editor) +{ + if (editor->priv->stop_signals) return; + + gl_debug (DEBUG_EDITOR, "START"); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->shadow_color_radio))) { + gtk_widget_set_sensitive (editor->priv->shadow_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->shadow_key_combo, FALSE); + } else { + gtk_widget_set_sensitive (editor->priv->shadow_color_combo, FALSE); + gtk_widget_set_sensitive (editor->priv->shadow_key_combo, TRUE); + + } + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0); + + gl_debug (DEBUG_EDITOR, "END"); +} diff --git a/glabels2/src/object-editor-size-page.c b/glabels2/src/object-editor-size-page.c new file mode 100644 index 00000000..4d8b1700 --- /dev/null +++ b/glabels2/src/object-editor-size-page.c @@ -0,0 +1,445 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * object-editor.c: object properties editor module + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "object-editor.h" + +#include +#include +#include +#include + +#include "prefs.h" +#include "wdgt-chain-button.h" + +#include "object-editor-private.h" + +#include "debug.h" + +/*===========================================*/ +/* Private macros */ +/*===========================================*/ + +/*===========================================*/ +/* Private data types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void aspect_toggle_cb (glObjectEditor *editor); +static void size_reset_cb (glObjectEditor *editor); +static void w_spin_cb (glObjectEditor *editor); +static void h_spin_cb (glObjectEditor *editor); + + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Prepare size page. */ +/*--------------------------------------------------------------------------*/ +void +gl_object_editor_prepare_size_page (glObjectEditor *editor, + glObjectEditorOption option) +{ + const gchar *units_string; + gdouble climb_rate; + gint digits; + + gl_debug (DEBUG_EDITOR, "START"); + + /* Extract widgets from XML tree. */ + editor->priv->size_page_vbox = + glade_xml_get_widget (editor->priv->gui, "size_page_vbox"); + editor->priv->size_w_spin = + glade_xml_get_widget (editor->priv->gui, "size_w_spin"); + editor->priv->size_h_spin = + glade_xml_get_widget (editor->priv->gui, "size_h_spin"); + editor->priv->size_w_units_label = + glade_xml_get_widget (editor->priv->gui, "size_w_units_label"); + editor->priv->size_h_units_label = + glade_xml_get_widget (editor->priv->gui, "size_h_units_label"); + editor->priv->size_aspect_checkbutton = + glade_xml_get_widget (editor->priv->gui, "size_aspect_checkbutton"); + editor->priv->size_reset_image_button = + glade_xml_get_widget (editor->priv->gui, "size_reset_image_button"); + + /* Get configuration information */ + units_string = gl_prefs_get_units_string (); + editor->priv->units_per_point = gl_prefs_get_units_per_point (); + climb_rate = gl_prefs_get_units_step_size (); + digits = gl_prefs_get_units_precision (); + + /* Modify widgets based on configuration */ + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(editor->priv->size_w_spin), digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(editor->priv->size_w_spin), + climb_rate, 10.0*climb_rate); + gtk_label_set_text (GTK_LABEL(editor->priv->size_w_units_label), units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(editor->priv->size_h_spin), digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(editor->priv->size_h_spin), + climb_rate, 10.0*climb_rate); + gtk_label_set_text (GTK_LABEL(editor->priv->size_h_units_label), units_string); + + /* Un-hide */ + gtk_widget_show_all (editor->priv->size_page_vbox); + if (option != GL_OBJECT_EDITOR_SIZE_IMAGE_PAGE) { + gtk_widget_hide (editor->priv->size_reset_image_button); + } + + /* Connect signals */ + g_signal_connect_swapped (G_OBJECT (editor->priv->size_aspect_checkbutton), + "toggled", + G_CALLBACK (aspect_toggle_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->size_w_spin), + "changed", + G_CALLBACK (w_spin_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->size_h_spin), + "changed", + G_CALLBACK (h_spin_cb), + G_OBJECT (editor)); + + if (option == GL_OBJECT_EDITOR_SIZE_IMAGE_PAGE) { + g_signal_connect_swapped (G_OBJECT (editor->priv->size_reset_image_button), + "clicked", + G_CALLBACK (size_reset_cb), + G_OBJECT (editor)); + } + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Maintain aspect ratio checkbox callback. */ +/*--------------------------------------------------------------------------*/ +static void +aspect_toggle_cb (glObjectEditor *editor) +{ + glWdgtChainButton *toggle; + gdouble w, h; + + if (editor->priv->stop_signals) return; + + gl_debug (DEBUG_EDITOR, "START"); + + toggle = GL_WDGT_CHAIN_BUTTON (editor->priv->size_aspect_checkbutton); + + if (gl_wdgt_chain_button_get_active (toggle)) { + + w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(editor->priv->size_w_spin)); + h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(editor->priv->size_h_spin)); + + editor->priv->size_aspect_ratio = h / w; + + } + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. W spin button changed callback. */ +/*--------------------------------------------------------------------------*/ +static void +w_spin_cb (glObjectEditor *editor) +{ + gdouble w, h; + glWdgtChainButton *toggle; + + if (editor->priv->stop_signals) return; + + gl_debug (DEBUG_EDITOR, "START"); + + toggle = GL_WDGT_CHAIN_BUTTON (editor->priv->size_aspect_checkbutton); + + if (gl_wdgt_chain_button_get_active (toggle)) { + + w = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->size_w_spin)); + + h = w * editor->priv->size_aspect_ratio; + + /* Update our sibling control, blocking recursion. */ + editor->priv->stop_signals = TRUE; + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->size_h_spin), h); + editor->priv->stop_signals = FALSE; + } + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0); + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[SIZE_CHANGED], 0); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. H spin button changed callback. */ +/*--------------------------------------------------------------------------*/ +static void +h_spin_cb (glObjectEditor *editor) +{ + gdouble w, h; + glWdgtChainButton *toggle; + + if (editor->priv->stop_signals) return; + + gl_debug (DEBUG_EDITOR, "START"); + + toggle = GL_WDGT_CHAIN_BUTTON (editor->priv->size_aspect_checkbutton); + + if (gl_wdgt_chain_button_get_active (toggle)) { + + h = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->size_h_spin)); + + w = h / editor->priv->size_aspect_ratio; + + /* Update our sibling control, blocking recursion. */ + editor->priv->stop_signals = TRUE; + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->size_w_spin), w); + editor->priv->stop_signals = FALSE; + } + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0); + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[SIZE_CHANGED], 0); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Reset image size callback. */ +/*--------------------------------------------------------------------------*/ +static void +size_reset_cb (glObjectEditor *editor) +{ + gdouble w_base, h_base; + gdouble w_max, h_max; + gdouble aspect_ratio; + + if (editor->priv->stop_signals) return; + + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + w_base = editor->priv->w_base; + h_base = editor->priv->h_base; + + w_max = editor->priv->w_max; + h_max = editor->priv->h_max; + + if ( (w_base > w_max) || (h_base > h_max) ) { + + aspect_ratio = h_base / w_base; + + if ( h_max > w_max*aspect_ratio ) { + w_base = w_max; + h_base = w_max * aspect_ratio; + + } else { + w_base = h_max / aspect_ratio; + h_base = h_max; + } + } + + w_base *= editor->priv->units_per_point; + h_base *= editor->priv->units_per_point; + + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->size_w_spin), + w_base); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->size_h_spin), + h_base); + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0); + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[SIZE_CHANGED], 0); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Set size. */ +/*****************************************************************************/ +void +gl_object_editor_set_size (glObjectEditor *editor, + gdouble w, + gdouble h) +{ + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + /* save a copy in internal units */ + editor->priv->w = w; + editor->priv->h = h; + + /* convert internal units to displayed units */ + gl_debug (DEBUG_EDITOR, "internal w,h = %g, %g", w, h); + w *= editor->priv->units_per_point; + h *= editor->priv->units_per_point; + gl_debug (DEBUG_EDITOR, "display w,h = %g, %g", w, h); + + /* Set widget values */ + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->size_w_spin), w); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->size_h_spin), h); + + /* Update aspect ratio */ + editor->priv->size_aspect_ratio = h / w; + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Set maximum size. */ +/*****************************************************************************/ +void +gl_object_editor_set_max_size (glObjectEditor *editor, + gdouble w_max, + gdouble h_max) +{ + gdouble tmp; + + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + /* save a copy in internal units */ + editor->priv->w_max = w_max; + editor->priv->h_max = h_max; + + /* convert internal units to displayed units */ + gl_debug (DEBUG_EDITOR, "internal w_max,h_max = %g, %g", w_max, h_max); + w_max *= editor->priv->units_per_point; + h_max *= editor->priv->units_per_point; + gl_debug (DEBUG_EDITOR, "display w_max,h_max = %g, %g", w_max, h_max); + + /* Set widget values */ + tmp = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->size_w_spin)); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (editor->priv->size_w_spin), + 0.0, 2.0*w_max); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->size_w_spin), tmp); + tmp = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->size_h_spin)); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (editor->priv->size_h_spin), + 0.0, 2.0*h_max); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->size_h_spin), tmp); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Set base or natural size of image. */ +/*****************************************************************************/ +void +gl_object_editor_set_base_size (glObjectEditor *editor, + gdouble w_base, + gdouble h_base) +{ + gl_debug (DEBUG_EDITOR, "Setting w_base = %g", w_base); + gl_debug (DEBUG_EDITOR, "Setting h_base = %g", h_base); + + editor->priv->w_base = w_base; + editor->priv->h_base = h_base; +} + +/*****************************************************************************/ +/* Query size. */ +/*****************************************************************************/ +void +gl_object_editor_get_size (glObjectEditor *editor, + gdouble *w, + gdouble *h) +{ + gl_debug (DEBUG_EDITOR, "START"); + + + /* Get values from widgets */ + *w = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->size_w_spin)); + *h = gtk_spin_button_get_value (GTK_SPIN_BUTTON (editor->priv->size_h_spin)); + + /* convert everything back to our internal units (points) */ + *w /= editor->priv->units_per_point; + *h /= editor->priv->units_per_point; + + /* save a copy in internal units */ + editor->priv->w = *w; + editor->priv->h = *h; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* PRIVATE. Prefs changed callback. Update units related items. */ +/*****************************************************************************/ +void +size_prefs_changed_cb (glObjectEditor *editor) +{ + const gchar *units_string; + gdouble climb_rate; + gint digits; + + gl_debug (DEBUG_EDITOR, "START"); + + /* Get new configuration information */ + units_string = gl_prefs_get_units_string (); + editor->priv->units_per_point = gl_prefs_get_units_per_point (); + climb_rate = gl_prefs_get_units_step_size (); + digits = gl_prefs_get_units_precision (); + + /* Update characteristics of w_spin/h_spin */ + editor->priv->stop_signals = TRUE; + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(editor->priv->size_w_spin), + digits); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(editor->priv->size_h_spin), + digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(editor->priv->size_w_spin), + climb_rate, 10.0*climb_rate); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(editor->priv->size_h_spin), + climb_rate, 10.0*climb_rate); + editor->priv->stop_signals = FALSE; + + /* Update units_labels */ + gtk_label_set_text (GTK_LABEL(editor->priv->size_w_units_label), + units_string); + gtk_label_set_text (GTK_LABEL(editor->priv->size_h_units_label), + units_string); + + /* Update values of w_spin/h_spin */ + gl_object_editor_set_size (editor, + editor->priv->w, + editor->priv->h); + gl_object_editor_set_max_size (editor, + editor->priv->w_max, + editor->priv->h_max); + + gl_debug (DEBUG_EDITOR, "END"); +} + diff --git a/glabels2/src/object-editor-text-page.c b/glabels2/src/object-editor-text-page.c new file mode 100644 index 00000000..93aad0a4 --- /dev/null +++ b/glabels2/src/object-editor-text-page.c @@ -0,0 +1,629 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * object-editor.c: object properties editor module + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "object-editor.h" + +#include +#include +#include +#include +#include + +#include "prefs.h" +#include "mygal/widget-color-combo.h" +#include "color.h" +#include "util.h" + +#include "object-editor-private.h" + +#include "debug.h" + +/*===========================================*/ +/* Private macros */ +/*===========================================*/ + +/*===========================================*/ +/* Private data types */ +/*===========================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void align_toggle_cb (GtkToggleButton *toggle, + glObjectEditor *editor); +static void text_radio_toggled_cb (glObjectEditor *editor); + + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Prepare size page. */ +/*--------------------------------------------------------------------------*/ +void +gl_object_editor_prepare_text_page (glObjectEditor *editor) +{ + GList *family_names = NULL; + + gl_debug (DEBUG_EDITOR, "START"); + + /* Extract widgets from XML tree. */ + editor->priv->text_page_vbox = + glade_xml_get_widget (editor->priv->gui, "text_page_vbox"); + editor->priv->text_family_combo = + glade_xml_get_widget (editor->priv->gui, "text_family_combo"); + editor->priv->text_size_spin = + glade_xml_get_widget (editor->priv->gui, "text_size_spin"); + editor->priv->text_bold_toggle = + glade_xml_get_widget (editor->priv->gui, "text_bold_toggle"); + editor->priv->text_italic_toggle = + glade_xml_get_widget (editor->priv->gui, "text_italic_toggle"); + editor->priv->text_color_combo = + glade_xml_get_widget (editor->priv->gui, "text_color_combo"); + editor->priv->text_color_radio = + glade_xml_get_widget (editor->priv->gui, "text_color_radio"); + editor->priv->text_color_key_radio = + glade_xml_get_widget (editor->priv->gui, "text_color_key_radio"); + editor->priv->text_color_key_combo = + glade_xml_get_widget (editor->priv->gui, "text_color_key_combo"); + editor->priv->text_left_toggle = + glade_xml_get_widget (editor->priv->gui, "text_left_toggle"); + editor->priv->text_center_toggle = + glade_xml_get_widget (editor->priv->gui, "text_center_toggle"); + editor->priv->text_right_toggle = + glade_xml_get_widget (editor->priv->gui, "text_right_toggle"); + editor->priv->text_line_spacing_spin = + glade_xml_get_widget (editor->priv->gui, "text_line_spacing_spin"); + editor->priv->text_auto_shrink_check = + glade_xml_get_widget (editor->priv->gui, "text_auto_shrink_check"); + + gl_util_combo_box_add_text_model ( GTK_COMBO_BOX(editor->priv->text_family_combo)); + gl_util_combo_box_add_text_model ( GTK_COMBO_BOX(editor->priv->text_color_key_combo)); + + /* Load family names */ + family_names = gl_util_get_font_family_list (); + gl_util_combo_box_set_strings (GTK_COMBO_BOX(editor->priv->text_family_combo), + family_names); + gl_util_font_family_list_free (family_names); + + /* Modify widgets */ + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->text_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->text_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->text_color_key_combo, FALSE); + + /* Un-hide */ + gtk_widget_show_all (editor->priv->text_page_vbox); + + /* Connect signals */ + g_signal_connect_swapped (G_OBJECT (editor->priv->text_family_combo), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->text_size_spin), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->text_bold_toggle), + "toggled", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->text_italic_toggle), + "toggled", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->text_color_combo), + "color_changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->text_color_key_combo), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->text_color_radio), + "toggled", + G_CALLBACK (text_radio_toggled_cb), + G_OBJECT (editor)); + g_signal_connect_swapped (G_OBJECT (editor->priv->text_color_key_radio), + "toggled", + G_CALLBACK (text_radio_toggled_cb), + G_OBJECT (editor)); + + g_signal_connect (G_OBJECT (editor->priv->text_left_toggle), + "toggled", + G_CALLBACK (align_toggle_cb), + G_OBJECT (editor)); + g_signal_connect (G_OBJECT (editor->priv->text_center_toggle), + "toggled", + G_CALLBACK (align_toggle_cb), + G_OBJECT (editor)); + g_signal_connect (G_OBJECT (editor->priv->text_right_toggle), + "toggled", + G_CALLBACK (align_toggle_cb), + G_OBJECT (editor)); + + g_signal_connect_swapped (G_OBJECT (editor->priv->text_line_spacing_spin), + "changed", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + + g_signal_connect_swapped (G_OBJECT (editor->priv->text_auto_shrink_check), + "toggled", + G_CALLBACK (gl_object_editor_changed_cb), + G_OBJECT (editor)); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Alignment togglebutton callback. */ +/*--------------------------------------------------------------------------*/ +static void +align_toggle_cb (GtkToggleButton *toggle, + glObjectEditor *editor) +{ + if (editor->priv->stop_signals) return; + + if (gtk_toggle_button_get_active (toggle)) { + + if (GTK_WIDGET (toggle) == GTK_WIDGET (editor->priv->text_left_toggle)) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->text_center_toggle), + FALSE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->text_right_toggle), + FALSE); + } else if (GTK_WIDGET (toggle) == + GTK_WIDGET (editor->priv->text_center_toggle)) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->text_left_toggle), + FALSE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->text_right_toggle), + FALSE); + } else if (GTK_WIDGET (toggle) == + GTK_WIDGET (editor->priv->text_right_toggle)) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->text_left_toggle), + FALSE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->text_center_toggle), + FALSE); + } + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0); + } + +} + +/*****************************************************************************/ +/* Set font family. */ +/*****************************************************************************/ +void +gl_object_editor_set_font_family (glObjectEditor *editor, + const gchar *font_family) +{ + GList *family_names; + gchar *good_font_family; + + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + /* Make sure we have a valid font family. if not provide a good default. */ + family_names = gl_util_get_font_family_list (); + if (g_list_find_custom (family_names, font_family, (GCompareFunc)g_utf8_collate)) { + good_font_family = g_strdup (font_family); + } else { + if (family_names != NULL) { + good_font_family = g_strdup (family_names->data); /* 1st entry */ + } else { + good_font_family = NULL; + } + } + gl_util_font_family_list_free (family_names); + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (editor->priv->text_family_combo), good_font_family); + g_free (good_font_family); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query font family. */ +/*****************************************************************************/ +gchar * +gl_object_editor_get_font_family (glObjectEditor *editor) +{ + gchar *font_family; + + gl_debug (DEBUG_EDITOR, "START"); + + font_family = gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->text_family_combo)); + + gl_debug (DEBUG_EDITOR, "END"); + + return font_family; +} + +/*****************************************************************************/ +/* Set font size. */ +/*****************************************************************************/ +void +gl_object_editor_set_font_size (glObjectEditor *editor, + gdouble font_size) +{ + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->text_size_spin), + font_size); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query font size. */ +/*****************************************************************************/ +gdouble +gl_object_editor_get_font_size (glObjectEditor *editor) +{ + gdouble font_size; + + gl_debug (DEBUG_EDITOR, "START"); + + font_size = + gtk_spin_button_get_value (GTK_SPIN_BUTTON(editor->priv->text_size_spin)); + + gl_debug (DEBUG_EDITOR, "END"); + + return font_size; +} + +/*****************************************************************************/ +/* Set font weight. */ +/*****************************************************************************/ +void +gl_object_editor_set_font_weight (glObjectEditor *editor, + PangoWeight font_weight) +{ + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->text_bold_toggle), + (font_weight == PANGO_WEIGHT_BOLD)); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query font weight. */ +/*****************************************************************************/ +PangoWeight +gl_object_editor_get_font_weight (glObjectEditor *editor) +{ + PangoWeight font_weight; + + gl_debug (DEBUG_EDITOR, "START"); + + if (gtk_toggle_button_get_active + (GTK_TOGGLE_BUTTON (editor->priv->text_bold_toggle))) { + font_weight = PANGO_WEIGHT_BOLD; + } else { + font_weight = PANGO_WEIGHT_NORMAL; + } + + gl_debug (DEBUG_EDITOR, "END"); + + return font_weight; +} + +/*****************************************************************************/ +/* Set font italic flag. */ +/*****************************************************************************/ +void +gl_object_editor_set_font_italic_flag (glObjectEditor *editor, + gboolean font_italic_flag) +{ + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->text_italic_toggle), + font_italic_flag); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query font italic flag. */ +/*****************************************************************************/ +gboolean +gl_object_editor_get_font_italic_flag (glObjectEditor *editor) +{ + gboolean italic_flag; + + gl_debug (DEBUG_EDITOR, "START"); + + italic_flag = + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON + (editor->priv->text_italic_toggle)); + + gl_debug (DEBUG_EDITOR, "END"); + + return italic_flag; +} + +/*****************************************************************************/ +/* Set text alignment. */ +/*****************************************************************************/ +void +gl_object_editor_set_text_alignment (glObjectEditor *editor, + PangoAlignment align) +{ + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->text_left_toggle), + (align == PANGO_ALIGN_LEFT)); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->text_center_toggle), + (align == PANGO_ALIGN_CENTER)); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->text_right_toggle), + (align == PANGO_ALIGN_RIGHT)); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query text alignment. */ +/*****************************************************************************/ +PangoAlignment +gl_object_editor_get_text_alignment (glObjectEditor *editor) +{ + PangoAlignment align; + + gl_debug (DEBUG_EDITOR, "START"); + + if (gtk_toggle_button_get_active + (GTK_TOGGLE_BUTTON (editor->priv->text_left_toggle))) { + align = PANGO_ALIGN_LEFT; + } else + if (gtk_toggle_button_get_active + (GTK_TOGGLE_BUTTON (editor->priv->text_right_toggle))) { + align = PANGO_ALIGN_RIGHT; + } else + if (gtk_toggle_button_get_active + (GTK_TOGGLE_BUTTON (editor->priv->text_center_toggle))) { + align = PANGO_ALIGN_CENTER; + } else { + align = PANGO_ALIGN_LEFT; /* Should not happen. */ + } + + gl_debug (DEBUG_EDITOR, "END"); + + return align; +} + +/*****************************************************************************/ +/* Set text color. */ +/*****************************************************************************/ +void +gl_object_editor_set_text_color (glObjectEditor *editor, + gboolean merge_flag, + glColorNode *text_color_node) +{ + GdkColor *gdk_color; + + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + gl_debug (DEBUG_EDITOR, "color field %s(%d) / %X", text_color_node->key, text_color_node->field_flag, text_color_node->color); + + gtk_widget_set_sensitive (editor->priv->text_color_key_radio, merge_flag); + + if ( text_color_node->color == GL_COLOR_NONE ) { + + color_combo_set_color_to_default (COLOR_COMBO(editor->priv->text_color_combo)); + + } else { + + gdk_color = gl_color_to_gdk_color (text_color_node->color); + color_combo_set_color (COLOR_COMBO(editor->priv->text_color_combo), gdk_color); + g_free (gdk_color); + } + + if (!text_color_node->field_flag) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->text_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->text_color_combo, TRUE); + gl_debug (DEBUG_EDITOR, "color field false 0"); + gtk_widget_set_sensitive (editor->priv->text_color_key_combo, FALSE); + + } else { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (editor->priv->text_color_key_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->text_color_combo, FALSE); + gtk_widget_set_sensitive (editor->priv->text_color_key_combo, TRUE); + + gl_debug (DEBUG_EDITOR, "color field true 1"); + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (editor->priv->text_color_key_combo), ""); + gl_debug (DEBUG_EDITOR, "color field true 2"); + } + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query text color. */ +/*****************************************************************************/ +glColorNode* +gl_object_editor_get_text_color (glObjectEditor *editor) +{ + GdkColor *gdk_color; + glColorNode *color_node; + gboolean is_default; + + gl_debug (DEBUG_EDITOR, "START"); + + color_node = gl_color_node_new_default (); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->text_color_key_radio))) { + color_node->field_flag = TRUE; + color_node->color = gl_prefs->default_text_color; + color_node->key = + gtk_combo_box_get_active_text (GTK_COMBO_BOX (editor->priv->text_color_key_combo)); + } else { + color_node->field_flag = FALSE; + color_node->key = NULL; + gdk_color = color_combo_get_color (COLOR_COMBO(editor->priv->text_color_combo), + &is_default); + + if (is_default) { + color_node->color = gl_prefs->default_text_color; + } else { + color_node->color = gl_color_from_gdk_color (gdk_color); + } + } + + gl_debug (DEBUG_EDITOR, "END"); + + return color_node; +} + + +/*****************************************************************************/ +/* Set text line spacing. */ +/*****************************************************************************/ +void +gl_object_editor_set_text_line_spacing (glObjectEditor *editor, + gdouble text_line_spacing) +{ + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->priv->text_line_spacing_spin), + text_line_spacing); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query text line spacing. */ +/*****************************************************************************/ +gdouble +gl_object_editor_get_text_line_spacing (glObjectEditor *editor) +{ + gdouble text_line_spacing; + + gl_debug (DEBUG_EDITOR, "START"); + + text_line_spacing = + gtk_spin_button_get_value (GTK_SPIN_BUTTON(editor->priv->text_line_spacing_spin)); + + gl_debug (DEBUG_EDITOR, "END"); + + return text_line_spacing; +} + +/*****************************************************************************/ +/* Set auto shrink checkbox. */ +/*****************************************************************************/ +void +gl_object_editor_set_text_auto_shrink (glObjectEditor *editor, + gboolean auto_shrink) +{ + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv->stop_signals = TRUE; + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->text_auto_shrink_check), + auto_shrink); + + editor->priv->stop_signals = FALSE; + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Query auto shrink checkbox. */ +/*****************************************************************************/ +gboolean gl_object_editor_get_text_auto_shrink (glObjectEditor *editor) +{ + gboolean auto_shrink; + + gl_debug (DEBUG_EDITOR, "START"); + + auto_shrink = + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->text_auto_shrink_check)); + + gl_debug (DEBUG_EDITOR, "END"); + + return auto_shrink; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. color radio callback. */ +/*--------------------------------------------------------------------------*/ +static void +text_radio_toggled_cb (glObjectEditor *editor) +{ + if (editor->priv->stop_signals) return; + + gl_debug (DEBUG_EDITOR, "START"); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (editor->priv->text_color_radio))) { + gtk_widget_set_sensitive (editor->priv->text_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->text_color_key_combo, FALSE); + } else { + gtk_widget_set_sensitive (editor->priv->text_color_combo, FALSE); + gtk_widget_set_sensitive (editor->priv->text_color_key_combo, TRUE); + + } + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0); + + gl_debug (DEBUG_EDITOR, "END"); +} diff --git a/glabels2/src/object-editor.c b/glabels2/src/object-editor.c new file mode 100644 index 00000000..d33bb4bc --- /dev/null +++ b/glabels2/src/object-editor.c @@ -0,0 +1,650 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/** + * (GLABELS) Label and Business Card Creation program for GNOME + * + * object-editor.c: object properties editor module + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "object-editor.h" + +#include +#include +#include +#include +#include +#include + +#include + +#include "prefs.h" +#include "mygal/widget-color-combo.h" +#include "color.h" +#include "wdgt-chain-button.h" +#include "marshal.h" +#include "util.h" + +#include "object-editor-private.h" + +#include "debug.h" + +/*===========================================*/ +/* Private macros */ +/*===========================================*/ + +/*===========================================*/ +/* Private data types */ +/*===========================================*/ + +typedef void (*ChangedSignal) (GObject * object, gpointer data); + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +gint gl_object_editor_signals[LAST_SIGNAL] = { 0 }; + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void gl_object_editor_finalize (GObject *object); + +static void gl_object_notebook_construct_valist (glObjectEditor *editor, + glObjectEditorOption first_option, + va_list args); + +static void prefs_changed_cb (glObjectEditor *editor); + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glObjectEditor, gl_object_editor, GTK_TYPE_VBOX); + +static void +gl_object_editor_class_init (glObjectEditorClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_debug (DEBUG_EDITOR, "START"); + + gl_object_editor_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_object_editor_finalize; + + gl_object_editor_signals[CHANGED] = + g_signal_new ("changed", + G_OBJECT_CLASS_TYPE(object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glObjectEditorClass, changed), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + gl_object_editor_signals[SIZE_CHANGED] = + g_signal_new ("size_changed", + G_OBJECT_CLASS_TYPE(object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glObjectEditorClass, size_changed), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + gl_debug (DEBUG_EDITOR, "END"); +} + +static void +gl_object_editor_init (glObjectEditor *editor) +{ + gl_debug (DEBUG_EDITOR, "START"); + + editor->priv = g_new0 (glObjectEditorPrivate, 1); + + editor->priv->gui = glade_xml_new (GLABELS_GLADE_DIR "object-editor.glade", + "editor_vbox", + NULL); + + if (!editor->priv->gui) { + g_critical ("Could not open object-editor.glade. gLabels may not be installed correctly!"); + return; + } + + editor->priv->editor_vbox = glade_xml_get_widget (editor->priv->gui, + "editor_vbox"); + gtk_box_pack_start (GTK_BOX(editor), + editor->priv->editor_vbox, + FALSE, FALSE, 0); + + editor->priv->title_image = glade_xml_get_widget (editor->priv->gui, + "title_image"); + editor->priv->title_label = glade_xml_get_widget (editor->priv->gui, + "title_label"); + editor->priv->notebook = glade_xml_get_widget (editor->priv->gui, + "notebook"); + + gtk_widget_show_all (GTK_WIDGET(editor)); + + /* Hide all notebook pages to start with. */ + gtk_widget_hide_all (editor->priv->notebook); + gtk_widget_set_no_show_all (editor->priv->notebook, TRUE); + + gl_debug (DEBUG_EDITOR, "END"); +} + +static void +gl_object_editor_finalize (GObject *object) +{ + glObjectEditor* editor = GL_OBJECT_EDITOR (object);; + + gl_debug (DEBUG_EDITOR, "START"); + + g_return_if_fail (object != NULL); + g_return_if_fail (GL_IS_OBJECT_EDITOR (editor)); + g_return_if_fail (editor->priv != NULL); + + g_object_unref (editor->priv->gui); + g_free (editor->priv); + + g_signal_handlers_disconnect_by_func (G_OBJECT(gl_prefs), + prefs_changed_cb, editor); + + G_OBJECT_CLASS (gl_object_editor_parent_class)->finalize (object); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* NEW object editor. */ +/*****************************************************************************/ +GtkWidget* +gl_object_editor_new (gchar *image, + gchar *label, + glObjectEditorOption first_option, ...) +{ + glObjectEditor *editor; + va_list args; + + gl_debug (DEBUG_EDITOR, "START"); + + editor = GL_OBJECT_EDITOR (g_object_new (GL_TYPE_OBJECT_EDITOR, NULL)); + + if (image) { + gtk_image_set_from_stock (GTK_IMAGE(editor->priv->title_image), + image, + GTK_ICON_SIZE_LARGE_TOOLBAR); + } + + if (label) { + gchar *s; + + s = g_strdup_printf ("%s", + label); + gtk_label_set_text (GTK_LABEL(editor->priv->title_label), s); + g_free (s); + + gtk_label_set_use_markup (GTK_LABEL(editor->priv->title_label), TRUE); + + } + + gtk_notebook_set_homogeneous_tabs (GTK_NOTEBOOK(editor->priv->notebook), TRUE); + + va_start (args, first_option); + gl_object_notebook_construct_valist (editor, first_option, args); + va_end (args); + + if (editor->priv->gui) { + g_object_unref (G_OBJECT (editor->priv->gui)); + } + + gl_debug (DEBUG_EDITOR, "END"); + + return GTK_WIDGET(editor); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Construct notebook. */ +/*--------------------------------------------------------------------------*/ +static void +gl_object_notebook_construct_valist (glObjectEditor *editor, + glObjectEditorOption first_option, + va_list args) +{ + glObjectEditorOption option; + gint pages = 0; + + gl_debug (DEBUG_EDITOR, "START"); + + option = first_option; + + for ( option=first_option; option; option=va_arg (args, glObjectEditorOption) ) { + + switch (option) { + + case GL_OBJECT_EDITOR_EMPTY: + gtk_widget_set_sensitive (editor->priv->title_image, FALSE); + gtk_widget_set_sensitive (editor->priv->title_label, FALSE); + break; + + case GL_OBJECT_EDITOR_POSITION_PAGE: + gl_object_editor_prepare_position_page (editor); + pages++; + break; + + case GL_OBJECT_EDITOR_SIZE_PAGE: + case GL_OBJECT_EDITOR_SIZE_IMAGE_PAGE: + gl_object_editor_prepare_size_page (editor, option); + pages++; + break; + + case GL_OBJECT_EDITOR_SIZE_LINE_PAGE: + gl_object_editor_prepare_lsize_page (editor); + pages++; + break; + + case GL_OBJECT_EDITOR_FILL_PAGE: + gl_object_editor_prepare_fill_page (editor); + pages++; + break; + + case GL_OBJECT_EDITOR_LINE_PAGE: + gl_object_editor_prepare_line_page (editor); + pages++; + break; + + case GL_OBJECT_EDITOR_IMAGE_PAGE: + gl_object_editor_prepare_image_page (editor); + pages++; + break; + + case GL_OBJECT_EDITOR_TEXT_PAGE: + gl_object_editor_prepare_text_page (editor); + pages++; + break; + + case GL_OBJECT_EDITOR_EDIT_PAGE: + gl_object_editor_prepare_edit_page (editor); + pages++; + break; + + case GL_OBJECT_EDITOR_BC_PAGE: + gl_object_editor_prepare_bc_page (editor); + pages++; + break; + + case GL_OBJECT_EDITOR_DATA_PAGE: + gl_object_editor_prepare_data_page (editor); + pages++; + break; + + case GL_OBJECT_EDITOR_SHADOW_PAGE: + gl_object_editor_prepare_shadow_page (editor); + pages++; + break; + + default: + g_message ("option = %d", option); + g_assert_not_reached (); + } + + } + if (pages) { + gtk_widget_show (editor->priv->notebook); + } + + g_signal_connect_swapped (G_OBJECT (gl_prefs), "changed", + G_CALLBACK (prefs_changed_cb), + editor); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Widget changed callback. Emit our "changed" signal. */ +/*--------------------------------------------------------------------------*/ +void +gl_object_editor_changed_cb (glObjectEditor *editor) +{ + if (editor->priv->stop_signals) return; + + gl_debug (DEBUG_EDITOR, "START"); + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[CHANGED], 0); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Widget size changed callback. Emit our "size-changed" signal. */ +/*--------------------------------------------------------------------------*/ +void +gl_object_editor_size_changed_cb (glObjectEditor *editor) +{ + if (editor->priv->stop_signals) return; + + gl_debug (DEBUG_EDITOR, "START"); + + /* Emit our "size_changed" signal */ + g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[SIZE_CHANGED], 0); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Set possible key names from merge object. */ +/*****************************************************************************/ +void +gl_object_editor_set_key_names (glObjectEditor *editor, + glMerge *merge) +{ + GList *keys; + GtkWidget *combo; + gboolean fixed_flag; + gboolean state; + + gl_debug (DEBUG_EDITOR, "START"); + + if (editor->priv->edit_key_label) { + gtk_widget_set_sensitive (editor->priv->edit_key_label, merge != NULL); + } + + if (editor->priv->edit_key_combo) { + gtk_widget_set_sensitive (editor->priv->edit_key_combo, merge != NULL); + } + + if (editor->priv->text_auto_shrink_check) { + gtk_widget_set_sensitive (editor->priv->text_auto_shrink_check, + merge != NULL); + } + + if (editor->priv->text_page_vbox) { + gtk_widget_set_sensitive (editor->priv->text_color_key_radio, merge != NULL); + if (merge == NULL) { + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(editor->priv->text_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->text_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->text_color_key_combo, FALSE); + } else { + state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->text_color_key_radio)); + gtk_widget_set_sensitive (editor->priv->text_color_combo, !state); + gtk_widget_set_sensitive (editor->priv->text_color_key_combo, state); + + } + } + + if (editor->priv->edit_insert_field_button) { + gtk_widget_set_sensitive (editor->priv->edit_insert_field_button, + merge != NULL); + } + + if (editor->priv->img_key_combo) { + gtk_widget_set_sensitive (editor->priv->img_key_combo, merge != NULL); + } + + if (editor->priv->img_key_radio) { + gtk_widget_set_sensitive (editor->priv->img_key_radio, merge != NULL); + if (merge == NULL) { + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(editor->priv->img_file_radio), TRUE); + } + } + + if (editor->priv->data_key_combo) { + gtk_widget_set_sensitive (editor->priv->data_key_combo, merge != NULL); + } + + if (editor->priv->data_key_radio) { + gtk_widget_set_sensitive (editor->priv->data_key_radio, merge != NULL); + if (merge == NULL) { + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(editor->priv->data_literal_radio), TRUE); + } + } + + fixed_flag = editor->priv->data_format_fixed_flag; + if (editor->priv->data_format_label) { + gtk_widget_set_sensitive (editor->priv->data_format_label, + (merge != NULL)); + } + if (editor->priv->data_ex_label) { + gtk_widget_set_sensitive (editor->priv->data_ex_label, + (merge != NULL)); + } + if (editor->priv->data_digits_label) { + gtk_widget_set_sensitive (editor->priv->data_digits_label, + (merge != NULL) && !fixed_flag); + } + if (editor->priv->data_digits_spin) { + gtk_widget_set_sensitive (editor->priv->data_digits_spin, + (merge != NULL) && !fixed_flag); + } + + if (editor->priv->fill_page_vbox) { + gtk_widget_set_sensitive (editor->priv->fill_key_radio, merge != NULL); + if (merge == NULL) { + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(editor->priv->fill_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->fill_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->fill_key_combo, FALSE); + } else { + state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->fill_key_radio)); + gtk_widget_set_sensitive (editor->priv->fill_color_combo, !state); + gtk_widget_set_sensitive (editor->priv->fill_key_combo, state); + + } + } + + if (editor->priv->line_page_vbox) { + gtk_widget_set_sensitive (editor->priv->line_key_radio, merge != NULL); + if (merge == NULL) { + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(editor->priv->line_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->line_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->line_key_combo, FALSE); + } else { + state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->line_key_radio)); + gtk_widget_set_sensitive (editor->priv->line_color_combo, !state); + gtk_widget_set_sensitive (editor->priv->line_key_combo, state); + + } + } + + if (editor->priv->bc_page_vbox) { + gtk_widget_set_sensitive (editor->priv->bc_key_radio, merge != NULL); + if (merge == NULL) { + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(editor->priv->bc_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE); + } else { + state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->bc_key_radio)); + gtk_widget_set_sensitive (editor->priv->bc_color_combo, !state); + gtk_widget_set_sensitive (editor->priv->bc_key_combo, state); + + } + } + + if (editor->priv->shadow_page_vbox) { + gtk_widget_set_sensitive (editor->priv->shadow_key_radio, merge != NULL); + if (merge == NULL) { + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(editor->priv->shadow_color_radio), TRUE); + gtk_widget_set_sensitive (editor->priv->shadow_color_combo, TRUE); + gtk_widget_set_sensitive (editor->priv->shadow_key_combo, FALSE); + } else { + state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->shadow_key_radio)); + gtk_widget_set_sensitive (editor->priv->shadow_color_combo, !state); + gtk_widget_set_sensitive (editor->priv->shadow_key_combo, state); + + } + } + + keys = gl_merge_get_key_list (merge); + if ( keys == NULL ) { + keys = g_list_append (keys, g_strdup ("")); + } + + combo = editor->priv->img_key_combo; + if (combo) { + gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys); + } + + combo = editor->priv->edit_key_combo; + if (combo) { + gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys); + } + + combo = editor->priv->data_key_combo; + if (combo) { + gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys); + } + + combo = editor->priv->fill_key_combo; + if (combo) { + gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys); + } + + combo = editor->priv->text_color_key_combo; + if (combo) { + gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys); + } + + combo = editor->priv->line_key_combo; + if (combo) { + gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys); + } + + combo = editor->priv->bc_key_combo; + if (combo) { + gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys); + } + + combo = editor->priv->shadow_key_combo; + if (combo) { + gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys); + } + + gl_merge_free_key_list (&keys); + + gl_debug (DEBUG_EDITOR, "END"); +} + +/*****************************************************************************/ +/* Construct color combo "Custom widget". */ +/*****************************************************************************/ +GtkWidget * +gl_object_editor_construct_color_combo (gchar *name, + gchar *string1, + gchar *string2, + gint int1, + gint int2) +{ + GtkWidget *color_combo; + ColorGroup *cg; + gchar *cg_name; + guint color; + GdkColor *gdk_color; + gchar *no_color; + + switch (int1) { + + case 3: + cg_name = "shadow_color_group"; + color = GL_COLOR_SHADOW_DEFAULT; + no_color = _("Default"); + break; + + case 2: + cg_name = "text_color_group"; + color = gl_prefs->default_text_color; + no_color = _("Default"); + break; + + case 1: + cg_name = "line_color_group"; + color = gl_prefs->default_line_color; + no_color = _("No line"); + break; + + case 0: + default: + cg_name = "fill_color_group"; + color = gl_prefs->default_fill_color; + no_color = _("No fill"); + break; + + } + + cg = color_group_fetch (cg_name, NULL); + gdk_color = gl_color_to_gdk_color (color); + color_combo = color_combo_new (NULL, no_color, gdk_color, cg); + g_free (gdk_color); + + color_combo_box_set_preview_relief (COLOR_COMBO(color_combo), GTK_RELIEF_NORMAL); + + return color_combo; +} + +/*****************************************************************************/ +/* Construct chain button "Custom widget". */ +/*****************************************************************************/ +GtkWidget * +gl_object_editor_construct_chain_button (gchar *name, + gchar *string1, + gchar *string2, + gint int1, + gint int2) +{ + GtkWidget *chain_button; + + chain_button = gl_wdgt_chain_button_new (GL_WDGT_CHAIN_RIGHT); + gl_wdgt_chain_button_set_active (GL_WDGT_CHAIN_BUTTON(chain_button), TRUE); + + return chain_button; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Prefs changed callback. Update units related items. */ +/*--------------------------------------------------------------------------*/ +static void +prefs_changed_cb (glObjectEditor *editor) +{ + + gl_debug (DEBUG_EDITOR, "START"); + + if (editor->priv->lsize_r_spin) { + lsize_prefs_changed_cb (editor); + } + + if (editor->priv->size_w_spin) { + size_prefs_changed_cb (editor); + } + + if (editor->priv->pos_x_spin) { + position_prefs_changed_cb (editor); + } + + if (editor->priv->shadow_x_spin) { + shadow_prefs_changed_cb (editor); + } + + gl_debug (DEBUG_EDITOR, "END"); +} diff --git a/glabels2/src/object-editor.h b/glabels2/src/object-editor.h new file mode 100644 index 00000000..2f229bb7 --- /dev/null +++ b/glabels2/src/object-editor.h @@ -0,0 +1,300 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * object-editor.h: object properties editor module header file + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __OBJECT_EDITOR_H__ +#define __OBJECT_EDITOR_H__ + +#include +#include + +#include "text-node.h" +#include "merge.h" +#include "bc.h" +#include "color.h" + +G_BEGIN_DECLS + +typedef enum { + GL_OBJECT_EDITOR_EMPTY = 1, + GL_OBJECT_EDITOR_POSITION_PAGE, + GL_OBJECT_EDITOR_SIZE_PAGE, + GL_OBJECT_EDITOR_SIZE_IMAGE_PAGE, + GL_OBJECT_EDITOR_SIZE_LINE_PAGE, + GL_OBJECT_EDITOR_FILL_PAGE, + GL_OBJECT_EDITOR_LINE_PAGE, + GL_OBJECT_EDITOR_IMAGE_PAGE, + GL_OBJECT_EDITOR_TEXT_PAGE, + GL_OBJECT_EDITOR_EDIT_PAGE, + GL_OBJECT_EDITOR_BC_PAGE, + GL_OBJECT_EDITOR_DATA_PAGE, + GL_OBJECT_EDITOR_SHADOW_PAGE, +} glObjectEditorOption; + +#define GL_TYPE_OBJECT_EDITOR (gl_object_editor_get_type ()) +#define GL_OBJECT_EDITOR(obj) (GTK_CHECK_CAST ((obj), GL_TYPE_OBJECT_EDITOR, glObjectEditor)) +#define GL_OBJECT_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GL_TYPE_OBJECT_EDITOR, glObjectEditorClass)) +#define GL_IS_OBJECT_EDITOR(obj) (GTK_CHECK_TYPE ((obj), GL_TYPE_OBJECT_EDITOR)) +#define GL_IS_OBJECT_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GL_TYPE_OBJECT_EDITOR)) +#define GL_OBJECT_EDITOR_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), GL_TYPE_OBJECT_EDITOR, glObjectEditorClass)) + + +typedef struct _glObjectEditor glObjectEditor; +typedef struct _glObjectEditorClass glObjectEditorClass; + +typedef struct _glObjectEditorPrivate glObjectEditorPrivate; + +struct _glObjectEditor +{ + GtkVBox parent_instance; + + glObjectEditorPrivate *priv; + +}; + +struct _glObjectEditorClass +{ + GtkVBoxClass parent_class; + + void (*changed) (glObjectEditor *editor, gpointer user_data); + void (*size_changed) (glObjectEditor *editor, gpointer user_data); +}; + + + + +GtkType gl_object_editor_get_type (void) G_GNUC_CONST; + +GtkWidget *gl_object_editor_new (gchar *image, + gchar *label, + glObjectEditorOption first_option, ...); + +void gl_object_editor_set_key_names (glObjectEditor *editor, + glMerge *merge); + + +/* + * Position Page + */ +void gl_object_editor_set_position (glObjectEditor *editor, + gdouble x, + gdouble y); + +void gl_object_editor_set_max_position (glObjectEditor *editor, + gdouble x_max, + gdouble y_max); + +void gl_object_editor_get_position (glObjectEditor *editor, + gdouble *x, + gdouble *y); + +/* + * Size Page + */ +void gl_object_editor_set_size (glObjectEditor *editor, + gdouble w, + gdouble h); + +void gl_object_editor_set_max_size (glObjectEditor *editor, + gdouble w_max, + gdouble h_max); + +void gl_object_editor_set_base_size (glObjectEditor *editor, + gdouble w_max, + gdouble h_max); + +void gl_object_editor_get_size (glObjectEditor *editor, + gdouble *w, + gdouble *h); + + +/* + * Line Size Page + */ +void gl_object_editor_set_lsize (glObjectEditor *editor, + gdouble dx, + gdouble dy); + +void gl_object_editor_set_max_lsize (glObjectEditor *editor, + gdouble dx_max, + gdouble dy_max); + +void gl_object_editor_get_lsize (glObjectEditor *editor, + gdouble *dx, + gdouble *dy); + + +/* + * Fill Page + */ +void gl_object_editor_set_fill_color (glObjectEditor *editor, + gboolean merge_flag, + glColorNode *color_node); + +glColorNode* gl_object_editor_get_fill_color (glObjectEditor *editor); + + +/* + * Line/Outline Page + */ +void gl_object_editor_set_line_color (glObjectEditor *editor, + gboolean merge_flag, + glColorNode *color_node); + +glColorNode* gl_object_editor_get_line_color (glObjectEditor *editor); + +void gl_object_editor_set_line_width (glObjectEditor *editor, + gdouble width); + +gdouble gl_object_editor_get_line_width (glObjectEditor *editor); + + +/* + * Image Page + */ +void gl_object_editor_set_image (glObjectEditor *editor, + gboolean merge_flag, + glTextNode *text_node); + +glTextNode *gl_object_editor_get_image (glObjectEditor *editor); + + +/* + * Text Page + */ +void gl_object_editor_set_font_family (glObjectEditor *editor, + const gchar *font_family); + +gchar *gl_object_editor_get_font_family (glObjectEditor *editor); + +void gl_object_editor_set_font_size (glObjectEditor *editor, + gdouble font_size); + +gdouble gl_object_editor_get_font_size (glObjectEditor *editor); + +void gl_object_editor_set_font_weight (glObjectEditor *editor, + PangoWeight font_weight); + +PangoWeight gl_object_editor_get_font_weight (glObjectEditor *editor); + +void gl_object_editor_set_font_italic_flag (glObjectEditor *editor, + gboolean font_italic_flag); + +gboolean gl_object_editor_get_font_italic_flag (glObjectEditor *editor); + +void gl_object_editor_set_text_alignment (glObjectEditor *editor, + PangoAlignment text_alignment); + +PangoAlignment gl_object_editor_get_text_alignment (glObjectEditor *editor); + +void gl_object_editor_set_text_line_spacing (glObjectEditor *editor, + gdouble text_line_spacing); + +gdouble gl_object_editor_get_text_line_spacing (glObjectEditor *editor); + +void gl_object_editor_set_text_color (glObjectEditor *editor, + gboolean merge_flag, + glColorNode *text_color_node); + +glColorNode* gl_object_editor_get_text_color (glObjectEditor *editor); + +void gl_object_editor_set_text_auto_shrink (glObjectEditor *editor, + gboolean auto_shrink); + +gboolean gl_object_editor_get_text_auto_shrink (glObjectEditor *editor); + + +/* + * Edit Text Page + */ +void gl_object_editor_set_text_buffer (glObjectEditor *editor, + GtkTextBuffer *buffer); + +/* + * Barcode Page + */ +void gl_object_editor_set_bc_style (glObjectEditor *editor, + gchar *id, + gboolean text_flag, + gboolean checksum_flag, + guint format_digits); + +void gl_object_editor_get_bc_style (glObjectEditor *editor, + gchar **id, + gboolean *text_flag, + gboolean *checksum_flag, + guint *format_digits); + +void gl_object_editor_set_bc_color (glObjectEditor *editor, + gboolean merge_flag, + glColorNode *color_node); + +glColorNode* gl_object_editor_get_bc_color (glObjectEditor *editor); + + +/* + * Barcode Data Page + */ +void gl_object_editor_set_data (glObjectEditor *editor, + gboolean merge_flag, + glTextNode *text_node); + +glTextNode *gl_object_editor_get_data (glObjectEditor *editor); + + +/* + * Shadow Page + */ +void gl_object_editor_set_shadow_state (glObjectEditor *editor, + gboolean state); + +void gl_object_editor_set_shadow_offset (glObjectEditor *editor, + gdouble x, + gdouble y); + +void gl_object_editor_set_shadow_color (glObjectEditor *editor, + gboolean merge_flag, + glColorNode *color_node); + +void gl_object_editor_set_shadow_opacity (glObjectEditor *editor, + gdouble alpha); + +void gl_object_editor_set_max_shadow_offset(glObjectEditor *editor, + gdouble x_max, + gdouble y_max); + + +gboolean gl_object_editor_get_shadow_state (glObjectEditor *editor); + +void gl_object_editor_get_shadow_offset (glObjectEditor *editor, + gdouble *x, + gdouble *y); + +glColorNode* gl_object_editor_get_shadow_color (glObjectEditor *editor); + +gdouble gl_object_editor_get_shadow_opacity (glObjectEditor *editor); + + + +G_END_DECLS + +#endif diff --git a/glabels2/src/pixbuf-cache.c b/glabels2/src/pixbuf-cache.c new file mode 100644 index 00000000..df676047 --- /dev/null +++ b/glabels2/src/pixbuf-cache.c @@ -0,0 +1,254 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * pixbuf-cache.c: GLabels pixbuf cache module + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "pixbuf-cache.h" + +#include "debug.h" + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +typedef struct { + gchar *key; + guint references; + GdkPixbuf *pixbuf; +} CacheRecord; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void record_destroy (gpointer val); + +static void add_name_to_list (gpointer key, + gpointer val, + gpointer user_data); + + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Destroy cache record. */ +/*---------------------------------------------------------------------------*/ +static void +record_destroy (gpointer val) +{ + CacheRecord *record = (CacheRecord *)val; + + g_return_if_fail (record); + + g_free (record->key); + g_object_unref (record->pixbuf); + g_free (record); +} + +/*****************************************************************************/ +/* Create a new hash table to keep track of cached pixbufs. */ +/*****************************************************************************/ +GHashTable * +gl_pixbuf_cache_new (void) +{ + GHashTable *pixbuf_cache; + + gl_debug (DEBUG_PIXBUF_CACHE, "START"); + + pixbuf_cache = g_hash_table_new_full (g_str_hash, + g_str_equal, + NULL, + record_destroy); + + gl_debug (DEBUG_PIXBUF_CACHE, "END pixbuf_cache=%p", pixbuf_cache); + + return pixbuf_cache; +} + +/*****************************************************************************/ +/* Free up previously allocated hash table and its contents. */ +/*****************************************************************************/ +void +gl_pixbuf_cache_free (GHashTable *pixbuf_cache) +{ + gl_debug (DEBUG_PIXBUF_CACHE, "START"); + + g_hash_table_destroy (pixbuf_cache); + + gl_debug (DEBUG_PIXBUF_CACHE, "END"); +} + +/*****************************************************************************/ +/* Add pixbuf to cache explicitly (not a reference). */ +/*****************************************************************************/ +void +gl_pixbuf_cache_add_pixbuf (GHashTable *pixbuf_cache, + gchar *name, + GdkPixbuf *pixbuf) +{ + CacheRecord *test_record, *record; + + gl_debug (DEBUG_PIXBUF_CACHE, "START"); + + test_record = g_hash_table_lookup (pixbuf_cache, name); + if (test_record != NULL) { + /* pixbuf is already in the cache. */ + gl_debug (DEBUG_PIXBUF_CACHE, "END already in cache"); + return; + } + + record = g_new0 (CacheRecord, 1); + record->key = g_strdup (name); + record->references = 0; /* Nobody has referenced it yet. */ + record->pixbuf = g_object_ref (G_OBJECT (pixbuf)); + + g_hash_table_insert (pixbuf_cache, record->key, record); + + gl_debug (DEBUG_PIXBUF_CACHE, "END"); +} + +/*****************************************************************************/ +/* Get pixbuf. If not in cache, read it and add to cache. */ +/*****************************************************************************/ +GdkPixbuf * +gl_pixbuf_cache_get_pixbuf (GHashTable *pixbuf_cache, + gchar *name) +{ + CacheRecord *record; + GdkPixbuf *pixbuf; + + gl_debug (DEBUG_PIXBUF_CACHE, "START pixbuf_cache=%p", pixbuf_cache); + + record = g_hash_table_lookup (pixbuf_cache, name); + + if (record != NULL) { + record->references++; + gl_debug (DEBUG_PIXBUF_CACHE, "references=%d", record->references); + gl_debug (DEBUG_PIXBUF_CACHE, "END cached"); + return record->pixbuf; + } + + + pixbuf = gdk_pixbuf_new_from_file (name, NULL); + if ( pixbuf != NULL) { + record = g_new0 (CacheRecord, 1); + record->key = g_strdup (name); + record->references = 1; + record->pixbuf = pixbuf; + + g_hash_table_insert (pixbuf_cache, record->key, record); + } + + gl_debug (DEBUG_PIXBUF_CACHE, "END"); + + return pixbuf; +} + +/*****************************************************************************/ +/* Remove pixbuf, but only if no references left. */ +/*****************************************************************************/ +void +gl_pixbuf_cache_remove_pixbuf (GHashTable *pixbuf_cache, + gchar *name) +{ + CacheRecord *record; + + if (name == NULL) return; + + gl_debug (DEBUG_PIXBUF_CACHE, "START"); + + record = g_hash_table_lookup (pixbuf_cache, name); + if (record == NULL) { + gl_debug (DEBUG_PIXBUF_CACHE, "END not in cache"); + return; + } + + record->references--; + + if ( record->references == 0 ) { + g_hash_table_remove (pixbuf_cache, name); + } + + gl_debug (DEBUG_PIXBUF_CACHE, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Add a name to a GList while iterating over cache. */ +/*---------------------------------------------------------------------------*/ +static void +add_name_to_list (gpointer key, + gpointer val, + gpointer user_data) +{ + gchar *name = (gchar *)key; + GList **name_list = (GList **)user_data; + + gl_debug (DEBUG_PIXBUF_CACHE, "START"); + + gl_debug (DEBUG_PIXBUF_CACHE, "adding name=%s", name); + + *name_list = g_list_append (*name_list, g_strdup(name)); + + gl_debug (DEBUG_PIXBUF_CACHE, "END"); +} + +/*****************************************************************************/ +/* Return a list of names for all pixbufs in the cache. */ +/*****************************************************************************/ +GList * +gl_pixbuf_cache_get_name_list (GHashTable *pixbuf_cache) +{ + GList *name_list = NULL; + + gl_debug (DEBUG_PIXBUF_CACHE, "START"); + + g_hash_table_foreach (pixbuf_cache, add_name_to_list, &name_list); + + gl_debug (DEBUG_PIXBUF_CACHE, "END"); + + return name_list; +} + +/*****************************************************************************/ +/* Free up a list of pixbuf names. */ +/*****************************************************************************/ +void +gl_pixbuf_cache_free_name_list (GList *name_list) +{ + GList *p_name; + + gl_debug (DEBUG_PIXBUF_CACHE, "START"); + + for (p_name = name_list; p_name != NULL; p_name = p_name->next) { + g_free (p_name->data); + p_name->data = NULL; + } + + g_list_free (name_list); + + gl_debug (DEBUG_PIXBUF_CACHE, "END"); +} + + diff --git a/glabels2/src/pixbuf-cache.h b/glabels2/src/pixbuf-cache.h new file mode 100644 index 00000000..5fe8a80c --- /dev/null +++ b/glabels2/src/pixbuf-cache.h @@ -0,0 +1,53 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * pixbuf-cache.h: GLabels pixbuf cache module + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __PIXBUF_CACHE_H__ +#define __PIXBUF_CACHE_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +GHashTable *gl_pixbuf_cache_new (void); + +void gl_pixbuf_cache_free (GHashTable *pixbuf_cache); + +void gl_pixbuf_cache_add_pixbuf (GHashTable *pixbuf_cache, + gchar *name, + GdkPixbuf *pixbuf); + +GdkPixbuf *gl_pixbuf_cache_get_pixbuf (GHashTable *pixbuf_cache, + gchar *name); + +void gl_pixbuf_cache_remove_pixbuf (GHashTable *pixbuf_cache, + gchar *name); + +GList *gl_pixbuf_cache_get_name_list (GHashTable *pixbuf_cache); + +void gl_pixbuf_cache_free_name_list (GList *name_list); + +G_END_DECLS + +#endif /*__PIXBUF_CACHE_H__ */ diff --git a/glabels2/src/pixmaps/Makefile.am b/glabels2/src/pixmaps/Makefile.am new file mode 100644 index 00000000..5b192860 --- /dev/null +++ b/glabels2/src/pixmaps/Makefile.am @@ -0,0 +1,18 @@ + +EXTRA_DIST = \ + collate.xpm \ + nocollate.xpm \ + checkerboard.xpm \ + cursor_text.xbm \ + cursor_text_mask.xbm \ + cursor_box.xbm \ + cursor_box_mask.xbm \ + cursor_line.xbm \ + cursor_line_mask.xbm \ + cursor_ellipse.xbm \ + cursor_ellipse_mask.xbm \ + cursor_image.xbm \ + cursor_image_mask.xbm \ + cursor_barcode.xbm \ + cursor_barcode_mask.xbm + diff --git a/glabels2/src/pixmaps/checkerboard.xpm b/glabels2/src/pixmaps/checkerboard.xpm new file mode 100644 index 00000000..33ab7b57 --- /dev/null +++ b/glabels2/src/pixmaps/checkerboard.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static char * checkerboard_xpm[] = { +"24 24 2 1", +" c #CCCCCC", +". c #000000", +".. .. .. .. .. .. ", +".. .. .. .. .. .. ", +" .. .. .. .. .. ..", +" .. .. .. .. .. ..", +".. .. .. .. .. .. ", +".. .. .. .. .. .. ", +" .. .. .. .. .. ..", +" .. .. .. .. .. ..", +".. .. .. .. .. .. ", +".. .. .. .. .. .. ", +" .. .. .. .. .. ..", +" .. .. .. .. .. ..", +".. .. .. .. .. .. ", +".. .. .. .. .. .. ", +" .. .. .. .. .. ..", +" .. .. .. .. .. ..", +".. .. .. .. .. .. ", +".. .. .. .. .. .. ", +" .. .. .. .. .. ..", +" .. .. .. .. .. ..", +".. .. .. .. .. .. ", +".. .. .. .. .. .. ", +" .. .. .. .. .. ..", +" .. .. .. .. .. .."}; diff --git a/glabels2/src/pixmaps/collate.xpm b/glabels2/src/pixmaps/collate.xpm new file mode 100644 index 00000000..a781151a --- /dev/null +++ b/glabels2/src/pixmaps/collate.xpm @@ -0,0 +1,34 @@ +/* XPM */ +static char *collate_xpm[]={ +"58 28 3 1", +". c None", +"# c #000000", +"a c #ffffff", +"..........................................................", +".###################..###################.................", +".#aaaaaaaaaaaaaaaaa#..#aaaaaaaaaaaaaaaaa#.................", +".#aaaaaaaa#aaaaaaaa#..#aaaaaaa##aaaaaaaa#.................", +".#aaaaaaa##aaaaaaaa#..#aaaaaa#aa#aaaaaaa#.................", +".#aaaaaaaa#aaaaaaaa#..#aaaaaaaaa#aaaaaaa#..##..##..##.....", +".#aaaaaaaa#aaaaaaaa#..#aaaaaaaa#aaaaaaaa#..##..##..##.....", +".#aaaaaaaa#aaaaaaaa#..#aaaaaaa#aaaaaaaaa#.................", +".#aaaaaaaa#aaaaaaaa#..#aaaaaa#aaaaaaaaaa#.................", +".#aaaaaaa###aaaaaaa#..#aaaaaa####aaaaaaa#.................", +".#aaaaaaaaaaaaaaaaa#..#aaaaaaaaaaaaaaaaa#.................", +".###################..###################.................", +"..........................................................", +"..........................................................", +"..........................................................", +".................###################..###################.", +".................#aaaaaaaaaaaaaaaaa#..#aaaaaaaaaaaaaaaaa#.", +".................#aaaaaaaa#aaaaaaaa#..#aaaaaaa##aaaaaaaa#.", +".................#aaaaaaa##aaaaaaaa#..#aaaaaa#aa#aaaaaaa#.", +"....##..##..##...#aaaaaaaa#aaaaaaaa#..#aaaaaaaaa#aaaaaaa#.", +"....##..##..##...#aaaaaaaa#aaaaaaaa#..#aaaaaaaa#aaaaaaaa#.", +".................#aaaaaaaa#aaaaaaaa#..#aaaaaaa#aaaaaaaaa#.", +".................#aaaaaaaa#aaaaaaaa#..#aaaaaa#aaaaaaaaaa#.", +".................#aaaaaaa###aaaaaaa#..#aaaaaa####aaaaaaa#.", +".................#aaaaaaaaaaaaaaaaa#..#aaaaaaaaaaaaaaaaa#.", +".................###################..###################.", +"..........................................................", +".........................................................."}; diff --git a/glabels2/src/pixmaps/cursor_barcode.xbm b/glabels2/src/pixmaps/cursor_barcode.xbm new file mode 100644 index 00000000..6e8d1d62 --- /dev/null +++ b/glabels2/src/pixmaps/cursor_barcode.xbm @@ -0,0 +1,16 @@ +#define cursor_barcode_width 32 +#define cursor_barcode_height 32 +#define cursor_barcode_x_hot 7 +#define cursor_barcode_y_hot 7 +static unsigned char cursor_barcode_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0xa0, 0xad, 0x5a, 0x00, 0xa0, 0xad, 0x5a, + 0x00, 0xa0, 0xad, 0x5a, 0x00, 0xa0, 0xad, 0x5a, 0x00, 0xa0, 0xad, 0x5a, + 0x00, 0xa0, 0xad, 0x5a, 0x00, 0xa0, 0xad, 0x5a, 0x00, 0xa0, 0xad, 0x5a, + 0x00, 0xa0, 0xad, 0x5a, 0x00, 0xa0, 0xad, 0x5a, 0x00, 0xa0, 0xad, 0x5a, + 0x00, 0xa0, 0xad, 0x5a, 0x00, 0xa0, 0xad, 0x5a, 0x00, 0xa0, 0xad, 0x5a, + 0x00, 0xa0, 0xad, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/glabels2/src/pixmaps/cursor_barcode_mask.xbm b/glabels2/src/pixmaps/cursor_barcode_mask.xbm new file mode 100644 index 00000000..52ed3ba2 --- /dev/null +++ b/glabels2/src/pixmaps/cursor_barcode_mask.xbm @@ -0,0 +1,16 @@ +#define cursor_barcode_mask_width 32 +#define cursor_barcode_mask_height 32 +#define cursor_barcode_mask_x_hot 7 +#define cursor_barcode_mask_y_hot 7 +static unsigned char cursor_barcode_mask_bits[] = { + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, + 0xff, 0x7f, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, + 0xc0, 0xf1, 0xff, 0xff, 0xc0, 0xf1, 0xff, 0xff, 0xc0, 0xf1, 0xff, 0xff, + 0x00, 0xf0, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, + 0x00, 0xf0, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, + 0x00, 0xf0, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, + 0x00, 0xf0, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, + 0x00, 0xf0, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/glabels2/src/pixmaps/cursor_box.xbm b/glabels2/src/pixmaps/cursor_box.xbm new file mode 100644 index 00000000..48ae4ea2 --- /dev/null +++ b/glabels2/src/pixmaps/cursor_box.xbm @@ -0,0 +1,16 @@ +#define cursor_box_width 32 +#define cursor_box_height 32 +#define cursor_box_x_hot 7 +#define cursor_box_y_hot 7 +static unsigned char cursor_box_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xff, 0x7f, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x80, 0x01, 0x60, + 0x00, 0x80, 0x01, 0x60, 0x00, 0x80, 0x01, 0x60, 0x00, 0x80, 0x01, 0x60, + 0x00, 0x80, 0x01, 0x60, 0x00, 0x80, 0x01, 0x60, 0x00, 0x80, 0x01, 0x60, + 0x00, 0x80, 0x01, 0x60, 0x00, 0x80, 0x01, 0x60, 0x00, 0x80, 0x01, 0x60, + 0x00, 0x80, 0x01, 0x60, 0x00, 0x80, 0x01, 0x60, 0x00, 0x80, 0xff, 0x7f, + 0x00, 0x80, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00}; diff --git a/glabels2/src/pixmaps/cursor_box_mask.xbm b/glabels2/src/pixmaps/cursor_box_mask.xbm new file mode 100644 index 00000000..b41e0559 --- /dev/null +++ b/glabels2/src/pixmaps/cursor_box_mask.xbm @@ -0,0 +1,16 @@ +#define cursor_box_mask_width 32 +#define cursor_box_mask_height 32 +#define cursor_box_mask_x_hot 7 +#define cursor_box_mask_y_hot 7 +static unsigned char cursor_box_mask_bits[] = { + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, + 0xff, 0x7f, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0xc1, 0xff, 0xff, + 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, + 0x00, 0xc0, 0x03, 0xf0, 0x00, 0xc0, 0x03, 0xf0, 0x00, 0xc0, 0x03, 0xf0, + 0x00, 0xc0, 0x03, 0xf0, 0x00, 0xc0, 0x03, 0xf0, 0x00, 0xc0, 0x03, 0xf0, + 0x00, 0xc0, 0x03, 0xf0, 0x00, 0xc0, 0x03, 0xf0, 0x00, 0xc0, 0x03, 0xf0, + 0x00, 0xc0, 0x03, 0xf0, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, + 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff}; diff --git a/glabels2/src/pixmaps/cursor_ellipse.xbm b/glabels2/src/pixmaps/cursor_ellipse.xbm new file mode 100644 index 00000000..946af9ac --- /dev/null +++ b/glabels2/src/pixmaps/cursor_ellipse.xbm @@ -0,0 +1,16 @@ +#define cursor_ellipse_width 32 +#define cursor_ellipse_height 32 +#define cursor_ellipse_x_hot 7 +#define cursor_ellipse_y_hot 7 +static unsigned char cursor_ellipse_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x7c, 0x00, 0x80, 0x00, 0xef, 0x01, 0x00, 0x80, 0x01, 0x03, + 0x00, 0xc0, 0x00, 0x06, 0x00, 0x60, 0x00, 0x0c, 0x00, 0x20, 0x00, 0x08, + 0x00, 0x30, 0x00, 0x18, 0x00, 0x30, 0x00, 0x18, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x30, 0x00, 0x18, 0x00, 0x30, 0x00, 0x18, 0x00, 0x20, 0x00, 0x08, + 0x00, 0x60, 0x00, 0x0c, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x80, 0x01, 0x03, + 0x00, 0x00, 0xef, 0x01, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/glabels2/src/pixmaps/cursor_ellipse_mask.xbm b/glabels2/src/pixmaps/cursor_ellipse_mask.xbm new file mode 100644 index 00000000..22fb5442 --- /dev/null +++ b/glabels2/src/pixmaps/cursor_ellipse_mask.xbm @@ -0,0 +1,16 @@ +#define cursor_ellipse_mask_width 32 +#define cursor_ellipse_mask_height 32 +#define cursor_ellipse_mask_x_hot 7 +#define cursor_ellipse_mask_y_hot 7 +static unsigned char cursor_ellipse_mask_bits[] = { + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, + 0xff, 0x7f, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0xfe, 0x00, + 0xc0, 0x81, 0xff, 0x03, 0xc0, 0xc1, 0xff, 0x07, 0xc0, 0xe1, 0xff, 0x0f, + 0x00, 0xf0, 0x83, 0x1f, 0x00, 0xf0, 0x01, 0x1f, 0x00, 0xf8, 0x00, 0x3e, + 0x00, 0x78, 0x00, 0x3c, 0x00, 0x78, 0x00, 0x3c, 0x00, 0x78, 0x00, 0x3c, + 0x00, 0x78, 0x00, 0x3c, 0x00, 0x78, 0x00, 0x3c, 0x00, 0xf8, 0x00, 0x3e, + 0x00, 0xf0, 0x01, 0x1f, 0x00, 0xf0, 0x83, 0x1f, 0x00, 0xe0, 0xff, 0x0f, + 0x00, 0xc0, 0xff, 0x07, 0x00, 0x80, 0xff, 0x03, 0x00, 0x00, 0xfe, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/glabels2/src/pixmaps/cursor_image.xbm b/glabels2/src/pixmaps/cursor_image.xbm new file mode 100644 index 00000000..32308360 --- /dev/null +++ b/glabels2/src/pixmaps/cursor_image.xbm @@ -0,0 +1,16 @@ +#define cursor_image_width 32 +#define cursor_image_height 32 +#define cursor_image_x_hot 7 +#define cursor_image_y_hot 7 +static unsigned char cursor_image_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0xf0, 0xff, 0x7f, 0x80, 0x10, 0x00, 0x40, 0x00, 0x10, 0x00, 0x40, + 0x00, 0x10, 0x00, 0x4c, 0x00, 0x10, 0x00, 0x52, 0x00, 0x10, 0x08, 0x4c, + 0x00, 0x10, 0x14, 0x40, 0x00, 0x10, 0x22, 0x40, 0x00, 0x10, 0x41, 0x40, + 0x00, 0x90, 0xc1, 0x40, 0x00, 0x10, 0x41, 0x40, 0x00, 0xf0, 0xc1, 0x7f, + 0x00, 0x10, 0x41, 0x40, 0x00, 0x10, 0x41, 0x40, 0x00, 0x10, 0x41, 0x40, + 0x00, 0x10, 0x7f, 0x40, 0x00, 0x10, 0x00, 0x40, 0x00, 0x10, 0x00, 0x40, + 0x00, 0xf0, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00}; diff --git a/glabels2/src/pixmaps/cursor_image_mask.xbm b/glabels2/src/pixmaps/cursor_image_mask.xbm new file mode 100644 index 00000000..9c79e82e --- /dev/null +++ b/glabels2/src/pixmaps/cursor_image_mask.xbm @@ -0,0 +1,16 @@ +#define cursor_image_mask_width 32 +#define cursor_image_mask_height 32 +#define cursor_image_mask_x_hot 7 +#define cursor_image_mask_y_hot 7 +static unsigned char cursor_image_mask_bits[] = { + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, + 0xff, 0x7f, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0xf9, 0xff, 0xff, + 0xc0, 0xf9, 0xff, 0xff, 0xc0, 0xf9, 0xff, 0xff, 0xc0, 0xf9, 0xff, 0xff, + 0x00, 0xf8, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, + 0x00, 0xf8, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, + 0x00, 0xf8, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, + 0x00, 0xf8, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, + 0x00, 0xf8, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, + 0x00, 0xf8, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff}; diff --git a/glabels2/src/pixmaps/cursor_line.xbm b/glabels2/src/pixmaps/cursor_line.xbm new file mode 100644 index 00000000..f5e2636e --- /dev/null +++ b/glabels2/src/pixmaps/cursor_line.xbm @@ -0,0 +1,16 @@ +#define cursor_line_width 32 +#define cursor_line_height 32 +#define cursor_line_x_hot 7 +#define cursor_line_y_hot 7 +static unsigned char cursor_line_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x08, + 0x80, 0x00, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/glabels2/src/pixmaps/cursor_line_mask.xbm b/glabels2/src/pixmaps/cursor_line_mask.xbm new file mode 100644 index 00000000..a9359d55 --- /dev/null +++ b/glabels2/src/pixmaps/cursor_line_mask.xbm @@ -0,0 +1,16 @@ +#define cursor_line_mask_width 32 +#define cursor_line_mask_height 32 +#define cursor_line_mask_x_hot 7 +#define cursor_line_mask_y_hot 7 +static unsigned char cursor_line_mask_bits[] = { + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, + 0xff, 0x7f, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x08, 0xc0, 0x01, 0x00, 0x1c, + 0xc0, 0x01, 0x00, 0x1e, 0xc0, 0x01, 0x00, 0x0f, 0xc0, 0x01, 0x80, 0x07, + 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xf0, 0x00, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x1e, 0x00, + 0x00, 0x00, 0x0f, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xc0, 0x03, 0x00, + 0x00, 0xe0, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x00, 0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/glabels2/src/pixmaps/cursor_text.xbm b/glabels2/src/pixmaps/cursor_text.xbm new file mode 100644 index 00000000..4378c1a6 --- /dev/null +++ b/glabels2/src/pixmaps/cursor_text.xbm @@ -0,0 +1,16 @@ +#define cursor_text_width 32 +#define cursor_text_height 32 +#define cursor_text_x_hot 7 +#define cursor_text_y_hot 7 +static unsigned char cursor_text_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x01, + 0x00, 0xc0, 0x9c, 0x01, 0x00, 0x40, 0x1c, 0x01, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x3e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/glabels2/src/pixmaps/cursor_text_mask.xbm b/glabels2/src/pixmaps/cursor_text_mask.xbm new file mode 100644 index 00000000..543c2b7f --- /dev/null +++ b/glabels2/src/pixmaps/cursor_text_mask.xbm @@ -0,0 +1,16 @@ +#define cursor_text_mask_width 32 +#define cursor_text_mask_height 32 +#define cursor_text_mask_x_hot 7 +#define cursor_text_mask_y_hot 7 +static unsigned char cursor_text_mask_bits[] = { + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, + 0xff, 0x7f, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0xc0, 0xe1, 0xff, 0x03, 0xc0, 0xe1, 0xff, 0x03, + 0x00, 0xe0, 0xff, 0x03, 0x00, 0xe0, 0xbe, 0x03, 0x00, 0x60, 0x3e, 0x03, + 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3e, 0x00, + 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3e, 0x00, + 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x7f, 0x00, + 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/glabels2/src/pixmaps/nocollate.xpm b/glabels2/src/pixmaps/nocollate.xpm new file mode 100644 index 00000000..a67cc13c --- /dev/null +++ b/glabels2/src/pixmaps/nocollate.xpm @@ -0,0 +1,34 @@ +/* XPM */ +static char *nocollate_xpm[]={ +"58 28 3 1", +". c None", +"# c #000000", +"a c #ffffff", +"..........................................................", +".###################..###################.................", +".#aaaaaaaaaaaaaaaaa#..#aaaaaaaaaaaaaaaaa#.................", +".#aaaaaaaa#aaaaaaaa#..#aaaaaaaa#aaaaaaaa#.................", +".#aaaaaaa##aaaaaaaa#..#aaaaaaa##aaaaaaaa#.................", +".#aaaaaaaa#aaaaaaaa#..#aaaaaaaa#aaaaaaaa#..##..##..##.....", +".#aaaaaaaa#aaaaaaaa#..#aaaaaaaa#aaaaaaaa#..##..##..##.....", +".#aaaaaaaa#aaaaaaaa#..#aaaaaaaa#aaaaaaaa#.................", +".#aaaaaaaa#aaaaaaaa#..#aaaaaaaa#aaaaaaaa#.................", +".#aaaaaaa###aaaaaaa#..#aaaaaaa###aaaaaaa#.................", +".#aaaaaaaaaaaaaaaaa#..#aaaaaaaaaaaaaaaaa#.................", +".###################..###################.................", +"..........................................................", +"..........................................................", +"..........................................................", +".................###################..###################.", +".................#aaaaaaaaaaaaaaaaa#..#aaaaaaaaaaaaaaaaa#.", +".................#aaaaaaaa##aaaaaaa#..#aaaaaaaa##aaaaaaa#.", +".................#aaaaaaa#aa#aaaaaa#..#aaaaaaa#aa#aaaaaa#.", +"....##..##..##...#aaaaaaaaaa#aaaaaa#..#aaaaaaaaaa#aaaaaa#.", +"....##..##..##...#aaaaaaaaa#aaaaaaa#..#aaaaaaaaa#aaaaaaa#.", +".................#aaaaaaaa#aaaaaaaa#..#aaaaaaaa#aaaaaaaa#.", +".................#aaaaaaa#aaaaaaaaa#..#aaaaaaa#aaaaaaaaa#.", +".................#aaaaaaa####aaaaaa#..#aaaaaaa####aaaaaa#.", +".................#aaaaaaaaaaaaaaaaa#..#aaaaaaaaaaaaaaaaa#.", +".................###################..###################.", +"..........................................................", +".........................................................."}; diff --git a/glabels2/src/prefs-dialog.c b/glabels2/src/prefs-dialog.c new file mode 100644 index 00000000..683926fb --- /dev/null +++ b/glabels2/src/prefs-dialog.c @@ -0,0 +1,694 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * prefs-dialog.c: Preferences dialog module + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "prefs-dialog.h" + +#include +#include +#include +#include +#include +#include + +#include "prefs.h" +#include "hig.h" +#include "mygal/widget-color-combo.h" +#include "color.h" +#include "util.h" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + +#define US_LETTER_ID "US-Letter" +#define A4_ID "A4" + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glPrefsDialogPrivate +{ + GladeXML *gui; + + /* Units properties */ + GtkWidget *units_points_radio; + GtkWidget *units_inches_radio; + GtkWidget *units_mm_radio; + + /* Page size properties */ + GtkWidget *page_size_us_letter_radio; + GtkWidget *page_size_a4_radio; + + /* Default text properties */ + GtkWidget *text_family_combo; + GtkWidget *text_size_spin; + GtkWidget *text_bold_toggle; + GtkWidget *text_italic_toggle; + GtkWidget *text_color_combo; + GtkWidget *text_left_toggle; + GtkWidget *text_center_toggle; + GtkWidget *text_right_toggle; + GtkWidget *text_line_spacing_spin; + + /* Default line properties */ + GtkWidget *line_width_spin; + GtkWidget *line_color_combo; + + /* Default fill properties */ + GtkWidget *fill_color_combo; + + /* Prevent recursion */ + gboolean stop_signals; +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_prefs_dialog_finalize (GObject *object); +static void gl_prefs_dialog_construct (glPrefsDialog *dialog); + +static void response_cb (glPrefsDialog *dialog, + gint response, + gpointer user_data); + +static void construct_locale_page (glPrefsDialog *dialog); +static void construct_object_page (glPrefsDialog *dialog); + +static void align_toggle_cb (GtkToggleButton *toggle, + glPrefsDialog *dialog); + +static void update_locale_page_from_prefs (glPrefsDialog *dialog); +static void update_object_page_from_prefs (glPrefsDialog *dialog); + +static void update_prefs_from_locale_page (glPrefsDialog *dialog); +static void update_prefs_from_object_page (glPrefsDialog *dialog); + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glPrefsDialog, gl_prefs_dialog, GTK_TYPE_DIALOG); + +static void +gl_prefs_dialog_class_init (glPrefsDialogClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_debug (DEBUG_PREFS, ""); + + gl_prefs_dialog_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_prefs_dialog_finalize; +} + +static void +gl_prefs_dialog_init (glPrefsDialog *dialog) +{ + gl_debug (DEBUG_PREFS, "START"); + + dialog->priv = g_new0 (glPrefsDialogPrivate, 1); + + dialog->priv->gui = glade_xml_new (GLABELS_GLADE_DIR "prefs-dialog.glade", + "prefs_notebook", + NULL); + + if (!dialog->priv->gui) + { + g_critical ("Could not open prefs-dialog.glade. gLabels may not be installed correctly!"); + return; + } + + gtk_container_set_border_width (GTK_CONTAINER(dialog), GL_HIG_PAD2); + + gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE); + gtk_dialog_add_button (GTK_DIALOG(dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE); + + g_signal_connect(G_OBJECT (dialog), "response", + G_CALLBACK (response_cb), NULL); + + gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); + gtk_window_set_title (GTK_WINDOW (dialog), _("gLabels Preferences")); + gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); + + gl_debug (DEBUG_PREFS, "END"); +} + +static void +gl_prefs_dialog_finalize (GObject *object) +{ + glPrefsDialog* dialog = GL_PREFS_DIALOG (object); + + gl_debug (DEBUG_PREFS, "START"); + + g_return_if_fail (object != NULL); + g_return_if_fail (GL_IS_PREFS_DIALOG (dialog)); + g_return_if_fail (dialog->priv != NULL); + + if (dialog->priv->gui) + { + g_object_unref (G_OBJECT (dialog->priv->gui)); + } + g_free (dialog->priv); + + G_OBJECT_CLASS (gl_prefs_dialog_parent_class)->finalize (object); + + gl_debug (DEBUG_PREFS, "END"); +} + +/*****************************************************************************/ +/* NEW preferences dialog. */ +/*****************************************************************************/ +GtkWidget* +gl_prefs_dialog_new (GtkWindow *parent) +{ + GtkWidget *dialog; + + gl_debug (DEBUG_PREFS, "START"); + gl_debug (DEBUG_PREFS, "page size = \"%s\"", gl_prefs->default_page_size); + + dialog = GTK_WIDGET (g_object_new (GL_TYPE_PREFS_DIALOG, NULL)); + + if (parent) + gtk_window_set_transient_for (GTK_WINDOW (dialog), parent); + + gl_prefs_dialog_construct (GL_PREFS_DIALOG(dialog)); + + + gl_debug (DEBUG_PREFS, "END"); + + return dialog; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Construct composite widget. */ +/*---------------------------------------------------------------------------*/ +static void +gl_prefs_dialog_construct (glPrefsDialog *dialog) +{ + GtkWidget *notebook; + + g_return_if_fail (GL_IS_PREFS_DIALOG (dialog)); + g_return_if_fail (dialog->priv != NULL); + + notebook = glade_xml_get_widget (dialog->priv->gui, "prefs_notebook"); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), notebook, FALSE, FALSE, 0); + + construct_locale_page (dialog); + construct_object_page (dialog); + + update_locale_page_from_prefs (dialog); + update_object_page_from_prefs (dialog); + + gtk_widget_show_all (GTK_DIALOG (dialog)->vbox); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. "Response" callback. */ +/*---------------------------------------------------------------------------*/ +static void +response_cb (glPrefsDialog *dialog, + gint response, + gpointer user_data) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail(dialog != NULL); + g_return_if_fail(GTK_IS_DIALOG(dialog)); + + switch(response) { + case GTK_RESPONSE_CLOSE: + gtk_widget_hide (GTK_WIDGET(dialog)); + break; + case GTK_RESPONSE_DELETE_EVENT: + break; + default: + g_print ("response = %d", response); + g_assert_not_reached (); + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Build Locale Properties Notebook Tab */ +/*--------------------------------------------------------------------------*/ +static void +construct_locale_page (glPrefsDialog *dialog) +{ + + dialog->priv->units_points_radio = + glade_xml_get_widget (dialog->priv->gui, "units_points_radio"); + + dialog->priv->units_inches_radio = + glade_xml_get_widget (dialog->priv->gui, "units_inches_radio"); + + dialog->priv->units_mm_radio = + glade_xml_get_widget (dialog->priv->gui, "units_mm_radio"); + + dialog->priv->page_size_us_letter_radio = + glade_xml_get_widget (dialog->priv->gui, "page_size_us_letter_radio"); + + dialog->priv->page_size_a4_radio = + glade_xml_get_widget (dialog->priv->gui, "page_size_a4_radio"); + + g_signal_connect_swapped ( + G_OBJECT(dialog->priv->units_points_radio), + "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog)); + g_signal_connect_swapped ( + G_OBJECT(dialog->priv->units_inches_radio), + "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog)); + g_signal_connect_swapped ( + G_OBJECT(dialog->priv->units_mm_radio), + "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog)); + g_signal_connect_swapped ( + G_OBJECT(dialog->priv->page_size_us_letter_radio), + "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog)); + g_signal_connect_swapped ( + G_OBJECT(dialog->priv->page_size_a4_radio), + "toggled", G_CALLBACK(update_prefs_from_locale_page), G_OBJECT(dialog)); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Build Default Object Properties Notebook Tab */ +/*--------------------------------------------------------------------------*/ +static void +construct_object_page (glPrefsDialog *dialog) +{ + GList *family_names; + + dialog->priv->text_family_combo = + glade_xml_get_widget (dialog->priv->gui, "text_family_combo"); + dialog->priv->text_size_spin = + glade_xml_get_widget (dialog->priv->gui, "text_size_spin"); + dialog->priv->text_bold_toggle = + glade_xml_get_widget (dialog->priv->gui, "text_bold_toggle"); + dialog->priv->text_italic_toggle = + glade_xml_get_widget (dialog->priv->gui, "text_italic_toggle"); + dialog->priv->text_color_combo = + glade_xml_get_widget (dialog->priv->gui, "text_color_combo"); + dialog->priv->text_left_toggle = + glade_xml_get_widget (dialog->priv->gui, "text_left_toggle"); + dialog->priv->text_center_toggle = + glade_xml_get_widget (dialog->priv->gui, "text_center_toggle"); + dialog->priv->text_right_toggle = + glade_xml_get_widget (dialog->priv->gui, "text_right_toggle"); + dialog->priv->text_line_spacing_spin = + glade_xml_get_widget (dialog->priv->gui, "text_line_spacing_spin"); + + dialog->priv->line_width_spin = + glade_xml_get_widget (dialog->priv->gui, "line_width_spin"); + dialog->priv->line_color_combo = + glade_xml_get_widget (dialog->priv->gui, "line_color_combo"); + + dialog->priv->fill_color_combo = + glade_xml_get_widget (dialog->priv->gui, "fill_color_combo"); + + gl_util_combo_box_add_text_model (GTK_COMBO_BOX (dialog->priv->text_family_combo)); + + /* Load family names */ + family_names = gl_util_get_font_family_list (); + gl_util_combo_box_set_strings (GTK_COMBO_BOX (dialog->priv->text_family_combo), + family_names); + gl_util_font_family_list_free (family_names); + + + g_signal_connect_swapped (G_OBJECT(dialog->priv->text_family_combo), + "changed", + G_CALLBACK(update_prefs_from_object_page), + G_OBJECT(dialog)); + g_signal_connect_swapped (G_OBJECT(dialog->priv->text_size_spin), + "changed", + G_CALLBACK(update_prefs_from_object_page), + G_OBJECT(dialog)); + g_signal_connect_swapped (G_OBJECT(dialog->priv->text_bold_toggle), + "toggled", + G_CALLBACK(update_prefs_from_object_page), + G_OBJECT(dialog)); + g_signal_connect_swapped (G_OBJECT(dialog->priv->text_italic_toggle), + "toggled", + G_CALLBACK(update_prefs_from_object_page), + G_OBJECT(dialog)); + g_signal_connect_swapped (G_OBJECT(dialog->priv->text_color_combo), + "color_changed", + G_CALLBACK(update_prefs_from_object_page), + G_OBJECT(dialog)); + + g_signal_connect (G_OBJECT(dialog->priv->text_left_toggle), + "toggled", + G_CALLBACK(align_toggle_cb), + G_OBJECT(dialog)); + g_signal_connect (G_OBJECT(dialog->priv->text_center_toggle), + "toggled", + G_CALLBACK(align_toggle_cb), + G_OBJECT(dialog)); + g_signal_connect (G_OBJECT(dialog->priv->text_right_toggle), + "toggled", + G_CALLBACK(align_toggle_cb), + G_OBJECT(dialog)); + + g_signal_connect_swapped (G_OBJECT(dialog->priv->text_line_spacing_spin), + "changed", + G_CALLBACK(update_prefs_from_object_page), + G_OBJECT(dialog)); + + g_signal_connect_swapped (G_OBJECT(dialog->priv->line_width_spin), + "changed", + G_CALLBACK(update_prefs_from_object_page), + G_OBJECT(dialog)); + g_signal_connect_swapped (G_OBJECT(dialog->priv->line_color_combo), + "color_changed", + G_CALLBACK(update_prefs_from_object_page), + G_OBJECT(dialog)); + + g_signal_connect_swapped (G_OBJECT(dialog->priv->fill_color_combo), + "color_changed", + G_CALLBACK(update_prefs_from_object_page), + G_OBJECT(dialog)); +} + + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Alignment togglebutton callback. */ +/*--------------------------------------------------------------------------*/ +static void +align_toggle_cb (GtkToggleButton *toggle, + glPrefsDialog *dialog) +{ + if (gtk_toggle_button_get_active (toggle)) + { + + if (GTK_WIDGET (toggle) == GTK_WIDGET (dialog->priv->text_left_toggle)) + { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (dialog->priv->text_center_toggle), + FALSE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (dialog->priv->text_right_toggle), + FALSE); + } + else if (GTK_WIDGET (toggle) == GTK_WIDGET (dialog->priv->text_center_toggle)) + { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (dialog->priv->text_left_toggle), + FALSE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (dialog->priv->text_right_toggle), + FALSE); + } + else if (GTK_WIDGET (toggle) == GTK_WIDGET (dialog->priv->text_right_toggle)) + { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (dialog->priv->text_left_toggle), + FALSE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (dialog->priv->text_center_toggle), + FALSE); + } + + update_prefs_from_object_page (dialog); + } + +} + + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Update locale page widgets from current prefs. */ +/*--------------------------------------------------------------------------*/ +static void +update_locale_page_from_prefs (glPrefsDialog *dialog) +{ + dialog->priv->stop_signals = TRUE; + + switch (gl_prefs->units) { + case LGL_UNITS_POINT: + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(dialog->priv->units_points_radio), + TRUE); + break; + case LGL_UNITS_INCH: + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(dialog->priv->units_inches_radio), + TRUE); + break; + case LGL_UNITS_MM: + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(dialog->priv->units_mm_radio), + TRUE); + break; + default: + g_message ("Illegal units"); /* Should not happen */ + break; + } + + if ( g_strcasecmp(gl_prefs->default_page_size, US_LETTER_ID) == 0) + { + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(dialog->priv->page_size_us_letter_radio), TRUE); + } + else if ( g_strcasecmp(gl_prefs->default_page_size, A4_ID) == 0) + { + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON(dialog->priv->page_size_a4_radio), TRUE); + } + else + { + g_message ("Unknown default page size"); /* Shouldn't happen */ + } + + dialog->priv->stop_signals = FALSE; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Update object page widgets from current prefs. */ +/*--------------------------------------------------------------------------*/ +static void +update_object_page_from_prefs (glPrefsDialog *dialog) +{ + GList *family_names; + gchar *good_font_family; + GdkColor *gdk_color; + + dialog->priv->stop_signals = TRUE; + + + /* Make sure we have a valid font family. if not provide a good default. */ + family_names = gl_util_get_font_family_list (); + if (g_list_find_custom (family_names, + gl_prefs->default_font_family, + (GCompareFunc)g_utf8_collate)) + { + good_font_family = g_strdup (gl_prefs->default_font_family); + } + else + { + if (family_names != NULL) + { + good_font_family = g_strdup (family_names->data); /* 1st entry */ + } + else + { + good_font_family = NULL; + } + } + gl_util_font_family_list_free (family_names); + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (dialog->priv->text_family_combo), + good_font_family); + g_free (good_font_family); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->priv->text_size_spin), + gl_prefs->default_font_size); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_bold_toggle), + (gl_prefs->default_font_weight == PANGO_WEIGHT_BOLD)); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_italic_toggle), + gl_prefs->default_font_italic_flag); + + gdk_color = gl_color_to_gdk_color (gl_prefs->default_text_color); + color_combo_set_color (COLOR_COMBO(dialog->priv->text_color_combo), gdk_color); + g_free (gdk_color); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_left_toggle), + (gl_prefs->default_text_alignment == GTK_JUSTIFY_LEFT)); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_center_toggle), + (gl_prefs->default_text_alignment == GTK_JUSTIFY_CENTER)); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->text_right_toggle), + (gl_prefs->default_text_alignment == GTK_JUSTIFY_RIGHT)); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->priv->text_line_spacing_spin), + gl_prefs->default_text_line_spacing); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->priv->line_width_spin), + gl_prefs->default_line_width); + + gdk_color = gl_color_to_gdk_color (gl_prefs->default_line_color); + color_combo_set_color (COLOR_COMBO(dialog->priv->line_color_combo), gdk_color); + g_free (gdk_color); + + + gdk_color = gl_color_to_gdk_color (gl_prefs->default_fill_color); + color_combo_set_color (COLOR_COMBO(dialog->priv->fill_color_combo), gdk_color); + g_free (gdk_color); + + + dialog->priv->stop_signals = FALSE; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Update prefs from current state of locale page widgets. */ +/*--------------------------------------------------------------------------*/ +static void +update_prefs_from_locale_page (glPrefsDialog *dialog) +{ + if (dialog->priv->stop_signals) return; + + if (gtk_toggle_button_get_active ( + GTK_TOGGLE_BUTTON(dialog->priv->units_points_radio))) + { + gl_prefs->units = LGL_UNITS_POINT; + } + if (gtk_toggle_button_get_active ( + GTK_TOGGLE_BUTTON(dialog->priv->units_inches_radio))) + { + gl_prefs->units = LGL_UNITS_INCH; + } + if (gtk_toggle_button_get_active ( + GTK_TOGGLE_BUTTON(dialog->priv->units_mm_radio))) + { + gl_prefs->units = LGL_UNITS_MM; + } + + if (gtk_toggle_button_get_active ( + GTK_TOGGLE_BUTTON(dialog->priv->page_size_us_letter_radio))) + { + g_free (gl_prefs->default_page_size); + gl_prefs->default_page_size = g_strdup (US_LETTER_ID); + } + if (gtk_toggle_button_get_active ( + GTK_TOGGLE_BUTTON(dialog->priv->page_size_a4_radio))) + { + g_free (gl_prefs->default_page_size); + gl_prefs->default_page_size = g_strdup (A4_ID); + } + + gl_prefs_model_save_settings (gl_prefs); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Update prefs from current state of object page widgets. */ +/*--------------------------------------------------------------------------*/ +static void +update_prefs_from_object_page (glPrefsDialog *dialog) +{ + GdkColor *gdk_color; + gboolean is_default; + + if (dialog->priv->stop_signals) return; + + g_free (gl_prefs->default_font_family); + gl_prefs->default_font_family = + gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->text_family_combo)); + gl_prefs->default_font_size = + gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->text_size_spin)); + + if (gtk_toggle_button_get_active + (GTK_TOGGLE_BUTTON (dialog->priv->text_bold_toggle))) + { + gl_prefs->default_font_weight = PANGO_WEIGHT_BOLD; + } + else + { + gl_prefs->default_font_weight = PANGO_WEIGHT_NORMAL; + } + + gl_prefs->default_font_italic_flag = + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON + (dialog->priv->text_italic_toggle)); + + gdk_color = color_combo_get_color (COLOR_COMBO(dialog->priv->text_color_combo), + &is_default); + if (!is_default) + { + gl_prefs->default_text_color = gl_color_from_gdk_color (gdk_color); + } + + if (gtk_toggle_button_get_active + (GTK_TOGGLE_BUTTON (dialog->priv->text_left_toggle))) + { + gl_prefs->default_text_alignment = GTK_JUSTIFY_LEFT; + } + else if (gtk_toggle_button_get_active + (GTK_TOGGLE_BUTTON (dialog->priv->text_right_toggle))) + { + gl_prefs->default_text_alignment = GTK_JUSTIFY_RIGHT; + } + else if (gtk_toggle_button_get_active + (GTK_TOGGLE_BUTTON (dialog->priv->text_center_toggle))) + { + gl_prefs->default_text_alignment = GTK_JUSTIFY_CENTER; + } + else + { + /* Should not happen. */ + gl_prefs->default_text_alignment = GTK_JUSTIFY_LEFT; + } + + + gl_prefs->default_text_line_spacing = + gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->text_line_spacing_spin)); + + gl_prefs->default_line_width = + gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->line_width_spin)); + + gdk_color = color_combo_get_color (COLOR_COMBO(dialog->priv->line_color_combo), + &is_default); + if (!is_default) + { + gl_prefs->default_line_color = gl_color_from_gdk_color (gdk_color); + } + + + gdk_color = color_combo_get_color (COLOR_COMBO(dialog->priv->fill_color_combo), + &is_default); + if (!is_default) + { + gl_prefs->default_fill_color = gl_color_from_gdk_color (gdk_color); + } + + gl_prefs_model_save_settings (gl_prefs); +} + + + diff --git a/glabels2/src/prefs-dialog.h b/glabels2/src/prefs-dialog.h new file mode 100644 index 00000000..8ec8e929 --- /dev/null +++ b/glabels2/src/prefs-dialog.h @@ -0,0 +1,65 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * prefs-dialog.h: Preferences dialog module header file + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __PREFS_DIALOG_H__ +#define __PREFS_DIALOG_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GL_TYPE_PREFS_DIALOG (gl_prefs_dialog_get_type ()) +#define GL_PREFS_DIALOG(obj) (GTK_CHECK_CAST ((obj), GL_TYPE_PREFS_DIALOG, glPrefsDialog)) +#define GL_PREFS_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GL_TYPE_PREFS_DIALOG, glPrefsDialogClass)) +#define GL_IS_PREFS_DIALOG(obj) (GTK_CHECK_TYPE ((obj), GL_TYPE_PREFS_DIALOG)) +#define GL_IS_PREFS_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GL_TYPE_PREFS_DIALOG)) +#define GL_PREFS_DIALOG_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), GL_TYPE_PREFS_DIALOG, glPrefsDialogClass)) + + +typedef struct _glPrefsDialog glPrefsDialog; +typedef struct _glPrefsDialogClass glPrefsDialogClass; + +typedef struct _glPrefsDialogPrivate glPrefsDialogPrivate; + +struct _glPrefsDialog +{ + GtkDialog parent_instance; + + glPrefsDialogPrivate *priv; + +}; + +struct _glPrefsDialogClass +{ + GtkDialogClass parent_class; +}; + +GType gl_prefs_dialog_get_type (void) G_GNUC_CONST; + +GtkWidget *gl_prefs_dialog_new (GtkWindow *parent); + +G_END_DECLS + +#endif /* __PREFS_DIALOG_H__ */ diff --git a/glabels2/src/prefs-model.c b/glabels2/src/prefs-model.c new file mode 100644 index 00000000..b67f92f4 --- /dev/null +++ b/glabels2/src/prefs-model.c @@ -0,0 +1,733 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * prefs-model.c: Application preferences model module + * + * Copyright (C) 2001-2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "prefs-model.h" + +#include + +#include "marshal.h" +#include "util.h" +#include "color.h" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + +/* GConf keys */ +#define BASE_KEY "/apps/glabels" + +#define PREF_UNITS "/units" +#define PREF_DEFAULT_PAGE_SIZE "/default-page-size" + +#define PREF_DEFAULT_FONT_FAMILY "/default-font-family" +#define PREF_DEFAULT_FONT_SIZE "/default-font-size" +#define PREF_DEFAULT_FONT_WEIGHT "/default-font-weight" +#define PREF_DEFAULT_FONT_ITALIC_FLAG "/default-font-italic-flag" +#define PREF_DEFAULT_TEXT_COLOR "/default-text-color" +#define PREF_DEFAULT_TEXT_ALIGNMENT "/default-text-alignment" +#define PREF_DEFAULT_TEXT_LINE_SPACING "/default-text-line-spacing" + +#define PREF_DEFAULT_LINE_WIDTH "/default-line-width" +#define PREF_DEFAULT_LINE_COLOR "/default-line-color" + +#define PREF_DEFAULT_FILL_COLOR "/default-fill-color" + +#define PREF_MAIN_TOOLBAR_VISIBLE "/main-toolbar-visible" +#define PREF_MAIN_TOOLBAR_BUTTONS_STYLE "/main-toolbar-buttons-style" +#define PREF_MAIN_TOOLBAR_VIEW_TOOLTIPS "/main-toolbar-view-tooltips" + +#define PREF_DRAWING_TOOLBAR_VISIBLE "/drawing-toolbar-visible" +#define PREF_DRAWING_TOOLBAR_VIEW_TOOLTIPS "/drawing-toolbar-view-tooltips" + +#define PREF_PROPERTY_TOOLBAR_VISIBLE "/property-toolbar-visible" +#define PREF_PROPERTY_TOOLBAR_VIEW_TOOLTIPS "/property-toolbar-view-tooltips" + +#define PREF_GRID_VISIBLE "/grid-visible" +#define PREF_MARKUP_VISIBLE "/markup-visible" + +#define PREF_MAX_RECENTS "/max-recents" + +#define PREF_RECENT_TEMPLATES "/recent-templates" +#define PREF_MAX_RECENT_TEMPLATES "/max-recent-templates" + +/* Default values */ +#define DEFAULT_UNITS_STRING units_to_string (LGL_UNITS_INCH) +#define DEFAULT_PAGE_SIZE "US-Letter" + +#define DEFAULT_FONT_FAMILY "Sans" +#define DEFAULT_FONT_SIZE 14.0 +#define DEFAULT_FONT_WEIGHT_STRING gl_util_weight_to_string (PANGO_WEIGHT_NORMAL) +#define DEFAULT_FONT_ITALIC_FLAG FALSE +#define DEFAULT_TEXT_ALIGN_STRING gl_util_align_to_string (PANGO_ALIGN_LEFT) +#define DEFAULT_TEXT_COLOR GL_COLOR (0,0,0) +#define DEFAULT_TEXT_LINE_SPACING 1.0 + +#define DEFAULT_LINE_WIDTH 1.0 +#define DEFAULT_LINE_COLOR GL_COLOR_A (0, 0, 0, 255) + +#define DEFAULT_FILL_COLOR GL_COLOR_A (0, 255, 0, 255) + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +enum { + CHANGED, + LAST_SIGNAL +}; + + + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +static guint signals[LAST_SIGNAL] = {0}; + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_prefs_model_finalize (GObject *object); + +static void notify_cb (GConfClient *client, + guint cnxn_id, + GConfEntry *entry, + glPrefsModel *prefs_model); + +static gchar *get_string (GConfClient *client, + const gchar *key, + const gchar *def); + +static gboolean get_bool (GConfClient *client, + const gchar *key, + gboolean def); + +static gint get_int (GConfClient *client, + const gchar *key, + gint def); + +static gdouble get_float (GConfClient *client, + const gchar *key, + gdouble def); + +static lglUnitsType string_to_units (const gchar *string); +static const gchar *units_to_string (lglUnitsType units); + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glPrefsModel, gl_prefs_model, G_TYPE_OBJECT); + +static void +gl_prefs_model_class_init (glPrefsModelClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_debug (DEBUG_PREFS, "START"); + + gl_prefs_model_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_prefs_model_finalize; + + signals[CHANGED] = + g_signal_new ("changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glPrefsModelClass, changed), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + + gl_debug (DEBUG_PREFS, "END"); +} + +static void +gl_prefs_model_init (glPrefsModel *prefs_model) +{ + gl_debug (DEBUG_PREFS, "START"); + + prefs_model->gconf_client = gconf_client_get_default (); + + g_return_if_fail (prefs_model->gconf_client != NULL); + + gconf_client_add_dir (prefs_model->gconf_client, + BASE_KEY, + GCONF_CLIENT_PRELOAD_ONELEVEL, + NULL); + + gconf_client_notify_add (prefs_model->gconf_client, + BASE_KEY, + (GConfClientNotifyFunc)notify_cb, prefs_model, + NULL, NULL); + + gl_debug (DEBUG_PREFS, "END"); +} + +static void +gl_prefs_model_finalize (GObject *object) +{ + glPrefsModel *prefs_model = GL_PREFS_MODEL (object); + + gl_debug (DEBUG_PREFS, "START"); + + g_return_if_fail (object && GL_IS_PREFS_MODEL (object)); + + g_object_unref (G_OBJECT(prefs_model->gconf_client)); + g_free (prefs_model->default_page_size); + g_free (prefs_model->default_font_family); + + G_OBJECT_CLASS (gl_prefs_model_parent_class)->finalize (object); + + gl_debug (DEBUG_PREFS, "END"); +} + +/*****************************************************************************/ +/* New prefs_model object. */ +/*****************************************************************************/ +glPrefsModel * +gl_prefs_model_new (void) +{ + glPrefsModel *prefs_model; + + gl_debug (DEBUG_PREFS, "START"); + + prefs_model = GL_PREFS_MODEL (g_object_new (gl_prefs_model_get_type(), NULL)); + + gl_debug (DEBUG_PREFS, "END"); + + return prefs_model; +} + + + +/*****************************************************************************/ +/* Save all settings. */ +/*****************************************************************************/ +void +gl_prefs_model_save_settings (glPrefsModel *prefs_model) +{ + gl_debug (DEBUG_PREFS, "START"); + + g_return_if_fail (prefs_model && GL_IS_PREFS_MODEL(prefs_model)); + g_return_if_fail (prefs_model->gconf_client != NULL); + + /* We are saving settings because presumably some of them have been changed. */ + g_signal_emit (G_OBJECT(prefs_model), signals[CHANGED], 0); + + /* Units */ + gconf_client_set_string (prefs_model->gconf_client, + BASE_KEY PREF_UNITS, + units_to_string(prefs_model->units), + NULL); + + /* Default page size */ + gconf_client_set_string (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_PAGE_SIZE, + prefs_model->default_page_size, + NULL); + + + /* Text properties */ + gconf_client_set_string (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_FONT_FAMILY, + prefs_model->default_font_family, + NULL); + + gconf_client_set_float (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_FONT_SIZE, + prefs_model->default_font_size, + NULL); + + gconf_client_set_string (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_FONT_WEIGHT, + gl_util_weight_to_string(prefs_model->default_font_weight), + NULL); + + gconf_client_set_int (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_TEXT_COLOR, + prefs_model->default_text_color, + NULL); + + gconf_client_set_string (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_TEXT_ALIGNMENT, + gl_util_align_to_string(prefs_model->default_text_alignment), + NULL); + + gconf_client_set_float (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_TEXT_LINE_SPACING, + prefs_model->default_text_line_spacing, + NULL); + + /* Line properties */ + gconf_client_set_float (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_LINE_WIDTH, + prefs_model->default_line_width, + NULL); + + gconf_client_set_int (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_LINE_COLOR, + prefs_model->default_line_color, + NULL); + + + /* Fill properties */ + gconf_client_set_int (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_FILL_COLOR, + prefs_model->default_fill_color, + NULL); + + + /* Main Toolbar */ + gconf_client_set_bool (prefs_model->gconf_client, + BASE_KEY PREF_MAIN_TOOLBAR_VISIBLE, + prefs_model->main_toolbar_visible, + NULL); + + gconf_client_set_int (prefs_model->gconf_client, + BASE_KEY PREF_MAIN_TOOLBAR_BUTTONS_STYLE, + prefs_model->main_toolbar_buttons_style, + NULL); + + gconf_client_set_bool (prefs_model->gconf_client, + BASE_KEY PREF_MAIN_TOOLBAR_VIEW_TOOLTIPS, + prefs_model->main_toolbar_view_tooltips, + NULL); + + /* Drawing Toolbar */ + gconf_client_set_bool (prefs_model->gconf_client, + BASE_KEY PREF_DRAWING_TOOLBAR_VISIBLE, + prefs_model->drawing_toolbar_visible, + NULL); + + gconf_client_set_bool (prefs_model->gconf_client, + BASE_KEY PREF_DRAWING_TOOLBAR_VIEW_TOOLTIPS, + prefs_model->drawing_toolbar_view_tooltips, + NULL); + + /* Property Toolbar */ + gconf_client_set_bool (prefs_model->gconf_client, + BASE_KEY PREF_PROPERTY_TOOLBAR_VISIBLE, + prefs_model->property_toolbar_visible, + NULL); + + gconf_client_set_bool (prefs_model->gconf_client, + BASE_KEY PREF_PROPERTY_TOOLBAR_VIEW_TOOLTIPS, + prefs_model->property_toolbar_view_tooltips, + NULL); + + /* View properties */ + gconf_client_set_bool (prefs_model->gconf_client, + BASE_KEY PREF_GRID_VISIBLE, + prefs_model->grid_visible, + NULL); + + gconf_client_set_bool (prefs_model->gconf_client, + BASE_KEY PREF_MARKUP_VISIBLE, + prefs_model->markup_visible, + NULL); + + /* Recent files */ + gconf_client_set_int (prefs_model->gconf_client, + BASE_KEY PREF_MAX_RECENTS, + prefs_model->max_recents, + NULL); + + /* Recent templates */ + gconf_client_set_list (prefs_model->gconf_client, + BASE_KEY PREF_RECENT_TEMPLATES, + GCONF_VALUE_STRING, + prefs_model->recent_templates, + NULL); + gconf_client_set_int (prefs_model->gconf_client, + BASE_KEY PREF_MAX_RECENT_TEMPLATES, + prefs_model->max_recent_templates, + NULL); + + + gconf_client_suggest_sync (prefs_model->gconf_client, NULL); + + gl_debug (DEBUG_PREFS, "END"); +} + +/*****************************************************************************/ +/* Load all settings. */ +/*****************************************************************************/ +void +gl_prefs_model_load_settings (glPrefsModel *prefs_model) +{ + gchar *string; + lglPaper *paper; + GSList *p, *p_next; + + gl_debug (DEBUG_PREFS, "START"); + + g_return_if_fail (prefs_model && GL_IS_PREFS_MODEL(prefs_model)); + g_return_if_fail (prefs_model->gconf_client != NULL); + + /* Units */ + string = + get_string (prefs_model->gconf_client, + BASE_KEY PREF_UNITS, + DEFAULT_UNITS_STRING); + prefs_model->units = string_to_units( string ); + g_free( string ); + + + /* Page size */ + g_free (prefs_model->default_page_size); + prefs_model->default_page_size = + get_string (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_PAGE_SIZE, + DEFAULT_PAGE_SIZE); + + /* Text properties */ + g_free (prefs_model->default_font_family); + prefs_model->default_font_family = + get_string (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_FONT_FAMILY, + DEFAULT_FONT_FAMILY); + + prefs_model->default_font_size = + get_float (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_FONT_SIZE, + DEFAULT_FONT_SIZE); + + string = + get_string (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_FONT_WEIGHT, + DEFAULT_FONT_WEIGHT_STRING); + prefs_model->default_font_weight = gl_util_string_to_weight( string ); + g_free( string ); + + prefs_model->default_text_color = + get_int (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_TEXT_COLOR, + DEFAULT_TEXT_COLOR); + + string = + get_string (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_TEXT_ALIGNMENT, + DEFAULT_TEXT_ALIGN_STRING); + prefs_model->default_text_alignment = gl_util_string_to_align( string ); + g_free( string ); + + prefs_model->default_text_line_spacing = + get_float (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_TEXT_LINE_SPACING, + DEFAULT_TEXT_LINE_SPACING); + + gl_debug (DEBUG_PREFS, "text_line_spacing = %f", prefs_model->default_text_line_spacing); + + /* Line properties */ + prefs_model->default_line_width = + get_float (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_LINE_WIDTH, + DEFAULT_LINE_WIDTH); + prefs_model->default_line_color = + get_int (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_LINE_COLOR, + DEFAULT_LINE_COLOR); + + /* Fill properties */ + prefs_model->default_fill_color = + get_int (prefs_model->gconf_client, + BASE_KEY PREF_DEFAULT_FILL_COLOR, + DEFAULT_FILL_COLOR); + + + /* User Inferface/Main Toolbar */ + prefs_model->main_toolbar_visible = + get_bool (prefs_model->gconf_client, + BASE_KEY PREF_MAIN_TOOLBAR_VISIBLE, + TRUE); + + prefs_model->main_toolbar_buttons_style = + get_int (prefs_model->gconf_client, + BASE_KEY PREF_MAIN_TOOLBAR_BUTTONS_STYLE, + GL_TOOLBAR_SYSTEM); + + prefs_model->main_toolbar_view_tooltips = + get_bool (prefs_model->gconf_client, + BASE_KEY PREF_MAIN_TOOLBAR_VIEW_TOOLTIPS, + TRUE); + + /* User Inferface/Drawing Toolbar */ + prefs_model->drawing_toolbar_visible = + get_bool (prefs_model->gconf_client, + BASE_KEY PREF_DRAWING_TOOLBAR_VISIBLE, + TRUE); + + prefs_model->drawing_toolbar_view_tooltips = + get_bool (prefs_model->gconf_client, + BASE_KEY PREF_DRAWING_TOOLBAR_VIEW_TOOLTIPS, + TRUE); + + /* User Inferface/Property Toolbar */ + prefs_model->property_toolbar_visible = + get_bool (prefs_model->gconf_client, + BASE_KEY PREF_PROPERTY_TOOLBAR_VISIBLE, + TRUE); + + prefs_model->property_toolbar_view_tooltips = + get_bool (prefs_model->gconf_client, + BASE_KEY PREF_PROPERTY_TOOLBAR_VIEW_TOOLTIPS, + TRUE); + + + /* View properties */ + prefs_model->grid_visible = + get_bool (prefs_model->gconf_client, + BASE_KEY PREF_GRID_VISIBLE, + TRUE); + + prefs_model->markup_visible = + get_bool (prefs_model->gconf_client, + BASE_KEY PREF_MARKUP_VISIBLE, + TRUE); + + /* Recent files */ + prefs_model->max_recents = + get_int (prefs_model->gconf_client, + BASE_KEY PREF_MAX_RECENTS, + -1); + + /* Recent templates */ + for (p=prefs_model->recent_templates; p != NULL; p=p->next) + { + g_free (p->data); + } + g_slist_free (prefs_model->recent_templates); + prefs_model->recent_templates = + gconf_client_get_list (prefs_model->gconf_client, + BASE_KEY PREF_RECENT_TEMPLATES, + GCONF_VALUE_STRING, + NULL); + prefs_model->max_recent_templates = + get_int (prefs_model->gconf_client, + BASE_KEY PREF_MAX_RECENT_TEMPLATES, + 5); + + + /* Proof read the default page size -- it must be a valid id. */ + /* (For compatability with older versions.) */ + paper = lgl_db_lookup_paper_from_id (prefs_model->default_page_size); + if ( paper == NULL ) { + prefs_model->default_page_size = g_strdup (DEFAULT_PAGE_SIZE); + } else { + lgl_paper_free (paper); + paper = NULL; + } + + /* Proof read the recent templates list. Make sure the template names */ + /* are valid. Remove from list if not. */ + for (p=prefs_model->recent_templates; p != NULL; p=p_next) + { + p_next = p->next; + + if ( !lgl_db_does_template_name_exist (p->data) ) + { + g_free (p->data); + prefs_model->recent_templates = g_slist_delete_link (prefs_model->recent_templates, p); + } + } + + gl_debug (DEBUG_PREFS, "max_recents = %d", prefs_model->max_recents); + + + g_signal_emit (G_OBJECT(prefs_model), signals[CHANGED], 0); + + gl_debug (DEBUG_PREFS, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Key changed callback. */ +/*---------------------------------------------------------------------------*/ +static void +notify_cb (GConfClient *client, + guint cnxn_id, + GConfEntry *entry, + glPrefsModel *prefs_model) +{ + gl_debug (DEBUG_PREFS, "Key was changed: %s", entry->key); + + gl_prefs_model_load_settings (prefs_model); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Utilities to get values with defaults. */ +/*---------------------------------------------------------------------------*/ +static gchar* +get_string (GConfClient *client, + const gchar *key, + const gchar *def) +{ + gchar* val; + + val = gconf_client_get_string (client, key, NULL); + + if (val != NULL) { + + return val; + + } else { + + return def ? g_strdup (def) : NULL; + + } +} + +static gboolean +get_bool (GConfClient *client, + const gchar *key, + gboolean def) +{ + GConfValue* val; + gboolean retval; + + val = gconf_client_get (client, key, NULL); + + if (val != NULL) { + + if ( val->type == GCONF_VALUE_BOOL ) { + retval = gconf_value_get_bool (val); + } else { + retval = def; + } + + gconf_value_free (val); + + return retval; + + } else { + + return def; + + } +} + +static gint +get_int (GConfClient *client, + const gchar *key, + gint def) +{ + GConfValue* val; + gint retval; + + val = gconf_client_get (client, key, NULL); + + if (val != NULL) { + + if ( val->type == GCONF_VALUE_INT) { + retval = gconf_value_get_int(val); + } else { + retval = def; + } + + gconf_value_free (val); + + return retval; + + } else { + + return def; + + } +} + +static gdouble +get_float (GConfClient *client, + const gchar *key, + gdouble def) +{ + GConfValue* val; + gdouble retval; + + val = gconf_client_get (client, key, NULL); + + if (val != NULL) { + + if ( val->type == GCONF_VALUE_FLOAT ) { + retval = gconf_value_get_float(val); + } else { + retval = def; + } + + gconf_value_free (val); + + return retval; + + } else { + return def; + + } +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Utilities to deal with units. */ +/*---------------------------------------------------------------------------*/ +static lglUnitsType +string_to_units (const gchar *string) +{ + lglUnitsType units; + + if (g_strcasecmp (string, "Points") == 0) { + units = LGL_UNITS_POINT; + } else if (g_strcasecmp (string, "Inches") == 0) { + units = LGL_UNITS_INCH; + } else if (g_strcasecmp (string, "Millimeters") == 0) { + units = LGL_UNITS_MM; + } else { + units = LGL_UNITS_INCH; + } + + return units; +} + +static const +gchar *units_to_string (lglUnitsType units) +{ + switch (units) { + case LGL_UNITS_POINT: + return "Points"; + break; + case LGL_UNITS_INCH: + return "Inches"; + break; + case LGL_UNITS_MM: + return "Millimeters"; + break; + default: + return "Inches"; + break; + } +} + + diff --git a/glabels2/src/prefs-model.h b/glabels2/src/prefs-model.h new file mode 100644 index 00000000..b2cc1cbd --- /dev/null +++ b/glabels2/src/prefs-model.h @@ -0,0 +1,124 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * prefs-model.h: Application preferences model module header file + * + * Copyright (C) 2001-2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __PREFS_MODEL_H__ +#define __PREFS_MODEL_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + +typedef enum { + GL_TOOLBAR_SYSTEM = 0, + GL_TOOLBAR_ICONS, + GL_TOOLBAR_ICONS_AND_TEXT +} glToolbarSetting; + +#define GL_TYPE_PREFS_MODEL (gl_prefs_model_get_type ()) +#define GL_PREFS_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_PREFS_MODEL, glPrefsModel)) +#define GL_PREFS_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_PREFS_MODEL, glPrefsModelClass)) +#define GL_IS_PREFS_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_PREFS_MODEL)) +#define GL_IS_PREFS_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_PREFS_MODEL)) +#define GL_PREFS_MODEL_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), GL_TYPE_PREFS_MODEL, glPrefsModelClass)) + + +typedef struct _glPrefsModel glPrefsModel; +typedef struct _glPrefsModelClass glPrefsModelClass; + +typedef struct _glPrefsModelPrivate glPrefsModelPrivate; + + +struct _glPrefsModel { + GObject *object; + + GConfClient *gconf_client; + + /* Units */ + lglUnitsType units; + + /* Page size */ + gchar *default_page_size; + + /* Text properties */ + gchar *default_font_family; + gdouble default_font_size; + PangoWeight default_font_weight; + gboolean default_font_italic_flag; + guint default_text_color; + PangoAlignment default_text_alignment; + gdouble default_text_line_spacing; + + /* Line properties */ + gdouble default_line_width; + guint default_line_color; + + /* Fill properties */ + guint default_fill_color; + + /* User Interface/Main Toolbar */ + gboolean main_toolbar_visible; + glToolbarSetting main_toolbar_buttons_style; + gboolean main_toolbar_view_tooltips; + + /* User Interface/Drawing Toolbar */ + gboolean drawing_toolbar_visible; + gboolean drawing_toolbar_view_tooltips; + + /* User Interface/Property Toolbar */ + gboolean property_toolbar_visible; + gboolean property_toolbar_view_tooltips; + + /* View properties */ + gboolean grid_visible; + gboolean markup_visible; + + /* Recent files */ + gint max_recents; + + /* Recent templates */ + GSList *recent_templates; + gint max_recent_templates; +}; + +struct _glPrefsModelClass { + GObjectClass parent_class; + + void (*changed) (glPrefsModel *prefs_model, gpointer user_data); +}; + + +GType gl_prefs_model_get_type (void) G_GNUC_CONST; + +glPrefsModel *gl_prefs_model_new (void); + +void gl_prefs_model_save_settings (glPrefsModel *prefs_model); + +void gl_prefs_model_load_settings (glPrefsModel *prefs_model); + +G_END_DECLS + +#endif /* __PREFS_MODEL_H__ */ + diff --git a/glabels2/src/prefs.c b/glabels2/src/prefs.c new file mode 100644 index 00000000..32011b79 --- /dev/null +++ b/glabels2/src/prefs.c @@ -0,0 +1,214 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * prefs.c: Application preferences module + * + * Copyright (C) 2001-2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "prefs.h" + +#include +#include + +#include "debug.h" + +glPrefsModel *gl_prefs = NULL; + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + + + +/*****************************************************************************/ +/* Initialize preferences module. */ +/*****************************************************************************/ +void +gl_prefs_init (void) +{ + gl_debug (DEBUG_PREFS, "START"); + + gl_prefs = gl_prefs_model_new (); + + gl_prefs_model_load_settings (gl_prefs); + + gl_debug (DEBUG_PREFS, "END"); +} + + +/****************************************************************************/ +/* Get string representing desired units. */ +/****************************************************************************/ +const gchar * +gl_prefs_get_page_size (void) +{ + return (gl_prefs->default_page_size); +} + +/****************************************************************************/ +/* Get desired units. */ +/****************************************************************************/ +lglUnitsType +gl_prefs_get_units (void) +{ + return gl_prefs->units; +} + +/****************************************************************************/ +/* Get desired units per point. */ +/****************************************************************************/ +gdouble +gl_prefs_get_units_per_point (void) +{ + + switch (gl_prefs->units) { + case LGL_UNITS_POINT: + return 1.0; /* points */ + case LGL_UNITS_INCH: + return 1.0 / 72.0; /* inches */ + case LGL_UNITS_MM: + return 0.35277778; /* mm */ + default: + g_message ("Illegal units"); /* Should not happen */ + return 1.0; + } +} + +/****************************************************************************/ +/* Get precision for desired units. */ +/****************************************************************************/ +gint +gl_prefs_get_units_precision (void) +{ + + switch (gl_prefs->units) { + case LGL_UNITS_POINT: + return 1; /* points */ + case LGL_UNITS_INCH: + return 3; /* inches */ + case LGL_UNITS_MM: + return 1; /* mm */ + default: + g_message ("Illegal units"); /* Should not happen */ + return 1.0; + } +} + +/****************************************************************************/ +/* Get step size for desired units. */ +/****************************************************************************/ +gdouble +gl_prefs_get_units_step_size (void) +{ + + switch (gl_prefs->units) { + case LGL_UNITS_POINT: + return 0.1; /* points */ + case LGL_UNITS_INCH: + return 0.001; /* inches */ + case LGL_UNITS_MM: + return 0.1; /* mm */ + default: + g_message ("Illegal units"); /* Should not happen */ + return 1.0; + } +} + +/****************************************************************************/ +/* Get string representing desired units. */ +/****************************************************************************/ +const gchar * +gl_prefs_get_units_string (void) +{ + + switch (gl_prefs->units) { + case LGL_UNITS_POINT: + return _("points"); + case LGL_UNITS_INCH: + return _("inches"); + case LGL_UNITS_MM: + return _("mm"); + default: + g_message ("Illegal units"); /* Should not happen */ + return _("points"); + } +} + +/****************************************************************************/ +/* Add template to recent template list. */ +/****************************************************************************/ +void +gl_prefs_add_recent_template (const gchar *name) +{ + GSList *p; + + /* + * If already in list, remove that entry. + */ + p = g_slist_find_custom (gl_prefs->recent_templates, + name, + (GCompareFunc)lgl_str_utf8_casecmp); + if (p) + { + gl_prefs->recent_templates = + g_slist_remove_link (gl_prefs->recent_templates, p); + g_free (p->data); + g_slist_free_1 (p); + } + + /* + * Now prepend to list. + */ + gl_prefs->recent_templates = + g_slist_prepend (gl_prefs->recent_templates, g_strdup (name)); + + /* + * Truncate list to maximum size + */ + while (g_slist_length (gl_prefs->recent_templates) > gl_prefs->max_recent_templates) + { + p = g_slist_last (gl_prefs->recent_templates); + gl_prefs->recent_templates = + g_slist_remove_link (gl_prefs->recent_templates, p); + g_free (p->data); + g_slist_free_1 (p); + } + + /* + * Sync to disk. + */ + gl_prefs_model_save_settings (gl_prefs); +} diff --git a/glabels2/src/prefs.h b/glabels2/src/prefs.h new file mode 100644 index 00000000..98474f5c --- /dev/null +++ b/glabels2/src/prefs.h @@ -0,0 +1,56 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * prefs.h: Application preferences module header file + * + * Copyright (C) 2001-2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __PREFS_H__ +#define __PREFS_H__ + +#include "prefs-model.h" + +G_BEGIN_DECLS + + + +extern glPrefsModel *gl_prefs; + + + +void gl_prefs_init (void); + +const gchar *gl_prefs_get_page_size (void); + +lglUnitsType gl_prefs_get_units (void); + +const gchar *gl_prefs_get_units_string (void); + +gdouble gl_prefs_get_units_per_point (void); + +gdouble gl_prefs_get_units_step_size (void); + +gint gl_prefs_get_units_precision (void); + +void gl_prefs_add_recent_template (const gchar *name); + +G_END_DECLS + +#endif /* __PREFS_H__ */ + diff --git a/glabels2/src/print-op.c b/glabels2/src/print-op.c new file mode 100644 index 00000000..cdcf11fc --- /dev/null +++ b/glabels2/src/print-op.c @@ -0,0 +1,629 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * print-op.c: Print operation module + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "print-op.h" + +#include +#include +#include +#include +#include +#include + +#include "print.h" +#include "label.h" + +#include "wdgt-print-copies.h" +#include "wdgt-print-merge.h" + +#include "debug.h" + +/*===========================================*/ +/* Private data types */ +/*===========================================*/ + +struct _glPrintOpPrivate { + + glLabel *label; + + GtkWidget *simple_frame; + GtkWidget *copies_vbox; + GtkWidget *copies; + + GtkWidget *merge_frame; + GtkWidget *prmerge_vbox; + GtkWidget *prmerge; + + GtkWidget *outline_check; + GtkWidget *reverse_check; + GtkWidget *crop_marks_check; + + gboolean force_outline_flag; + + gchar *filename; + + gboolean outline_flag; + gboolean reverse_flag; + gboolean crop_marks_flag; + gboolean merge_flag; + gboolean collate_flag; + + gint first; + gint last; + gint n_sheets; + gint n_copies; + + glPrintState state; +}; + +struct _glPrintOpSettings +{ + + GtkPrintSettings *gtk_settings; + + gboolean outline_flag; + gboolean reverse_flag; + gboolean crop_marks_flag; + gboolean collate_flag; + + gint first; + gint last; + gint n_sheets; + gint n_copies; + +}; + + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void gl_print_op_finalize (GObject *object); + +static void gl_print_op_construct (glPrintOp *op, + glLabel *label); + +static void gl_print_op_construct_batch (glPrintOp *op, + glLabel *label, + gchar *filename, + gint n_sheets, + gint n_copies, + gint first, + gboolean outline_flag, + gboolean reverse_flag, + gboolean crop_marks_flag); + + +static GObject *create_custom_widget_cb (GtkPrintOperation *operation, + gpointer user_data); + +static void custom_widget_apply_cb (GtkPrintOperation *operation, + GtkWidget *widget, + gpointer user_data); + +static void begin_print_cb (GtkPrintOperation *operation, + GtkPrintContext *context, + gpointer user_data); + +static void draw_page_cb (GtkPrintOperation *operation, + GtkPrintContext *context, + int page_nr, + gpointer user_data); + + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glPrintOp, gl_print_op, GTK_TYPE_PRINT_OPERATION); + +static void +gl_print_op_class_init (glPrintOpClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_debug (DEBUG_PRINT, ""); + + gl_print_op_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_print_op_finalize; +} + +static void +gl_print_op_init (glPrintOp *op) +{ + gl_debug (DEBUG_PRINT, ""); + + gtk_print_operation_set_use_full_page (GTK_PRINT_OPERATION (op), TRUE); + + gtk_print_operation_set_unit (GTK_PRINT_OPERATION (op), GTK_UNIT_POINTS); + + op->priv = g_new0 (glPrintOpPrivate, 1); + +} + +static void +gl_print_op_finalize (GObject *object) +{ + glPrintOp* op = GL_PRINT_OP (object); + + gl_debug (DEBUG_PRINT, ""); + + g_return_if_fail (object != NULL); + g_return_if_fail (GL_IS_PRINT_OP (op)); + g_return_if_fail (op->priv != NULL); + + if (op->priv->label) { + g_object_unref (G_OBJECT(op->priv->label)); + } + g_free (op->priv->filename); + g_free (op->priv); + + G_OBJECT_CLASS (gl_print_op_parent_class)->finalize (object); + + g_free (op->priv); +} + +/*****************************************************************************/ +/* NEW print op. */ +/*****************************************************************************/ +glPrintOp * +gl_print_op_new (glLabel *label) +{ + glPrintOp *op; + + gl_debug (DEBUG_PRINT, ""); + + op = GL_PRINT_OP (g_object_new (GL_TYPE_PRINT_OP, NULL)); + + gl_print_op_construct (GL_PRINT_OP(op), label); + + return op; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Construct op. */ +/*--------------------------------------------------------------------------*/ +static void +gl_print_op_construct (glPrintOp *op, + glLabel *label) +{ + const lglTemplateFrame *frame; + + op->priv->label = label; + op->priv->force_outline_flag = FALSE; + + frame = (lglTemplateFrame *)label->template->frames->data; + + op->priv->n_sheets = 1; + op->priv->first = 1; + op->priv->last = lgl_template_frame_get_n_labels (frame); + op->priv->n_copies = 1; + + gtk_print_operation_set_custom_tab_label ( GTK_PRINT_OPERATION (op), + _("Labels")); + + g_signal_connect (G_OBJECT (op), "create-custom-widget", + G_CALLBACK (create_custom_widget_cb), label); + + g_signal_connect (G_OBJECT (op), "custom-widget-apply", + G_CALLBACK (custom_widget_apply_cb), label); + + g_signal_connect (G_OBJECT (op), "begin-print", + G_CALLBACK (begin_print_cb), label); + + g_signal_connect (G_OBJECT (op), "draw-page", + G_CALLBACK (draw_page_cb), label); +} + +/*****************************************************************************/ +/* NEW batch print operation. */ +/*****************************************************************************/ +glPrintOp * +gl_print_op_new_batch (glLabel *label, + gchar *filename, + gint n_sheets, + gint n_copies, + gint first, + gboolean outline_flag, + gboolean reverse_flag, + gboolean crop_marks_flag) +{ + glPrintOp *op; + + gl_debug (DEBUG_PRINT, ""); + + op = GL_PRINT_OP (g_object_new (GL_TYPE_PRINT_OP, NULL)); + + gl_print_op_construct_batch (GL_PRINT_OP(op), + label, + filename, + n_sheets, + n_copies, + first, + outline_flag, + reverse_flag, + crop_marks_flag); + + return op; +} + +/*****************************************************************************/ +/* Get print operation settings. */ +/*****************************************************************************/ +glPrintOpSettings * +gl_print_op_get_settings (glPrintOp *print_op) +{ + glPrintOpSettings *settings; + + settings = g_new0 (glPrintOpSettings, 1); + + if ( settings ) + { + settings->gtk_settings = + gtk_print_operation_get_print_settings (GTK_PRINT_OPERATION (print_op)); + + settings->outline_flag = print_op->priv->outline_flag; + settings->reverse_flag = print_op->priv->reverse_flag; + settings->crop_marks_flag = print_op->priv->crop_marks_flag; + settings->collate_flag = print_op->priv->collate_flag; + + settings->first = print_op->priv->first; + settings->last = print_op->priv->last; + settings->n_sheets = print_op->priv->n_sheets; + settings->n_copies = print_op->priv->n_copies; + } + + return settings; +} + +/*****************************************************************************/ +/* Set print operation settings. */ +/*****************************************************************************/ +void +gl_print_op_set_settings (glPrintOp *print_op, + glPrintOpSettings *settings) +{ + + if ( settings ) + { + gtk_print_operation_set_print_settings (GTK_PRINT_OPERATION (print_op), + settings->gtk_settings); + + print_op->priv->outline_flag = settings->outline_flag; + print_op->priv->reverse_flag = settings->reverse_flag; + print_op->priv->crop_marks_flag = settings->crop_marks_flag; + print_op->priv->collate_flag = settings->collate_flag; + + print_op->priv->first = settings->first; + print_op->priv->last = settings->last; + print_op->priv->n_sheets = settings->n_sheets; + print_op->priv->n_copies = settings->n_copies; + } + + } + +/*****************************************************************************/ +/* Free print operation settings structure. */ +/*****************************************************************************/ +void +gl_print_op_free_settings(glPrintOpSettings *settings) +{ + + if ( settings ) + { + if ( settings->gtk_settings ) + { + g_object_unref (settings->gtk_settings); + } + + g_free (settings); + } +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Construct op. */ +/*--------------------------------------------------------------------------*/ +static void +gl_print_op_construct_batch (glPrintOp *op, + glLabel *label, + gchar *filename, + gint n_sheets, + gint n_copies, + gint first, + gboolean outline_flag, + gboolean reverse_flag, + gboolean crop_marks_flag) + +{ + glMerge *merge = NULL; + const lglTemplateFrame *frame = NULL; + + op->priv->label = label; + op->priv->force_outline_flag = FALSE; + op->priv->filename = g_strdup (filename); + op->priv->n_sheets = n_sheets; + op->priv->n_copies = n_copies; + op->priv->first = first; + op->priv->outline_flag = outline_flag; + op->priv->reverse_flag = reverse_flag; + op->priv->crop_marks_flag = crop_marks_flag; + + merge = gl_label_get_merge (label); + + frame = (lglTemplateFrame *)label->template->frames->data; + if (merge == NULL) + { + op->priv->merge_flag = FALSE; + + op->priv->last = lgl_template_frame_get_n_labels (frame); + + } + else + { + op->priv->merge_flag = TRUE; + + op->priv->n_sheets = + ceil ((double)(first-1 + n_copies * gl_merge_get_record_count(merge)) + / lgl_template_frame_get_n_labels (frame));; + + g_object_unref (G_OBJECT(merge)); + + } + + gtk_print_operation_set_export_filename (GTK_PRINT_OPERATION (op), + filename); + + g_signal_connect (G_OBJECT (op), "begin-print", + G_CALLBACK (begin_print_cb), label); + + g_signal_connect (G_OBJECT (op), "draw-page", + G_CALLBACK (draw_page_cb), label); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. "Create custom widget" callback */ +/*--------------------------------------------------------------------------*/ +static GObject * +create_custom_widget_cb (GtkPrintOperation *operation, + gpointer user_data) +{ + GladeXML *gui; + glPrintOp *op = GL_PRINT_OP (operation); + glLabel *label = GL_LABEL (user_data); + GtkWidget *vbox; + glMerge *merge = NULL; + + gui = glade_xml_new (GLABELS_GLADE_DIR "print-custom-widget.glade", + "print_custom_widget_vbox", NULL); + + if (!gui) { + g_warning ("Could not open print-op.glade, reinstall glabels!"); + return NULL; + } + + vbox = glade_xml_get_widget (gui, "print_custom_widget_vbox"); + + /* ----- Simple print control ----- */ + op->priv->simple_frame = glade_xml_get_widget (gui, "simple_frame"); + op->priv->copies_vbox = glade_xml_get_widget (gui, "copies_vbox"); + op->priv->copies = gl_wdgt_print_copies_new (label); + gtk_box_pack_start (GTK_BOX(op->priv->copies_vbox), + op->priv->copies, FALSE, FALSE, 0); + + /* ----- Merge print control ----- */ + op->priv->merge_frame = glade_xml_get_widget (gui, "merge_frame"); + op->priv->prmerge_vbox = glade_xml_get_widget (gui, "prmerge_vbox"); + op->priv->prmerge = gl_wdgt_print_merge_new (label); + gtk_box_pack_start (GTK_BOX(op->priv->prmerge_vbox), + op->priv->prmerge, FALSE, FALSE, 0); + + /* ----- Options ----------------- */ + op->priv->outline_check = glade_xml_get_widget (gui, "outline_check"); + op->priv->reverse_check = glade_xml_get_widget (gui, "reverse_check"); + op->priv->crop_marks_check = glade_xml_get_widget (gui, "crop_marks_check"); + + g_object_unref (gui); + + /* ---- Activate either simple or merge print control widgets. ---- */ + merge = gl_label_get_merge (op->priv->label); + if (merge == NULL) { + + gl_wdgt_print_copies_set_range (GL_WDGT_PRINT_COPIES (op->priv->copies), + op->priv->n_sheets, + op->priv->first, + op->priv->last); + + gtk_widget_show_all (op->priv->simple_frame); + gtk_widget_hide_all (op->priv->merge_frame); + + } else { + + gint n_records = gl_merge_get_record_count( merge ); + gl_wdgt_print_merge_set_copies (GL_WDGT_PRINT_MERGE (op->priv->prmerge), + op->priv->n_copies, + op->priv->first, + n_records, + op->priv->collate_flag); + g_object_unref (G_OBJECT(merge)); + + gtk_widget_hide_all (op->priv->simple_frame); + gtk_widget_show_all (op->priv->merge_frame); + } + + /* --- Set options --- */ + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->outline_check), + op->priv->outline_flag); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->reverse_check), + op->priv->reverse_flag); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (op->priv->crop_marks_check), + op->priv->crop_marks_flag); + + /* --- Do we need to force the outline flag --- */ + if (op->priv->force_outline_flag) + { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(op->priv->outline_check), + TRUE); + + gtk_widget_set_sensitive (op->priv->outline_check, FALSE); + gtk_widget_set_sensitive (op->priv->reverse_check, FALSE); + gtk_widget_set_sensitive (op->priv->crop_marks_check, FALSE); + } + + return G_OBJECT (vbox); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. "Custom widget apply" callback */ +/*--------------------------------------------------------------------------*/ +static void +custom_widget_apply_cb (GtkPrintOperation *operation, + GtkWidget *widget, + gpointer user_data) +{ + glPrintOp *op = GL_PRINT_OP (operation); + glMerge *merge = NULL; + + + op->priv->outline_flag = + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON + (op->priv->outline_check)); + op->priv->reverse_flag = + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON + (op->priv->reverse_check)); + op->priv->crop_marks_flag = + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON + (op->priv->crop_marks_check)); + + merge = gl_label_get_merge (op->priv->label); + + if (merge == NULL) + { + + op->priv->merge_flag = FALSE; + gl_wdgt_print_copies_get_range (GL_WDGT_PRINT_COPIES (op->priv->copies), + &op->priv->n_sheets, + &op->priv->first, + &op->priv->last); + } + else + { + + op->priv->merge_flag = TRUE; + gl_wdgt_print_merge_get_copies (GL_WDGT_PRINT_MERGE (op->priv->prmerge), + &op->priv->n_copies, + &op->priv->first, + &op->priv->collate_flag, + &op->priv->n_sheets); + g_object_unref (G_OBJECT(merge)); + } + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. "Begin print" callback */ +/*--------------------------------------------------------------------------*/ +static void +begin_print_cb (GtkPrintOperation *operation, + GtkPrintContext *context, + gpointer user_data) +{ + glPrintOp *op = GL_PRINT_OP (operation); + + gtk_print_operation_set_n_pages (operation, op->priv->n_sheets); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. "Draw page" callback. */ +/*--------------------------------------------------------------------------*/ +static void +draw_page_cb (GtkPrintOperation *operation, + GtkPrintContext *context, + int page_nr, + gpointer user_data) +{ + glPrintOp *op = GL_PRINT_OP (operation); + cairo_t *cr; + + cr = gtk_print_context_get_cairo_context (context); + + if (!op->priv->merge_flag) + { + gl_print_simple_sheet (op->priv->label, + cr, + page_nr, + op->priv->n_sheets, + op->priv->first, + op->priv->last, + op->priv->outline_flag, + op->priv->reverse_flag, + op->priv->crop_marks_flag); + } + else + { + if (op->priv->collate_flag) + { + gl_print_collated_merge_sheet (op->priv->label, + cr, + page_nr, + op->priv->n_copies, + op->priv->first, + op->priv->outline_flag, + op->priv->reverse_flag, + op->priv->crop_marks_flag, + &op->priv->state); + } + else + { + gl_print_uncollated_merge_sheet (op->priv->label, + cr, + page_nr, + op->priv->n_copies, + op->priv->first, + op->priv->outline_flag, + op->priv->reverse_flag, + op->priv->crop_marks_flag, + &op->priv->state); + } + } +} + + +/*****************************************************************************/ +/* Set outline flag/checkbox. */ +/*****************************************************************************/ +void +gl_print_op_force_outline_flag (glPrintOp *op) +{ + op->priv->force_outline_flag = TRUE; +} + + diff --git a/glabels2/src/print-op.h b/glabels2/src/print-op.h new file mode 100644 index 00000000..75c893c5 --- /dev/null +++ b/glabels2/src/print-op.h @@ -0,0 +1,88 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * print-op.h: Print operation module header file + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __PRINT_OP_H__ +#define __PRINT_OP_H__ + +#include +#include "label.h" + +G_BEGIN_DECLS + +#define GL_TYPE_PRINT_OP (gl_print_op_get_type ()) +#define GL_PRINT_OP(obj) (GTK_CHECK_CAST ((obj), GL_TYPE_PRINT_OP, glPrintOp)) +#define GL_PRINT_OP_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GL_TYPE_PRINT_OP, glPrintOpClass)) +#define GL_IS_PRINT_OP(obj) (GTK_CHECK_TYPE ((obj), GL_TYPE_PRINT_OP)) +#define GL_IS_PRINT_OP_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GL_TYPE_PRINT_OP)) +#define GL_PRINT_OP_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), GL_TYPE_PRINT_OP, glPrintOpClass)) + + +typedef struct _glPrintOp glPrintOp; +typedef struct _glPrintOpClass glPrintOpClass; + +typedef struct _glPrintOpPrivate glPrintOpPrivate; + +struct _glPrintOp +{ + GtkPrintOperation parent_instance; + + glPrintOpPrivate *priv; + +}; + +struct _glPrintOpClass +{ + GtkPrintOperationClass parent_class; +}; + + +typedef struct _glPrintOpSettings glPrintOpSettings; + + + +GType gl_print_op_get_type (void) G_GNUC_CONST; + +glPrintOp *gl_print_op_new (glLabel *label); + +void gl_print_op_force_outline_flag (glPrintOp *print_op); + +glPrintOpSettings *gl_print_op_get_settings (glPrintOp *print_op); +void gl_print_op_set_settings (glPrintOp *print_op, + glPrintOpSettings *settings); +void gl_print_op_free_settings (glPrintOpSettings *settings); + +/* + * Batch print operation + */ +glPrintOp *gl_print_op_new_batch (glLabel *label, + gchar *filename, + gint n_sheets, + gint n_copies, + gint first, + gboolean outline_flag, + gboolean reverse_flag, + gboolean crop_marks_flag); + +G_END_DECLS + +#endif diff --git a/glabels2/src/print.c b/glabels2/src/print.c new file mode 100644 index 00000000..b19c5c5b --- /dev/null +++ b/glabels2/src/print.c @@ -0,0 +1,567 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * print.c: Print module + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "print.h" + +#include +#include +#include +#include + +#include "label.h" +#include +#include "cairo-label-path.h" + +#include "debug.h" + +/*===========================================*/ +/* Private macros and constants. */ +/*===========================================*/ + +#define OUTLINE_RGB_ARGS 0.0, 0.0, 0.0 + +#define OUTLINE_WIDTH 0.25 + +#define TICK_OFFSET 2.25 +#define TICK_LENGTH 18.0 + +/*=========================================================================*/ +/* Private types. */ +/*=========================================================================*/ + +typedef struct _PrintInfo { + cairo_t *cr; + + /* gLabels Template */ + lglTemplate *template; + gboolean label_rotate_flag; + + /* page size */ + gdouble page_width; + gdouble page_height; + +} PrintInfo; + + +/*=========================================================================*/ +/* Private function prototypes. */ +/*=========================================================================*/ +static PrintInfo *print_info_new (cairo_t *cr, + glLabel *label); + +static void print_info_free (PrintInfo **pi); + +static void print_crop_marks (PrintInfo *pi); + +static void print_label (PrintInfo *pi, + glLabel *label, + gdouble x, + gdouble y, + glMergeRecord *record, + gboolean outline_flag, + gboolean reverse_flag); + + +static void draw_outline (PrintInfo *pi, + glLabel *label); + +static void clip_to_outline (PrintInfo *pi, + glLabel *label); + + + +/*****************************************************************************/ +/* Print simple sheet (no merge data) command. */ +/*****************************************************************************/ +void +gl_print_simple_sheet (glLabel *label, + cairo_t *cr, + gint page, + gint n_sheets, + gint first, + gint last, + gboolean outline_flag, + gboolean reverse_flag, + gboolean crop_marks_flag) +{ + PrintInfo *pi; + const lglTemplateFrame *frame; + gint i_label; + lglTemplateOrigin *origins; + + gl_debug (DEBUG_PRINT, "START"); + + pi = print_info_new (cr, label); + + frame = (lglTemplateFrame *)pi->template->frames->data; + origins = lgl_template_frame_get_origins (frame); + + if (crop_marks_flag) { + print_crop_marks (pi); + } + + for (i_label = first - 1; i_label < last; i_label++) { + + print_label (pi, label, + origins[i_label].x, origins[i_label].y, + NULL, outline_flag, reverse_flag); + + } + + g_free (origins); + + print_info_free (&pi); + + gl_debug (DEBUG_PRINT, "END"); +} + +/*****************************************************************************/ +/* Print collated merge sheet command */ +/*****************************************************************************/ +void +gl_print_collated_merge_sheet (glLabel *label, + cairo_t *cr, + gint page, + gint n_copies, + gint first, + gboolean outline_flag, + gboolean reverse_flag, + gboolean crop_marks_flag, + glPrintState *state) +{ + glMerge *merge; + const GList *record_list; + PrintInfo *pi; + const lglTemplateFrame *frame; + gint i_label, n_labels_per_page, i_copy; + glMergeRecord *record; + GList *p; + lglTemplateOrigin *origins; + + gl_debug (DEBUG_PRINT, "START"); + + merge = gl_label_get_merge (label); + record_list = gl_merge_get_record_list (merge); + + pi = print_info_new (cr, label); + frame = (lglTemplateFrame *)pi->template->frames->data; + + n_labels_per_page = lgl_template_frame_get_n_labels (frame); + origins = lgl_template_frame_get_origins (frame); + + if (crop_marks_flag) { + print_crop_marks (pi); + } + + if (page == 0) + { + state->i_copy = 0; + state->p_record = (GList *)record_list; + + i_label = first - 1; + } + else + { + i_label = 0; + } + + + for ( p=(GList *)state->p_record; p!=NULL; p=p->next ) { + record = (glMergeRecord *)p->data; + + if ( record->select_flag ) { + for (i_copy = state->i_copy; i_copy < n_copies; i_copy++) { + + print_label (pi, label, + origins[i_label].x, + origins[i_label].y, + record, + outline_flag, reverse_flag); + + i_label++; + if (i_label == n_labels_per_page) + { + g_free (origins); + print_info_free (&pi); + + state->i_copy = (i_copy+1) % n_copies; + if (state->i_copy == 0) + { + state->p_record = p->next; + } + else + { + state->p_record = p; + } + return; + } + } + state->i_copy = 0; + } + } + + g_free (origins); + print_info_free (&pi); + + gl_debug (DEBUG_PRINT, "END"); +} + +/*****************************************************************************/ +/* Print uncollated merge sheet command */ +/*****************************************************************************/ +void +gl_print_uncollated_merge_sheet (glLabel *label, + cairo_t *cr, + gint page, + gint n_copies, + gint first, + gboolean outline_flag, + gboolean reverse_flag, + gboolean crop_marks_flag, + glPrintState *state) +{ + glMerge *merge; + const GList *record_list; + PrintInfo *pi; + const lglTemplateFrame *frame; + gint i_label, n_labels_per_page, i_copy; + glMergeRecord *record; + GList *p; + lglTemplateOrigin *origins; + + gl_debug (DEBUG_PRINT, "START"); + + merge = gl_label_get_merge (label); + record_list = gl_merge_get_record_list (merge); + + pi = print_info_new (cr, label); + frame = (lglTemplateFrame *)pi->template->frames->data; + + n_labels_per_page = lgl_template_frame_get_n_labels (frame); + origins = lgl_template_frame_get_origins (frame); + + if (crop_marks_flag) { + print_crop_marks (pi); + } + + if (page == 0) + { + state->i_copy = 0; + state->p_record = (GList *)record_list; + + i_label = first - 1; + } + else + { + i_label = 0; + } + + for (i_copy = state->i_copy; i_copy < n_copies; i_copy++) { + + for ( p=state->p_record; p!=NULL; p=p->next ) { + record = (glMergeRecord *)p->data; + + if ( record->select_flag ) { + + print_label (pi, label, + origins[i_label].x, + origins[i_label].y, + record, + outline_flag, reverse_flag); + + i_label++; + if (i_label == n_labels_per_page) + { + g_free (origins); + print_info_free (&pi); + + state->p_record = p->next; + if (state->p_record == NULL) + { + state->p_record = (GList *)record_list; + state->i_copy = i_copy + 1; + } + else + { + state->i_copy = i_copy; + } + return; + } + } + } + state->p_record = (GList *)record_list; + + } + + g_free (origins); + print_info_free (&pi); + + gl_debug (DEBUG_PRINT, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. new print info structure */ +/*---------------------------------------------------------------------------*/ +static PrintInfo * +print_info_new (cairo_t *cr, + glLabel *label) +{ + PrintInfo *pi = g_new0 (PrintInfo, 1); + + gl_debug (DEBUG_PRINT, "START"); + + g_return_val_if_fail (label && GL_IS_LABEL (label), NULL); + + g_return_val_if_fail (label->template, NULL); + g_return_val_if_fail (label->template->paper_id, NULL); + g_return_val_if_fail (label->template->page_width > 0, NULL); + g_return_val_if_fail (label->template->page_height > 0, NULL); + + pi->cr = cr; + + gl_debug (DEBUG_PRINT, + "setting page size = \"%s\"", label->template->paper_id); + + pi->page_width = label->template->page_width; + pi->page_height = label->template->page_height; + + pi->template = label->template; + pi->label_rotate_flag = label->rotate_flag; + + gl_debug (DEBUG_PRINT, "END"); + + return pi; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. free print info structure */ +/*---------------------------------------------------------------------------*/ +static void +print_info_free (PrintInfo **pi) +{ + gl_debug (DEBUG_PRINT, "START"); + + + g_free (*pi); + *pi = NULL; + + gl_debug (DEBUG_PRINT, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Print crop tick marks. */ +/*---------------------------------------------------------------------------*/ +static void +print_crop_marks (PrintInfo *pi) +{ + const lglTemplateFrame *frame; + gdouble w, h, page_w, page_h; + GList *p; + lglTemplateLayout *layout; + gdouble xmin, ymin, xmax, ymax, dx, dy; + gdouble x1, y1, x2, y2, x3, y3, x4, y4; + gint ix, iy, nx, ny; + + gl_debug (DEBUG_PRINT, "START"); + + frame = (lglTemplateFrame *)pi->template->frames->data; + + lgl_template_frame_get_size (frame, &w, &h); + + page_w = pi->page_width; + page_h = pi->page_height; + + cairo_save (pi->cr); + + cairo_set_source_rgb (pi->cr, OUTLINE_RGB_ARGS); + cairo_set_line_width (pi->cr, OUTLINE_WIDTH); + + for (p=frame->all.layouts; p != NULL; p=p->next) { + + layout = (lglTemplateLayout *)p->data; + + xmin = layout->x0; + ymin = layout->y0; + xmax = layout->x0 + layout->dx*(layout->nx - 1) + w; + ymax = layout->y0 + layout->dy*(layout->ny - 1) + h; + + dx = layout->dx; + dy = layout->dy; + + nx = layout->nx; + ny = layout->ny; + + for (ix=0; ix < nx; ix++) { + + x1 = xmin + ix*dx; + x2 = x1 + w; + + y1 = MAX((ymin - TICK_OFFSET), 0.0); + y2 = MAX((y1 - TICK_LENGTH), 0.0); + + y3 = MIN((ymax + TICK_OFFSET), page_h); + y4 = MIN((y3 + TICK_LENGTH), page_h); + + cairo_move_to (pi->cr, x1, y1); + cairo_line_to (pi->cr, x1, y2); + cairo_stroke (pi->cr); + + cairo_move_to (pi->cr, x2, y1); + cairo_line_to (pi->cr, x2, y2); + cairo_stroke (pi->cr); + + cairo_move_to (pi->cr, x1, y3); + cairo_line_to (pi->cr, x1, y4); + cairo_stroke (pi->cr); + + cairo_move_to (pi->cr, x2, y3); + cairo_line_to (pi->cr, x2, y4); + cairo_stroke (pi->cr); + + } + + for (iy=0; iy < ny; iy++) { + + y1 = ymin + iy*dy; + y2 = y1 + h; + + x1 = MAX((xmin - TICK_OFFSET), 0.0); + x2 = MAX((x1 - TICK_LENGTH), 0.0); + + x3 = MIN((xmax + TICK_OFFSET), page_w); + x4 = MIN((x3 + TICK_LENGTH), page_w); + + cairo_move_to (pi->cr, x1, y1); + cairo_line_to (pi->cr, x2, y1); + cairo_stroke (pi->cr); + + cairo_move_to (pi->cr, x1, y2); + cairo_line_to (pi->cr, x2, y2); + cairo_stroke (pi->cr); + + cairo_move_to (pi->cr, x3, y1); + cairo_line_to (pi->cr, x4, y1); + cairo_stroke (pi->cr); + + cairo_move_to (pi->cr, x3, y2); + cairo_line_to (pi->cr, x4, y2); + cairo_stroke (pi->cr); + + } + + } + + cairo_restore (pi->cr); + + gl_debug (DEBUG_PRINT, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Print i'th label. */ +/*---------------------------------------------------------------------------*/ +static void +print_label (PrintInfo *pi, + glLabel *label, + gdouble x, + gdouble y, + glMergeRecord *record, + gboolean outline_flag, + gboolean reverse_flag) +{ + const lglTemplateFrame *frame; + gdouble width, height; + + gl_debug (DEBUG_PRINT, "START"); + + frame = (lglTemplateFrame *)pi->template->frames->data; + + gl_label_get_size (label, &width, &height); + + cairo_save (pi->cr); + + /* Transform coordinate system to be relative to upper corner */ + /* of the current label */ + cairo_translate (pi->cr, x, y); + if (label->rotate_flag) { + gl_debug (DEBUG_PRINT, "Rotate flag set"); + cairo_rotate (pi->cr, -M_PI/2.0); + cairo_translate (pi->cr, -width, 0.0); + } + if ( reverse_flag ) { + cairo_translate (pi->cr, width, 0.0); + cairo_scale (pi->cr, -1.0, 1.0); + } + + clip_to_outline (pi, label); + gl_label_draw (label, pi->cr, FALSE, record); + if (outline_flag) { + draw_outline (pi, label); + } + + cairo_restore (pi->cr); + + gl_debug (DEBUG_PRINT, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Draw outline. */ +/*---------------------------------------------------------------------------*/ +static void +draw_outline (PrintInfo *pi, + glLabel *label) +{ + gl_debug (DEBUG_PRINT, "START"); + + cairo_save (pi->cr); + + cairo_set_source_rgb (pi->cr, OUTLINE_RGB_ARGS); + cairo_set_line_width (pi->cr, OUTLINE_WIDTH); + + gl_cairo_label_path (pi->cr, label->template, FALSE, FALSE); + + cairo_stroke (pi->cr); + + cairo_restore (pi->cr); + + gl_debug (DEBUG_PRINT, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Clip to outline. */ +/*---------------------------------------------------------------------------*/ +static void +clip_to_outline (PrintInfo *pi, + glLabel *label) +{ + gl_debug (DEBUG_PRINT, "START"); + + gl_cairo_label_path (pi->cr, label->template, FALSE, TRUE); + + cairo_set_fill_rule (pi->cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_clip (pi->cr); + + gl_debug (DEBUG_PRINT, "END"); +} + diff --git a/glabels2/src/print.h b/glabels2/src/print.h new file mode 100644 index 00000000..b4f46a1f --- /dev/null +++ b/glabels2/src/print.h @@ -0,0 +1,70 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * print.h: Print module header file + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __PRINT_H__ +#define __PRINT_H__ + +#include + +#include "label.h" + +G_BEGIN_DECLS + +typedef struct { + gint i_copy; + GList *p_record; +} glPrintState; + +void gl_print_simple_sheet (glLabel *label, + cairo_t *cr, + gint page, + gint n_sheets, + gint first, + gint last, + gboolean outline_flag, + gboolean reverse_flag, + gboolean crop_marks_flag); + +void gl_print_collated_merge_sheet (glLabel *label, + cairo_t *cr, + gint page, + gint n_copies, + gint first, + gboolean outline_flag, + gboolean reverse_flag, + gboolean crop_marks_flag, + glPrintState *state); + +void gl_print_uncollated_merge_sheet (glLabel *label, + cairo_t *cr, + gint page, + gint n_copies, + gint first, + gboolean outline_flag, + gboolean reverse_flag, + gboolean crop_marks_flag, + glPrintState *state); + +G_END_DECLS + +#endif diff --git a/glabels2/src/recent.c b/glabels2/src/recent.c new file mode 100644 index 00000000..f713fcb4 --- /dev/null +++ b/glabels2/src/recent.c @@ -0,0 +1,155 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * recent.c: gLabels recent files module + * + * Copyright (C) 2001-2006 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "recent.h" + +#include +#include + +#include "prefs.h" +#include "debug.h" + +#define GLABELS_MIME_TYPE "application/x-glabels" + +static GtkRecentManager *model; + + + +/*****************************************************************************/ +/* Initialize recent files model. */ +/*****************************************************************************/ +void +gl_recent_init (void) +{ + gl_debug (DEBUG_RECENT, "START"); + + model = gtk_recent_manager_get_default (); + + gl_debug (DEBUG_RECENT, "END"); +} + + +/*****************************************************************************/ +/* Get UTF8 filename from GtkRecentInfo structure. */ +/*****************************************************************************/ +gchar * +gl_recent_get_utf8_filename (GtkRecentInfo *item) +{ + const gchar *uri; + gchar *filename; + gchar *utf8_filename = NULL; + + gl_debug (DEBUG_RECENT, "START"); + + uri = gtk_recent_info_get_uri (item); + + filename = g_filename_from_uri (uri, NULL, NULL); + if ( filename != NULL ) + { + utf8_filename = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL); + g_free (filename); + } + + return utf8_filename; + gl_debug (DEBUG_RECENT, "END"); +} + +/*****************************************************************************/ +/* Add file by UTF8 filename to recent model. */ +/*****************************************************************************/ +void +gl_recent_add_utf8_filename (gchar *utf8_filename) +{ + GtkRecentData *recent_data; + gchar *filename; + gchar *uri; + + static gchar *groups[2] = { + "glabels", + NULL + }; + + gl_debug (DEBUG_RECENT, "START"); + + recent_data = g_slice_new (GtkRecentData); + + recent_data->display_name = NULL; + recent_data->description = NULL; + recent_data->mime_type = GLABELS_MIME_TYPE; + recent_data->app_name = (gchar *) g_get_application_name (); + recent_data->app_exec = g_strjoin (" ", g_get_prgname (), "%f", NULL); + recent_data->groups = groups; + recent_data->is_private = FALSE; + + filename = g_filename_from_utf8 (utf8_filename, -1, NULL, NULL, NULL); + if ( filename != NULL ) + { + + uri = g_filename_to_uri (filename, NULL, NULL); + if ( uri != NULL ) + { + + gtk_recent_manager_add_full (model, uri, recent_data); + g_free (uri); + + } + g_free (filename); + + } + + g_free (recent_data->app_exec); + g_slice_free (GtkRecentData, recent_data); + + gl_debug (DEBUG_RECENT, "END"); +} + + +/*****************************************************************************/ +/* Create a menu of recent files. */ +/*****************************************************************************/ +GtkWidget * +gl_recent_create_menu (void) +{ + GtkWidget *recent_menu; + GtkRecentFilter *recent_filter; + + gl_debug (DEBUG_RECENT, "START"); + + recent_menu = + gtk_recent_chooser_menu_new_for_manager (model); + gtk_recent_chooser_menu_set_show_numbers (GTK_RECENT_CHOOSER_MENU (recent_menu), FALSE); + gtk_recent_chooser_set_show_icons (GTK_RECENT_CHOOSER (recent_menu), TRUE); + gtk_recent_chooser_set_limit (GTK_RECENT_CHOOSER (recent_menu), gl_prefs->max_recents); + gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (recent_menu), GTK_RECENT_SORT_MRU); + gtk_recent_chooser_set_local_only (GTK_RECENT_CHOOSER (recent_menu), TRUE); + + recent_filter = gtk_recent_filter_new (); + gtk_recent_filter_add_mime_type (recent_filter, GLABELS_MIME_TYPE); + gtk_recent_chooser_set_filter (GTK_RECENT_CHOOSER (recent_menu), recent_filter); + + gl_debug (DEBUG_RECENT, "END"); + return recent_menu; +} diff --git a/glabels2/src/recent.h b/glabels2/src/recent.h new file mode 100644 index 00000000..9a1b36c4 --- /dev/null +++ b/glabels2/src/recent.h @@ -0,0 +1,45 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * recent.h: gLabels recent files module header file + * + * Copyright (C) 2001-2006 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __RECENT_H__ +#define __RECENT_H__ + +#include +#include + +G_BEGIN_DECLS + +void gl_recent_init (void); + +gchar *gl_recent_get_utf8_filename (GtkRecentInfo *item); + +void gl_recent_add_utf8_filename (gchar *utf8_filename); + +GtkWidget *gl_recent_create_menu (void); + + +G_END_DECLS + +#endif /*__RECENT_H__*/ + diff --git a/glabels2/src/stock-pixmaps/Makefile.am b/glabels2/src/stock-pixmaps/Makefile.am new file mode 100644 index 00000000..5e34a955 --- /dev/null +++ b/glabels2/src/stock-pixmaps/Makefile.am @@ -0,0 +1,95 @@ + +IMAGES = \ + stock_arrow_24.png \ + stock_arrow_16.png \ + stock_barcode_24.png \ + stock_barcode_16.png \ + stock_box_24.png \ + stock_box_16.png \ + stock_ellipse_24.png \ + stock_ellipse_16.png \ + stock_image_24.png \ + stock_image_16.png \ + stock_line_24.png \ + stock_line_16.png \ + stock_merge_24.png \ + stock_merge_16.png \ + stock_properties_24.png \ + stock_properties_16.png \ + stock_text_24.png \ + stock_text_16.png \ + stock_order_top_16.png \ + stock_order_bottom_16.png \ + stock_rotate_left_16.png \ + stock_rotate_right_16.png \ + stock_flip_horiz_16.png \ + stock_flip_vert_16.png \ + stock_align_left_16.png \ + stock_align_right_16.png \ + stock_align_hcenter_16.png \ + stock_align_top_16.png \ + stock_align_bottom_16.png \ + stock_align_vcenter_16.png \ + stock_center_horiz_16.png \ + stock_center_vert_16.png \ + stock_bucket_fill_16.png \ + stock_bucket_fill_24.png \ + stock_pencil_16.png \ + stock_pencil_24.png \ + stock_hchain_24.png \ + stock_hchain_broken_24.png \ + stock_vchain_24.png \ + stock_vchain_broken_24.png + +VARIABLES1 = \ + stock_arrow_24 $(srcdir)/stock_arrow_24.png \ + stock_arrow_16 $(srcdir)/stock_arrow_16.png \ + stock_barcode_24 $(srcdir)/stock_barcode_24.png \ + stock_barcode_16 $(srcdir)/stock_barcode_16.png \ + stock_box_24 $(srcdir)/stock_box_24.png \ + stock_box_16 $(srcdir)/stock_box_16.png \ + stock_ellipse_24 $(srcdir)/stock_ellipse_24.png \ + stock_ellipse_16 $(srcdir)/stock_ellipse_16.png \ + stock_image_24 $(srcdir)/stock_image_24.png \ + stock_image_16 $(srcdir)/stock_image_16.png \ + stock_line_24 $(srcdir)/stock_line_24.png \ + stock_line_16 $(srcdir)/stock_line_16.png \ + stock_merge_24 $(srcdir)/stock_merge_24.png \ + stock_merge_16 $(srcdir)/stock_merge_16.png \ + stock_properties_24 $(srcdir)/stock_properties_24.png \ + stock_properties_16 $(srcdir)/stock_properties_16.png \ + stock_text_24 $(srcdir)/stock_text_24.png \ + stock_text_16 $(srcdir)/stock_text_16.png \ + stock_order_top_16 $(srcdir)/stock_order_top_16.png \ + stock_order_bottom_16 $(srcdir)/stock_order_bottom_16.png \ + stock_rotate_left_16 $(srcdir)/stock_rotate_left_16.png \ + stock_rotate_right_16 $(srcdir)/stock_rotate_right_16.png \ + stock_flip_horiz_16 $(srcdir)/stock_flip_horiz_16.png \ + stock_flip_vert_16 $(srcdir)/stock_flip_vert_16.png \ + stock_align_left_16 $(srcdir)/stock_align_left_16.png \ + stock_align_right_16 $(srcdir)/stock_align_right_16.png \ + stock_align_hcenter_16 $(srcdir)/stock_align_hcenter_16.png \ + stock_align_top_16 $(srcdir)/stock_align_top_16.png \ + stock_align_bottom_16 $(srcdir)/stock_align_bottom_16.png \ + stock_align_vcenter_16 $(srcdir)/stock_align_vcenter_16.png \ + stock_center_horiz_16 $(srcdir)/stock_center_horiz_16.png \ + stock_center_vert_16 $(srcdir)/stock_center_vert_16.png \ + stock_bucket_fill_16 $(srcdir)/stock_bucket_fill_16.png \ + stock_bucket_fill_24 $(srcdir)/stock_bucket_fill_24.png \ + stock_pencil_16 $(srcdir)/stock_pencil_16.png \ + stock_pencil_24 $(srcdir)/stock_pencil_24.png \ + stock_hchain_24 $(srcdir)/stock_hchain_24.png \ + stock_hchain_broken_24 $(srcdir)/stock_hchain_broken_24.png \ + stock_vchain_24 $(srcdir)/stock_vchain_24.png \ + stock_vchain_broken_24 $(srcdir)/stock_vchain_broken_24.png + + +noinst_DATA = stockpixbufs.h +CLEANFILES = $(noinst_DATA) + +stockpixbufs.h: $(IMAGES) + gdk-pixbuf-csource \ + --raw --build-list $(VARIABLES1) > $(srcdir)/stockpixbufs.h || \ + ( rm -f $(srcdir)/stockpixbufs.h && false ) + +EXTRA_DIST = $(IMAGES) stockpixbufs.h diff --git a/glabels2/src/stock-pixmaps/stock_align_bottom_16.png b/glabels2/src/stock-pixmaps/stock_align_bottom_16.png new file mode 100644 index 0000000000000000000000000000000000000000..da901bc46076cb5c45d952d9b41d6c8963e5a978 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G_YAk0{w5<>&kweOO%P(xbors2B1)+r;B5V#p&dP1p)?-CjR#CiBhXs zCVtlbe1OS+n>cZUz*jzMUWXf6MgBi3Jve{*Kc4!yUz6W5B{8;n&-A$ZHGQw_;rU<7 ru5ce|G;a{}HxbfylNJw9HWp%MIB-BjEXDf@$gK>Xu6{1-oD!M<>&kweOO%OK%_(ipTcA*)r;B5V#p&dP1p)?(KK`G)s+~3V z+j;N$mL)&jcJ;e=%75dTh<>c%7nhQA&%JI!?*)&ebK@O1TaS?83{1OSa7 BN8$hg literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_align_left_16.png b/glabels2/src/stock-pixmaps/stock_align_left_16.png new file mode 100644 index 0000000000000000000000000000000000000000..1cdcf9bcde458dd9931b3266f9061446893b4b4c GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G_YAk0{w5<>&kweOO%OC+EBUK9w-#!>Eak-aXL9+fq;S2%l`r2>Xoh@ zX5`*=VE*)f5v7|t@{eepGkFk~;9%6CbHHh#V~<2*gvo!KK&#(Eye~yMdVVnXOw4OM v;jxC1r~caQg<2doE!SB~ygPe%wlFbx8i>hyPP@AaXb*#@tDnm{r-UW|Y2-q+ literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_align_right_16.png b/glabels2/src/stock-pixmaps/stock_align_right_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2b4872b00481a825a44732685eeeb88bf4fab543 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G_YAk0{w5<>&kweOO%P7^LFE5GoVn0r;B5V#p&dP1p)>_6aM$R->+w5 zV{;R8GW!#m-+m~a)28K6x>SLFK+;c;1e;h2pYlh)2JKe%q>Fz(yF}iep5Zau;g5ft z-77YwjThUk1q_28c-OCar1MDn<>&kweOO%P-@^8fFSwNvUPZ!4!i_^&o3j_?DUj7$(wR|79 zM5kzS)5d>mwkQACe2>p{TgJc2wnaam2Ojyi=S%vJ&zI!Sr7ya|&79A`Jx8#jW6h7m zg(h~99@iB1O;lo*cqz{Pf8_+pf5Eno6POw9-VpxJX4I1ow28sf)z4*}Q$iB}A`wd5 literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_align_vcenter_16.png b/glabels2/src/stock-pixmaps/stock_align_vcenter_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a51293f093d7aedd13555a23308890e5354793f1 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G_YAk0{w5<>&kweOO%Pjvg*M5P@qt;r;B5V#p&b(iHrjs?(ggkvm!st zj5GOf!wdw@^@|kSGGDO$Q9qb^Blg4drS>ikHOkDI_mY%MFZ^4xJ^9Dxdwl287lrBk zQ4hBlE|NHKh%v3;;-AkSW;ApL-sRR&$>y+Wxy!(GvE8_K!-QD{E9Qx7urZ_s$zE5s S^40@d&*16m=d#Wzp$Pz{6iwRz literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_arrow_16.png b/glabels2/src/stock-pixmaps/stock_arrow_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae5f36825ef0b889fba6eb3181a58b8daadd61d GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G_YAk0{w5<>&kwKlara1^Xc^y$ALoSo-U3d6?3kh+sJt+K&0&=vtn(O zZqB8ht;~@Y4II-R2}vH(HR`OLvmjW+!@|9hv7KXr!9xi~ zqfPw`oXUEt2bgWQWlUqbE4?Mk=$wNszj07V?`xhncCw-I4eIYAlAEJns^`A^;9te~ Y>6l`$$@Ek6flgrXboFyt=akR{0E4Vf-2eap literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_arrow_24.png b/glabels2/src/stock-pixmaps/stock_arrow_24.png new file mode 100644 index 0000000000000000000000000000000000000000..6e0e26af77b6b1159ee30fd7801c24e11ae6c2e5 GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=G_YAk0{w5<>&kwKlaon;Q@Zlp8=%l1PZ!6KiaBqu?)GAKlsNkFewC*~ zK+c|tUOJDMBX0jnTKV?KtxM@2I9UX17`eFvT_%WL(J0g@YwAurdF)Kq<3?s z&$d1kpXxgOcW}0v>k0p<4`trIaARN;kI3Z`T6BIxQ&@0AgZCQm7|#!~o2ChU5}hDp z#5F-Ah?QfKLmT(~&zQ7Jdvo6$IncmdqEaP% zx~ulxg6GBmcSm?JW=!AH%6{j8g!Bw~aRckLnt)HqJa4sDSsm5Aw~TR$>7H4;Ee`E{ z)bpz_XNlV1kf?|wO^a5^_*eL|o)CF%xaZz_!H~#<`~StsXDNCgzdi9$7%&_dJYD@< J);T3K0RTr_k*xp# literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_barcode_16.png b/glabels2/src/stock-pixmaps/stock_barcode_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6e0e2890a2f8d5ce4df3c722d6f6932cd8eb08b2 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G_YAk0{w5<>&kwKlZ!!#``~*nOQ6suPZ!6KiaARsZ4_iu6mb0?C)#%I zMiXm5)6Ddet+6U;(+XH4ni}WUG(Q%YCR(5p86nr78o}6bQMkT8B@C jJc}-23l^TR=9u{|&ajn*LFJ!;u4nLc^>bP0l+XkKEMIX! literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_barcode_24.png b/glabels2/src/stock-pixmaps/stock_barcode_24.png new file mode 100644 index 0000000000000000000000000000000000000000..9699c8dd58d6e9ea9fec19aa69b8ba1b04133085 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=G_YAk0{w5<>&kwKlatAu`+4^CwLqadPZ!6KiaBqmY~*S%;BlGncXq|% z|Nm>PUWrZTdYUmuN9)V9-IEsgmvNX}V|eh+Tl>I`SC6hgX-F+kSe3#ZW6kze-^+EL zwk7Mjxgv~fP6Vq)Ke)vi|6zsI0%joE#~|^fCiie;ck4Bq@audBmNjI5RZEhsT(?fP f;qS9~^IxzO?UKxx5XiRy=n@7`S3j3^P6<>&kweOO%OIhmXzbKTs&d)5S5w;&gI?M8*M*r86ZZB>o93 z{3p)L%q+br&Q0Z<>&kweOGHfHqGTdtK2Year;B5V$MLsQ{kfVPMB43(#Y7!5 z+cPe2o9yB;{e?lSlG3igtvz9?tr}+gG8gM!;n+0k0Q+GBoH$Hy`oCv>cLI7O4zNFWSM&!m`P?}ucqwT#DOS+yXgQt5Onx!3DiQSx*;m1eUk zfH;nGw-P#dc5qs2nM@`!pU(x5AP5AI!C(+pbGT`UqO~TU&yz?bFin$Ar$am*r(Un) z`#wLfuL1mZkw?FfOeP=va=DD_x>T!Gf*|0V<6zr1hGC4H_s5?fm7$b62wUj)`**(Y zi|e{F91f-1?TT&N5{tz|DfL?^^~<*Q7C+8DUIOeybSz+@wZ^h6(&;p#(TLe>My*y0 z-|hmp9>|+qj^x$VPPBz(Hk(Zsi$#{pC7$Q4lMUeZ*?mZ*Qm+9i6bgSMs~oKq59IrY zqnm9yyFg*(o9n^LxUu+?%gIX*4G-kY+r)h9F>S+FWjH727bd_xXgR59Ho$m*00000 LNkvXXu0mjfN@wU* literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_bucket_fill_24.png b/glabels2/src/stock-pixmaps/stock_bucket_fill_24.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee5993efb5d76c199a432c70069240006ca5d09 GIT binary patch literal 589 zcmV-T0$tkOc;p{?1*6D3jzl1QuvIf3c=dO#uTZnBBZzTPnbfRKo~ZV zbRz-5Fo+0_O$M@At&$=TgDwsk$7+v-vtbRZCfVI;{hD*&p8I|0#l3J?a37G^9tZ?D zy~ECpqw@wDhVedjuk2gel}hErb_KOsO#n%!(~tJ00^7D#;0GX%Q&sh|2lDR0-50xY9r=R* zVHlnQzBrCUB9Xu_40^pDyt$A{kz8ND41D@$i^4Dj_-dNwYCfN5 zGMV6c-YmHSyaL{S(2jqPubx?`Ri$(X@E|;6cL%kgfOgrF#c)!kWExb;;t^;Vm z6W}^+m9aQ^Yrl>_@Mo@pxpSAm=S b$Kk_ID!IwIC@mWz00000NkvXXu0mjfnD+#g literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_center_horiz_16.png b/glabels2/src/stock-pixmaps/stock_center_horiz_16.png new file mode 100644 index 0000000000000000000000000000000000000000..fce3e9098dea5aa3c8167f8ef857e0df990a1111 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G^rrQ8CHYnAtw0tMMiJbhi+FLBGTFiUPLnwtw03iotz45^rtoUp*~hrb7-@KUpY zyAA(&czB*!T$yDo@Ng-2fa@j?HY10h{}+CWI9RU}A=c}5+~T0HjMTgbmt9Q7C&;p$ t&@*&@e3&6{W5Zd8JqaI{y8L2hSa?xy<>&kwKTZVi8BxErFumT0<*Zy znEx3Y7{oXT?{+w$dg6f0svq{u%!h?lwpnWGO?JKXL;jSybP0l+XkKIeb9% literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_ellipse_16.png b/glabels2/src/stock-pixmaps/stock_ellipse_16.png new file mode 100644 index 0000000000000000000000000000000000000000..9652562e0d3d9b6c8bb7a9db0e2fa9f3a7712bf7 GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G_YAk0{w5<>&kweOO%O6m!<5V4g&)ttEY=&h{frxlNECgIf%6F59(vF z+^pF&W9=NJ#G*wVU0ghim@Icn9y!7ic}#?9@2QhZ6{9)inw1?m92a)YQG7Y;&Y7um zB7!+SOiF+E_y7NQ`@i#@6HtA?I)h>2sZJ~H)QPjZ6oQR{W`t~FS&|)X^uboLy|2gF zoo%0b?CndfWlC*jZ$%a6$-mFA75V@6Lf!38S0ow!FkL@zD`cx!!RuRMcdwrgslVEl zU?qHJx^(bO$!8&J*&bZYH;Ruqe5Hh2P~p*qo7p};SD!!Prda;wjBq3Cf$QI0)f^A& zlr-8M_mdKI;Vst08DtAHvj+t literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_ellipse_24.png b/glabels2/src/stock-pixmaps/stock_ellipse_24.png new file mode 100644 index 0000000000000000000000000000000000000000..12f0468fc4414a1fd4289079ee22137bdc78196e GIT binary patch literal 744 zcmVP)Hk(b@?Y4;3YV8Nwr9J6VlGwU{7J%H`-Q?xxp=lb{9afe?ON2sU-S0kd zBNc)I;3?pCI!n3Ibd0*%5-LiE$jOGUD=<8MfY<%Abod?splRALa0>Whh9CgAy&e~L zI~pl3>D%&(Zw9OJ-Frn(&s%^IpcYt3M$iSccs(v&JaU*W)alEM3=9T|MAn`FO-7r= zSWs0}AC@{xxYKc-LdSw>g6gW{_TU z8A^`bZfD~sXzTBY{R*1~R}>37_tfiZmJv50AXuHAn#qZM8v~0-DS9C^R>R%8`rX)_ zi4?`-@zM45AIvV_PAf%|p-x?#1H@)UehKj0Kam!J;oN&5w%MSS0b>BcfDcFZEz{r& zYd$KECj74f6F~3ZgSHIp1rCkRM7eZk-Za7Wn^C5w=K-F{Jqbj&^8W}3ug4{V0iReN zVapv1_=MNv5;EtX01t5Ze*qQ9aTkDSYi$+-{?0#u2mGC)t+iPP*1?+qx7l0o0v;Ox zlI?C8xm%ty{onvxklz-UoX{-U=X0`KdVq0Y0~kv6MblS4P$-8oE~8dti^qV^z~c7( aYxoVw#^h6s!*nMA0000<>&kwKTasBqY;V@ui$Eb4PZ!6KiaE&%609!{%xP?VXfOBk ze}HL3qfW>{RvWgMhE)@fE}bdTlf>ckfm7~w;see}Rj+n3+!WY!h=EO`t2NL;je+6D XU#*pA;bP0l+XkKgEctz literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_flip_vert_16.png b/glabels2/src/stock-pixmaps/stock_flip_vert_16.png new file mode 100644 index 0000000000000000000000000000000000000000..93027c937def1cdc614f01abfeba83b3868e0bc6 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G_YAk0{w5<>&kwKTasDAP$EHM7f{IG)5S5QVoq|x0>cTZ2?;;=m!7=F zb67<(sc*?gPNCa#BAEXf8yLhiT)OeYrTKq`30s2F)gyt-9p(&TxhEQyWGt~zG&Bg9 iG36q!qPKA%1B2vsxr1*na~%X4&EV|gW!U_%O``R3p^r= z85p>QK$!8;-MT+OLG}_)Usv{vJVLBG`ul2|m4QOLJzX3_D&{07EHF%Pd1hd^@z3$4 zAMWqBPg&V&JYz=0KX(@wgD+pd8ttk0$mDwX-(Pl#uI}!KQZs>4-@kn`TCsAak%YAL z;uW^l-*lSSua|FYmH=tXzq{+Ly|6I1>yM+|)BjJbJ>Hblxn+wa}0^Cu~WJ9bwe zcq%C&Au-Rcw(DU~2kVM`?jH}fa*JoaZm#_N%;?Mv!`6dm&Ir9bwcKCcu;%YCVP(FA oeNOz1+qQ*?7|vR*G>e(xp+&>v+dL~)1HHlE>FVdQ&MBb@0N=rVZ2$lO literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_hchain_broken_24.png b/glabels2/src/stock-pixmaps/stock_hchain_broken_24.png new file mode 100644 index 0000000000000000000000000000000000000000..2e961a3e7956e25846ebf90a491f10d6d10d8b33 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^5|gW!U_%O``R3p^r= z85p>QK$!8;-MT+OLG}_)Usv{vJVFd+ymx>9`VJJj-rONmD{*#E^{fpT%>WRZ1zEk%Zeda1wAKyF;kqRciPBjxp2k2>nAmr3bd_O zU#Y|2=fQVu`6K7VGiL=o)fpRR-oNIk5-YP_kj2};_}S;kmgC`f!Dv^la9FEvF)_k49U!0j33(dr7rzr;aBr%zWq+) RzdO)(44$rjF6*2UngB2jgBSn+ literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_image_16.png b/glabels2/src/stock-pixmaps/stock_image_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ee9ed3d2c39cce27df3f8f612f845c5a72a42229 GIT binary patch literal 485 zcmV>31%X0K2s-r>UKt3%Yq=l9%@^OcDt!4tSxFk8+5CkPm zzW@eMbpY&Fxc*Wi#%6`h06>T+-5S8@MHWmbrE~EA6=Ivt^m6%?NW@FM-WsTR`!sVz zJm~nSa;?@cUa#A(g*vpiN^p_@^ga!!0%~n^-9Xb^Xqv*$l)y06(Sf!(L<7zN=`iTA zW5BP%P!$Xhut%>3$d1<`BQu0Np&ktBmQ>6NS()w0I}G$8lluUQfg<6Duu3SVV&cy< bW}jn!x@K;K>bqBS00000NkvXXu0mjf!>-Kq literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_image_24.png b/glabels2/src/stock-pixmaps/stock_image_24.png new file mode 100644 index 0000000000000000000000000000000000000000..093c8ad9bc827c347e1f6862bed3f93d2f7e61b1 GIT binary patch literal 704 zcmV;x0zdtUP)Lo zK~zY`)s;_Z6G0Tlf3v$uv-#H~1TBIwN-5GqP!bVEA<$#N3PLLg77yydgI*F(dJsWK zMbx7?1q7=nQP68HJvE9b^&ld36-5x@KTKL<#zT|sZn8-i41xp0EN|a@-}~O1Hv|9s z5SDK_SYRclqSQ63@#Nia0|772gpo9(4VqQ$Z-8!1hXFWs&oQtlP*>bW)C;`xyK^Y6 zCNm85% zT zn{>42T41>z0ohVCzwm~ow_jNK^?SoQv;jpH+uCo)6OTvbnaWOiWjQTdx2xkU7#VqS zX_p*1;*}SkrDR}Im9k|gYx<>uEoMd3At6UD>zqD3hN>uNng9g(#3FO=_H;#a=h|oX zP5Ky)dGHP?=mCwZXP=Y1nc{r%iFr&-g3V(-d91X9aKwwpBT$sJncr5~Q2O=v2U%^_ zSgAMh>1w;kc7m34e*A0@&{c#Gu6iQ3brHa((n`>En+E-wYw%9sfBIxPT@|s`D-<0N mK^3T33ECZ29}qzesQm$P7R{m3`S0=o0000QcFTt^6?^t%~#p(@e&Ovn_9h z=co!)FurKN81p~W@x!`n384zs{!)LmJj$;&t;ucLK6Vm2~)oS literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_line_24.png b/glabels2/src/stock-pixmaps/stock_line_24.png new file mode 100644 index 0000000000000000000000000000000000000000..7bb65234073ab65a9b32f7c225702be38467a03e GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=G_YAk0{w5<>&kwKlat9vHt)o>oj{>Wo-U3d6?5KRHOxEYAky-X-(aFf zhK7bE%mTGwyc$MPxm z^45b=#WUC%Za>*@RH@$bTEeTa!)AB)7amzzD$i^${=v5F$4T?6FOoUt?BZ10we`!P z%KD~#=j0FFHgWzM_Q~d=fT`&Rv#Z*ns`6O|T<1P_t;*IEwhQ|AGyLGo`3pLmF3(*s z@t>mLhf4`<_dO~y1;V`7{c(wYXl!fka$x8DgqLLzGRhB@9<+&`f2w!uFJ|WVo_k9_ SzFG+M9fPNmk#YHEFDmeH6;saFF zY^6&PD%OIw7-;Q61MIs68hD87CP5NH*r#da^ zcUn@@v`7I3*Z@u{l?nil_jkNE>eQcWxQ-7%5CoC0i{bG;ULWwh4u}|CkwA7`mU4xV z`wN<`C%CyfK%dK@>uGH31)-);VkxAwnayO!9!{|=m%@4pjW(X^-~}-PktC2RpkRMC z05A*#!!Sm#;5W9ZRyWZyYwRDMPqeF8EGpsZTG-T+3d9uv%H{G{fqXvSHBD0t3e1~W z?d2ZHG|fqaNI>)iX5to3(-~yQ===yF0E7}YYEO%-WUo2e+xky>Mem6HaP0-stEYbv zP)7;?TwG>AsFcha$7i=;YGt2$08&i)C_|P{AK%xnh?eg|qF?|3002ovPDHLkV1hB2 Bz!d-h literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_merge_24.png b/glabels2/src/stock-pixmaps/stock_merge_24.png new file mode 100644 index 0000000000000000000000000000000000000000..af612006f83a965fa0f43e27ae923b066e170eda GIT binary patch literal 758 zcmVOqQ1Z$0$XQ%+j^4C43jOL!|NUbLVf zj1|IF+x{AUpz&l;cuaUcem zYAsA$panFQbp!h{49EcH)n*hO0R~k-T0ljIf^z;4kmYh&0@AUoJyijW1LuH5z@Z4E z>^qlIMg_PJ6oJ%nH87NYRxX!WSXl5kUOs<8E|;e?G0ytNCh1dI>Q;kNX|#PLq3(+) zMLtp#XMYWZ0Y(Zmy*sK{0bmB$0IER!Zw#<^D!h5OOgfz=U&ynv@`cICao#Rg7|IV( zw`_#axi@{cuQrv9>LOquG!rxvAq)@(LW?0Z1B3}i5;UXDU>5ie>;RU^g4?08ivjKd zUst!u59JuU^9aXra6O6VdA)*L3|T9vbTt8|8^E);b>loji*e9sa@b5KNQDpp7ZjtK zV&(n;kPRyDzcF|^8@zN9Sy8sA($w?;q_mixx{MG;m*YN}6x3_2W7h2RVQCG^`iUlv zUW%$pmViwl>od^AHdD99&~zJ3Kbo38ndE#1dTfhNpI0&B6--0#C;wqG;C}~Bb&h&n zCz*8dTGx=?Fv*c8NGTCQP^~p1d(CHJ?Eq(tt`=C%5I580a|zJ)`t79fQ2{Vfs*%b5 z0JaY2QFRWdd6h)*>AwM3{ut-d#T27AcX|CPLvAp`nX?Y5q)s6l@5g_`uff6kJm$dO zv8UbEFrIy#<>&kweOO%OU{AGAaEKn%a)5S5w;&gJt0s#Y|3IF{)?70=C z4>j3r=vp7Oy}1ztI)n5Bau~QL)~RMNIA2#5<~eD!)A-A0CO-!5+)X?V-^8w1_k?^u lWMI%R@kq;&6Arly488aGOgW~W@Bv!D;OXk;vd$@?2>_-GJthDE literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_order_top_16.png b/glabels2/src/stock-pixmaps/stock_order_top_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0884bc1e6ebdc7f90c6ed3f0f390baff44ce0ea3 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G_YAk0{w5<>&kweOO%P<(zLO15>UwB)5S5w;&gJt0s(_Z0{{Kj)QQCy z#rFGrc%?Jh`tSh|a9Jtd*2t)%(q`qyEODsG=0VfyYi}3q7cV$w9LbjOk?-+?UN<+T f#SbP0l+XkK8Rk7y literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_pencil_16.png b/glabels2/src/stock-pixmaps/stock_pencil_16.png new file mode 100644 index 0000000000000000000000000000000000000000..83a14936e5000385daa5a2e8531e75e905cfb67a GIT binary patch literal 489 zcmVvvpfdj~|5X0NdfTt-n&tb}7oNlO@I0UA4-cHLDqsWkuWKu1W=gUBz8GuVw)!v=;Risxh_?XGVQ*JNGO|qN=XnZ)( zmzW!VK!GIVDYsM9+5zy?%nB}5RRdqr+cXwi+4!!bIBOV9t^vHngkHaijiwUOW-&GF z7U`usA|8(mKwNi}UND-#rD>Y`+x`|xRxlh61Nf(tYbS=?7iWSZyZipixB!IjR-ApKHxvA{*eH-MQ(1qTrj~AQv^m<}E$`|^ z69n4bW&DsY0#JXmpC`d*0RHG~@{hZp`Ge!*6YMq{mr5M0d|Ku1&|~iTnu32j*crg* z10B8aD%Of>oV6Y%Lxalw(EO=sz}pWg(qB)hbT%+E5m35(kB;~UiJtB*0SK+3PUb%( f03k~j$!x(dk?xk4i>q%H00000NkvXXu0mjf=CR{v literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_pencil_24.png b/glabels2/src/stock-pixmaps/stock_pencil_24.png new file mode 100644 index 0000000000000000000000000000000000000000..a36ce93049a0216921dcb3dc90f4d9ccbf148632 GIT binary patch literal 618 zcmV-w0+s!VP)k*V^nj8?>zhfc!0`k4Wf#ooGNCg5hfncQ_m-{bZ8PjvYvDkOD)TzYxOf7Vl{l;}cM`Dqxpj1!-%dL8~hS(c^8qM1d_K|EopiNi`hF(K(17! zDs9KtwUR{yZJ|nYRt5$}2~QWt5R21OCvWsR;vmqrpI0&T zNQtN7#{*_&O|2)g5>+ea^iP<+L;M8yk`JP9a(vR0AK#3O*kRX@z_pt923Ph&)s)Ao zJ9%{8oO}2G?U^@y2h0we2c~j|CL91TBb|Zi)S#N`DJbHoSl12>dk%sGn;xW`aCah`S`T5@3F;?ef}b@ n74zI9r(KhbGXK8T{FZ)pM$)slymK}KgN?z{)z4*}Q$iB}R1>9b literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_properties_24.png b/glabels2/src/stock-pixmaps/stock_properties_24.png new file mode 100644 index 0000000000000000000000000000000000000000..f5926060facd94bce87fdf971fced826b3357789 GIT binary patch literal 484 zcmVd)IwF4StXZ@K{x15znl1D7Dmim2M`bAPv3m>>dfwEolh^#~5SzAB+as?}7sZ*qsLPSatdC&7aeBZYVqtVEIgCJnot5IL+ z<|a4?+J?jh?{qp0do=)-TAzh9xHX+H3<<+9<(Mb>e?>0qqLpG3wMZ#tHE@qDoEF}J zHkZxSU@#cWVa zXh5$n*S7#aPpY&bN%~RJEVwi8=MlM`vG(Ma4B#l4Q+Wm7&4|>D5AvpF{I4P!-vO{z aB=TQpqL?jS#OHAU0000<>&kwKTauZ{+)>Xx1Sr(t>EaktF()};fzc2DRcvZDMM^w8 zJkMNaetLB@xh-5@?r_Wkwxx+PQpD%DBt=h1X4tg3+`zzKiI5S?vl=$GmdU9Lb0p@v zUl1^1mH>h~3)v3vD83P5yVIz4`oMt?{X)zMMXFOI6hNGLLd+5yBoBBjaf@jXjBQv| c*=PrJ`UQpW*EGNX2D*j8)78&qol`;+02+`@)c^nh literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_rotate_right_16.png b/glabels2/src/stock-pixmaps/stock_rotate_right_16.png new file mode 100644 index 0000000000000000000000000000000000000000..cc5dc49a13a05655be22cf2d8ffa6de308cc474e GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G_YAk0{w5<>&kwKTauYe@9mt_IY6O0PZ!6KiaE&%5)2>YXC8KGVJl{1 zV-wt?6}PwI%!gM;lWWWlZIH6m+u)Ei-(|W=ih~w2^I<-feU@RN7IWqwXDD2!BXssa z!!ygTe~DWM4f7A8#V literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_text_16.png b/glabels2/src/stock-pixmaps/stock_text_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c539bf1ece1cffa4d5fc4cebcff1d35b9cf62f36 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4G&t}!%lNpmCvMK}vQ zB8wRqxCKF&u|6e!B2bXM#M9T6{Sqe^qloToo02x5kglhTV@SoEW#iU zFnM4vX6MOpmx1Si%c{=BY!@yvxUq3PuIFH6V4Kd#`6|3%Hc%sjr>mdKI;Vst0O<>&kwKlaoooXz$zE#z3J}o-U3d6?5KR*~@jvK*H^zd*Ow% zRh(VTk3@G?KID7X^eD;tWx^4m-^ni)-C%AsiN8E~$)1JJXYW+q!t;1lKTos@`x?Xk zW9AVpRz8NFqB0w~h1mmjxgSTzIPEWDU(9xJlgUe&tLrQh`==f^j16YB?7En4kgkHzV$-p$`R>&vvvQ;st^)8eK_z1uveM(2TTKriF# bpUUqlA86#6)eEfxx|+e$)z4*}Q$iB}qVH~K literal 0 HcmV?d00001 diff --git a/glabels2/src/stock-pixmaps/stock_vchain_24.png b/glabels2/src/stock-pixmaps/stock_vchain_24.png new file mode 100644 index 0000000000000000000000000000000000000000..7dc2031f4f031b7cd4d3c66b2cebe41f2edb662d GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^oIotW!3HEXq_67%DYhhUcNd2LAh=-f^2s121s;*b z3=G^tAk28_ZrvZCAbW|YuPggS9wAmORgO<*cLRkkd%8G=RLogBDUhq#fT!($tDMsZ ziKY#!Pxu)enf=4ArLz0iD?NoP+B{R~ zJLmcI-e!-2K#?^e=e@q_q#lkeOM0$2@xiKH1`{{9ziw|m(U4hH;+3&>zo%16bcRHm zz>9yIy}5la3o}f3p3dNK`<_`)-L6TSHp*7b^a(GNvEIl0*O+@PYxUC(7U_d&BB_yw zqE82XxOD$Y3X8huqiilAIhL6}bJn`f@Q#f)>|@??tz!{K?Da^EKfm84wrSHJY5_^D&}0B?8wz@AmF;+nNP8T z$MHqz5_OG7zIVhI-gDaijmc?`lj0<~1Fj1#?#{U4qWyN0Jd!)5sI0Xt|nBLS-V|8(!i7NoM_bRa-sjS(VHd&y^?nAPHYlpSdhD3S~ESo^ln7^YM*1FBCdXa#Fd0}QqR||&EWjOF4N($L32^2 zf1pT2@2O24r*G^$cS6Ll@A22!WxRh`X3op)?J}6XYFC1U$d+pyhXrD. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "stock.h" + +#include +#include +#include +#include + +#include "stock-pixmaps/stockpixbufs.h" + + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void add_icons (GtkIconFactory *factory, + const gchar *stock_id, + const guchar *inline_24, + const guchar *inline_16); + +static void add_button_icon (GtkIconFactory *factory, + const gchar *stock_id, + const guchar *inline_24); + + +/****************************************************************************/ +/* Initialize our stock icons. */ +/****************************************************************************/ +void +gl_stock_init (void) +{ + GtkIconFactory *factory; + + static GtkStockItem items[] = { + { GL_STOCK_ARROW, N_("_Select Mode"), 0, 0, NULL }, + { GL_STOCK_TEXT, N_("_Text"), 0, 0, NULL }, + { GL_STOCK_LINE, N_("_Line"), 0, 0, NULL }, + { GL_STOCK_BOX, N_("_Box"), 0, 0, NULL }, + { GL_STOCK_ELLIPSE, N_("_Ellipse"), 0, 0, NULL }, + { GL_STOCK_IMAGE, N_("_Image"), 0, 0, NULL }, + { GL_STOCK_BARCODE, N_("Bar_code"), 0, 0, NULL }, + { GL_STOCK_MERGE, N_("_Merge Properties"), 0, 0, NULL }, + { GL_STOCK_PROPERTIES, N_("Object _Properties"), 0, 0, NULL }, + { GL_STOCK_ORDER_TOP, N_("Bring to _Front"), 0, 0, NULL }, + { GL_STOCK_ORDER_BOTTOM, N_("Send to _Back"), 0, 0, NULL }, + { GL_STOCK_ROTATE_LEFT, N_("Rotate _Left"), 0, 0, NULL }, + { GL_STOCK_ROTATE_RIGHT, N_("Rotate _Right"), 0, 0, NULL }, + { GL_STOCK_FLIP_HORIZ, N_("Flip _Horizontally"), 0, 0, NULL }, + { GL_STOCK_FLIP_VERT, N_("Flip _Vertically"), 0, 0, NULL }, + { GL_STOCK_ALIGN_LEFT, N_("_Lefts"), 0, 0, NULL }, + { GL_STOCK_ALIGN_RIGHT, N_("_Rights"), 0, 0, NULL }, + { GL_STOCK_ALIGN_HCENTER, N_("_Centers"), 0, 0, NULL }, + { GL_STOCK_ALIGN_TOP, N_("_Tops"), 0, 0, NULL }, + { GL_STOCK_ALIGN_BOTTOM, N_("Bottoms"), 0, 0, NULL }, + { GL_STOCK_ALIGN_VCENTER, N_("Centers"), 0, 0, NULL }, + { GL_STOCK_CENTER_HORIZ, N_("Label Ce_nter"), 0, 0, NULL }, + { GL_STOCK_CENTER_VERT, N_("Label Ce_nter"), 0, 0, NULL }, + { GL_STOCK_BUCKET_FILL, N_("Fill color"), 0, 0, NULL }, + { GL_STOCK_PENCIL, N_("Line color"), 0, 0, NULL }, + { GL_STOCK_HCHAIN, N_("Linked"), 0, 0, NULL }, + { GL_STOCK_HCHAIN_BROKEN, N_("Not Linked"), 0, 0, NULL }, + { GL_STOCK_VCHAIN, N_("Linked"), 0, 0, NULL }, + { GL_STOCK_VCHAIN_BROKEN, N_("Not Linked"), 0, 0, NULL }, + }; + + gtk_stock_add (items, G_N_ELEMENTS (items)); + + factory = gtk_icon_factory_new (); + gtk_icon_factory_add_default (factory); + + add_icons (factory, GL_STOCK_ARROW, stock_arrow_24, stock_arrow_16); + add_icons (factory, GL_STOCK_TEXT, stock_text_24, stock_text_16); + add_icons (factory, GL_STOCK_LINE, stock_line_24, stock_line_16); + add_icons (factory, GL_STOCK_BOX, stock_box_24, stock_box_16); + add_icons (factory, GL_STOCK_ELLIPSE, stock_ellipse_24, stock_ellipse_16); + add_icons (factory, GL_STOCK_IMAGE, stock_image_24, stock_image_16); + add_icons (factory, GL_STOCK_BARCODE, stock_barcode_24, stock_barcode_16); + add_icons (factory, GL_STOCK_MERGE, stock_merge_24, stock_merge_16); + + add_icons (factory, GL_STOCK_PROPERTIES, + stock_properties_24, + stock_properties_16); + + add_icons (factory, GL_STOCK_ORDER_TOP, NULL, stock_order_top_16); + add_icons (factory, GL_STOCK_ORDER_BOTTOM, NULL, stock_order_bottom_16); + add_icons (factory, GL_STOCK_ROTATE_LEFT, NULL, stock_rotate_left_16); + add_icons (factory, GL_STOCK_ROTATE_RIGHT, NULL, stock_rotate_right_16); + add_icons (factory, GL_STOCK_FLIP_HORIZ, NULL, stock_flip_horiz_16); + add_icons (factory, GL_STOCK_FLIP_VERT, NULL, stock_flip_vert_16); + add_icons (factory, GL_STOCK_ALIGN_LEFT, NULL, stock_align_left_16); + add_icons (factory, GL_STOCK_ALIGN_RIGHT, NULL, stock_align_right_16); + add_icons (factory, GL_STOCK_ALIGN_HCENTER, NULL, stock_align_hcenter_16); + add_icons (factory, GL_STOCK_ALIGN_TOP, NULL, stock_align_top_16); + add_icons (factory, GL_STOCK_ALIGN_BOTTOM, NULL, stock_align_bottom_16); + add_icons (factory, GL_STOCK_ALIGN_VCENTER, NULL, stock_align_vcenter_16); + add_icons (factory, GL_STOCK_CENTER_HORIZ, NULL, stock_center_horiz_16); + add_icons (factory, GL_STOCK_CENTER_VERT, NULL, stock_center_vert_16); + + add_icons (factory, GL_STOCK_BUCKET_FILL, stock_bucket_fill_24, stock_bucket_fill_16); + add_icons (factory, GL_STOCK_PENCIL, stock_pencil_24, stock_pencil_16); + + add_button_icon (factory, GL_STOCK_HCHAIN, stock_hchain_24); + add_button_icon (factory, GL_STOCK_HCHAIN_BROKEN, stock_hchain_broken_24); + add_button_icon (factory, GL_STOCK_VCHAIN, stock_vchain_24); + add_button_icon (factory, GL_STOCK_VCHAIN_BROKEN, stock_vchain_broken_24); + + g_object_unref (G_OBJECT(factory)); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Unpack and associate given icons with stock_id. */ +/*--------------------------------------------------------------------------*/ +static void +add_icons (GtkIconFactory *factory, + const gchar *stock_id, + const guchar *inline_24, + const guchar *inline_16) +{ + GdkPixbuf *pixbuf; + GtkIconSet *icon_set; + GtkIconSource *icon_source; + + if ( inline_24 != NULL ) { + /* Create icon set with default image */ + pixbuf = gdk_pixbuf_new_from_inline (-1, inline_24, FALSE, NULL); + icon_set = gtk_icon_set_new_from_pixbuf (pixbuf); + g_object_unref (G_OBJECT(pixbuf)); + } else { + /* Create an empty icon set */ + icon_set = gtk_icon_set_new (); + } + + if ( inline_16 != NULL ) { + /* Add 16x16 icon for menus to icon set */ + icon_source = gtk_icon_source_new (); + pixbuf = gdk_pixbuf_new_from_inline (-1, inline_16, + FALSE, NULL); + gtk_icon_source_set_pixbuf (icon_source, pixbuf); + g_object_unref (G_OBJECT(pixbuf)); + gtk_icon_source_set_size_wildcarded (icon_source, FALSE); + gtk_icon_source_set_size (icon_source, GTK_ICON_SIZE_MENU); + gtk_icon_set_add_source (icon_set, icon_source); + g_free (icon_source); + } + + /* Now associate icon set with stock id */ + gtk_icon_factory_add (factory, stock_id, icon_set); + gtk_icon_set_unref (icon_set); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Unpack and associate given button icon with stock_id. */ +/*--------------------------------------------------------------------------*/ +static void +add_button_icon (GtkIconFactory *factory, + const gchar *stock_id, + const guchar *inline_24) +{ + GtkIconSet *icon_set; + GdkPixbuf *pixbuf; + GtkIconSource *icon_source; + + icon_set = gtk_icon_set_new (); + + icon_source = gtk_icon_source_new (); + pixbuf = gdk_pixbuf_new_from_inline (-1, inline_24, FALSE, NULL); + gtk_icon_source_set_pixbuf (icon_source, pixbuf); + g_object_unref (G_OBJECT(pixbuf)); + gtk_icon_source_set_size_wildcarded (icon_source, FALSE); + gtk_icon_source_set_size (icon_source, GTK_ICON_SIZE_BUTTON); + gtk_icon_set_add_source (icon_set, icon_source); + g_free (icon_source); + + /* Now associate icon set with stock id */ + gtk_icon_factory_add (factory, stock_id, icon_set); + gtk_icon_set_unref (icon_set); +} + + + + + + + diff --git a/glabels2/src/stock.h b/glabels2/src/stock.h new file mode 100644 index 00000000..14fb907a --- /dev/null +++ b/glabels2/src/stock.h @@ -0,0 +1,68 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * stock.h: Stock image module header file + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __STOCK_H__ +#define __STOCK_H__ + +#include + +G_BEGIN_DECLS + +/* Stock names */ + +#define GL_STOCK_ARROW "gl_stock_arrow" +#define GL_STOCK_TEXT "gl_stock_text" +#define GL_STOCK_LINE "gl_stock_line" +#define GL_STOCK_BOX "gl_stock_box" +#define GL_STOCK_ELLIPSE "gl_stock_ellipse" +#define GL_STOCK_IMAGE "gl_stock_image" +#define GL_STOCK_BARCODE "gl_stock_barcode" +#define GL_STOCK_MERGE "gl_stock_merge" +#define GL_STOCK_PROPERTIES "gl_stock_properties" +#define GL_STOCK_ORDER_TOP "gl_stock_order_top" +#define GL_STOCK_ORDER_BOTTOM "gl_stock_order_bottom" +#define GL_STOCK_ROTATE_LEFT "gl_stock_rotate_left" +#define GL_STOCK_ROTATE_RIGHT "gl_stock_rotate_right" +#define GL_STOCK_FLIP_HORIZ "gl_stock_flip_horiz" +#define GL_STOCK_FLIP_VERT "gl_stock_flip_vert" +#define GL_STOCK_ALIGN_LEFT "gl_stock_align_left" +#define GL_STOCK_ALIGN_RIGHT "gl_stock_align_right" +#define GL_STOCK_ALIGN_HCENTER "gl_stock_align_hcenter" +#define GL_STOCK_ALIGN_TOP "gl_stock_align_top" +#define GL_STOCK_ALIGN_BOTTOM "gl_stock_align_bottom" +#define GL_STOCK_ALIGN_VCENTER "gl_stock_align_vcenter" +#define GL_STOCK_CENTER_HORIZ "gl_stock_center_horiz" +#define GL_STOCK_CENTER_VERT "gl_stock_center_vert" +#define GL_STOCK_BUCKET_FILL "gl_stock_bucket_fill" +#define GL_STOCK_PENCIL "gl_stock_pencil" +#define GL_STOCK_HCHAIN "gl_stock_hchain" +#define GL_STOCK_HCHAIN_BROKEN "gl_stock_hchain_broken" +#define GL_STOCK_VCHAIN "gl_stock_vchain" +#define GL_STOCK_VCHAIN_BROKEN "gl_stock_vchain_broken" + +void gl_stock_init (void); + +G_END_DECLS + +#endif diff --git a/glabels2/src/template-designer.c b/glabels2/src/template-designer.c new file mode 100644 index 00000000..60ffe576 --- /dev/null +++ b/glabels2/src/template-designer.c @@ -0,0 +1,1758 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * template-designer.c: Template designer module + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "template-designer.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "prefs.h" +#include +#include "wdgt-mini-preview.h" +#include "mini-preview-pixbuf-cache.h" +#include "print-op.h" +#include "util.h" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ +#define ICON_PIXMAP (GLABELS_ICON_DIR "glabels.png") + +#define EX_RECT_IMAGE (GLABELS_PIXMAP_DIR "ex-rect-size.png") +#define EX_ROUND_IMAGE (GLABELS_PIXMAP_DIR "ex-round-size.png") +#define EX_CD_IMAGE (GLABELS_PIXMAP_DIR "ex-cd-size.png") +#define EX_NLAYOUTS_IMAGE1 (GLABELS_PIXMAP_DIR "ex-1layout.png") +#define EX_NLAYOUTS_IMAGE2 (GLABELS_PIXMAP_DIR "ex-2layouts.png") + +#define DEFAULT_MARGIN 9.0 + +#define DEFAULT_RECT_W 252.0 +#define DEFAULT_RECT_H 144.0 +#define DEFAULT_RECT_R 0.0 +#define DEFAULT_RECT_WASTE 0.0 /* Should never exceed 1/2 the distance between items. */ + +#define DEFAULT_ROUND_R 72.0 +#define DEFAULT_ROUND_WASTE 0.0 /* Should never exceed 1/2 the distance between items. */ + +#define DEFAULT_CD_RADIUS 166.5 +#define DEFAULT_CD_HOLE 58.5 +#define DEFAULT_CD_WASTE 9.0 /* Should never exceed 1/2 the distance between items. */ + +#define DELTA 0.01 +#define MAX_PAGE_DIM_POINTS 5000.0 + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glTemplateDesignerPrivate +{ + /* Assistant pages */ + GtkWidget *start_page; + GtkWidget *name_page; + GtkWidget *pg_size_page; + GtkWidget *shape_page; + GtkWidget *rect_size_page; + GtkWidget *round_size_page; + GtkWidget *cd_size_page; + GtkWidget *nlayouts_page; + GtkWidget *layout_page; + GtkWidget *finish_page; + + /* Name page controls */ + GtkWidget *brand_entry; + GtkWidget *part_num_entry; + GtkWidget *name_warning_image; + GtkWidget *name_warning_label; + GtkWidget *description_entry; + + /* Page size page controls */ + GtkWidget *pg_size_combo; + GtkWidget *pg_w_spin; + GtkWidget *pg_h_spin; + GtkWidget *pg_w_units_label; + GtkWidget *pg_h_units_label; + + /* Shape page controls */ + GtkWidget *shape_rect_radio; + GtkWidget *shape_round_radio; + GtkWidget *shape_cd_radio; + + /* Label size (rectangular) page controls */ + GtkWidget *rect_image; + GtkWidget *rect_w_spin; + GtkWidget *rect_h_spin; + GtkWidget *rect_r_spin; + GtkWidget *rect_x_waste_spin; + GtkWidget *rect_y_waste_spin; + GtkWidget *rect_margin_spin; + GtkWidget *rect_w_units_label; + GtkWidget *rect_h_units_label; + GtkWidget *rect_r_units_label; + GtkWidget *rect_x_waste_units_label; + GtkWidget *rect_y_waste_units_label; + GtkWidget *rect_margin_units_label; + + /* Label size (round) page controls */ + GtkWidget *round_image; + GtkWidget *round_r_spin; + GtkWidget *round_waste_spin; + GtkWidget *round_margin_spin; + GtkWidget *round_r_units_label; + GtkWidget *round_waste_units_label; + GtkWidget *round_margin_units_label; + + /* Label size (cd) page controls */ + GtkWidget *cd_image; + GtkWidget *cd_radius_spin; + GtkWidget *cd_hole_spin; + GtkWidget *cd_w_spin; + GtkWidget *cd_h_spin; + GtkWidget *cd_waste_spin; + GtkWidget *cd_margin_spin; + GtkWidget *cd_radius_units_label; + GtkWidget *cd_hole_units_label; + GtkWidget *cd_w_units_label; + GtkWidget *cd_h_units_label; + GtkWidget *cd_waste_units_label; + GtkWidget *cd_margin_units_label; + + /* Number of layouts controls */ + GtkWidget *nlayouts_image1; + GtkWidget *nlayouts_image2; + GtkWidget *nlayouts_spin; + + /* Layout page controls */ + GtkWidget *layout1_head_label; + GtkWidget *layout1_nx_spin; + GtkWidget *layout1_ny_spin; + GtkWidget *layout1_x0_spin; + GtkWidget *layout1_y0_spin; + GtkWidget *layout1_dx_spin; + GtkWidget *layout1_dy_spin; + GtkWidget *layout2_head_label; + GtkWidget *layout2_nx_spin; + GtkWidget *layout2_ny_spin; + GtkWidget *layout2_x0_spin; + GtkWidget *layout2_y0_spin; + GtkWidget *layout2_dx_spin; + GtkWidget *layout2_dy_spin; + GtkWidget *layout_x0_units_label; + GtkWidget *layout_y0_units_label; + GtkWidget *layout_dx_units_label; + GtkWidget *layout_dy_units_label; + GtkWidget *layout_mini_preview; + GtkWidget *layout_test_button; + + /* Units related stuff */ + const gchar *units_string; + gdouble units_per_point; + gdouble climb_rate; + gint digits; + + /* Prevent recursion */ + gboolean stop_signals; +}; + +/* Page numbers for traversing GtkAssistant */ +enum { + START_PAGE_NUM = 0, + NAME_PAGE_NUM, + PG_SIZE_PAGE_NUM, + SHAPE_PAGE_NUM, + RECT_SIZE_PAGE_NUM, + ROUND_SIZE_PAGE_NUM, + CD_SIZE_PAGE_NUM, + NLAYOUTS_PAGE_NUM, + LAYOUT_PAGE_NUM, + FINISH_PAGE_NUM +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_template_designer_finalize (GObject *object); +static void gl_template_designer_construct (glTemplateDesigner *dialog); + +static void construct_start_page (glTemplateDesigner *dialog, + GdkPixbuf *logo); + +static void construct_name_page (glTemplateDesigner *dialog, + GdkPixbuf *logo); + +static void construct_pg_size_page (glTemplateDesigner *dialog, + GdkPixbuf *logo); + +static void construct_shape_page (glTemplateDesigner *dialog, + GdkPixbuf *logo); + +static void construct_rect_size_page (glTemplateDesigner *dialog, + GdkPixbuf *logo); + +static void construct_round_size_page (glTemplateDesigner *dialog, + GdkPixbuf *logo); + +static void construct_cd_size_page (glTemplateDesigner *dialog, + GdkPixbuf *logo); + +static void construct_nlayouts_page (glTemplateDesigner *dialog, + GdkPixbuf *logo); + +static void construct_layout_page (glTemplateDesigner *dialog, + GdkPixbuf *logo); + +static void construct_finish_page (glTemplateDesigner *dialog, + GdkPixbuf *logo); + +static void cancel_cb (glTemplateDesigner *dialog); +static void apply_cb (glTemplateDesigner *dialog); +static void close_cb (glTemplateDesigner *dialog); +static void prepare_cb (glTemplateDesigner *dialog, + GtkWidget *page); + +static gint forward_page_function (gint current_page, + gpointer data); + +static void name_page_changed_cb (glTemplateDesigner *dialog); + +static void pg_size_page_changed_cb (glTemplateDesigner *dialog); + +static void rect_size_page_prepare_cb (glTemplateDesigner *dialog); + +static void round_size_page_prepare_cb (glTemplateDesigner *dialog); + +static void cd_size_page_prepare_cb (glTemplateDesigner *dialog); + +static void layout_page_prepare_cb (glTemplateDesigner *dialog); + +static void layout_page_changed_cb (glTemplateDesigner *dialog); + +static void print_test_cb (glTemplateDesigner *dialog); + +static lglTemplate *build_template (glTemplateDesigner *dialog); + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glTemplateDesigner, gl_template_designer, GTK_TYPE_ASSISTANT); + +static void +gl_template_designer_class_init (glTemplateDesignerClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_debug (DEBUG_TEMPLATE, ""); + + gl_template_designer_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_template_designer_finalize; +} + +static void +gl_template_designer_init (glTemplateDesigner *dialog) +{ + gl_debug (DEBUG_TEMPLATE, "START"); + + dialog->priv = g_new0 (glTemplateDesignerPrivate, 1); + + gl_debug (DEBUG_TEMPLATE, "END"); + + return; +} + +static void +gl_template_designer_finalize (GObject *object) +{ + glTemplateDesigner* dialog = GL_TEMPLATE_DESIGNER (object); + + gl_debug (DEBUG_TEMPLATE, "START"); + + g_return_if_fail (object != NULL); + g_return_if_fail (GL_IS_TEMPLATE_DESIGNER (dialog)); + g_return_if_fail (dialog->priv != NULL); + + g_free (dialog->priv); + + G_OBJECT_CLASS (gl_template_designer_parent_class)->finalize (object); + + gl_debug (DEBUG_TEMPLATE, "END"); +} + +/*****************************************************************************/ +/* NEW preferences dialog. */ +/*****************************************************************************/ +GtkWidget* +gl_template_designer_new (GtkWindow *parent) +{ + GtkWidget *dialog; + + gl_debug (DEBUG_TEMPLATE, "START"); + + dialog = GTK_WIDGET (g_object_new (GL_TYPE_TEMPLATE_DESIGNER, NULL)); + + if (parent) + gtk_window_set_transient_for (GTK_WINDOW (dialog), parent); + + gl_template_designer_construct (GL_TEMPLATE_DESIGNER(dialog)); + + + gl_debug (DEBUG_TEMPLATE, "END"); + + return dialog; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Construct composite widget. */ +/*---------------------------------------------------------------------------*/ +static void +gl_template_designer_construct (glTemplateDesigner *dialog) +{ + GdkPixbuf *logo; + + g_return_if_fail (dialog && GL_IS_TEMPLATE_DESIGNER (dialog)); + g_return_if_fail (dialog->priv != NULL); + + /* Initialize units stuff from prefs */ + dialog->priv->units_string = gl_prefs_get_units_string (); + dialog->priv->units_per_point = gl_prefs_get_units_per_point (); + dialog->priv->climb_rate = gl_prefs_get_units_step_size (); + dialog->priv->digits = gl_prefs_get_units_precision (); + + gtk_window_set_title (GTK_WINDOW(dialog), _("gLabels Template Designer")); + + logo = gdk_pixbuf_new_from_file (ICON_PIXMAP, NULL); + + /* Costruct and append pages (must be same order as PAGE_NUM enums. */ + construct_start_page (dialog, logo); + construct_name_page (dialog, logo); + construct_pg_size_page (dialog, logo); + construct_shape_page (dialog, logo); + construct_rect_size_page (dialog, logo); + construct_round_size_page (dialog, logo); + construct_cd_size_page (dialog, logo); + construct_nlayouts_page (dialog, logo); + construct_layout_page (dialog, logo); + construct_finish_page (dialog, logo); + + gtk_assistant_set_forward_page_func (GTK_ASSISTANT (dialog), + forward_page_function, + dialog, + NULL); + + /* signals */ + g_signal_connect_swapped (G_OBJECT(dialog), "cancel", + G_CALLBACK(cancel_cb), dialog); + g_signal_connect_swapped (G_OBJECT(dialog), "apply", + G_CALLBACK(apply_cb), dialog); + g_signal_connect_swapped (G_OBJECT(dialog), "close", + G_CALLBACK(close_cb), dialog); + g_signal_connect (G_OBJECT(dialog), "prepare", + G_CALLBACK(prepare_cb), NULL); + + gtk_widget_show_all (GTK_WIDGET(dialog)); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Construct start page. */ +/*--------------------------------------------------------------------------*/ +static void +construct_start_page (glTemplateDesigner *dialog, + GdkPixbuf *logo) +{ + GladeXML *gui; + + gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade", + "start_page", NULL); + if (!gui) + { + g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!"); + return; + } + + dialog->priv->start_page = glade_xml_get_widget (gui, "start_page"); + + g_object_unref (gui); + + + gtk_assistant_append_page (GTK_ASSISTANT (dialog), + dialog->priv->start_page); + + gtk_assistant_set_page_title (GTK_ASSISTANT (dialog), + dialog->priv->start_page, + _("Welcome")); + gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog), + dialog->priv->start_page, + logo); + gtk_assistant_set_page_type (GTK_ASSISTANT (dialog), + dialog->priv->start_page, + GTK_ASSISTANT_PAGE_INTRO); + gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), + dialog->priv->start_page, + TRUE); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Construct name page. */ +/*--------------------------------------------------------------------------*/ +static void +construct_name_page (glTemplateDesigner *dialog, + GdkPixbuf *logo) +{ + GladeXML *gui; + + gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade", + "name_page", NULL); + if (!gui) + { + g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!"); + return; + } + + dialog->priv->name_page = glade_xml_get_widget (gui, "name_page"); + dialog->priv->brand_entry = glade_xml_get_widget (gui, "brand_entry"); + dialog->priv->part_num_entry = glade_xml_get_widget (gui, "part_num_entry"); + dialog->priv->name_warning_image = glade_xml_get_widget (gui, "name_warning_image"); + dialog->priv->name_warning_label = glade_xml_get_widget (gui, "name_warning_label"); + dialog->priv->description_entry = glade_xml_get_widget (gui, "description_entry"); + + g_object_unref (gui); + + + gtk_assistant_append_page (GTK_ASSISTANT (dialog), + dialog->priv->name_page); + + gtk_assistant_set_page_title (GTK_ASSISTANT (dialog), + dialog->priv->name_page, + _("Name and Description")); + gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog), + dialog->priv->name_page, + logo); + + /* Connect a handler that listens for changes in these widgets */ + /* This controls whether we can progress to the next page. */ + g_signal_connect_swapped (G_OBJECT(dialog->priv->brand_entry), "changed", + G_CALLBACK(name_page_changed_cb), dialog); + g_signal_connect_swapped (G_OBJECT(dialog->priv->part_num_entry), "changed", + G_CALLBACK(name_page_changed_cb), dialog); + g_signal_connect_swapped (G_OBJECT(dialog->priv->description_entry), "changed", + G_CALLBACK(name_page_changed_cb), dialog); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Construct page size page. */ +/*--------------------------------------------------------------------------*/ +static void +construct_pg_size_page (glTemplateDesigner *dialog, + GdkPixbuf *logo) +{ + GladeXML *gui; + GList *page_sizes; + const gchar *default_page_size_id; + gchar *default_page_size_name; + + gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade", + "pg_size_page", NULL); + if (!gui) + { + g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!"); + return; + } + + dialog->priv->pg_size_page = glade_xml_get_widget (gui, "pg_size_page"); + dialog->priv->pg_size_combo = glade_xml_get_widget (gui, "pg_size_combo"); + dialog->priv->pg_w_spin = glade_xml_get_widget (gui, "pg_w_spin"); + dialog->priv->pg_h_spin = glade_xml_get_widget (gui, "pg_h_spin"); + dialog->priv->pg_w_units_label = glade_xml_get_widget (gui, "pg_w_units_label"); + dialog->priv->pg_h_units_label = glade_xml_get_widget (gui, "pg_h_units_label"); + + g_object_unref (gui); + + + gl_util_combo_box_add_text_model (GTK_COMBO_BOX (dialog->priv->pg_size_combo)); + + gtk_assistant_append_page (GTK_ASSISTANT (dialog), + dialog->priv->pg_size_page); + + gtk_assistant_set_page_title (GTK_ASSISTANT (dialog), + dialog->priv->pg_size_page, + _("Page Size")); + gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog), + dialog->priv->pg_size_page, + logo); + gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), + dialog->priv->pg_size_page, + TRUE); + + /* Load page size combo */ + page_sizes = lgl_db_get_paper_name_list (); + gl_util_combo_box_set_strings (GTK_COMBO_BOX (dialog->priv->pg_size_combo), page_sizes); + lgl_db_free_paper_name_list (page_sizes); + default_page_size_id = gl_prefs_get_page_size (); + default_page_size_name = lgl_db_lookup_paper_name_from_id (default_page_size_id); + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo), default_page_size_name); + g_free (default_page_size_name); + + /* Apply units to spinbuttons and units labels. */ + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->pg_w_units_label), + dialog->priv->units_string); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->pg_w_spin), + 0.0, MAX_PAGE_DIM_POINTS*dialog->priv->units_per_point); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->pg_h_units_label), + dialog->priv->units_string); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->pg_h_spin), + 0.0, MAX_PAGE_DIM_POINTS*dialog->priv->units_per_point); + + /* Connect a handler that listens for changes in these widgets */ + /* This controls sensitivity of related widgets. */ + g_signal_connect_swapped (G_OBJECT(dialog->priv->pg_size_combo), "changed", + G_CALLBACK(pg_size_page_changed_cb), dialog); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Construct shape page. */ +/*--------------------------------------------------------------------------*/ +static void +construct_shape_page (glTemplateDesigner *dialog, + GdkPixbuf *logo) +{ + GladeXML *gui; + + gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade", + "shape_page", NULL); + if (!gui) + { + g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!"); + return; + } + + dialog->priv->shape_page = glade_xml_get_widget (gui, "shape_page"); + dialog->priv->shape_rect_radio = glade_xml_get_widget (gui, "shape_rect_radio"); + dialog->priv->shape_round_radio = glade_xml_get_widget (gui, "shape_round_radio"); + dialog->priv->shape_cd_radio = glade_xml_get_widget (gui, "shape_cd_radio"); + + g_object_unref (gui); + + + gtk_assistant_append_page (GTK_ASSISTANT (dialog), + dialog->priv->shape_page); + + gtk_assistant_set_page_title (GTK_ASSISTANT (dialog), + dialog->priv->shape_page, + _("Label or Card Shape")); + gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog), + dialog->priv->shape_page, + logo); + gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), + dialog->priv->shape_page, + TRUE); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Construct rect size page. */ +/*--------------------------------------------------------------------------*/ +static void +construct_rect_size_page (glTemplateDesigner *dialog, + GdkPixbuf *logo) +{ + GladeXML *gui; + GdkPixbuf *pixbuf; + + gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade", + "rect_size_page", NULL); + if (!gui) + { + g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!"); + return; + } + + dialog->priv->rect_size_page = glade_xml_get_widget (gui, "rect_size_page"); + dialog->priv->rect_image = glade_xml_get_widget (gui, "rect_image"); + dialog->priv->rect_w_spin = glade_xml_get_widget (gui, "rect_w_spin"); + dialog->priv->rect_h_spin = glade_xml_get_widget (gui, "rect_h_spin"); + dialog->priv->rect_r_spin = glade_xml_get_widget (gui, "rect_r_spin"); + dialog->priv->rect_x_waste_spin = glade_xml_get_widget (gui, "rect_x_waste_spin"); + dialog->priv->rect_y_waste_spin = glade_xml_get_widget (gui, "rect_y_waste_spin"); + dialog->priv->rect_margin_spin = glade_xml_get_widget (gui, "rect_margin_spin"); + dialog->priv->rect_w_units_label = glade_xml_get_widget (gui, "rect_w_units_label"); + dialog->priv->rect_h_units_label = glade_xml_get_widget (gui, "rect_h_units_label"); + dialog->priv->rect_r_units_label = glade_xml_get_widget (gui, "rect_r_units_label"); + dialog->priv->rect_x_waste_units_label = glade_xml_get_widget (gui, "rect_x_waste_units_label"); + dialog->priv->rect_y_waste_units_label = glade_xml_get_widget (gui, "rect_y_waste_units_label"); + dialog->priv->rect_margin_units_label = glade_xml_get_widget (gui, "rect_margin_units_label"); + + g_object_unref (gui); + + + gtk_assistant_append_page (GTK_ASSISTANT (dialog), + dialog->priv->rect_size_page); + + gtk_assistant_set_page_title (GTK_ASSISTANT (dialog), + dialog->priv->rect_size_page, + _("Label or Card Size")); + gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog), + dialog->priv->rect_size_page, + logo); + gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), + dialog->priv->rect_size_page, + TRUE); + + /* Initialize illustration. */ + pixbuf = gdk_pixbuf_new_from_file (EX_RECT_IMAGE, NULL); + gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->rect_image), pixbuf); + + /* Apply units to spinbuttons and units labels. */ + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->rect_w_units_label), + dialog->priv->units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->rect_h_units_label), + dialog->priv->units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->rect_r_units_label), + dialog->priv->units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->rect_x_waste_units_label), + dialog->priv->units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->rect_y_waste_units_label), + dialog->priv->units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->rect_margin_units_label), + dialog->priv->units_string); + + /* Load some realistic defaults. */ + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin), + DEFAULT_RECT_W * dialog->priv->units_per_point); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin), + DEFAULT_RECT_H * dialog->priv->units_per_point); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin), + DEFAULT_RECT_R * dialog->priv->units_per_point); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin), + DEFAULT_RECT_WASTE * dialog->priv->units_per_point); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin), + DEFAULT_RECT_WASTE * dialog->priv->units_per_point); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin), + DEFAULT_MARGIN * dialog->priv->units_per_point); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Construct round size page. */ +/*--------------------------------------------------------------------------*/ +static void +construct_round_size_page (glTemplateDesigner *dialog, + GdkPixbuf *logo) +{ + GladeXML *gui; + GdkPixbuf *pixbuf; + + gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade", + "round_size_page", NULL); + if (!gui) + { + g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!"); + return; + } + + dialog->priv->round_size_page = glade_xml_get_widget (gui, "round_size_page"); + dialog->priv->round_image = glade_xml_get_widget (gui, "round_image"); + dialog->priv->round_r_spin = glade_xml_get_widget (gui, "round_r_spin"); + dialog->priv->round_waste_spin = glade_xml_get_widget (gui, "round_waste_spin"); + dialog->priv->round_margin_spin = glade_xml_get_widget (gui, "round_margin_spin"); + dialog->priv->round_r_units_label = glade_xml_get_widget (gui, "round_r_units_label"); + dialog->priv->round_waste_units_label = glade_xml_get_widget (gui, "round_waste_units_label"); + dialog->priv->round_margin_units_label = glade_xml_get_widget (gui, "round_margin_units_label"); + + g_object_unref (gui); + + + gtk_assistant_append_page (GTK_ASSISTANT (dialog), + dialog->priv->round_size_page); + + gtk_assistant_set_page_title (GTK_ASSISTANT (dialog), + dialog->priv->round_size_page, + _("Label Size (round)")); + gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog), + dialog->priv->round_size_page, + logo); + gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), + dialog->priv->round_size_page, + TRUE); + + /* Initialize illustration. */ + pixbuf = gdk_pixbuf_new_from_file (EX_ROUND_IMAGE, NULL); + gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->round_image), pixbuf); + + /* Apply units to spinbuttons and units labels. */ + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_r_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_r_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->round_r_units_label), + dialog->priv->units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->round_waste_units_label), + dialog->priv->units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->round_margin_units_label), + dialog->priv->units_string); + + /* Load some realistic defaults. */ + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin), + DEFAULT_ROUND_R * dialog->priv->units_per_point); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin), + DEFAULT_ROUND_WASTE * dialog->priv->units_per_point); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin), + DEFAULT_MARGIN * dialog->priv->units_per_point); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Construct CD/DVD size page. */ +/*--------------------------------------------------------------------------*/ +static void +construct_cd_size_page (glTemplateDesigner *dialog, + GdkPixbuf *logo) +{ + GladeXML *gui; + GdkPixbuf *pixbuf; + + gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade", + "cd_size_page", NULL); + if (!gui) + { + g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!"); + return; + } + + dialog->priv->cd_size_page = glade_xml_get_widget (gui, "cd_size_page"); + dialog->priv->cd_image = glade_xml_get_widget (gui, "cd_image"); + dialog->priv->cd_radius_spin = glade_xml_get_widget (gui, "cd_radius_spin"); + dialog->priv->cd_hole_spin = glade_xml_get_widget (gui, "cd_hole_spin"); + dialog->priv->cd_w_spin = glade_xml_get_widget (gui, "cd_w_spin"); + dialog->priv->cd_h_spin = glade_xml_get_widget (gui, "cd_h_spin"); + dialog->priv->cd_waste_spin = glade_xml_get_widget (gui, "cd_waste_spin"); + dialog->priv->cd_margin_spin = glade_xml_get_widget (gui, "cd_margin_spin"); + dialog->priv->cd_radius_units_label = glade_xml_get_widget (gui, "cd_radius_units_label"); + dialog->priv->cd_hole_units_label = glade_xml_get_widget (gui, "cd_hole_units_label"); + dialog->priv->cd_w_units_label = glade_xml_get_widget (gui, "cd_w_units_label"); + dialog->priv->cd_h_units_label = glade_xml_get_widget (gui, "cd_h_units_label"); + dialog->priv->cd_waste_units_label = glade_xml_get_widget (gui, "cd_waste_units_label"); + dialog->priv->cd_margin_units_label = glade_xml_get_widget (gui, "cd_margin_units_label"); + + g_object_unref (gui); + + + gtk_assistant_append_page (GTK_ASSISTANT (dialog), + dialog->priv->cd_size_page); + + gtk_assistant_set_page_title (GTK_ASSISTANT (dialog), + dialog->priv->cd_size_page, + _("Label Size (CD/DVD)")); + gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog), + dialog->priv->cd_size_page, + logo); + gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), + dialog->priv->cd_size_page, + TRUE); + + /* Initialize illustration. */ + pixbuf = gdk_pixbuf_new_from_file (EX_CD_IMAGE, NULL); + gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->cd_image), pixbuf); + + /* Apply units to spinbuttons and units labels. */ + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->cd_radius_units_label), + dialog->priv->units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->cd_hole_units_label), + dialog->priv->units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->cd_w_units_label), + dialog->priv->units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->cd_h_units_label), + dialog->priv->units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->cd_waste_units_label), + dialog->priv->units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->cd_margin_units_label), + dialog->priv->units_string); + + /* Load some realistic defaults. */ + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin), + DEFAULT_CD_RADIUS * dialog->priv->units_per_point); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin), + DEFAULT_CD_HOLE * dialog->priv->units_per_point); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin), + DEFAULT_CD_WASTE * dialog->priv->units_per_point); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin), + DEFAULT_MARGIN * dialog->priv->units_per_point); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Construct number of layouts page. */ +/*--------------------------------------------------------------------------*/ +static void +construct_nlayouts_page (glTemplateDesigner *dialog, + GdkPixbuf *logo) +{ + GladeXML *gui; + GdkPixbuf *pixbuf; + + gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade", + "nlayouts_page", NULL); + if (!gui) + { + g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!"); + return; + } + + dialog->priv->nlayouts_page = glade_xml_get_widget (gui, "nlayouts_page"); + dialog->priv->nlayouts_image1 = glade_xml_get_widget (gui, "nlayouts_image1"); + dialog->priv->nlayouts_image2 = glade_xml_get_widget (gui, "nlayouts_image2"); + dialog->priv->nlayouts_spin = glade_xml_get_widget (gui, "nlayouts_spin"); + + g_object_unref (gui); + + + gtk_assistant_append_page (GTK_ASSISTANT (dialog), + dialog->priv->nlayouts_page); + + gtk_assistant_set_page_title (GTK_ASSISTANT (dialog), + dialog->priv->nlayouts_page, + _("Number of Layouts")); + gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog), + dialog->priv->nlayouts_page, + logo); + gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), + dialog->priv->nlayouts_page, + TRUE); + + /* Initialize illustrations. */ + pixbuf = gdk_pixbuf_new_from_file (EX_NLAYOUTS_IMAGE1, NULL); + gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->nlayouts_image1), pixbuf); + pixbuf = gdk_pixbuf_new_from_file (EX_NLAYOUTS_IMAGE2, NULL); + gtk_image_set_from_pixbuf (GTK_IMAGE(dialog->priv->nlayouts_image2), pixbuf); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Construct layout page. */ +/*--------------------------------------------------------------------------*/ +static void +construct_layout_page (glTemplateDesigner *dialog, + GdkPixbuf *logo) +{ + GladeXML *gui; + + gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade", + "layout_page", NULL); + if (!gui) + { + g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!"); + return; + } + + dialog->priv->layout_page = glade_xml_get_widget (gui, "layout_page"); + dialog->priv->layout1_head_label = glade_xml_get_widget (gui, "layout1_head_label"); + dialog->priv->layout1_nx_spin = glade_xml_get_widget (gui, "layout1_nx_spin"); + dialog->priv->layout1_ny_spin = glade_xml_get_widget (gui, "layout1_ny_spin"); + dialog->priv->layout1_x0_spin = glade_xml_get_widget (gui, "layout1_x0_spin"); + dialog->priv->layout1_y0_spin = glade_xml_get_widget (gui, "layout1_y0_spin"); + dialog->priv->layout1_dx_spin = glade_xml_get_widget (gui, "layout1_dx_spin"); + dialog->priv->layout1_dy_spin = glade_xml_get_widget (gui, "layout1_dy_spin"); + dialog->priv->layout2_head_label = glade_xml_get_widget (gui, "layout2_head_label"); + dialog->priv->layout2_nx_spin = glade_xml_get_widget (gui, "layout2_nx_spin"); + dialog->priv->layout2_ny_spin = glade_xml_get_widget (gui, "layout2_ny_spin"); + dialog->priv->layout2_x0_spin = glade_xml_get_widget (gui, "layout2_x0_spin"); + dialog->priv->layout2_y0_spin = glade_xml_get_widget (gui, "layout2_y0_spin"); + dialog->priv->layout2_dx_spin = glade_xml_get_widget (gui, "layout2_dx_spin"); + dialog->priv->layout2_dy_spin = glade_xml_get_widget (gui, "layout2_dy_spin"); + dialog->priv->layout_x0_units_label = glade_xml_get_widget (gui, "layout_x0_units_label"); + dialog->priv->layout_y0_units_label = glade_xml_get_widget (gui, "layout_y0_units_label"); + dialog->priv->layout_dx_units_label = glade_xml_get_widget (gui, "layout_dx_units_label"); + dialog->priv->layout_dy_units_label = glade_xml_get_widget (gui, "layout_dy_units_label"); + dialog->priv->layout_mini_preview = glade_xml_get_widget (gui, "layout_mini_preview"); + dialog->priv->layout_test_button = glade_xml_get_widget (gui, "layout_test_button"); + + g_object_unref (gui); + + + gtk_assistant_append_page (GTK_ASSISTANT (dialog), + dialog->priv->layout_page); + + gtk_assistant_set_page_title (GTK_ASSISTANT (dialog), + dialog->priv->layout_page, + _("Layout(s)")); + gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog), + dialog->priv->layout_page, + logo); + gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), + dialog->priv->layout_page, + TRUE); + + /* Apply units to spinbuttons and units labels. */ + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->layout_x0_units_label), + dialog->priv->units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->layout_y0_units_label), + dialog->priv->units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->layout_dx_units_label), + dialog->priv->units_string); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin), + dialog->priv->digits); + gtk_spin_button_set_increments (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin), + dialog->priv->climb_rate, 10.0*dialog->priv->climb_rate); + gtk_label_set_text (GTK_LABEL(dialog->priv->layout_dy_units_label), + dialog->priv->units_string); + + /* Connect a handler that listens for changes in these widgets */ + /* This controls sensitivity of related widgets. */ + g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_nx_spin), "changed", + G_CALLBACK(layout_page_changed_cb), dialog); + g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_ny_spin), "changed", + G_CALLBACK(layout_page_changed_cb), dialog); + g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_x0_spin), "changed", + G_CALLBACK(layout_page_changed_cb), dialog); + g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_y0_spin), "changed", + G_CALLBACK(layout_page_changed_cb), dialog); + g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_dx_spin), "changed", + G_CALLBACK(layout_page_changed_cb), dialog); + g_signal_connect_swapped (G_OBJECT(dialog->priv->layout1_dy_spin), "changed", + G_CALLBACK(layout_page_changed_cb), dialog); + g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_nx_spin), "changed", + G_CALLBACK(layout_page_changed_cb), dialog); + g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_ny_spin), "changed", + G_CALLBACK(layout_page_changed_cb), dialog); + g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_x0_spin), "changed", + G_CALLBACK(layout_page_changed_cb), dialog); + g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_y0_spin), "changed", + G_CALLBACK(layout_page_changed_cb), dialog); + g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_dx_spin), "changed", + G_CALLBACK(layout_page_changed_cb), dialog); + g_signal_connect_swapped (G_OBJECT(dialog->priv->layout2_dy_spin), "changed", + G_CALLBACK(layout_page_changed_cb), dialog); + + + /* Print button */ + g_signal_connect_swapped (G_OBJECT(dialog->priv->layout_test_button), "clicked", + G_CALLBACK(print_test_cb), dialog); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Construct finish page. */ +/*--------------------------------------------------------------------------*/ +static void +construct_finish_page (glTemplateDesigner *dialog, + GdkPixbuf *logo) +{ + GladeXML *gui; + + gui = glade_xml_new (GLABELS_GLADE_DIR "template-designer.glade", + "finish_page", NULL); + if (!gui) + { + g_critical ("Could not open template-designer.glade. gLabels may not be installed correctly!"); + return; + } + + dialog->priv->finish_page = glade_xml_get_widget (gui, "finish_page"); + + g_object_unref (gui); + + + gtk_assistant_append_page (GTK_ASSISTANT (dialog), + dialog->priv->finish_page); + + gtk_assistant_set_page_title (GTK_ASSISTANT (dialog), + dialog->priv->finish_page, + _("Design Completed")); + gtk_assistant_set_page_header_image (GTK_ASSISTANT (dialog), + dialog->priv->finish_page, + logo); + gtk_assistant_set_page_type (GTK_ASSISTANT (dialog), + dialog->priv->finish_page, + GTK_ASSISTANT_PAGE_CONFIRM); + gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), + dialog->priv->finish_page, + TRUE); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. cancel callback. */ +/*--------------------------------------------------------------------------*/ +static void +cancel_cb (glTemplateDesigner *dialog) +{ + + gtk_widget_destroy (GTK_WIDGET(dialog)); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. apply callback */ +/*--------------------------------------------------------------------------*/ +static void +apply_cb (glTemplateDesigner *dialog) +{ + lglTemplate *template; + gchar *name; + + template = build_template (dialog); + lgl_db_register_template (template); + name = lgl_template_get_name (template); + gl_mini_preview_pixbuf_cache_add_by_name (name); + g_free (name); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. close callback */ +/*--------------------------------------------------------------------------*/ +static void +close_cb (glTemplateDesigner *dialog) +{ + + gtk_widget_destroy (GTK_WIDGET(dialog)); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. prepare page callback */ +/*--------------------------------------------------------------------------*/ +static void +prepare_cb (glTemplateDesigner *dialog, + GtkWidget *page) +{ + gint page_num; + + page_num = gtk_assistant_get_current_page (GTK_ASSISTANT (dialog)); + + switch (page_num) + { + + case NAME_PAGE_NUM: + name_page_changed_cb (dialog); /* Use to prepare */ + break; + + case PG_SIZE_PAGE_NUM: + pg_size_page_changed_cb (dialog); /* Use to prepare */ + break; + + case RECT_SIZE_PAGE_NUM: + rect_size_page_prepare_cb (dialog); + break; + + case ROUND_SIZE_PAGE_NUM: + round_size_page_prepare_cb (dialog); + break; + + case CD_SIZE_PAGE_NUM: + cd_size_page_prepare_cb (dialog); + break; + + case LAYOUT_PAGE_NUM: + layout_page_prepare_cb (dialog); + break; + + default: + /* No preparation needed */ + break; + + } +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Handle non-linear forward traversal. */ +/*--------------------------------------------------------------------------*/ +static gint +forward_page_function (gint current_page, + gpointer data) +{ + glTemplateDesigner *dialog = GL_TEMPLATE_DESIGNER (data); + + switch (current_page) + { + case START_PAGE_NUM: + return NAME_PAGE_NUM; + + case NAME_PAGE_NUM: + return PG_SIZE_PAGE_NUM; + + case PG_SIZE_PAGE_NUM: + return SHAPE_PAGE_NUM; + + case SHAPE_PAGE_NUM: + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) { + return RECT_SIZE_PAGE_NUM; + } + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) { + return ROUND_SIZE_PAGE_NUM; + } + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) { + return CD_SIZE_PAGE_NUM; + } + break; + + case RECT_SIZE_PAGE_NUM: + case ROUND_SIZE_PAGE_NUM: + case CD_SIZE_PAGE_NUM: + return NLAYOUTS_PAGE_NUM; + + case NLAYOUTS_PAGE_NUM: + return LAYOUT_PAGE_NUM; + + case LAYOUT_PAGE_NUM: + return FINISH_PAGE_NUM; + + case FINISH_PAGE_NUM: + default: + return -1; + } + + return -1; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Widget on name page "changed" callback. */ +/*--------------------------------------------------------------------------*/ +static void +name_page_changed_cb (glTemplateDesigner *dialog) +{ + gchar *brand, *part_num, *desc; + + brand = g_strstrip (gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->brand_entry), 0, -1)); + part_num = g_strstrip (gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->part_num_entry), 0, -1)); + desc = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->description_entry), 0, -1); + + + if (brand && brand[0] && part_num && part_num[0] && + lgl_db_does_template_exist (brand, part_num)) + { + gtk_image_set_from_stock (GTK_IMAGE (dialog->priv->name_warning_image), + GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_BUTTON); + gtk_label_set_markup (GTK_LABEL (dialog->priv->name_warning_label), + _("Brand and part# match an existing template!")); + } + else + { + gtk_image_clear (GTK_IMAGE (dialog->priv->name_warning_image)); + gtk_label_set_text (GTK_LABEL (dialog->priv->name_warning_label), ""); + } + + if (brand && brand[0] && part_num && part_num[0] && desc && desc[0] && + !lgl_db_does_template_exist (brand, part_num)) + { + + gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), + dialog->priv->name_page, + TRUE); + } + else + { + + gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), + dialog->priv->name_page, + FALSE); + } + + g_free (brand); + g_free (part_num); + g_free (desc); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Widget on page size page "changed" callback. */ +/*--------------------------------------------------------------------------*/ +static void +pg_size_page_changed_cb (glTemplateDesigner *dialog) +{ + gchar *page_size_name; + lglPaper *paper; + + + page_size_name = + gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo)); + + if (page_size_name && strlen(page_size_name)) { + + paper = lgl_db_lookup_paper_from_name (page_size_name); + + + if ( g_strcasecmp (paper->id, "Other") == 0 ) { + gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_spin), TRUE); + gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_spin), TRUE); + gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_units_label), + TRUE); + gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_units_label), + TRUE); + + } else { + gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_spin), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_spin), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_w_units_label), + FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(dialog->priv->pg_h_units_label), + FALSE); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin), + paper->width * dialog->priv->units_per_point); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin), + paper->height * dialog->priv->units_per_point); + } + + lgl_paper_free (paper); + } + + g_free (page_size_name); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Prepare rectangular size page. */ +/*--------------------------------------------------------------------------*/ +static void +rect_size_page_prepare_cb (glTemplateDesigner *dialog) +{ + gdouble max_w, max_h; + gdouble w, h, r, x_waste, y_waste, margin; + + /* Limit label size based on already chosen page size. */ + max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin)); + max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin)); + + w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin)); + h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin)); + r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin)); + x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin)); + y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin)); + margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin)); + + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_w_spin), + dialog->priv->climb_rate, max_w); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_h_spin), + dialog->priv->climb_rate, max_h); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_r_spin), + 0.0, MIN(max_w, max_h)/2.0); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_x_waste_spin), + 0.0, MIN(max_w, max_h)/4.0); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_y_waste_spin), + 0.0, MIN(max_w, max_h)/4.0); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->rect_margin_spin), + 0.0, MIN(max_w, max_h)/4.0); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin), w); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin), h); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin), r); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin), x_waste); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin), y_waste); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin), margin); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Prepare round size page. */ +/*--------------------------------------------------------------------------*/ +static void +round_size_page_prepare_cb (glTemplateDesigner *dialog) +{ + gdouble max_w, max_h; + gdouble r, waste, margin; + + /* Limit label size based on already chosen page size. */ + max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin)); + max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin)); + + r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin)); + waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin)); + margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin)); + + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_r_spin), + dialog->priv->climb_rate, MIN(max_w, max_h)/2.0); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_waste_spin), + 0.0, MIN(max_w, max_h)/4.0); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->round_margin_spin), + 0.0, MIN(max_w, max_h)/4.0); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin), r); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin), waste); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin), margin); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Prepare cd/dvd size page. */ +/*--------------------------------------------------------------------------*/ +static void +cd_size_page_prepare_cb (glTemplateDesigner *dialog) +{ + gdouble max_w, max_h; + gdouble radius, hole, w, h, waste, margin; + + /* Limit label size based on already chosen page size. */ + max_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin)); + max_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin)); + + radius = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin)); + hole = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin)); + w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin)); + h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin)); + waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin)); + margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin)); + + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_radius_spin), + dialog->priv->climb_rate, MIN(max_w, max_h)/2.0); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_hole_spin), + dialog->priv->climb_rate, MIN(max_w, max_h)/2.0); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_w_spin), + 0.0, max_w); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_h_spin), + 0.0, max_h); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_waste_spin), + 0.0, MIN(max_w, max_h)/4.0); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->cd_margin_spin), + 0.0, MIN(max_w, max_h)/4.0); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin), radius); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin), hole); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin), w); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin), h); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin), waste); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin), margin); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Prepare Layout page cb. */ +/*--------------------------------------------------------------------------*/ +static void +layout_page_prepare_cb (glTemplateDesigner *dialog) +{ + gdouble page_w, page_h; + gdouble w=0, h=0, x_waste=0, y_waste=0; + gint max_nx, max_ny; + gint nlayouts; + gdouble nx_1, ny_1, x0_1, y0_1, dx_1, dy_1; + gdouble nx_2, ny_2, x0_2, y0_2, dx_2, dy_2; + lglTemplate *template; + + if (dialog->priv->stop_signals) return; + dialog->priv->stop_signals = TRUE; + + + /* Limit ranges based on already chosen page and label sizes. */ + page_w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin)); + page_h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin)); + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) { + w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin)); + h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin)); + x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin)); + y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin)); + } + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) { + w = 2*gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin)); + h = w; + x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin)); + y_waste = x_waste; + } + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) { + w = 2*gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin)); + h = w; + x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin)); + y_waste = x_waste; + } + max_nx = MAX (floor (page_w/(w + 2*x_waste) + DELTA), 1.0); + max_ny = MAX (floor (page_h/(h + 2*y_waste) + DELTA), 1.0); + + nx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin)); + ny_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin)); + x0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin)); + y0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin)); + dx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin)); + dy_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin)); + nx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin)); + ny_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin)); + x0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin)); + y0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin)); + dx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin)); + dy_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin)); + + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_nx_spin), + 1, max_nx); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_ny_spin), + 1, max_ny); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_x0_spin), + x_waste, page_w - w - x_waste); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_y0_spin), + y_waste, page_h - h - y_waste); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_dx_spin), + w + 2*x_waste, page_w - w - 2*x_waste); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout1_dy_spin), + h + 2*y_waste, page_h - h - 2*y_waste); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_nx_spin), + 1, max_nx); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_ny_spin), + 1, max_ny); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_x0_spin), + x_waste, page_w - w - x_waste); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_y0_spin), + y_waste, page_h - h - y_waste); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_dx_spin), + w + 2*x_waste, page_w - w - 2*x_waste); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (dialog->priv->layout2_dy_spin), + h + 2*y_waste, page_h - h - 2*y_waste); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin), nx_1); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin), ny_1); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin), x0_1); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin), y0_1); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin), dx_1); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin), dy_1); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin), nx_2); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin), ny_2); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin), x0_2); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin), y0_2); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin), dx_2); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin), dy_2); + + /* Set visibility of layout2 widgets as appropriate. */ + nlayouts = gtk_spin_button_get_value (GTK_SPIN_BUTTON (dialog->priv->nlayouts_spin)); + if ( nlayouts == 1 ) + { + gtk_widget_hide (dialog->priv->layout1_head_label); + gtk_widget_hide (dialog->priv->layout2_head_label); + gtk_widget_hide (dialog->priv->layout2_nx_spin); + gtk_widget_hide (dialog->priv->layout2_ny_spin); + gtk_widget_hide (dialog->priv->layout2_x0_spin); + gtk_widget_hide (dialog->priv->layout2_y0_spin); + gtk_widget_hide (dialog->priv->layout2_dx_spin); + gtk_widget_hide (dialog->priv->layout2_dy_spin); + } + else + { + gtk_widget_show (dialog->priv->layout1_head_label); + gtk_widget_show (dialog->priv->layout2_head_label); + gtk_widget_show (dialog->priv->layout2_nx_spin); + gtk_widget_show (dialog->priv->layout2_ny_spin); + gtk_widget_show (dialog->priv->layout2_x0_spin); + gtk_widget_show (dialog->priv->layout2_y0_spin); + gtk_widget_show (dialog->priv->layout2_dx_spin); + gtk_widget_show (dialog->priv->layout2_dy_spin); + } + + template = build_template (dialog); + gl_wdgt_mini_preview_set_template (GL_WDGT_MINI_PREVIEW(dialog->priv->layout_mini_preview), + template); + lgl_template_free (template); + + + dialog->priv->stop_signals = FALSE; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Layout page widget changed cb. */ +/*--------------------------------------------------------------------------*/ +static void +layout_page_changed_cb (glTemplateDesigner *dialog) +{ + lglTemplate *template; + + if (dialog->priv->stop_signals) return; + dialog->priv->stop_signals = TRUE; + + template = build_template (dialog); + + gl_wdgt_mini_preview_set_template (GL_WDGT_MINI_PREVIEW(dialog->priv->layout_mini_preview), + template); + + lgl_template_free (template); + + dialog->priv->stop_signals = FALSE; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Print test sheet callback. */ +/*--------------------------------------------------------------------------*/ +static void +print_test_cb (glTemplateDesigner *dialog) +{ + GObject *label; + lglTemplate *template; + glPrintOp *print_op; + + label = gl_label_new (); + + template = build_template (dialog); + gl_label_set_template (GL_LABEL(label), template); + + print_op = gl_print_op_new (GL_LABEL(label)); + gl_print_op_force_outline_flag (print_op); + gtk_print_operation_run (GTK_PRINT_OPERATION (print_op), + GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, + GTK_WINDOW (dialog), + NULL); + + lgl_template_free (template); + g_object_unref (G_OBJECT(label)); +} + +/*--------------------------------------------------------------------------*/ +/* Build a template based on current assistant settings. */ +/*--------------------------------------------------------------------------*/ +static lglTemplate * +build_template (glTemplateDesigner *dialog) +{ + gdouble upp; + gchar *brand, *part_num, *desc; + gchar *page_size_name; + lglPaper *paper; + lglTemplateFrameShape shape; + lglTemplateFrame *frame=NULL; + gdouble w=0, h=0, r=0, radius=0, hole=0, waste=0, x_waste=0, y_waste=0, margin=0; + gint nlayouts; + gdouble nx_1, ny_1, x0_1, y0_1, dx_1, dy_1; + gdouble nx_2, ny_2, x0_2, y0_2, dx_2, dy_2; + lglTemplate *template; + + upp = dialog->priv->units_per_point; + + brand = g_strstrip (gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->brand_entry), 0, -1)); + part_num = g_strstrip (gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->part_num_entry), 0, -1)); + desc = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->description_entry), 0, -1); + + page_size_name = + gtk_combo_box_get_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo)); + paper = lgl_db_lookup_paper_from_name (page_size_name); + if ( g_strcasecmp (paper->id, "Other") == 0 ) { + paper->width = + gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin)) + / upp; + paper->height = + gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin)) + / upp; + } + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_rect_radio))) { + shape = LGL_TEMPLATE_FRAME_SHAPE_RECT; + w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin)); + h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin)); + r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin)); + x_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin)); + y_waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin)); + margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin)); + } + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_round_radio))) { + shape = LGL_TEMPLATE_FRAME_SHAPE_ROUND; + r = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin)); + waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin)); + margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin)); + } + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->priv->shape_cd_radio))) { + shape = LGL_TEMPLATE_FRAME_SHAPE_CD; + radius = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin)); + hole = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin)); + w = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin)); + h = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin)); + waste = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_waste_spin)); + margin = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin)); + } + + nlayouts = gtk_spin_button_get_value (GTK_SPIN_BUTTON (dialog->priv->nlayouts_spin)); + nx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin)); + ny_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin)); + x0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin)); + y0_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin)); + dx_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin)); + dy_1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin)); + nx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin)); + ny_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin)); + x0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin)); + y0_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin)); + dx_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin)); + dy_2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin)); + + + template = lgl_template_new (brand, part_num, desc, paper->id, paper->width, paper->height); + + switch (shape) { + case LGL_TEMPLATE_FRAME_SHAPE_RECT: + frame = lgl_template_frame_rect_new ("0", + w/upp, h/upp, r/upp, + x_waste/upp, y_waste/upp); + break; + case LGL_TEMPLATE_FRAME_SHAPE_ROUND: + frame = lgl_template_frame_round_new ("0", r/upp, waste/upp); + break; + case LGL_TEMPLATE_FRAME_SHAPE_CD: + frame = lgl_template_frame_cd_new ("0", + radius/upp, hole/upp, + w/upp, h/upp, + waste/upp); + break; + } + lgl_template_add_frame (template, frame); + + lgl_template_frame_add_markup (frame, + lgl_template_markup_margin_new (margin/upp)); + + lgl_template_frame_add_layout (frame, + lgl_template_layout_new (nx_1, ny_1, + x0_1/upp, + y0_1/upp, + dx_1/upp, + dy_1/upp)); + if (nlayouts > 1) { + lgl_template_frame_add_layout (frame, + lgl_template_layout_new (nx_2, ny_2, + x0_2/upp, + y0_2/upp, + dx_2/upp, + dy_2/upp)); + } + + g_free (brand); + g_free (part_num); + g_free (desc); + + g_free (page_size_name); + lgl_paper_free (paper); + + return template; +} + +/*****************************************************************************/ +/* Construct mini preview widget. */ +/*****************************************************************************/ +GtkWidget * +gl_template_designer_construct_mini_preview (gchar *name, + gchar *string1, + gchar *string2, + gint int1, + gint int2) +{ + gint width = int1; + gint height = int2; + + return gl_wdgt_mini_preview_new (height, width); +} + diff --git a/glabels2/src/template-designer.h b/glabels2/src/template-designer.h new file mode 100644 index 00000000..bf5086ae --- /dev/null +++ b/glabels2/src/template-designer.h @@ -0,0 +1,73 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * template-designer.h: Template designer module header file + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __TEMPLATE_DESIGNER_H__ +#define __TEMPLATE_DESIGNER_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GL_TYPE_TEMPLATE_DESIGNER (gl_template_designer_get_type ()) +#define GL_TEMPLATE_DESIGNER(obj) (GTK_CHECK_CAST ((obj), GL_TYPE_TEMPLATE_DESIGNER, glTemplateDesigner)) +#define GL_TEMPLATE_DESIGNER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GL_TYPE_TEMPLATE_DESIGNER, glTemplateDesignerClass)) +#define GL_IS_TEMPLATE_DESIGNER(obj) (GTK_CHECK_TYPE ((obj), GL_TYPE_TEMPLATE_DESIGNER)) +#define GL_IS_TEMPLATE_DESIGNER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GL_TYPE_TEMPLATE_DESIGNER)) +#define GL_TEMPLATE_DESIGNER_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), GL_TYPE_TEMPLATE_DESIGNER, glTemplateDesignerClass)) + + +typedef struct _glTemplateDesigner glTemplateDesigner; +typedef struct _glTemplateDesignerClass glTemplateDesignerClass; + +typedef struct _glTemplateDesignerPrivate glTemplateDesignerPrivate; + +struct _glTemplateDesigner +{ + GtkAssistant parent_instance; + + glTemplateDesignerPrivate *priv; + +}; + +struct _glTemplateDesignerClass +{ + GtkAssistantClass parent_class; +}; + +GType gl_template_designer_get_type (void) G_GNUC_CONST; + +GtkWidget *gl_template_designer_new (GtkWindow *parent); + +/* Semi-public, for use by libglade: */ +GtkWidget *gl_template_designer_construct_mini_preview (gchar *name, + gchar *string1, + gchar *string2, + gint int1, + gint int2); + + +G_END_DECLS + +#endif /* __TEMPLATE_DESIGNER_H__ */ diff --git a/glabels2/src/text-node.c b/glabels2/src/text-node.c new file mode 100644 index 00000000..7a77fbd6 --- /dev/null +++ b/glabels2/src/text-node.c @@ -0,0 +1,356 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * text_node.c: text node module + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "text-node.h" + +#include + +#include "merge.h" + +#include "debug.h" + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static glTextNode *extract_text_node (gchar *text, + gint *n); + +static gboolean is_empty_field (glTextNode *text_node, + glMergeRecord *record); + + +/****************************************************************************/ +/* Expand single node into representative string. */ +/****************************************************************************/ +gchar * +gl_text_node_expand (glTextNode *text_node, + glMergeRecord *record) +{ + gchar *text; + + if (text_node->field_flag) { + if (record == NULL) { + return g_strdup_printf ("${%s}", text_node->data); + } else { + text = gl_merge_eval_key (record, text_node->data); + if (text != NULL) { + return text; + } else { + return g_strdup_printf ("%s", ""); + } + } + } else { + return g_strdup (text_node->data); + } +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Is node a field that evaluates empty? */ +/*--------------------------------------------------------------------------*/ +static gboolean +is_empty_field (glTextNode *text_node, + glMergeRecord *record) +{ + gchar *text; + gboolean ret = FALSE; + + if ( (record != NULL) && text_node->field_flag) { + text = gl_merge_eval_key (record, text_node->data); + if ( (text == NULL) || (text[0] == 0) ) { + ret = TRUE; + } + g_free (text); + } + + return ret; +} + +/****************************************************************************/ +/* Create a single text node from given text. */ +/****************************************************************************/ +glTextNode * +gl_text_node_new_from_text (gchar *text) +{ + gint n; + + return extract_text_node (text, &n); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Create a single text node from given text. n = characters used */ +/*--------------------------------------------------------------------------*/ +static glTextNode * +extract_text_node (gchar *text, + gint *n) +{ + glTextNode *text_node; + gchar *p; + gint m; + + text_node = g_new0 (glTextNode, 1); + + if (strncmp (text, "${", strlen ("${")) == 0) { + /* We are at the beginning of a "FIELD" node */ + text_node->field_flag = TRUE; + *n = strlen ("${"); + text += *n; + for (p = text, m = 0; *p != 0; p++, m++, (*n)++) { + if (*p == '}') { + (*n)++; + break; + } + } + text_node->data = g_strndup (text, m); + } else { + /* We are at the beginning of a literal node */ + text_node->field_flag = FALSE; + for (p = text, *n = 0; *p != 0; p++, (*n)++) { + if (strncmp (p, "${", strlen ("${")) == 0) + break; + if (*p == '\n') + break; + } + text_node->data = g_strndup (text, *n); + } + + return text_node; +} + +/****************************************************************************/ +/* Copy a single text node. */ +/****************************************************************************/ +glTextNode * +gl_text_node_dup (glTextNode *src) +{ + glTextNode *dst; + + if ( src == NULL ) return NULL; + + dst = g_new0 (glTextNode, 1); + + dst->field_flag = src->field_flag; + dst->data = g_strdup (src->data); + + return dst; +} + +/****************************************************************************/ +/* Free a single text node. */ +/****************************************************************************/ +void +gl_text_node_free (glTextNode **text_node) +{ + if ( *text_node == NULL ) return; + + g_free ((*text_node)->data); + (*text_node)->data = NULL; + g_free (*text_node); + *text_node = NULL; +} + +/****************************************************************************/ +/* Compare 2 text nodes for equality. */ +/****************************************************************************/ +gboolean +gl_text_node_equal (glTextNode *text_node1, + glTextNode *text_node2) +{ + /* First take care of the case of either or both being NULL. */ + if ( text_node1 == NULL ) { + return ( text_node2 == NULL ); + } else { + if ( text_node2 == NULL ) { + return FALSE; + } + } + + /* Bail if field flags differ. */ + if ( text_node1->field_flag != text_node2->field_flag ) { + return FALSE; + } + + /* Now take care of the case of either or both data fields being NULL. */ + if ( text_node1->data == NULL ) { + return ( text_node2->data == NULL ); + } else { + if ( text_node2->data == NULL ) { + return FALSE; + } + } + + /* Field flags are identical, so now compare the data. */ + return (strcmp (text_node1->data, text_node2->data) == 0); +} + +/****************************************************************************/ +/* Expand text lines into single string. */ +/****************************************************************************/ +gchar * +gl_text_node_lines_expand (GList *lines, + glMergeRecord *record) +{ + GList *p_line, *p_node; + glTextNode *text_node; + gchar *text, *old_text, *expanded_node; + + text = g_strdup (""); /* prime pointer for concatenation */ + for (p_line = lines; p_line != NULL; p_line = p_line->next) { + + /* special case: something like ${ADDRESS2} = "" on line by itself. */ + /* in such circumstances ignore the line completely. */ + p_node = (GList *)p_line->data; + if (p_node && p_node->next == NULL) { + text_node = (glTextNode *) p_node->data; + if ( is_empty_field (text_node, record) ) { + continue; + } + } + + /* expand each node */ + for (p_node = (GList *) p_line->data; p_node != NULL; + p_node = p_node->next) { + text_node = (glTextNode *) p_node->data; + old_text = text; + expanded_node = gl_text_node_expand (text_node, record); + text = g_strconcat (text, expanded_node, NULL); + g_free (old_text); + g_free (expanded_node); + } + + /* append newline to each line, except last. */ + if ( p_line->next != NULL ) { + old_text = text; + text = g_strconcat (text, "\n", NULL); + g_free (old_text); + } + } + + return text; +} + +/****************************************************************************/ +/* Parse a string back into text lines. */ +/****************************************************************************/ +GList * +gl_text_node_lines_new_from_text (gchar *text) +{ + GList *lines, *nodes; + glTextNode *text_node; + gchar *p; + gint n; + + lines = NULL; + nodes = NULL; + for (p = text; *p != 0; p += n) { + if (*p != '\n') { + text_node = extract_text_node (p, &n); + nodes = g_list_append (nodes, text_node); + } else { + n = 1; + lines = g_list_append (lines, nodes); + nodes = NULL; + } + } + if (*(p - 1) != '\n') { + lines = g_list_append (lines, nodes); + } + + return lines; +} + +/****************************************************************************/ +/* Copy a list of text lines. */ +/****************************************************************************/ +GList * +gl_text_node_lines_dup (GList *src_lines) +{ + GList *dst_lines=NULL; + GList *p_line, *line, *p_node; + glTextNode *node; + + for (p_line = src_lines; p_line != NULL; p_line = p_line->next) + { + line = NULL; + for (p_node = (GList *) p_line->data; p_node != NULL; p_node = p_node->next) + { + node = gl_text_node_dup ((glTextNode *)p_node->data); + line = g_list_append (line, node); + } + dst_lines = g_list_append (dst_lines, line); + } + + return dst_lines; +} + +/****************************************************************************/ +/* Free a list of text lines. */ +/****************************************************************************/ +void +gl_text_node_lines_free (GList **lines) +{ + GList *p_line, *p_node; + glTextNode *text_node; + + for (p_line = *lines; p_line != NULL; p_line = p_line->next) + { + for (p_node = (GList *) p_line->data; p_node != NULL; p_node = p_node->next) + { + text_node = (glTextNode *)p_node->data; + p_node->data = NULL; + gl_text_node_free ( &text_node ); + } + g_list_free ((GList *) p_line->data); + p_line->data = NULL; + } + + g_list_free (*lines); + *lines = NULL; +} + +/****************************************************************************/ +/* For debugging: descend and print lines list. */ +/****************************************************************************/ +void +gl_text_node_lines_print (GList * lines ) +{ + GList *p_line, *p_node; + glTextNode *text_node; + gint i_line, i_node; + + for (p_line=lines, i_line=0; p_line != NULL; p_line=p_line->next, i_line++) { + for (p_node = (GList *) p_line->data, i_node=0; p_node != NULL; + p_node = p_node->next, i_node++) { + text_node = (glTextNode *) p_node->data; + g_print( "LINE[%d], NODE[%d] = { %d, \"%s\" }\n", + i_line, i_node, + text_node->field_flag, text_node->data ); + + } + } + +} + diff --git a/glabels2/src/text-node.h b/glabels2/src/text-node.h new file mode 100644 index 00000000..4a9bd228 --- /dev/null +++ b/glabels2/src/text-node.h @@ -0,0 +1,58 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * text_node.h: text node module header file + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __TEXT_NODE_H__ +#define __TEXT_NODE_H__ + +#include +#include +#include "merge.h" + +G_BEGIN_DECLS + +typedef struct { + gboolean field_flag; + gchar *data; +} glTextNode; + +gchar *gl_text_node_expand (glTextNode *text_node, + glMergeRecord *record); +glTextNode *gl_text_node_new_from_text (gchar *text); +glTextNode *gl_text_node_dup (glTextNode *text_node); +void gl_text_node_free (glTextNode **text_node); + +gboolean gl_text_node_equal (glTextNode *text_node1, + glTextNode *text_node2); + +gchar *gl_text_node_lines_expand (GList *lines, + glMergeRecord *record); +GList *gl_text_node_lines_new_from_text (gchar *text); +GList *gl_text_node_lines_dup (GList *lines); +void gl_text_node_lines_free (GList **lines); + +/* debug function */ +void gl_text_node_lines_print (GList *lines); + +G_END_DECLS + +#endif diff --git a/glabels2/src/ui-commands.c b/glabels2/src/ui-commands.c new file mode 100644 index 00000000..ddeb2dd1 --- /dev/null +++ b/glabels2/src/ui-commands.c @@ -0,0 +1,1168 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * ui-commands.c: GLabels UI commands module + * + * Copyright (C) 2001-2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "ui-commands.h" + +#include +#include +#include +#include + +#include "view.h" +#include "file.h" +#include "template-designer.h" +#include "print-op.h" +#include "prefs.h" +#include "prefs-dialog.h" +#include "recent.h" +#include "debug.h" + + + +/****************************************************************************/ +/** File/New command. */ +/****************************************************************************/ +void +gl_ui_cmd_file_new (GtkAction *action, + glWindow *window) +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + gl_file_new (window); + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/****************************************************************************/ +/** File/Properties command. */ +/****************************************************************************/ +void +gl_ui_cmd_file_properties (GtkAction *action, + glWindow *window) +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + gl_file_properties (GL_VIEW(window->view)->label, window); + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/****************************************************************************/ +/** File/Template-Designer command. */ +/****************************************************************************/ +void +gl_ui_cmd_file_template_designer (GtkAction *action, + glWindow *window) +{ + GtkWidget *dialog; + + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + dialog = gl_template_designer_new (GTK_WINDOW(window)); + + gtk_widget_show (dialog); + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/****************************************************************************/ +/** File/Open command. */ +/****************************************************************************/ +void +gl_ui_cmd_file_open (GtkAction *action, + glWindow *window) +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + gl_file_open (window); + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/****************************************************************************/ +/** File/Open-Recent command. */ +/****************************************************************************/ +void +gl_ui_cmd_file_open_recent (GtkRecentChooser *chooser, + glWindow *window) +{ + GtkRecentInfo *item; + gchar *utf8_filename; + + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (chooser && GTK_IS_RECENT_CHOOSER(chooser)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + item = gtk_recent_chooser_get_current_item (chooser); + if (!item) + return; + + utf8_filename = gl_recent_get_utf8_filename (item); + + gl_debug (DEBUG_COMMANDS, "Selected %s\n", utf8_filename); + gl_file_open_recent (utf8_filename, window); + + gtk_recent_info_unref (item); + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/****************************************************************************/ +/** File/Save command. */ +/****************************************************************************/ +void +gl_ui_cmd_file_save (GtkAction *action, + glWindow *window) +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + gl_file_save (GL_VIEW(window->view)->label, window); + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/****************************************************************************/ +/** File/Save-as command. */ +/****************************************************************************/ +void +gl_ui_cmd_file_save_as (GtkAction *action, + glWindow *window) +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + gl_file_save_as (GL_VIEW(window->view)->label, window); + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/****************************************************************************/ +/** File/Print command. */ +/****************************************************************************/ +void +gl_ui_cmd_file_print (GtkAction *action, + glWindow *window) +{ + glPrintOp *op; + GtkPrintOperationResult result; + + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + op = gl_print_op_new (GL_VIEW(window->view)->label); + + if (window->print_settings) + { + gl_print_op_set_settings (op, window->print_settings); + } + + result = gtk_print_operation_run (GTK_PRINT_OPERATION (op), + GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, + GTK_WINDOW (window), + NULL); + + if ( result == GTK_PRINT_OPERATION_RESULT_APPLY ) + { + gl_print_op_free_settings (window->print_settings); + window->print_settings = gl_print_op_get_settings (op); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/****************************************************************************/ +/** File/Close command. */ +/****************************************************************************/ +void +gl_ui_cmd_file_close (GtkAction *action, + glWindow *window) +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + gl_file_close (window); + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/****************************************************************************/ +/** File/Quit command. */ +/****************************************************************************/ +void +gl_ui_cmd_file_quit (GtkAction *action, + glWindow *window) +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + gl_file_exit (); + + gl_debug (DEBUG_COMMANDS, "END"); +} + + +/****************************************************************************/ +/** Edit/Cut command. */ +/****************************************************************************/ +void +gl_ui_cmd_edit_cut (GtkAction *action, + glWindow *window) +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + gl_view_cut (GL_VIEW(window->view)); + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/****************************************************************************/ +/** Edit/Copy command. */ +/****************************************************************************/ +void +gl_ui_cmd_edit_copy (GtkAction *action, + glWindow *window) +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + gl_view_copy (GL_VIEW(window->view)); + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/****************************************************************************/ +/** Edit/Paste command. */ +/****************************************************************************/ +void +gl_ui_cmd_edit_paste (GtkAction *action, + glWindow *window) +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + gl_view_paste (GL_VIEW(window->view)); + + gl_debug (DEBUG_COMMANDS, "END"); +} + + +/****************************************************************************/ +/** Edit/Delete command. */ +/****************************************************************************/ +void +gl_ui_cmd_edit_delete (GtkAction *action, + glWindow *window) +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + gl_view_delete_selection (GL_VIEW(window->view)); + + gl_debug (DEBUG_COMMANDS, "END"); +} + + +/****************************************************************************/ +/** Edit/Select-all command. */ +/****************************************************************************/ +void +gl_ui_cmd_edit_select_all (GtkAction *action, + glWindow *window) +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + gl_view_select_all (GL_VIEW(window->view)); + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/****************************************************************************/ +/** Edit/Unselect-all command. */ +/****************************************************************************/ +void +gl_ui_cmd_edit_unselect_all (GtkAction *action, + glWindow *window) +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + gl_view_unselect_all (GL_VIEW(window->view)); + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/****************************************************************************/ +/** Edit/Preferences command. */ +/****************************************************************************/ +void +gl_ui_cmd_edit_preferences (GtkAction *action, + glWindow *window) +{ + static GtkWidget *dialog = NULL; + + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (dialog != NULL) + { + gtk_window_present (GTK_WINDOW (dialog)); + gtk_window_set_transient_for (GTK_WINDOW (dialog), + GTK_WINDOW(window)); + + } else { + + dialog = gl_prefs_dialog_new (GTK_WINDOW(window)); + + g_signal_connect (G_OBJECT (dialog), "destroy", + G_CALLBACK (gtk_widget_destroyed), &dialog); + + gtk_widget_show (dialog); + + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** View/Property-bar-toggle command. */ +/*****************************************************************************/ +void +gl_ui_cmd_view_property_bar_toggle (GtkToggleAction *action, + glWindow *window) +{ + gboolean state; + + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_TOGGLE_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + state = gtk_toggle_action_get_active (action); + + gl_prefs->property_toolbar_visible = state; + if (state) { + gtk_widget_show (GTK_WIDGET (window->property_bar)); + } else { + gtk_widget_hide (GTK_WIDGET (window->property_bar)); + } + gl_prefs_model_save_settings (gl_prefs); + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** View/Property-bar-tooltips-toggle command. */ +/*****************************************************************************/ +void +gl_ui_cmd_view_property_bar_tips_toggle (GtkToggleAction *action, + glWindow *window) +{ + gboolean state; + + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_TOGGLE_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + state = gtk_toggle_action_get_active (action); + + gl_prefs->property_toolbar_view_tooltips = state; + gl_ui_property_bar_set_tooltips (window->property_bar, state); + gl_prefs_model_save_settings (gl_prefs); + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** View/Grid-toggle command. */ +/*****************************************************************************/ +void +gl_ui_cmd_view_grid_toggle (GtkToggleAction *action, + glWindow *window) +{ + gboolean state; + + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_TOGGLE_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + state = gtk_toggle_action_get_active (action); + + if (window->view != NULL) + { + if (state) { + gl_view_show_grid (GL_VIEW(window->view)); + } else { + gl_view_hide_grid (GL_VIEW(window->view)); + } + } + + gl_prefs->grid_visible = state; + gl_prefs_model_save_settings (gl_prefs); + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** View/Markup-toggle command. */ +/*****************************************************************************/ +void +gl_ui_cmd_view_markup_toggle (GtkToggleAction *action, + glWindow *window) +{ + gboolean state; + + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_TOGGLE_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + state = gtk_toggle_action_get_active (action); + + if (window->view != NULL) + { + if (state) { + gl_view_show_markup (GL_VIEW(window->view)); + } else { + gl_view_hide_markup (GL_VIEW(window->view)); + } + } + + gl_prefs->markup_visible = state; + gl_prefs_model_save_settings (gl_prefs); + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** View/Zoom-in command. */ +/*****************************************************************************/ +void +gl_ui_cmd_view_zoomin (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_zoom_in (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** View/Zoom-out command. */ +/*****************************************************************************/ +void +gl_ui_cmd_view_zoomout (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_zoom_out (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** View/Zoom-1:1 command. */ +/*****************************************************************************/ +void +gl_ui_cmd_view_zoom1to1 (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_set_zoom (GL_VIEW(window->view), 1.0); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** View/Zoom-to-fit command. */ +/*****************************************************************************/ +void +gl_ui_cmd_view_zoom_to_fit (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_zoom_to_fit (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Arrow-mode command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_arrow_mode (GtkAction *action, + glWindow *window) +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_arrow_mode (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Create-text object command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_create_text (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_object_create_mode (GL_VIEW(window->view), + GL_LABEL_OBJECT_TEXT); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Create-box object command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_create_box (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_object_create_mode (GL_VIEW(window->view), + GL_LABEL_OBJECT_BOX); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Create-line object command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_create_line (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_object_create_mode (GL_VIEW(window->view), + GL_LABEL_OBJECT_LINE); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Create-ellipse object command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_create_ellipse (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_object_create_mode (GL_VIEW(window->view), + GL_LABEL_OBJECT_ELLIPSE); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Create-image object command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_create_image (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_object_create_mode (GL_VIEW(window->view), + GL_LABEL_OBJECT_IMAGE); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Create-barcode object command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_create_barcode (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_object_create_mode (GL_VIEW(window->view), + GL_LABEL_OBJECT_BARCODE); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Raise command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_raise (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_raise_selection (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Lower command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_lower (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_lower_selection (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Rotate-left-90-degrees command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_rotate_left (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_rotate_selection_left (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Rotate-right-90-degrees command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_rotate_right (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_rotate_selection_right (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Flip-horizontally command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_flip_horiz (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_flip_selection_horiz (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Flip-vertically command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_flip_vert (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_flip_selection_vert (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Align-left command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_align_left (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_align_selection_left (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Align-right command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_align_right (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_align_selection_right (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Align-horizontal-center command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_align_hcenter (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_align_selection_hcenter (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Align-top command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_align_top (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_align_selection_top (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Align-bottom command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_align_bottom (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_align_selection_bottom (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Align-vertical center command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_align_vcenter (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_align_selection_vcenter (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Center-horizontally command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_center_horiz (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_center_selection_horiz (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Center-vertically command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_center_vert (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->view != NULL) { + gl_view_center_selection_vert (GL_VIEW(window->view)); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/*****************************************************************************/ +/** Objects/Edit- merge-properties command. */ +/*****************************************************************************/ +void +gl_ui_cmd_objects_merge_properties (GtkAction *action, + glWindow *window) + +{ + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (window->merge_dialog) { + + gtk_window_present (GTK_WINDOW(window->merge_dialog)); + gtk_window_set_transient_for (GTK_WINDOW (window->merge_dialog), + GTK_WINDOW (window)); + + } else { + + window->merge_dialog = + g_object_ref ( + gl_merge_properties_dialog_new (GL_VIEW(window->view)->label, + GTK_WINDOW(window)) ); + + g_signal_connect (G_OBJECT(window->merge_dialog), "destroy", + G_CALLBACK (gtk_widget_destroyed), + &window->merge_dialog); + + gtk_widget_show (GTK_WIDGET (window->merge_dialog)); + + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + +/****************************************************************************/ +/** Help/Contents command. */ +/****************************************************************************/ +void +gl_ui_cmd_help_contents (GtkAction *action, + glWindow *window) +{ + GError *error = NULL; + + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + gnome_help_display_with_doc_id (NULL, NULL, "glabels.xml", NULL, &error); + + if (error != NULL) + { + g_message (error->message); + + g_error_free (error); + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + + +/****************************************************************************/ +/** Help/About command. */ +/****************************************************************************/ +void +gl_ui_cmd_help_about (GtkAction *action, + glWindow *window) +{ + static GtkWidget *about = NULL; + + GdkPixbuf *pixbuf = NULL; + + const gchar *authors[] = { + "Jim Evins", + " ", + _("Glabels includes contributions from:"), + "Frederic Ruaudel", + "Wayne Schuller", + "Emmanuel Pacaud", + "Austin Henry", + " ", + _("See the file AUTHORS for additional credits,"), + _("or visit http://glabels.sourceforge.net/"), + NULL + }; + + const gchar *artists[] = { + "Nestor Di", + "Jim Evins", + NULL + }; + + const gchar *copy_text = "Copyright \xc2\xa9 2001-2007 Jim Evins"; + + const gchar *about_text = _("A label and business card creation program.\n"); + + const gchar *url = "http://glabels.sourceforge.net"; + + const gchar *translator_credits = _("translator-credits"); + + const gchar *license = _( + "Glabels is free software; you can redistribute it and/or modify it\n" + "under the terms of the GNU General Public License as published by\n" + "the Free Software Foundation; either version 2 of the License, or\n" + "(at your option) any later version.\n" "\n" + "This program is distributed in the hope that it will be useful, but\n" + "WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See\n" + "the GNU General Public License for more details.\n"); + + gl_debug (DEBUG_COMMANDS, "START"); + + g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (window && GL_IS_WINDOW(window)); + + if (about != NULL) + { + + gtk_window_present (GTK_WINDOW (about)); + gtk_window_set_transient_for (GTK_WINDOW (about), + GTK_WINDOW (window)); + + } else { + + pixbuf = gdk_pixbuf_new_from_file (GLABELS_PIXMAP_DIR "glabels-splash.png", NULL); + + about = gtk_about_dialog_new (); + gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), _("glabels")); + gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about), VERSION); + gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG(about), copy_text); + gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about), about_text); + gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), url); + gtk_about_dialog_set_logo (GTK_ABOUT_DIALOG(about), pixbuf); + + gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors); + gtk_about_dialog_set_artists (GTK_ABOUT_DIALOG(about), artists); + gtk_about_dialog_set_translator_credits (GTK_ABOUT_DIALOG(about), + translator_credits); + gtk_about_dialog_set_license (GTK_ABOUT_DIALOG(about), license); + + gtk_window_set_destroy_with_parent (GTK_WINDOW (about), TRUE); + + g_signal_connect (G_OBJECT (about), "response", + G_CALLBACK (gtk_widget_destroy), NULL); + g_signal_connect (G_OBJECT (about), "destroy", + G_CALLBACK (gtk_widget_destroyed), &about); + + gtk_window_set_transient_for (GTK_WINDOW (about), + GTK_WINDOW (window)); + + gtk_window_present (GTK_WINDOW (about)); + + if (pixbuf != NULL) + g_object_unref (pixbuf); + + } + + gl_debug (DEBUG_COMMANDS, "END"); +} + diff --git a/glabels2/src/ui-commands.h b/glabels2/src/ui-commands.h new file mode 100644 index 00000000..fc8a3db9 --- /dev/null +++ b/glabels2/src/ui-commands.h @@ -0,0 +1,203 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * ui-commands.h: GLabels UI commands module header file + * + * Copyright (C) 2001-2005 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __COMMANDS_H__ +#define __COMMANDS_H__ + +#include +#include +#include +#include "window.h" + +G_BEGIN_DECLS + +void gl_ui_cmd_file_new (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_file_properties (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_file_template_designer (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_file_open (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_file_open_recent (GtkRecentChooser *chooser, + glWindow *window); + +void gl_ui_cmd_file_save (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_file_save_as (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_file_print (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_file_print_preview (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_file_close (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_file_quit (GtkAction *action, + glWindow *window); + + + +void gl_ui_cmd_edit_undo (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_edit_redo (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_edit_cut (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_edit_copy (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_edit_paste (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_edit_delete (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_edit_select_all (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_edit_unselect_all (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_edit_preferences (GtkAction *action, + glWindow *window); + + + +void gl_ui_cmd_view_property_bar_toggle (GtkToggleAction *action, + glWindow *window); + +void gl_ui_cmd_view_property_bar_tips_toggle (GtkToggleAction *action, + glWindow *window); + +void gl_ui_cmd_view_grid_toggle (GtkToggleAction *action, + glWindow *window); + +void gl_ui_cmd_view_markup_toggle (GtkToggleAction *action, + glWindow *window); + + + +void gl_ui_cmd_view_zoomin (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_view_zoomout (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_view_zoom1to1 (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_view_zoom_to_fit (GtkAction *action, + glWindow *window); + + + +void gl_ui_cmd_objects_arrow_mode (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_create_text (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_create_box (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_create_line (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_create_ellipse (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_create_image (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_create_barcode (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_raise (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_lower (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_rotate_left (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_rotate_right (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_flip_horiz (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_flip_vert (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_align_left (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_align_right (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_align_hcenter (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_align_top (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_align_bottom (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_align_vcenter (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_center_horiz (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_center_vert (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_objects_merge_properties (GtkAction *action, + glWindow *window); + + + +void gl_ui_cmd_help_contents (GtkAction *action, + glWindow *window); + +void gl_ui_cmd_help_about (GtkAction *action, + glWindow *window); + +G_END_DECLS + +#endif /* __COMMANDS_H__ */ diff --git a/glabels2/src/ui-property-bar.c b/glabels2/src/ui-property-bar.c new file mode 100644 index 00000000..ea2d10a4 --- /dev/null +++ b/glabels2/src/ui-property-bar.c @@ -0,0 +1,1335 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/** + * (GLABELS) Label and Business Card Creation program for GNOME + * + * property-bar.c: gLabels property bar + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "ui-property-bar.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "util.h" +#include "mygal/widget-color-combo.h" +#include "stock-pixmaps/stockpixbufs.h" +#include "prefs.h" +#include "color.h" + +#include "debug.h" + +/*===========================================================================*/ +/* Private macros and constants. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Private data types */ +/*===========================================================================*/ + +struct _glUIPropertyBarPrivate { + + glView *view; + + GladeXML *gui; + + GtkWidget *tool_bar; + + /* Font selection */ + GtkWidget *font_family_combo; + GtkWidget *font_size_spin; + GtkWidget *font_bold_toggle; + GtkWidget *font_italic_toggle; + + /* Text alignemnt radios */ + GtkWidget *text_align_left_radio; + GtkWidget *text_align_center_radio; + GtkWidget *text_align_right_radio; + + /* Color combos */ + GtkWidget *text_color_combo; + GtkWidget *fill_color_combo; + GtkWidget *line_color_combo; + + /* Line width */ + GtkWidget *line_width_spin; + + /* Prevent recursion */ + gboolean stop_signals; +}; + + +/*===========================================================================*/ +/* Private globals */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Local function prototypes */ +/*===========================================================================*/ + +static void gl_ui_property_bar_finalize (GObject *object); + +static void gl_ui_property_bar_construct (glUIPropertyBar *property_bar); + +static void selection_changed_cb (glUIPropertyBar *property_bar); + +static void font_family_changed_cb (GtkComboBox *combo, + glUIPropertyBar *property_bar); + +static void font_size_changed_cb (GtkSpinButton *spin, + glUIPropertyBar *property_bar); + +static void text_color_changed_cb (ColorCombo *cc, + GdkColor *gdk_color, + gboolean custom, + gboolean by_user, + gboolean is_default, + glUIPropertyBar *property_bar); + +static void fill_color_changed_cb (ColorCombo *cc, + GdkColor *gdk_color, + gboolean custom, + gboolean by_user, + gboolean is_default, + glUIPropertyBar *property_bar); + +static void line_color_changed_cb (ColorCombo *cc, + GdkColor *gdk_color, + gboolean custom, + gboolean by_user, + gboolean is_default, + glUIPropertyBar *property_bar); + +static void line_width_changed_cb (GtkSpinButton *spin, + glUIPropertyBar *property_bar); + +static void font_bold_toggled_cb (GtkToggleToolButton *toggle, + glUIPropertyBar *property_bar); + +static void font_italic_toggled_cb (GtkToggleToolButton *toggle, + glUIPropertyBar *property_bar); + +static void text_align_toggled_cb (GtkToggleToolButton *toggle, + glUIPropertyBar *property_bar); + +static void set_doc_items_sensitive (glUIPropertyBar *property_bar, + gboolean state); + +static void set_text_items_sensitive (glUIPropertyBar *property_bar, + gboolean state); + +static void set_fill_items_sensitive (glUIPropertyBar *property_bar, + gboolean state); + +static void set_line_color_items_sensitive (glUIPropertyBar *property_bar, + gboolean state); + +static void set_line_width_items_sensitive (glUIPropertyBar *property_bar, + gboolean state); + + +/****************************************************************************/ +/* Boilerplate Object stuff. */ +/****************************************************************************/ +G_DEFINE_TYPE (glUIPropertyBar, gl_ui_property_bar, GTK_TYPE_HBOX); + +static void +gl_ui_property_bar_class_init (glUIPropertyBarClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + gl_ui_property_bar_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_ui_property_bar_finalize; + + gl_debug (DEBUG_PROPERTY_BAR, "END"); +} + +static void +gl_ui_property_bar_init (glUIPropertyBar *property_bar) +{ + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + property_bar->priv = g_new0 (glUIPropertyBarPrivate, 1); + + gl_debug (DEBUG_PROPERTY_BAR, "END"); +} + +static void +gl_ui_property_bar_finalize (GObject *object) +{ + glUIPropertyBar *property_bar = GL_UI_PROPERTY_BAR (object); + + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + g_return_if_fail (object != NULL); + g_return_if_fail (GL_IS_UI_PROPERTY_BAR (object)); + + if (property_bar->priv->view) + { + g_object_unref (G_OBJECT(property_bar->priv->view)); + } + if (property_bar->priv->gui) + { + g_object_unref (G_OBJECT(property_bar->priv->gui)); + } + g_free (property_bar->priv); + + G_OBJECT_CLASS (gl_ui_property_bar_parent_class)->finalize (object); + + gl_debug (DEBUG_PROPERTY_BAR, "END"); +} + +/****************************************************************************/ +/* Create a NEW property_bar. */ +/****************************************************************************/ +GtkWidget * +gl_ui_property_bar_new (void) +{ + glUIPropertyBar *property_bar; + + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + property_bar = g_object_new (GL_TYPE_UI_PROPERTY_BAR, NULL); + + gl_ui_property_bar_construct (property_bar); + + gl_debug (DEBUG_PROPERTY_BAR, "END"); + + return GTK_WIDGET (property_bar); +} + +/******************************************************************************/ +/* Initialize property toolbar. */ +/******************************************************************************/ +static void +gl_ui_property_bar_construct (glUIPropertyBar *property_bar) +{ + GladeXML *gui; + GList *family_names = NULL; + GList *family_node; + GdkColor *gdk_color; + + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + property_bar->priv->stop_signals = TRUE; + + gui = glade_xml_new (GLABELS_GLADE_DIR "property-bar.glade", + "property_toolbar", NULL); + + if (!gui) + { + g_critical ("Could not open property-bar.glade. gLabels may not be installed correctly!"); + return; + } + + property_bar->priv->tool_bar = glade_xml_get_widget (gui, "property_toolbar"); + gtk_container_add (GTK_CONTAINER (property_bar), property_bar->priv->tool_bar); + + property_bar->priv->font_family_combo = + glade_xml_get_widget (gui, "font_family_combo"); + property_bar->priv->font_size_spin = + glade_xml_get_widget (gui, "font_size_spin"); + property_bar->priv->font_bold_toggle = + glade_xml_get_widget (gui, "font_bold_toggle"); + property_bar->priv->font_italic_toggle = + glade_xml_get_widget (gui, "font_italic_toggle"); + property_bar->priv->text_align_left_radio = + glade_xml_get_widget (gui, "text_align_left_radio"); + property_bar->priv->text_align_center_radio = + glade_xml_get_widget (gui, "text_align_center_radio"); + property_bar->priv->text_align_right_radio = + glade_xml_get_widget (gui, "text_align_right_radio"); + property_bar->priv->text_color_combo = + glade_xml_get_widget (gui, "text_color_combo"); + property_bar->priv->fill_color_combo = + glade_xml_get_widget (gui, "fill_color_combo"); + property_bar->priv->line_color_combo = + glade_xml_get_widget (gui, "line_color_combo"); + property_bar->priv->line_width_spin = + glade_xml_get_widget (gui, "line_width_spin"); + + /* Save reference to gui tree so we don't lose tooltips */ + property_bar->priv->gui = gui; + + set_doc_items_sensitive (property_bar, FALSE); + + /* Font family entry widget */ + gl_util_combo_box_add_text_model (GTK_COMBO_BOX (property_bar->priv->font_family_combo)); + family_names = gl_util_get_font_family_list (); + gl_util_combo_box_set_strings (GTK_COMBO_BOX (property_bar->priv->font_family_combo), + family_names); + gtk_widget_set_size_request (property_bar->priv->font_family_combo, 200, -1); + + /* Make sure we have a valid font. if not provide a good default. */ + family_node = g_list_find_custom (family_names, + gl_prefs->default_font_family, + (GCompareFunc)g_utf8_collate); + if (family_node) + { + gtk_combo_box_set_active (GTK_COMBO_BOX (property_bar->priv->font_family_combo), + g_list_position (family_names, + family_node)); + } + else + { + gtk_combo_box_set_active (GTK_COMBO_BOX (property_bar->priv->font_family_combo), 0); + } + gl_util_font_family_list_free (family_names); + + g_signal_connect (G_OBJECT (property_bar->priv->font_family_combo), + "changed", G_CALLBACK (font_family_changed_cb), property_bar); + + /* Font size entry widget */ + gtk_spin_button_set_value (GTK_SPIN_BUTTON(property_bar->priv->font_size_spin), + gl_prefs->default_font_size); + + g_signal_connect (G_OBJECT (property_bar->priv->font_size_spin), + "changed", G_CALLBACK (font_size_changed_cb), property_bar); + + + /* Bold and Italic toggles */ + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->font_bold_toggle), + (gl_prefs->default_font_weight == PANGO_WEIGHT_BOLD)); + g_signal_connect (G_OBJECT (property_bar->priv->font_bold_toggle), + "toggled", G_CALLBACK (font_bold_toggled_cb), property_bar); + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->font_italic_toggle), + gl_prefs->default_font_italic_flag); + g_signal_connect (G_OBJECT (property_bar->priv->font_italic_toggle), + "toggled", G_CALLBACK (font_italic_toggled_cb), property_bar); + + + /* Text alignment radio group */ + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->text_align_left_radio), + (gl_prefs->default_text_alignment == PANGO_ALIGN_LEFT)); + g_signal_connect (G_OBJECT (property_bar->priv->text_align_left_radio), + "toggled", G_CALLBACK (text_align_toggled_cb), property_bar); + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->text_align_center_radio), + (gl_prefs->default_text_alignment == PANGO_ALIGN_CENTER)); + g_signal_connect (G_OBJECT (property_bar->priv->text_align_center_radio), + "toggled", G_CALLBACK (text_align_toggled_cb), property_bar); + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->text_align_right_radio), + (gl_prefs->default_text_alignment == PANGO_ALIGN_RIGHT)); + g_signal_connect (G_OBJECT (property_bar->priv->text_align_right_radio), + "toggled", G_CALLBACK (text_align_toggled_cb), property_bar); + + /* Text color widget */ + gdk_color = gl_color_to_gdk_color (gl_prefs->default_text_color); + color_combo_set_color (COLOR_COMBO (property_bar->priv->text_color_combo), gdk_color); + g_free (gdk_color); + g_signal_connect (G_OBJECT (property_bar->priv->text_color_combo), + "color_changed", + G_CALLBACK (text_color_changed_cb), property_bar); + + /* Fill color widget */ + gdk_color = gl_color_to_gdk_color (gl_prefs->default_fill_color); + color_combo_set_color (COLOR_COMBO (property_bar->priv->fill_color_combo), gdk_color); + g_free (gdk_color); + g_signal_connect (G_OBJECT (property_bar->priv->fill_color_combo), + "color_changed", + G_CALLBACK (fill_color_changed_cb), property_bar); + + /* Line color widget */ + gdk_color = gl_color_to_gdk_color (gl_prefs->default_line_color); + color_combo_set_color (COLOR_COMBO (property_bar->priv->line_color_combo), gdk_color); + g_free (gdk_color); + g_signal_connect (G_OBJECT (property_bar->priv->line_color_combo), + "color_changed", + G_CALLBACK (line_color_changed_cb), property_bar); + + /* Line width entry widget */ + g_signal_connect (G_OBJECT (property_bar->priv->line_width_spin), + "changed", + G_CALLBACK (line_width_changed_cb), property_bar); + + property_bar->priv->stop_signals = FALSE; + + gl_debug (DEBUG_PROPERTY_BAR, "END"); +} + +/****************************************************************************/ +/* Fill widgets with default values. */ +/****************************************************************************/ +static void +reset_to_default_properties (glView *view, + glUIPropertyBar *property_bar) +{ + GList *family_names; + gchar *good_font_family; + GdkColor *gdk_color; + + /* Make sure we have a valid font. if not provide a good default. */ + family_names = gl_util_get_font_family_list (); + if (g_list_find_custom (family_names, + view->default_font_family, + (GCompareFunc)g_utf8_collate)) + { + good_font_family = g_strdup (view->default_font_family); + } + else + { + if (family_names != NULL) + { + good_font_family = g_strdup (family_names->data); /* 1st entry */ + } + else + { + good_font_family = NULL; + } + } + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (property_bar->priv->font_family_combo), + good_font_family); + g_free (good_font_family); + gl_util_font_family_list_free (family_names); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON(property_bar->priv->font_size_spin), + view->default_font_size); + + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->font_bold_toggle), + (view->default_font_weight == PANGO_WEIGHT_BOLD)); + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->font_italic_toggle), + view->default_font_italic_flag); + + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->text_align_left_radio), + (view->default_text_alignment == PANGO_ALIGN_LEFT)); + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->text_align_center_radio), + (view->default_text_alignment == PANGO_ALIGN_CENTER)); + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->text_align_right_radio), + (view->default_text_alignment == PANGO_ALIGN_RIGHT)); + + gdk_color = gl_color_to_gdk_color (view->default_text_color); + color_combo_set_color (COLOR_COMBO(property_bar->priv->text_color_combo), gdk_color); + g_free (gdk_color); + + gdk_color = gl_color_to_gdk_color (view->default_fill_color); + color_combo_set_color (COLOR_COMBO(property_bar->priv->fill_color_combo), gdk_color); + g_free (gdk_color); + + gdk_color = gl_color_to_gdk_color (view->default_line_color); + color_combo_set_color (COLOR_COMBO(property_bar->priv->line_color_combo), gdk_color); + g_free (gdk_color); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON(property_bar->priv->line_width_spin), + view->default_line_width); +} + +/****************************************************************************/ +/* Set view associated with property_bar. */ +/****************************************************************************/ +void +gl_ui_property_bar_set_view (glUIPropertyBar *property_bar, + glView *view) +{ + glLabel *label; + + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + label = view->label; + g_return_if_fail (label && GL_IS_LABEL (label)); + + set_doc_items_sensitive (property_bar, TRUE); + + property_bar->priv->view = GL_VIEW (g_object_ref (G_OBJECT (view))); + + reset_to_default_properties (view, property_bar); + + g_signal_connect_swapped (G_OBJECT(view), "selection_changed", + G_CALLBACK(selection_changed_cb), property_bar); + + g_signal_connect_swapped (G_OBJECT(view->label), "changed", + G_CALLBACK(selection_changed_cb), property_bar); + + gl_debug (DEBUG_PROPERTY_BAR, "END"); +} + +/****************************************************************************/ +/** Set visiblity of property bar's tooltips. */ +/****************************************************************************/ +void +gl_ui_property_bar_set_tooltips (glUIPropertyBar *property_bar, + gboolean state) +{ + GtkTooltipsData *data; + + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + g_return_if_fail (property_bar && GL_IS_UI_PROPERTY_BAR(property_bar)); + + /* HACK: peek into one of our widgets to get the tooltips group created by libglade. */ + data = gtk_tooltips_data_get (property_bar->priv->font_size_spin); + g_return_if_fail (data); + + if (state) + { + gtk_tooltips_enable (data->tooltips); + } + else + { + gtk_tooltips_disable (data->tooltips); + } + + gl_debug (DEBUG_PROPERTY_BAR, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. View "selection state changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_text_properties (glView *view, + glUIPropertyBar *property_bar) +{ + gboolean can_text, is_first_object; + gboolean is_same_font_family, is_same_font_size; + gboolean is_same_text_color, is_same_is_italic; + gboolean is_same_is_bold, is_same_align; + GList *p; + glLabelObject *object; + gchar *selection_font_family, *font_family; + gdouble selection_font_size, font_size; + guint selection_text_color, text_color; + glColorNode *text_color_node; + gboolean selection_is_italic, is_italic; + gboolean selection_is_bold, is_bold; + PangoAlignment selection_align, align; + GdkColor *gdk_color; + + can_text = gl_view_can_selection_text (view); + set_text_items_sensitive (property_bar, can_text); + + if (!can_text) + return; + + is_same_is_italic = + is_same_is_bold = + is_same_align = + is_same_text_color = + is_same_font_size = + is_same_font_family = TRUE; + selection_font_family = NULL; + selection_font_size = -1; + selection_align = PANGO_ALIGN_LEFT; + selection_is_italic = TRUE; + selection_is_bold = TRUE; + selection_text_color = 0; + + is_first_object = TRUE; + + for (p = view->selected_object_list; p != NULL; p = p->next) + { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + if (!gl_label_object_can_text (object)) + continue; + + font_family = gl_label_object_get_font_family (object); + if (font_family != NULL) + { + if (selection_font_family == NULL) + { + selection_font_family = g_strdup (font_family); + } + else + { + if (strcmp (font_family, selection_font_family) != 0) + { + is_same_font_family = FALSE; + } + } + g_free (font_family); + } + + font_size = gl_label_object_get_font_size (object); + + text_color_node = gl_label_object_get_text_color (object); + if (text_color_node->field_flag) + { + /* If a merge field is set we use the default color for merged color*/ + text_color = GL_COLOR_MERGE_DEFAULT; + + } + else + { + text_color = text_color_node->color; + } + gl_color_node_free (&text_color_node); + + is_italic = gl_label_object_get_font_italic_flag (object); + is_bold = gl_label_object_get_font_weight (object) == PANGO_WEIGHT_BOLD; + align = gl_label_object_get_text_alignment (object); + + if (is_first_object) + { + selection_font_size = font_size; + selection_text_color = text_color; + selection_is_italic = is_italic; + selection_is_bold = is_bold; + selection_align = align; + } + else + { + if (font_size != selection_font_size) + is_same_font_size = FALSE; + if (text_color != selection_text_color) + is_same_text_color = FALSE; + if (is_italic != selection_is_italic) + is_same_is_italic = FALSE; + if (is_bold != selection_is_bold) + is_same_is_bold = FALSE; + if (align != selection_align) + is_same_align = FALSE; + } + is_first_object = FALSE; + } + + if (is_same_font_family && (selection_font_family != NULL)) + gl_debug (DEBUG_PROPERTY_BAR, "same font family = %s", + selection_font_family); + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (property_bar->priv->font_family_combo), + is_same_font_family?selection_font_family:""); + g_free (selection_font_family); + + if (is_same_font_size) + { + gl_debug (DEBUG_PROPERTY_BAR, "same font size = %g", + selection_font_size); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (property_bar->priv->font_size_spin), + selection_font_size); + } + else + { + gtk_entry_set_text (GTK_ENTRY (property_bar->priv->font_size_spin), ""); + } + + if (is_same_text_color) + { + gl_debug (DEBUG_PROPERTY_BAR, "same text color = %08x", selection_text_color); + gdk_color = gl_color_to_gdk_color (selection_text_color); + color_combo_set_color (COLOR_COMBO (property_bar->priv->text_color_combo), + gdk_color); + g_free (gdk_color); + } + + if (is_same_is_italic) + { + gl_debug (DEBUG_PROPERTY_BAR, "same italic flag = %d", + selection_is_italic); + } + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->font_italic_toggle), + selection_is_italic && is_same_is_italic); + + if (is_same_is_bold) + { + gl_debug (DEBUG_PROPERTY_BAR, "same bold flag = %d", + selection_is_bold); + } + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->font_bold_toggle), + selection_is_bold && is_same_is_bold); + + if (is_same_align) + gl_debug (DEBUG_PROPERTY_BAR, "same align"); + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->text_align_left_radio), + (selection_align == PANGO_ALIGN_LEFT) && + is_same_align); + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->text_align_center_radio), + (selection_align == PANGO_ALIGN_CENTER) && + is_same_align); + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->text_align_right_radio), + (selection_align == PANGO_ALIGN_RIGHT) && + is_same_align); +} + +static void +update_fill_color (glView *view, + glUIPropertyBar *property_bar) +{ + gboolean can, is_first_object; + gboolean is_same_fill_color; + GList *p; + glLabelObject *object; + guint selection_fill_color, fill_color; + GdkColor *gdk_color; + glColorNode *fill_color_node; + + can = gl_view_can_selection_fill (view); + set_fill_items_sensitive (property_bar, can); + + if (!can) + return; + + is_same_fill_color = TRUE; + is_first_object = TRUE; + selection_fill_color = 0; + + for (p = view->selected_object_list; p != NULL; p = p->next) + { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + if (!gl_label_object_can_fill (object)) + continue; + + fill_color_node = gl_label_object_get_fill_color (object); + if (fill_color_node->field_flag) + { + /* If a merge field is set we use the default color for merged color*/ + fill_color = GL_COLOR_FILL_MERGE_DEFAULT; + + } + else + { + fill_color = fill_color_node->color; + } + gl_color_node_free (&fill_color_node); + + if (is_first_object) + { + selection_fill_color = fill_color; + } + else + { + if (fill_color != selection_fill_color) + { + is_same_fill_color = FALSE; + } + } + is_first_object = FALSE; + } + + if (is_same_fill_color) + { + gl_debug (DEBUG_PROPERTY_BAR, "same fill color = %08x", selection_fill_color); + gdk_color = gl_color_to_gdk_color (selection_fill_color); + color_combo_set_color (COLOR_COMBO (property_bar->priv->fill_color_combo), + gdk_color); + g_free (gdk_color); + } +} + +static void +update_line_color (glView *view, + glUIPropertyBar *property_bar) +{ + gboolean can, is_first_object; + gboolean is_same_line_color; + GList *p; + glLabelObject *object; + guint selection_line_color, line_color; + glColorNode *line_color_node; + GdkColor *gdk_color; + + can = gl_view_can_selection_line_color (view); + set_line_color_items_sensitive (property_bar, can); + + if (!can) + return; + + is_same_line_color = TRUE; + is_first_object = TRUE; + selection_line_color = 0; + + for (p = view->selected_object_list; p != NULL; p = p->next) + { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + if (!gl_label_object_can_line_color (object)) + continue; + + line_color_node = gl_label_object_get_line_color (object); + if (line_color_node->field_flag) + { + /* If a merge field is set we use the default color for merged color*/ + line_color = GL_COLOR_MERGE_DEFAULT; + + } + else + { + line_color = line_color_node->color; + } + gl_color_node_free (&line_color_node); + + if (is_first_object) + { + selection_line_color = line_color; + } + else + { + if (line_color != selection_line_color) + { + is_same_line_color = FALSE; + } + } + is_first_object = FALSE; + } + + if (is_same_line_color) + { + gl_debug (DEBUG_PROPERTY_BAR, "same line color = %08x", selection_line_color); + gdk_color = gl_color_to_gdk_color (selection_line_color); + color_combo_set_color (COLOR_COMBO (property_bar->priv->line_color_combo), + gdk_color); + g_free (gdk_color); + } +} + +static void +update_line_width (glView *view, + glUIPropertyBar *property_bar) +{ + gboolean can, is_first_object; + gboolean is_same_line_width; + GList *p; + glLabelObject *object; + gdouble selection_line_width, line_width; + + can = gl_view_can_selection_line_width (view); + set_line_width_items_sensitive (property_bar, can); + + if (!can) + return; + + is_same_line_width = TRUE; + is_first_object = TRUE; + selection_line_width = 0; + + for (p = view->selected_object_list; p != NULL; p = p->next) + { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + if (!gl_label_object_can_line_width (object)) + continue; + + line_width = gl_label_object_get_line_width (object); + + if (is_first_object) + { + selection_line_width = line_width; + } + else + { + if (line_width != selection_line_width) + { + is_same_line_width = FALSE; + } + } + is_first_object = FALSE; + } + + if (is_same_line_width) + { + gl_debug (DEBUG_PROPERTY_BAR, "same line width = %g", selection_line_width); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (property_bar->priv->line_width_spin), + selection_line_width); + } + else + { + gtk_entry_set_text (GTK_ENTRY (property_bar->priv->line_width_spin), ""); + } +} + +static void +selection_changed_cb (glUIPropertyBar *property_bar) +{ + glView *view = property_bar->priv->view; + + g_return_if_fail (view && GL_IS_VIEW (view)); + g_return_if_fail (property_bar && GL_IS_UI_PROPERTY_BAR (property_bar)); + + if (property_bar->priv->stop_signals) return; + property_bar->priv->stop_signals = TRUE; + + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + if (gl_view_is_selection_empty (view)) + { + /* No selection: make all controls active. */ + reset_to_default_properties (view, property_bar); + set_doc_items_sensitive (property_bar, TRUE); + } + else + { + update_text_properties (view, property_bar); + update_fill_color (view, property_bar); + update_line_color (view, property_bar); + update_line_width (view, property_bar); + } + + gl_debug (DEBUG_PROPERTY_BAR, "END"); + + property_bar->priv->stop_signals = FALSE; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Font family entry changed. */ +/*--------------------------------------------------------------------------*/ +static void +font_family_changed_cb (GtkComboBox *combo, + glUIPropertyBar *property_bar) +{ + gchar *font_family; + + if (property_bar->priv->stop_signals) return; + property_bar->priv->stop_signals = TRUE; + + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + font_family = gtk_combo_box_get_active_text (GTK_COMBO_BOX (combo)); + if ( strlen(font_family) ) + { + gl_view_set_selection_font_family (property_bar->priv->view, + font_family); + gl_view_set_default_font_family (property_bar->priv->view, + font_family); + } + g_free (font_family); + + gl_debug (DEBUG_PROPERTY_BAR, "END"); + + property_bar->priv->stop_signals = FALSE; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Font size spin button changed. */ +/*--------------------------------------------------------------------------*/ +static void +font_size_changed_cb (GtkSpinButton *spin, + glUIPropertyBar *property_bar) +{ + gdouble font_size; + + if (property_bar->priv->stop_signals) return; + property_bar->priv->stop_signals = TRUE; + + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + font_size = gtk_spin_button_get_value (spin); + + gl_view_set_selection_font_size (property_bar->priv->view, + font_size); + gl_view_set_default_font_size (property_bar->priv->view, + font_size); + + gl_debug (DEBUG_PROPERTY_BAR, "END"); + + property_bar->priv->stop_signals = FALSE; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Text color combo changed. */ +/*--------------------------------------------------------------------------*/ +static void +text_color_changed_cb (ColorCombo *cc, + GdkColor *gdk_color, + gboolean custom, + gboolean by_user, + gboolean is_default, + glUIPropertyBar *property_bar) +{ + glColorNode *text_color_node; + + g_return_if_fail (property_bar && GL_IS_UI_PROPERTY_BAR (property_bar)); + + if (property_bar->priv->stop_signals) return; + property_bar->priv->stop_signals = TRUE; + + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + text_color_node = gl_color_node_new_default (); + text_color_node->color = gl_color_from_gdk_color (gdk_color); + + gl_debug (DEBUG_PROPERTY_BAR, "Color=%08x, Custom=%d, By_User=%d, Is_default=%d", + text_color_node->color, custom, by_user, is_default); + + if (is_default) + { + text_color_node->color = gl_prefs->default_text_color; + gl_view_set_selection_text_color (property_bar->priv->view, + text_color_node); + gl_view_set_default_text_color (property_bar->priv->view, + gl_prefs->default_text_color); + } + else + { + gl_view_set_selection_text_color (property_bar->priv->view, + text_color_node); + gl_view_set_default_text_color (property_bar->priv->view, + text_color_node->color); + } + + gl_color_node_free (&text_color_node); + + gl_debug (DEBUG_PROPERTY_BAR, "END"); + + property_bar->priv->stop_signals = FALSE; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Fill color combo changed. */ +/*--------------------------------------------------------------------------*/ +static void +fill_color_changed_cb (ColorCombo *cc, + GdkColor *gdk_color, + gboolean custom, + gboolean by_user, + gboolean is_default, + glUIPropertyBar *property_bar) +{ + glColorNode *fill_color_node; + + g_return_if_fail (property_bar && GL_IS_UI_PROPERTY_BAR (property_bar)); + + if (property_bar->priv->stop_signals) return; + property_bar->priv->stop_signals = TRUE; + + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + fill_color_node = gl_color_node_new_default (); + + fill_color_node->color = gl_color_from_gdk_color (gdk_color); + + gl_debug (DEBUG_PROPERTY_BAR, "Color=%08x, Custom=%d, By_User=%d, Is_default=%d", + fill_color_node->color, custom, by_user, is_default); + + if (is_default) + { + + fill_color_node->color = GL_COLOR_NONE; + gl_view_set_selection_fill_color (property_bar->priv->view, + fill_color_node); + gl_view_set_default_fill_color (property_bar->priv->view, + fill_color_node->color); + } + else + { + gl_view_set_selection_fill_color (property_bar->priv->view, + fill_color_node); + gl_view_set_default_fill_color (property_bar->priv->view, + fill_color_node->color); + } + gl_color_node_free (&fill_color_node); + + gl_debug (DEBUG_PROPERTY_BAR, "END"); + + property_bar->priv->stop_signals = FALSE; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Line color combo changed. */ +/*--------------------------------------------------------------------------*/ +static void +line_color_changed_cb (ColorCombo *cc, + GdkColor *gdk_color, + gboolean custom, + gboolean by_user, + gboolean is_default, + glUIPropertyBar *property_bar) +{ + glColorNode *line_color_node; + + g_return_if_fail (property_bar && GL_IS_UI_PROPERTY_BAR (property_bar)); + + if (property_bar->priv->stop_signals) return; + property_bar->priv->stop_signals = TRUE; + + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + line_color_node = gl_color_node_new_default (); + line_color_node->color = gl_color_from_gdk_color (gdk_color); + + gl_debug (DEBUG_PROPERTY_BAR, "Color=%08x, Custom=%d, By_User=%d, Is_default=%d", + line_color_node->color, custom, by_user, is_default); + + if (is_default) + { + line_color_node->color = GL_COLOR_NONE; + gl_view_set_selection_line_color (property_bar->priv->view, + line_color_node); + gl_view_set_default_line_color (property_bar->priv->view, + line_color_node->color); + } + else + { + gl_view_set_selection_line_color (property_bar->priv->view, + line_color_node); + gl_view_set_default_line_color (property_bar->priv->view, + line_color_node->color); + } + gl_color_node_free (&line_color_node); + + gl_debug (DEBUG_PROPERTY_BAR, "END"); + + property_bar->priv->stop_signals = FALSE; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Line width spin button changed. */ +/*--------------------------------------------------------------------------*/ +static void +line_width_changed_cb (GtkSpinButton *spin, + glUIPropertyBar *property_bar) +{ + gdouble line_width; + + if (property_bar->priv->stop_signals) return; + property_bar->priv->stop_signals = TRUE; + + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + if (property_bar->priv->view) + { + line_width = gtk_spin_button_get_value (spin); + + gl_view_set_selection_line_width (property_bar->priv->view, + line_width); + gl_view_set_default_line_width (property_bar->priv->view, + line_width); + } + + gl_debug (DEBUG_PROPERTY_BAR, "END"); + + property_bar->priv->stop_signals = FALSE; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Font bold toggled callback. */ +/*---------------------------------------------------------------------------*/ +static void +font_bold_toggled_cb (GtkToggleToolButton *toggle, + glUIPropertyBar *property_bar) +{ + gboolean state; + PangoWeight weight; + + + if (property_bar->priv->stop_signals) return; + property_bar->priv->stop_signals = TRUE; + + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + state = gtk_toggle_tool_button_get_active (toggle); + + weight = state ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL; + + gl_view_set_selection_font_weight (property_bar->priv->view, weight); + gl_view_set_default_font_weight (property_bar->priv->view, weight); + + gl_debug (DEBUG_PROPERTY_BAR, "END"); + + property_bar->priv->stop_signals = FALSE; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Font italic toggled callback. */ +/*---------------------------------------------------------------------------*/ +static void +font_italic_toggled_cb (GtkToggleToolButton *toggle, + glUIPropertyBar *property_bar) +{ + gboolean state; + + if (property_bar->priv->stop_signals) return; + property_bar->priv->stop_signals = TRUE; + + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + state = gtk_toggle_tool_button_get_active (toggle); + + gl_view_set_selection_font_italic_flag (property_bar->priv->view, state); + gl_view_set_default_font_italic_flag (property_bar->priv->view, state); + + gl_debug (DEBUG_PROPERTY_BAR, "END"); + + property_bar->priv->stop_signals = FALSE; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Text align toggled callback. */ +/*---------------------------------------------------------------------------*/ +static void +text_align_toggled_cb (GtkToggleToolButton *toggle, + glUIPropertyBar *property_bar) +{ + if (property_bar->priv->stop_signals) return; + property_bar->priv->stop_signals = TRUE; + + gl_debug (DEBUG_PROPERTY_BAR, "START"); + + if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->text_align_left_radio))) + { + gl_view_set_selection_text_alignment (property_bar->priv->view, + PANGO_ALIGN_LEFT); + gl_view_set_default_text_alignment (property_bar->priv->view, + PANGO_ALIGN_LEFT); + } + + if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->text_align_center_radio))) + { + gl_view_set_selection_text_alignment (property_bar->priv->view, + PANGO_ALIGN_CENTER); + gl_view_set_default_text_alignment (property_bar->priv->view, + PANGO_ALIGN_CENTER); + } + + if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (property_bar->priv->text_align_right_radio))) + { + gl_view_set_selection_text_alignment (property_bar->priv->view, + PANGO_ALIGN_RIGHT); + gl_view_set_default_text_alignment (property_bar->priv->view, + PANGO_ALIGN_RIGHT); + } + + gl_debug (DEBUG_PROPERTY_BAR, "END"); + + property_bar->priv->stop_signals = FALSE; +} + + +/*****************************************************************************/ +/* Construct color combo "Custom widget". */ +/*****************************************************************************/ +GtkWidget * +gl_ui_property_bar_construct_color_combo (gchar *name, + gchar *string1, + gchar *string2, + gint int1, + gint int2) +{ + GtkWidget *color_combo; + ColorGroup *cg; + gchar *cg_name; + guint color; + GdkColor *gdk_color; + gchar *no_color; + GdkPixbuf *pixbuf = NULL; + + switch (int1) { + + case 0: + cg_name = "text_color_group"; + color = gl_prefs->default_text_color; + no_color = _("Default"); + pixbuf = gdk_pixbuf_new_from_inline (-1, stock_text_24, FALSE, NULL); + break; + + case 2: + cg_name = "line_color_group"; + color = gl_prefs->default_line_color; + no_color = _("No line"); + pixbuf = gdk_pixbuf_new_from_inline (-1, stock_pencil_24, FALSE, NULL); + break; + + case 1: + default: + cg_name = "fill_color_group"; + color = gl_prefs->default_fill_color; + no_color = _("No fill"); + pixbuf = gdk_pixbuf_new_from_inline (-1, stock_bucket_fill_24, FALSE, NULL); + break; + + } + + cg = color_group_fetch (cg_name, NULL); + gdk_color = gl_color_to_gdk_color (color); + color_combo = color_combo_new (pixbuf, no_color, gdk_color, cg); + g_free (gdk_color); + + color_combo_box_set_preview_relief (COLOR_COMBO(color_combo), GTK_RELIEF_NORMAL); + + g_object_unref (G_OBJECT (pixbuf)); + + return color_combo; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Set sensitivity of doc controls. */ +/*---------------------------------------------------------------------------*/ +static void +set_doc_items_sensitive (glUIPropertyBar *property_bar, + gboolean state) +{ + gtk_widget_set_sensitive (property_bar->priv->font_family_combo, state); + gtk_widget_set_sensitive (property_bar->priv->font_size_spin, state); + gtk_widget_set_sensitive (property_bar->priv->font_bold_toggle, state); + gtk_widget_set_sensitive (property_bar->priv->font_italic_toggle, state); + gtk_widget_set_sensitive (property_bar->priv->text_align_left_radio, state); + gtk_widget_set_sensitive (property_bar->priv->text_align_center_radio, state); + gtk_widget_set_sensitive (property_bar->priv->text_align_right_radio, state); + gtk_widget_set_sensitive (property_bar->priv->text_color_combo, state); + gtk_widget_set_sensitive (property_bar->priv->fill_color_combo, state); + gtk_widget_set_sensitive (property_bar->priv->line_color_combo, state); + gtk_widget_set_sensitive (property_bar->priv->line_width_spin, state); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Set sensitivity of text related controls. */ +/*---------------------------------------------------------------------------*/ +static void +set_text_items_sensitive (glUIPropertyBar *property_bar, + gboolean state) +{ + gtk_widget_set_sensitive (property_bar->priv->font_family_combo, state); + gtk_widget_set_sensitive (property_bar->priv->font_size_spin, state); + gtk_widget_set_sensitive (property_bar->priv->font_bold_toggle, state); + gtk_widget_set_sensitive (property_bar->priv->font_italic_toggle, state); + gtk_widget_set_sensitive (property_bar->priv->text_align_left_radio, state); + gtk_widget_set_sensitive (property_bar->priv->text_align_center_radio, state); + gtk_widget_set_sensitive (property_bar->priv->text_align_right_radio, state); + gtk_widget_set_sensitive (property_bar->priv->text_color_combo, state); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Set sensitivity of fill related controls. */ +/*---------------------------------------------------------------------------*/ +static void +set_fill_items_sensitive (glUIPropertyBar *property_bar, + gboolean state) +{ + gtk_widget_set_sensitive (property_bar->priv->fill_color_combo, state); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Set sensitivity of line color related controls. */ +/*---------------------------------------------------------------------------*/ +static void +set_line_color_items_sensitive (glUIPropertyBar *property_bar, + gboolean state) +{ + gtk_widget_set_sensitive (property_bar->priv->line_color_combo, state); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Set sensitivity of line width related controls. */ +/*---------------------------------------------------------------------------*/ +static void +set_line_width_items_sensitive (glUIPropertyBar *property_bar, + gboolean state) +{ + gtk_widget_set_sensitive (property_bar->priv->line_width_spin, state); +} + + diff --git a/glabels2/src/ui-property-bar.h b/glabels2/src/ui-property-bar.h new file mode 100644 index 00000000..e2af1912 --- /dev/null +++ b/glabels2/src/ui-property-bar.h @@ -0,0 +1,74 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/** + * (GLABELS) Label and Business Card Creation program for GNOME + * + * ui-property-bar.h: Property toolbar header file + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __UI_PROPERTY_BAR_H__ +#define __UI_PROPERTY_BAR_H__ + +#include + +#include "view.h" + +G_BEGIN_DECLS + +#define GL_TYPE_UI_PROPERTY_BAR (gl_ui_property_bar_get_type ()) +#define GL_UI_PROPERTY_BAR(obj) \ + (GTK_CHECK_CAST((obj), GL_TYPE_UI_PROPERTY_BAR, glUIPropertyBar )) +#define GL_UI_PROPERTY_BAR_CLASS(klass) \ + (GTK_CHECK_CLASS_CAST ((klass), GL_TYPE_UI_PROPERTY_BAR, glUIPropertyBarClass)) +#define GL_IS_UI_PROPERTY_BAR(obj) \ + (GTK_CHECK_TYPE ((obj), GL_TYPE_UI_PROPERTY_BAR)) +#define GL_IS_UI_PROPERTY_BAR_CLASS(klass) \ + (GTK_CHECK_CLASS_TYPE ((klass), GL_TYPE_UI_PROPERTY_BAR)) + +typedef struct _glUIPropertyBar glUIPropertyBar; +typedef struct _glUIPropertyBarClass glUIPropertyBarClass; + +typedef struct _glUIPropertyBarPrivate glUIPropertyBarPrivate; + +struct _glUIPropertyBar { + GtkHBox parent_widget; + + glUIPropertyBarPrivate *priv; + +}; + +struct _glUIPropertyBarClass { + GtkHBoxClass parent_class; +}; + +GType gl_ui_property_bar_get_type (void) G_GNUC_CONST; + +GtkWidget *gl_ui_property_bar_new (void); + +void gl_ui_property_bar_set_view (glUIPropertyBar *property_bar, + glView *view); + +void gl_ui_property_bar_set_tooltips (glUIPropertyBar *property_bar, + gboolean state); + + + +G_END_DECLS + +#endif /* __UI_PROPERTY_BAR_H__ */ diff --git a/glabels2/src/ui-sidebar.c b/glabels2/src/ui-sidebar.c new file mode 100644 index 00000000..924b0fa2 --- /dev/null +++ b/glabels2/src/ui-sidebar.c @@ -0,0 +1,216 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/** + * (GLABELS) Label and Business Card Creation program for GNOME + * + * ui-sidebar.c: Object property sidebar + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "ui-sidebar.h" + +#include + +#include "ui-util.h" +#include "object-editor.h" +#include "stock.h" + +#include "debug.h" + +/*===========================================================================*/ +/* Private macros and constants. */ +/*===========================================================================*/ + +#define DEFAULT_SIDEBAR_WIDTH 340 + +/*===========================================================================*/ +/* Private data types */ +/*===========================================================================*/ + +struct _glUISidebarPrivate { + + glView *view; + + GtkWidget *child; + GtkWidget *empty_child; +}; + +/*===========================================================================*/ +/* Private globals */ +/*===========================================================================*/ + + +/*===========================================================================*/ +/* Local function prototypes */ +/*===========================================================================*/ + +static void gl_ui_sidebar_finalize (GObject *object); + +static void gl_ui_sidebar_construct (glUISidebar *sidebar); + +static void selection_changed_cb (glView *view, + glUISidebar *sidebar); + + + +/****************************************************************************/ +/* Boilerplate Object stuff. */ +/****************************************************************************/ +G_DEFINE_TYPE (glUISidebar, gl_ui_sidebar, GTK_TYPE_VBOX); + +static void +gl_ui_sidebar_class_init (glUISidebarClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_debug (DEBUG_UI, "START"); + + gl_ui_sidebar_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_ui_sidebar_finalize; + + gl_debug (DEBUG_UI, "END"); +} + +static void +gl_ui_sidebar_init (glUISidebar *sidebar) +{ + gl_debug (DEBUG_UI, "START"); + + sidebar->priv = g_new0 (glUISidebarPrivate, 1); + + gl_debug (DEBUG_UI, "END"); +} + +static void +gl_ui_sidebar_finalize (GObject *object) +{ + glUISidebar *sidebar = GL_UI_SIDEBAR (object); + + gl_debug (DEBUG_UI, "START"); + + g_return_if_fail (object != NULL); + g_return_if_fail (GL_IS_UI_SIDEBAR (object)); + + if (sidebar->priv->view) { + g_object_unref (G_OBJECT(sidebar->priv->view)); + } + g_free (sidebar->priv); + + G_OBJECT_CLASS (gl_ui_sidebar_parent_class)->finalize (object); + + gl_debug (DEBUG_UI, "END"); +} + +/****************************************************************************/ +/* Create a NEW sidebar. */ +/****************************************************************************/ +GtkWidget * +gl_ui_sidebar_new (void) +{ + glUISidebar *sidebar; + + gl_debug (DEBUG_UI, "START"); + + sidebar = g_object_new (gl_ui_sidebar_get_type (), NULL); + + gtk_widget_set_size_request (GTK_WIDGET (sidebar), DEFAULT_SIDEBAR_WIDTH, -1); + + gl_ui_sidebar_construct (sidebar); + + gl_debug (DEBUG_UI, "END"); + + return GTK_WIDGET(sidebar); +} + +/******************************************************************************/ +/* Initialize property toolbar. */ +/******************************************************************************/ +static void +gl_ui_sidebar_construct (glUISidebar *sidebar) +{ + gl_debug (DEBUG_UI, "START"); + + sidebar->priv->empty_child = gl_object_editor_new (GL_STOCK_PROPERTIES, + _("Object properties"), + GL_OBJECT_EDITOR_EMPTY, + NULL); + + sidebar->priv->child = gtk_widget_ref (sidebar->priv->empty_child); + gtk_widget_show (sidebar->priv->child); + gtk_container_add (GTK_CONTAINER(sidebar), sidebar->priv->child); + + gtk_widget_set_sensitive (GTK_WIDGET (sidebar), FALSE); + + gl_debug (DEBUG_UI, "END"); +} + +/****************************************************************************/ +/* Set view associated with sidebar. */ +/****************************************************************************/ +void +gl_ui_sidebar_set_view (glUISidebar *sidebar, + glView *view) +{ + gl_debug (DEBUG_UI, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + gtk_widget_set_sensitive (GTK_WIDGET (sidebar), TRUE); + + sidebar->priv->view = GL_VIEW (g_object_ref (G_OBJECT (view))); + + g_signal_connect (G_OBJECT(view), "selection_changed", + G_CALLBACK(selection_changed_cb), sidebar); + + gl_debug (DEBUG_UI, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. View "selection state changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +selection_changed_cb (glView *view, + glUISidebar *sidebar) +{ + gl_debug (DEBUG_UI, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + g_return_if_fail (sidebar && GL_IS_UI_SIDEBAR (sidebar)); + + gtk_container_remove (GTK_CONTAINER(sidebar), sidebar->priv->child); + + if (gl_view_is_selection_empty (view) || !gl_view_is_selection_atomic (view)) { + + sidebar->priv->child = gtk_widget_ref (sidebar->priv->empty_child); + + } else { + + sidebar->priv->child = gtk_widget_ref (gl_view_get_editor (view)); + + } + + gtk_widget_show (sidebar->priv->child); + + gtk_box_pack_start (GTK_BOX(sidebar), sidebar->priv->child, TRUE, TRUE, 0); + + gl_debug (DEBUG_UI, "END"); +} + diff --git a/glabels2/src/ui-sidebar.h b/glabels2/src/ui-sidebar.h new file mode 100644 index 00000000..9ec1264d --- /dev/null +++ b/glabels2/src/ui-sidebar.h @@ -0,0 +1,69 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/** + * (GLABELS) Label and Business Card Creation program for GNOME + * + * ui-sidebar.h: Object property sidebar header file + * + * Copyright (C) 2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __UI_SIDEBAR_H__ +#define __UI_SIDEBAR_H__ + +#include + +#include "view.h" + +G_BEGIN_DECLS + +#define GL_TYPE_UI_SIDEBAR (gl_ui_sidebar_get_type ()) +#define GL_UI_SIDEBAR(obj) \ + (GTK_CHECK_CAST((obj), GL_TYPE_UI_SIDEBAR, glUISidebar )) +#define GL_UI_SIDEBAR_CLASS(klass) \ + (GTK_CHECK_CLASS_CAST ((klass), GL_TYPE_UI_SIDEBAR, glUISidebarClass)) +#define GL_IS_UI_SIDEBAR(obj) \ + (GTK_CHECK_TYPE ((obj), GL_TYPE_UI_SIDEBAR)) +#define GL_IS_UI_SIDEBAR_CLASS(klass) \ + (GTK_CHECK_CLASS_TYPE ((klass), GL_TYPE_UI_SIDEBAR)) + +typedef struct _glUISidebar glUISidebar; +typedef struct _glUISidebarClass glUISidebarClass; + +typedef struct _glUISidebarPrivate glUISidebarPrivate; + +struct _glUISidebar { + GtkVBox parent_widget; + + glUISidebarPrivate *priv; +}; + +struct _glUISidebarClass { + GtkVBoxClass parent_class; +}; + +GType gl_ui_sidebar_get_type (void) G_GNUC_CONST; + +GtkWidget *gl_ui_sidebar_new (void); + +void gl_ui_sidebar_set_view (glUISidebar *sidebar, + glView *view); + + +G_END_DECLS + +#endif /* __UI_SIDEBAR_H__ */ diff --git a/glabels2/src/ui-util.c b/glabels2/src/ui-util.c new file mode 100644 index 00000000..3a0539df --- /dev/null +++ b/glabels2/src/ui-util.c @@ -0,0 +1,126 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * ui-util.c: GLabels ui utilities module + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "ui-util.h" + +#include +#include + +#include "debug.h" + +/*==========================================================================*/ +/* Private macros and constants. */ +/*==========================================================================*/ + +/*==========================================================================*/ +/* Private types. */ +/*==========================================================================*/ + +/*==========================================================================*/ +/* Private globals */ +/*==========================================================================*/ + +/*==========================================================================*/ +/* Local function prototypes */ +/*==========================================================================*/ + + + +/*****************************************************************************/ +/** Set sensitivity of verb. */ +/*****************************************************************************/ +void +gl_ui_util_set_verb_sensitive (GtkUIManager *ui, + gchar *cname, + gboolean sensitive) +{ + GtkAction *action; + + gl_debug (DEBUG_UI, "START"); + + g_return_if_fail (cname != NULL); + g_return_if_fail (GTK_IS_UI_MANAGER (ui)); + + action = gtk_ui_manager_get_action (ui, cname); + + if (action) { + gl_debug (DEBUG_UI, "Set action \"%s\" sensitive = %d", cname, sensitive); + gtk_action_set_sensitive (action, sensitive); + } + + gl_debug (DEBUG_UI, "END"); +} + +/*****************************************************************************/ +/** Set sensitivity of a list of verbs. */ +/*****************************************************************************/ +void +gl_ui_util_set_verb_list_sensitive (GtkUIManager *ui, + gchar **vlist, + gboolean sensitive) +{ + GtkAction *action; + + gl_debug (DEBUG_UI, "START"); + + g_return_if_fail (vlist != NULL); + g_return_if_fail (GTK_IS_UI_MANAGER (ui)); + + for ( ; *vlist; ++vlist) + { + action = gtk_ui_manager_get_action (ui, *vlist); + + if (action) { + gtk_action_set_sensitive (action, sensitive); + } + } + + gl_debug (DEBUG_UI, "END"); +} + +/*****************************************************************************/ +/** Set state of a verb. */ +/*****************************************************************************/ +void +gl_ui_util_set_verb_state (GtkUIManager *ui, + gchar *cname, + gboolean state) +{ + GtkToggleAction *action; + + gl_debug (DEBUG_UI, "START"); + + g_return_if_fail (cname != NULL); + g_return_if_fail (GTK_IS_UI_MANAGER (ui)); + + action = GTK_TOGGLE_ACTION (gtk_ui_manager_get_action (ui, cname)); + + if (action) { + gtk_toggle_action_set_active (action, state); + } + + gl_debug (DEBUG_UI, "END"); +} + diff --git a/glabels2/src/ui-util.h b/glabels2/src/ui-util.h new file mode 100644 index 00000000..ffa2653e --- /dev/null +++ b/glabels2/src/ui-util.h @@ -0,0 +1,45 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * ui-util.h: GLabels UI utilities module header file + * + * Copyright (C) 2001-2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __GL_UI_UTIL_H__ +#define __GL_UI_UTIL_H__ + +#include + +G_BEGIN_DECLS + +void gl_ui_util_set_verb_sensitive (GtkUIManager *ui, + gchar *cname, + gboolean sensitive); + +void gl_ui_util_set_verb_list_sensitive (GtkUIManager *ui, + gchar **vlist, + gboolean sensitive); + +void gl_ui_util_set_verb_state (GtkUIManager *ui, + gchar *cname, + gboolean state); + +G_END_DECLS + +#endif /* __GL_UI_UTIL_H__ */ diff --git a/glabels2/src/ui.c b/glabels2/src/ui.c new file mode 100644 index 00000000..8f96432a --- /dev/null +++ b/glabels2/src/ui.c @@ -0,0 +1,1178 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * ui.c: GLabels ui module + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "ui.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ui-util.h" +#include "ui-commands.h" +#include "file.h" +#include "prefs.h" +#include "stock.h" +#include "window.h" +#include "recent.h" + +#include "debug.h" + +/*==========================================================================*/ +/* Private macros and constants. */ +/*==========================================================================*/ + +/*==========================================================================*/ +/* Private types. */ +/*==========================================================================*/ + + +/*==========================================================================*/ +/* Local function prototypes */ +/*==========================================================================*/ + +static void view_ui_item_toggled_cb (GtkToggleAction *action, + GtkUIManager *ui); + +static void set_app_main_toolbar_style (GtkUIManager *ui); + +static void set_app_drawing_toolbar_style (GtkUIManager *ui); + +static void set_view_style (GtkUIManager *ui); + +static void connect_proxy_cb (GtkUIManager *ui, + GtkAction *action, + GtkWidget *proxy, + glWindow *window); + +static void disconnect_proxy_cb (GtkUIManager *ui, + GtkAction *action, + GtkWidget *proxy, + glWindow *window); + +static void menu_item_select_cb (GtkMenuItem *proxy, + glWindow *window); + +static void menu_item_deselect_cb (GtkMenuItem *proxy, + glWindow *window); + + +/*==========================================================================*/ +/* Private globals */ +/*==========================================================================*/ + +static GtkActionEntry entries[] = { + + /* Menu entries. */ + { "FileMenu", NULL, N_("_File") }, + { "FileRecentsMenu", NULL, N_("Open Recent _Files") }, + { "EditMenu", NULL, N_("_Edit") }, + { "ViewMenu", NULL, N_("_View") }, + { "ViewMainToolBarMenu", NULL, N_("Customize Main Toolbar") }, + { "ViewDrawingToolBarMenu", NULL, N_("Customize Drawing Toolbar") }, + { "ViewPropertyToolBarMenu", NULL, N_("Customize Properties Toolbar") }, + { "ObjectsMenu", NULL, N_("_Objects") }, + { "ObjectsCreateMenu", NULL, N_("_Create") }, + { "ObjectsOrderMenu", NULL, N_("_Order") }, + { "ObjectsRotateFlipMenu", NULL, N_("_Rotate/Flip") }, + { "ObjectsAlignHorizMenu", NULL, N_("Align _Horizontal") }, + { "ObjectsAlignVertMenu", NULL, N_("Align _Vertical") }, + { "HelpMenu", NULL, N_("_Help") }, + + /* Popup entries. */ + { "ContextMenu", NULL, N_("Context Menu") }, + { "EmptySelectionContextMenu", NULL, N_("Context Menu") }, + + /* File action entries. */ + { "FileNew", + GTK_STOCK_NEW, + N_("_New"), + "N", + N_("Create a new file"), + G_CALLBACK (gl_ui_cmd_file_new) }, + + { "FileOpen", + GTK_STOCK_OPEN, + N_("_Open..."), + "O", + N_("Open a file"), + G_CALLBACK (gl_ui_cmd_file_open) }, + + { "FileSave", + GTK_STOCK_SAVE, + N_("_Save"), + "S", + N_("Save current file"), + G_CALLBACK (gl_ui_cmd_file_save) }, + + { "FileSaveAs", + GTK_STOCK_SAVE, + N_("Save _As..."), + "S", + N_("Save the current file to a different name"), + G_CALLBACK (gl_ui_cmd_file_save_as) }, + + { "FilePrint", + GTK_STOCK_PRINT, + N_("_Print..."), + "P", + N_("Print the current file"), + G_CALLBACK (gl_ui_cmd_file_print) }, + + { "FileProperties", + GTK_STOCK_PROPERTIES, + N_("Properties..."), + NULL, + N_("Modify document properties"), + G_CALLBACK (gl_ui_cmd_file_properties) }, + + { "FileTemplateDesigner", + NULL, + N_("Template _Designer..."), + NULL, + N_("Create a custom template"), + G_CALLBACK (gl_ui_cmd_file_template_designer) }, + + { "FileClose", + GTK_STOCK_CLOSE, + N_("_Close"), + "F4", + N_("Close the current file"), + G_CALLBACK (gl_ui_cmd_file_close) }, + + { "FileQuit", + GTK_STOCK_QUIT, + N_("_Quit"), + "Q", + N_("Quit the program"), + G_CALLBACK (gl_ui_cmd_file_quit) }, + + + /* Edit action entries. */ + { "EditCut", + GTK_STOCK_CUT, + N_("Cut"), + "X", + N_("Cut the selection"), + G_CALLBACK (gl_ui_cmd_edit_cut) }, + + { "EditCopy", + GTK_STOCK_COPY, + N_("Copy"), + "C", + N_("Copy the selection"), + G_CALLBACK (gl_ui_cmd_edit_copy) }, + + { "EditPaste", + GTK_STOCK_PASTE, + N_("Paste"), + "V", + N_("Paste the clipboard"), + G_CALLBACK (gl_ui_cmd_edit_paste) }, + + { "EditDelete", + NULL, + N_("Delete"), + NULL, + N_("Delete the selected objects"), + G_CALLBACK (gl_ui_cmd_edit_delete) }, + + { "EditSelectAll", + NULL, + N_("Select All"), + "A", + N_("Select all objects"), + G_CALLBACK (gl_ui_cmd_edit_select_all) }, + + { "EditUnSelectAll", + NULL, + N_("Un-select All"), + NULL, + N_("Remove all selections"), + G_CALLBACK (gl_ui_cmd_edit_unselect_all) }, + + { "EditPreferences", + GTK_STOCK_PREFERENCES, + N_("Preferences"), + NULL, + N_("Configure the application"), + G_CALLBACK (gl_ui_cmd_edit_preferences) }, + + + /* View action entries. */ + { "ViewZoomIn", + GTK_STOCK_ZOOM_IN, + N_("Zoom in"), + NULL, + N_("Increase magnification"), + G_CALLBACK (gl_ui_cmd_view_zoomin) }, + + { "ViewZoomOut", + GTK_STOCK_ZOOM_OUT, + N_("Zoom out"), + NULL, + N_("Decrease magnification"), + G_CALLBACK (gl_ui_cmd_view_zoomout) }, + + { "ViewZoom1to1", + GTK_STOCK_ZOOM_100, + N_("Zoom 1 to 1"), + NULL, + N_("Restore scale to 100%"), + G_CALLBACK (gl_ui_cmd_view_zoom1to1) }, + + { "ViewZoomToFit", + GTK_STOCK_ZOOM_FIT, + N_("Zoom to fit"), + NULL, + N_("Set scale to fit window"), + G_CALLBACK (gl_ui_cmd_view_zoom_to_fit) }, + + + /* Objects action entries. */ + { "ObjectsArrowMode", + GL_STOCK_ARROW, + N_("Select Mode"), + NULL, + N_("Select, move and modify objects"), + G_CALLBACK (gl_ui_cmd_objects_arrow_mode) }, + + { "ObjectsCreateText", + GL_STOCK_TEXT, + N_("Text"), + NULL, + N_("Create text object"), + G_CALLBACK (gl_ui_cmd_objects_create_text) }, + + { "ObjectsCreateBox", + GL_STOCK_BOX, + N_("Box"), + NULL, + N_("Create box/rectangle object"), + G_CALLBACK (gl_ui_cmd_objects_create_box) }, + + { "ObjectsCreateLine", + GL_STOCK_LINE, + N_("Line"), + NULL, + N_("Create line object"), + G_CALLBACK (gl_ui_cmd_objects_create_line) }, + + { "ObjectsCreateEllipse", + GL_STOCK_ELLIPSE, + N_("Ellipse"), + NULL, + N_("Create ellipse/circle object"), + G_CALLBACK (gl_ui_cmd_objects_create_ellipse) }, + + { "ObjectsCreateImage", + GL_STOCK_IMAGE, + N_("Image"), + NULL, + N_("Create image object"), + G_CALLBACK (gl_ui_cmd_objects_create_image) }, + + { "ObjectsCreateBarcode", + GL_STOCK_BARCODE, + N_("Barcode"), + NULL, + N_("Create barcode object"), + G_CALLBACK (gl_ui_cmd_objects_create_barcode) }, + + { "ObjectsRaise", + GL_STOCK_ORDER_TOP, + N_("Bring to front"), + NULL, + N_("Raise object to top"), + G_CALLBACK (gl_ui_cmd_objects_raise) }, + + { "ObjectsLower", + GL_STOCK_ORDER_BOTTOM, + N_("Send to back"), + NULL, + N_("Lower object to bottom"), + G_CALLBACK (gl_ui_cmd_objects_lower) }, + + { "ObjectsRotateLeft", + GL_STOCK_ROTATE_LEFT, + N_("Rotate left"), + NULL, + N_("Rotate object 90 degrees counter-clockwise"), + G_CALLBACK (gl_ui_cmd_objects_rotate_left) }, + + { "ObjectsRotateRight", + GL_STOCK_ROTATE_RIGHT, + N_("Rotate right"), + NULL, + N_("Rotate object 90 degrees clockwise"), + G_CALLBACK (gl_ui_cmd_objects_rotate_right) }, + + { "ObjectsFlipHorizontal", + GL_STOCK_FLIP_HORIZ, + N_("Flip horizontally"), + NULL, + N_("Flip object horizontally"), + G_CALLBACK (gl_ui_cmd_objects_flip_horiz) }, + + { "ObjectsFlipVertical", + GL_STOCK_FLIP_VERT, + N_("Flip vertically"), + NULL, + N_("Flip object vertically"), + G_CALLBACK (gl_ui_cmd_objects_flip_vert) }, + + { "ObjectsAlignLeft", + GL_STOCK_ALIGN_LEFT, + N_("Align left"), + NULL, + N_("Align objects to left edges"), + G_CALLBACK (gl_ui_cmd_objects_align_left) }, + + { "ObjectsAlignRight", + GL_STOCK_ALIGN_RIGHT, + N_("Align right"), + NULL, + N_("Align objects to right edges"), + G_CALLBACK (gl_ui_cmd_objects_align_right) }, + + { "ObjectsAlignHCenter", + GL_STOCK_ALIGN_HCENTER, + N_("Align horizontal center"), + NULL, + N_("Align objects to horizontal centers"), + G_CALLBACK (gl_ui_cmd_objects_align_hcenter) }, + + { "ObjectsAlignTop", + GL_STOCK_ALIGN_TOP, + N_("Align tops"), + NULL, + N_("Align objects to top edges"), + G_CALLBACK (gl_ui_cmd_objects_align_top) }, + + { "ObjectsAlignBottom", + GL_STOCK_ALIGN_BOTTOM, + N_("Align bottoms"), + NULL, + N_("Align objects to bottom edges"), + G_CALLBACK (gl_ui_cmd_objects_align_bottom) }, + + { "ObjectsAlignVCenter", + GL_STOCK_ALIGN_VCENTER, + N_("Align vertical center"), + NULL, + N_("Align objects to vertical centers"), + G_CALLBACK (gl_ui_cmd_objects_align_vcenter) }, + + { "ObjectsCenterHorizontal", + GL_STOCK_CENTER_HORIZ, + N_("Center horizontally"), + NULL, + N_("Center objects to horizontal label center"), + G_CALLBACK (gl_ui_cmd_objects_center_horiz) }, + + { "ObjectsCenterVertical", + GL_STOCK_CENTER_VERT, + N_("Center vertically"), + NULL, + N_("Center objects to vertical label center"), + G_CALLBACK (gl_ui_cmd_objects_center_vert) }, + + { "ObjectsMergeProperties", + GL_STOCK_MERGE, + N_("Merge properties"), + NULL, + N_("Edit merge properties"), + G_CALLBACK (gl_ui_cmd_objects_merge_properties) }, + + + /* Help actions entries. */ + { "HelpContents", + GTK_STOCK_HELP, + N_("Contents"), + "F1", + N_("Open glabels manual"), + G_CALLBACK (gl_ui_cmd_help_contents) }, + + { "HelpAbout", + GTK_STOCK_ABOUT, + N_("About..."), + NULL, + N_("About glabels"), + G_CALLBACK (gl_ui_cmd_help_about) }, + +}; +static guint n_entries = G_N_ELEMENTS (entries); + +static GtkToggleActionEntry toggle_entries[] = { + + { "ViewPropertyToolBar", + NULL, + N_("Property toolbar"), + NULL, + N_("Change the visibility of the property toolbar in the current window"), + G_CALLBACK (gl_ui_cmd_view_property_bar_toggle), + TRUE }, + + { "ViewPropertyToolBarToolTips", + NULL, + N_("Show tooltips"), + NULL, + N_("Show tooltips for property toolbar"), + G_CALLBACK (gl_ui_cmd_view_property_bar_tips_toggle), + TRUE }, + + { "ViewGrid", + NULL, + N_("Grid"), + NULL, + N_("Change the visibility of the grid in the current window"), + G_CALLBACK (gl_ui_cmd_view_grid_toggle), + TRUE }, + + { "ViewMarkup", + NULL, + N_("Markup"), + NULL, + N_("Change the visibility of markup lines in the current window"), + G_CALLBACK (gl_ui_cmd_view_markup_toggle), + TRUE }, + +}; +static guint n_toggle_entries = G_N_ELEMENTS (toggle_entries); + +static GtkToggleActionEntry ui_toggle_entries[] = { + + { "ViewMainToolBar", + NULL, + N_("Main toolbar"), + NULL, + N_("Change the visibility of the main toolbar in the current window"), + G_CALLBACK (view_ui_item_toggled_cb), + TRUE }, + + { "ViewDrawingToolBar", + NULL, + N_("Drawing toolbar"), + NULL, + N_("Change the visibility of the drawing toolbar in the current window"), + G_CALLBACK (view_ui_item_toggled_cb), + TRUE }, + + { "ViewMainToolBarToolTips", + NULL, + N_("Show tooltips"), + NULL, + N_("Show tooltips for main toolbar"), + G_CALLBACK (view_ui_item_toggled_cb), + TRUE }, + + { "ViewDrawingToolBarToolTips", + NULL, + N_("Show tooltips"), + NULL, + N_("Show tooltips for drawing toolbar"), + G_CALLBACK (view_ui_item_toggled_cb), + TRUE }, + +}; +static guint n_ui_toggle_entries = G_N_ELEMENTS (ui_toggle_entries); + +static const gchar *ui_info = +"" +"" +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +"" +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +"" +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +"" +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +"" +" " +" " +" " +"" +""; + + +static gchar* doc_verbs [] = { + "/ui/MenuBar/FileMenu/FileProperties", + "/ui/MenuBar/FileMenu/FileSave", + "/ui/MenuBar/FileMenu/FileSaveAs", + "/ui/MenuBar/FileMenu/FilePrint", + "/ui/MenuBar/FileMenu/FileClose", + "/ui/MenuBar/EditMenu/EditCut", + "/ui/MenuBar/EditMenu/EditCopy", + "/ui/MenuBar/EditMenu/EditPaste", + "/ui/MenuBar/EditMenu/EditDelete", + "/ui/MenuBar/EditMenu/EditSelectAll", + "/ui/MenuBar/EditMenu/EditUnSelectAll", + "/ui/MenuBar/ViewMenu/ViewZoomIn", + "/ui/MenuBar/ViewMenu/ViewZoomOut", + "/ui/MenuBar/ViewMenu/ViewZoom1to1", + "/ui/MenuBar/ViewMenu/ViewZoomToFit", + "/ui/MenuBar/ViewMenu/ViewGrid", + "/ui/MenuBar/ViewMenu/ViewMarkup", + "/ui/MenuBar/ObjectsMenu/ObjectsArrowMode", + "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateText", + "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateLine", + "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateBox", + "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateEllipse", + "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateImage", + "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateBarcode", + "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsRaise", + "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsLower", + "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateLeft", + "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateRight", + "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipHorizontal", + "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipVertical", + "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignLeft", + "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignRight", + "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignHCenter", + "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsCenterHorizontal", + "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignTop", + "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignBottom", + "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignVCenter", + "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsCenterVertical", + "/ui/MenuBar/ObjectsMenu/ObjectsMergeProperties", + + NULL +}; + +static gchar* doc_modified_verbs [] = { + "/ui/MenuBar/FileMenu/Save", + + NULL +}; + +static gchar* selection_verbs [] = { + "/ui/MenuBar/EditMenu/EditCut", + "/ui/MenuBar/EditMenu/EditCopy", + "/ui/MenuBar/EditMenu/EditDelete", + "/ui/MenuBar/EditMenu/EditUnSelectAll", + "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsRaise", + "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsLower", + "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateLeft", + "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateRight", + "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipHorizontal", + "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipVertical", + "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsCenterHorizontal", + "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsCenterVertical", + + NULL +}; + +static gchar* atomic_selection_verbs [] = { + + NULL +}; + +static gchar* multi_selection_verbs [] = { + "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignLeft", + "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignRight", + "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignHCenter", + "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignTop", + "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignBottom", + "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignVCenter", + + NULL +}; + + +/*****************************************************************************/ +/** Initialize UI component for given window. */ +/*****************************************************************************/ +GtkUIManager * +gl_ui_new (glWindow *window) +{ + GtkUIManager *ui; + GtkActionGroup *actions; + GError *error = NULL; + GtkWidget *recent_menu; + + gl_debug (DEBUG_UI, "START"); + + g_return_val_if_fail (window && GL_IS_WINDOW (window), NULL); + + gl_debug (DEBUG_UI, "window = %p", window); + + ui = gtk_ui_manager_new (); + + g_signal_connect (ui, "connect_proxy", + G_CALLBACK (connect_proxy_cb), window); + g_signal_connect (ui, "disconnect_proxy", + G_CALLBACK (disconnect_proxy_cb), window); + + actions = gtk_action_group_new ("Actions"); + gtk_action_group_add_actions (actions, entries, n_entries, GTK_WINDOW (window)); + gtk_action_group_add_toggle_actions (actions, + toggle_entries, n_toggle_entries, + window); + gtk_action_group_add_toggle_actions (actions, + ui_toggle_entries, n_ui_toggle_entries, + ui); + + gtk_ui_manager_insert_action_group (ui, actions, 0); + gtk_window_add_accel_group (GTK_WINDOW (window), gtk_ui_manager_get_accel_group (ui)); + + gl_debug (DEBUG_UI, "Creating ui from string"); + if (!gtk_ui_manager_add_ui_from_string (ui, ui_info, strlen (ui_info), &error)) { + g_message ("building menus failed: %s", error->message); + g_error_free (error); + } + + /* Set the toolbar styles according to prefs */ + set_app_main_toolbar_style (ui); + set_app_drawing_toolbar_style (ui); + + /* Set view grid and markup visibility according to prefs */ + set_view_style (ui); + + /* add an Open Recents Submenu */ + recent_menu = gl_recent_create_menu (); + g_signal_connect (G_OBJECT (recent_menu), "item-activated", + G_CALLBACK (gl_ui_cmd_file_open_recent), window); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget (ui, "/MenuBar/FileMenu/FileRecentsMenu")), + recent_menu); + + + gl_ui_util_set_verb_list_sensitive (ui, doc_verbs, FALSE); + + gl_debug (DEBUG_UI, "END"); + + return ui; +} + +/*****************************************************************************/ +/** Unref wrapper. */ +/*****************************************************************************/ +void +gl_ui_unref (GtkUIManager *ui) +{ + gl_debug (DEBUG_UI, "START"); + + g_object_unref(ui); + + gl_debug (DEBUG_UI, "END"); +} + +/*****************************************************************************/ +/** Update all verbs of given UI component. */ +/*****************************************************************************/ +void +gl_ui_update_all (GtkUIManager *ui, + glView *view) +{ + glLabel *label; + + gl_debug (DEBUG_UI, "START"); + + gl_ui_util_set_verb_list_sensitive (ui, doc_verbs, TRUE); + + label = view->label; + g_return_if_fail (label != NULL); + + gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditUndo", + gl_label_can_undo (label)); + gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditRedo", + gl_label_can_redo (label)); + + gl_ui_util_set_verb_list_sensitive (ui, doc_modified_verbs, + gl_label_is_modified (label)); + + gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomIn", + !gl_view_is_zoom_max (view)); + gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomOut", + !gl_view_is_zoom_min (view)); + + gl_ui_util_set_verb_list_sensitive (ui, selection_verbs, + !gl_view_is_selection_empty (view)); + + gl_ui_util_set_verb_list_sensitive (ui, atomic_selection_verbs, + gl_view_is_selection_atomic (view)); + + gl_ui_util_set_verb_list_sensitive (ui, multi_selection_verbs, + !gl_view_is_selection_empty (view) + && !gl_view_is_selection_atomic (view)); + + gl_debug (DEBUG_UI, "END"); +} + +/*****************************************************************************/ +/** Update all verbs of given UI component to "no document" state. */ +/*****************************************************************************/ +void +gl_ui_update_nodoc (GtkUIManager *ui) +{ + gl_debug (DEBUG_UI, "START"); + + gl_ui_util_set_verb_list_sensitive (ui, doc_verbs, FALSE); + + gl_debug (DEBUG_UI, "END"); +} + +/*****************************************************************************/ +/** Update label modified verbs of given UI component. */ +/*****************************************************************************/ +void +gl_ui_update_modified_verbs (GtkUIManager *ui, + glLabel *label) +{ + gl_debug (DEBUG_UI, "START"); + + gl_ui_util_set_verb_list_sensitive (ui, + doc_modified_verbs, + gl_label_is_modified (label)); + + gl_debug (DEBUG_UI, "END"); +} + +/*****************************************************************************/ +/** Update verbs associated with selection state of given UI component. */ +/*****************************************************************************/ +void +gl_ui_update_selection_verbs (GtkUIManager *ui, + glView *view) +{ + gl_debug (DEBUG_UI, "START"); + + gl_ui_util_set_verb_list_sensitive (ui, selection_verbs, + !gl_view_is_selection_empty (view)); + + gl_ui_util_set_verb_list_sensitive (ui, atomic_selection_verbs, + gl_view_is_selection_atomic (view)); + + gl_ui_util_set_verb_list_sensitive (ui, multi_selection_verbs, + !gl_view_is_selection_empty (view) + && !gl_view_is_selection_atomic (view)); + + gl_debug (DEBUG_UI, "END"); +} + +/*****************************************************************************/ +/** Update verbs associated with zoom level of given UI component. */ +/*****************************************************************************/ +void +gl_ui_update_zoom_verbs (GtkUIManager *ui, + glView *view) +{ + gl_debug (DEBUG_UI, "START"); + + gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomIn", + !gl_view_is_zoom_max (view)); + gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomOut", + !gl_view_is_zoom_min (view)); + + gl_debug (DEBUG_UI, "END"); +} + +/*****************************************************************************/ +/** Update undo/redo verbs of given UI component. */ +/*****************************************************************************/ +void +gl_ui_update_undo_redo_verbs (GtkUIManager *ui, + glLabel *label) +{ + gl_debug (DEBUG_UI, "START"); + + gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditUndo", + gl_label_can_undo (label)); + + gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditRedo", + gl_label_can_redo (label)); + + gl_debug (DEBUG_UI, "END"); +} + +/*---------------------------------------------------------------------------*/ +/** PRIVATE. View menu item toggled callback. */ +/*---------------------------------------------------------------------------*/ +static void +view_ui_item_toggled_cb (GtkToggleAction *action, + GtkUIManager *ui) +{ + const gchar *name; + gboolean state; + + gl_debug (DEBUG_UI, "START"); + + g_return_if_fail (action && GTK_IS_TOGGLE_ACTION (action)); + + name = gtk_action_get_name (GTK_ACTION (action)); + state = gtk_toggle_action_get_active (action); + + gl_debug (DEBUG_UI, "Action = %s, State = %d", name, state); + + if (strcmp (name, "ViewMainToolBar") == 0) + { + gl_prefs->main_toolbar_visible = state; + set_app_main_toolbar_style (ui); + gl_prefs_model_save_settings (gl_prefs); + } + + if (strcmp (name, "ViewMainToolBarToolTips") == 0) + { + gl_prefs->main_toolbar_view_tooltips = state; + set_app_main_toolbar_style (ui); + gl_prefs_model_save_settings (gl_prefs); + } + + if (strcmp (name, "ViewDrawingToolBar") == 0) + { + gl_prefs->drawing_toolbar_visible = state; + set_app_drawing_toolbar_style (ui); + gl_prefs_model_save_settings (gl_prefs); + } + + if (strcmp (name, "ViewDrawingToolBarToolTips") == 0) + { + gl_prefs->drawing_toolbar_view_tooltips = state; + set_app_drawing_toolbar_style (ui); + gl_prefs_model_save_settings (gl_prefs); + } + + gl_debug (DEBUG_UI, ""); +} + +/*---------------------------------------------------------------------------*/ +/** PRIVATE. Set main toolbar style. */ +/*---------------------------------------------------------------------------*/ +static void +set_app_main_toolbar_style (GtkUIManager *ui) +{ + GtkWidget *toolbar; + + gl_debug (DEBUG_UI, "START"); + + g_return_if_fail (ui && GTK_IS_UI_MANAGER (ui)); + + /* Updated view menu */ + gl_ui_util_set_verb_state (ui, "/ui/ViewMenu/ViewMainToolBar", + gl_prefs->main_toolbar_visible); + + gl_ui_util_set_verb_sensitive (ui, "/ui/ViewMenu/ViewMainToolBarToolTips", + gl_prefs->main_toolbar_visible); + + gl_ui_util_set_verb_state (ui, "/ui/ViewMenu/ViewMainToolBarToolTips", + gl_prefs->main_toolbar_view_tooltips); + + + toolbar = gtk_ui_manager_get_widget (ui, "/MainToolBar"); + + gtk_toolbar_set_tooltips (GTK_TOOLBAR (toolbar), + gl_prefs->main_toolbar_view_tooltips); + + if (gl_prefs->main_toolbar_visible) { + gtk_widget_show_all (toolbar); + } else { + gtk_widget_hide (toolbar); + } + + gl_debug (DEBUG_UI, "END"); +} + + +/*---------------------------------------------------------------------------*/ +/** PRIVATE. Set drawing toolbar style. */ +/*---------------------------------------------------------------------------*/ +static void +set_app_drawing_toolbar_style (GtkUIManager *ui) +{ + GtkWidget *toolbar; + + gl_debug (DEBUG_UI, "START"); + + g_return_if_fail (ui && GTK_IS_UI_MANAGER (ui)); + + /* Updated view menu */ + gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewDrawingToolBar", + gl_prefs->drawing_toolbar_visible); + + gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewDrawingToolBarToolTips", + gl_prefs->drawing_toolbar_visible); + + gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenuDrawingToolBarToolTips", + gl_prefs->drawing_toolbar_view_tooltips); + + + toolbar = gtk_ui_manager_get_widget (ui, "/DrawingToolBar"); + + gtk_toolbar_set_tooltips (GTK_TOOLBAR (toolbar), + gl_prefs->drawing_toolbar_view_tooltips); + + gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS); + + if (gl_prefs->drawing_toolbar_visible) { + gtk_widget_show_all (toolbar); + } else { + gtk_widget_hide (toolbar); + } + + gl_debug (DEBUG_UI, "END"); +} + +/*---------------------------------------------------------------------------*/ +/** PRIVATE. Set visibility of grid and markup. */ +/*---------------------------------------------------------------------------*/ +static void +set_view_style (GtkUIManager *ui) +{ + gl_debug (DEBUG_UI, "START"); + + g_return_if_fail (ui && GTK_IS_UI_MANAGER(ui)); + + gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewGrid", + gl_prefs->grid_visible); + + gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewMarkup", + gl_prefs->markup_visible); + + gl_debug (DEBUG_UI, "END"); +} + +/*---------------------------------------------------------------------------*/ +/** PRIVATE. Connect proxy callback. */ +/*---------------------------------------------------------------------------*/ +static void +connect_proxy_cb (GtkUIManager *ui, + GtkAction *action, + GtkWidget *proxy, + glWindow *window) +{ + if (GTK_IS_MENU_ITEM (proxy)) + { + g_signal_connect (proxy, "select", + G_CALLBACK (menu_item_select_cb), window); + g_signal_connect (proxy, "deselect", + G_CALLBACK (menu_item_deselect_cb), window); + } +} + +/*---------------------------------------------------------------------------*/ +/** PRIVATE. Disconnect proxy callback. */ +/*---------------------------------------------------------------------------*/ +static void +disconnect_proxy_cb (GtkUIManager *ui, + GtkAction *action, + GtkWidget *proxy, + glWindow *window) +{ + if (GTK_IS_MENU_ITEM (proxy)) + { + g_signal_handlers_disconnect_by_func + (proxy, G_CALLBACK (menu_item_select_cb), window); + g_signal_handlers_disconnect_by_func + (proxy, G_CALLBACK (menu_item_deselect_cb), window); + } +} + +/*---------------------------------------------------------------------------*/ +/** PRIVATE. Menu item select callback. */ +/*---------------------------------------------------------------------------*/ +static void +menu_item_select_cb (GtkMenuItem *proxy, + glWindow *window) +{ + GtkAction *action; + char *message; + + g_return_if_fail (window && GL_IS_WINDOW (window)); + g_return_if_fail (window->status_bar && GTK_IS_STATUSBAR (window->status_bar)); + + action = g_object_get_data (G_OBJECT (proxy), "gtk-action"); + g_return_if_fail (action != NULL); + + g_object_get (G_OBJECT (action), "tooltip", &message, NULL); + if (message) + { + gtk_statusbar_push (GTK_STATUSBAR (window->status_bar), + window->menu_tips_context_id, message); + g_free (message); + } +} + +/*---------------------------------------------------------------------------*/ +/** PRIVATE. Menu item deselect callback. */ +/*---------------------------------------------------------------------------*/ +static void +menu_item_deselect_cb (GtkMenuItem *proxy, + glWindow *window) +{ + g_return_if_fail (window && GL_IS_WINDOW (window)); + g_return_if_fail (window->status_bar && GTK_IS_STATUSBAR (window->status_bar)); + + gtk_statusbar_pop (GTK_STATUSBAR (window->status_bar), + window->menu_tips_context_id); +} + diff --git a/glabels2/src/ui.h b/glabels2/src/ui.h new file mode 100644 index 00000000..19135d53 --- /dev/null +++ b/glabels2/src/ui.h @@ -0,0 +1,57 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * ui.h: GLabels UI module header file + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __GL_UI_H__ +#define __GL_UI_H__ + +#include + +#include "window.h" +#include "view.h" + +G_BEGIN_DECLS + +GtkUIManager *gl_ui_new (glWindow *window); + +void gl_ui_unref (GtkUIManager *ui); + +void gl_ui_update_all (GtkUIManager *ui, + glView *view); + +void gl_ui_update_nodoc (GtkUIManager *ui); + +void gl_ui_update_modified_verbs (GtkUIManager *ui, + glLabel *label); + +void gl_ui_update_selection_verbs (GtkUIManager *ui, + glView *view); + +void gl_ui_update_zoom_verbs (GtkUIManager *ui, + glView *view); + +void gl_ui_update_undo_redo_verbs (GtkUIManager *ui, + glLabel *label); + +G_END_DECLS + +#endif /* __GL_UI_H__ */ diff --git a/glabels2/src/util.c b/glabels2/src/util.c new file mode 100644 index 00000000..6d9331b3 --- /dev/null +++ b/glabels2/src/util.c @@ -0,0 +1,355 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * util.c: various small utility functions + * + * Copyright (C) 2001 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "util.h" + +#include +#include +#include +#include +#include +#include + +#define FRAC_EPSILON 0.00005 + + +/****************************************************************************/ +/* Append ".glabels" extension to filename if needed. */ +/****************************************************************************/ +gchar * +gl_util_add_extension (const gchar *orig_filename) +{ + gchar *new_filename, *extension; + + extension = strrchr (orig_filename, '.'); + if (extension == NULL) { + new_filename = g_strconcat (orig_filename, ".glabels", NULL); + } else { + if (g_strcasecmp (extension, ".glabels") != 0) { + new_filename = + g_strconcat (orig_filename, ".glabels", NULL); + } else { + new_filename = g_strdup (orig_filename); + } + } + + return new_filename; +} + +/****************************************************************************/ +/* Remove ".glabels" extension from filename if needed. */ +/****************************************************************************/ +gchar * +gl_util_remove_extension (const gchar *orig_filename) +{ + gchar *new_filename, *extension; + + new_filename = g_strdup (orig_filename); + + extension = strrchr (new_filename, '.'); + if (extension != NULL) { + if (g_strcasecmp (extension, ".glabels") == 0) { + *extension = 0; /* truncate string, rm extension */ + } + } + + return new_filename; +} + +/****************************************************************************/ +/* Make sure we have an absolute path to filename. */ +/****************************************************************************/ +gchar * +gl_util_make_absolute (const gchar *filename) +{ + gchar *pwd, *absolute_filename; + + if (g_path_is_absolute (filename)) { + absolute_filename = g_strdup (filename); + } else { + pwd = g_get_current_dir (); + absolute_filename = g_build_filename (pwd, filename, NULL); + g_free (pwd); + } + + return absolute_filename; +} + +/****************************************************************************/ +/* Create fractional representation of number, if possible. */ +/****************************************************************************/ +gchar * +gl_util_fraction (gdouble x) +{ + static gdouble denom[] = { 1., 2., 3., 4., 8., 16., 32., 0. }; + gint i; + gdouble product, remainder; + gint n, d; + + for ( i=0; denom[i] != 0.0; i++ ) { + product = x * denom[i]; + remainder = fabs(product - ((gint)(product+0.5))); + if ( remainder < FRAC_EPSILON ) break; + } + + if ( denom[i] == 0.0 ) { + /* None of our denominators work. */ + return g_strdup_printf ("%.5g", x); + } + if ( denom[i] == 1.0 ) { + /* Simple integer. */ + return g_strdup_printf ("%d", (gint)x); + } + n = (gint)( x * denom[i] + 0.5 ); + d = (gint)denom[i]; + if ( n > d ) { + return g_strdup_printf ("%d_%d/%d", (n/d), (n%d), d); + } else { + return g_strdup_printf ("%d/%d", (n%d), d); + } +} + +/****************************************************************************/ +/* Utilities to deal with PangoAlignment types. */ +/****************************************************************************/ +const gchar * +gl_util_align_to_string (PangoAlignment align) +{ + switch (align) { + case PANGO_ALIGN_LEFT: + return "Left"; + case PANGO_ALIGN_CENTER: + return "Center"; + case PANGO_ALIGN_RIGHT: + return "Right"; + default: + return "?"; + } +} + +PangoAlignment +gl_util_string_to_align (const gchar *string) +{ + + if (g_strcasecmp (string, "Left") == 0) { + return PANGO_ALIGN_LEFT; + } else if (g_strcasecmp (string, "Center") == 0) { + return PANGO_ALIGN_CENTER; + } else if (g_strcasecmp (string, "Right") == 0) { + return PANGO_ALIGN_RIGHT; + } else { + return PANGO_ALIGN_LEFT; + } + +} + +/****************************************************************************/ +/* Utilities to deal with PangoWeight types */ +/****************************************************************************/ +const gchar * +gl_util_weight_to_string (PangoWeight weight) +{ + switch (weight) { + case PANGO_WEIGHT_NORMAL: + return "Regular"; + case PANGO_WEIGHT_BOLD: + return "Bold"; + default: + return "?"; + } +} + +PangoWeight +gl_util_string_to_weight (const gchar *string) +{ + + if (g_strcasecmp (string, "Regular") == 0) { + return PANGO_WEIGHT_NORMAL; + } else if (g_strcasecmp (string, "Bold") == 0) { + return PANGO_WEIGHT_BOLD; + } else { + return PANGO_WEIGHT_NORMAL; + } + +} + +/****************************************************************************/ +/* Convienience function to set strings in a text combo_box from a GList */ +/****************************************************************************/ +void +gl_util_combo_box_set_strings (GtkComboBox *combo, + GList *list) +{ + GtkTreeModel *model; + GList *p; + + g_return_if_fail (list); + + model = gtk_combo_box_get_model(combo); + gtk_list_store_clear (GTK_LIST_STORE (model)); + + for (p=list; p!=NULL; p=p->next) { + if (p->data) { + gtk_combo_box_append_text (combo, p->data); + } + } +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. gl_util_combo_box_set_active_text support. */ +/*---------------------------------------------------------------------------*/ + +typedef struct { + const gchar *text; + GtkTreeIter iter; + gboolean found; +} TextSearchData; + +static gboolean +search_text_func (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + TextSearchData *search_data = (TextSearchData *)data; + gchar *text = NULL; + + gtk_tree_model_get (model, iter, 0, &text, -1); + + if (strcmp (text,search_data->text) == 0) { + search_data->found = TRUE; + search_data->iter = *iter; + } + + g_free (text); + + return FALSE; +} + +/****************************************************************************/ +/* Convienience function to set active text in a text combo_box from text */ +/****************************************************************************/ +void +gl_util_combo_box_set_active_text (GtkComboBox *combo, + const gchar *text) +{ + GtkTreeModel *model = gtk_combo_box_get_model(combo); + + g_return_if_fail (GTK_IS_LIST_STORE (model)); + + if (!text) { + + gtk_combo_box_set_active (combo, -1); + + } else { + TextSearchData search_data; + + search_data.text = text; + search_data.found = FALSE; + + gtk_tree_model_foreach (model, search_text_func, &search_data); + if (search_data.found) { + gtk_combo_box_set_active_iter (combo, + &search_data.iter); + } else { + gtk_combo_box_set_active (combo, -1); + } + + } + +} + +/****************************************************************************/ +/* Convienience function to add a simple text model to an existing */ +/* combo_box. This is needed since combo_boxes created with glade do not */ +/* use the gtk_combo_box_new_text() constructor. */ +/****************************************************************************/ +void +gl_util_combo_box_add_text_model (GtkComboBox *combo) +{ + GtkCellRenderer *cell; + GtkListStore *store; + + store = gtk_list_store_new (1, G_TYPE_STRING); + gtk_combo_box_set_model (combo, GTK_TREE_MODEL (store)); + g_object_unref (store); + + cell = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), cell, TRUE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), cell, + "text", 0, + NULL); +} + +/****************************************************************************/ +/* Get list of available font families. */ +/****************************************************************************/ +GList * +gl_util_get_font_family_list (void) +{ + GList *list = NULL; + PangoFontMap *fontmap; + PangoContext *context; + PangoFontFamily **families; + gint n; + gint i; + gchar *name; + + fontmap = pango_cairo_font_map_new (); + context = pango_cairo_font_map_create_context (PANGO_CAIRO_FONT_MAP (fontmap)); + + pango_context_list_families (context, &families, &n); + + for ( i=0; inext) { + g_free (p->data); + p->data = NULL; + } + + g_list_free (list); +} + + diff --git a/glabels2/src/util.h b/glabels2/src/util.h new file mode 100644 index 00000000..aa0ff25e --- /dev/null +++ b/glabels2/src/util.h @@ -0,0 +1,58 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * util.h: various small utility functions + * + * Copyright (C) 2001-2003 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __UTIL_H__ +#define __UTIL_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +gchar *gl_util_add_extension (const gchar *orig_filename); +gchar *gl_util_remove_extension (const gchar *orig_filename); + +gchar *gl_util_make_absolute (const gchar *filename); + +gchar *gl_util_fraction (gdouble x); + +const gchar *gl_util_align_to_string (PangoAlignment align); +PangoAlignment gl_util_string_to_align (const gchar *string); + +const gchar *gl_util_weight_to_string (PangoWeight weight); +PangoWeight gl_util_string_to_weight (const gchar *string); + +void gl_util_combo_box_set_strings (GtkComboBox *combo, + GList *list); +void gl_util_combo_box_set_active_text (GtkComboBox *combo, + const gchar *text); +void gl_util_combo_box_add_text_model (GtkComboBox *combo); + +GList *gl_util_get_font_family_list (void); +void gl_util_font_family_list_free (GList *list); + +G_END_DECLS + +#endif /* __UTIL_H__ */ diff --git a/glabels2/src/view-barcode.c b/glabels2/src/view-barcode.c new file mode 100644 index 00000000..559d134f --- /dev/null +++ b/glabels2/src/view-barcode.c @@ -0,0 +1,455 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * view_barcode.c: GLabels label barcode object view + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "view-barcode.h" + +#include +#include + +#include "color.h" +#include "object-editor.h" +#include "stock.h" + +#include "pixmaps/cursor_barcode.xbm" +#include "pixmaps/cursor_barcode_mask.xbm" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glViewBarcodePrivate { +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_view_barcode_finalize (GObject *object); + +static GtkWidget *construct_properties_editor (glViewObject *view_object); + +static void update_object_from_editor_cb (glObjectEditor *editor, + glLabelObject *object); + +static void update_editor_from_object_cb (glLabelObject *object, + glObjectEditor *editor); + +static void update_editor_from_move_cb (glLabelObject *object, + gdouble dx, + gdouble dy, + glObjectEditor *editor); + +static void update_editor_from_label_cb (glLabel *label, + glObjectEditor *editor); + +static gboolean object_at (glViewObject *view_object, + cairo_t *cr, + gdouble x, + gdouble y); + + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glViewBarcode, gl_view_barcode, GL_TYPE_VIEW_OBJECT); + + +static void +gl_view_barcode_class_init (glViewBarcodeClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + glViewObjectClass *view_object_class = GL_VIEW_OBJECT_CLASS (class); + + gl_debug (DEBUG_VIEW, "START"); + + gl_view_barcode_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_view_barcode_finalize; + + view_object_class->construct_editor = construct_properties_editor; + view_object_class->object_at = object_at; + + gl_debug (DEBUG_VIEW, "END"); +} + +static void +gl_view_barcode_init (glViewBarcode *view_barcode) +{ + gl_debug (DEBUG_VIEW, "START"); + + view_barcode->priv = g_new0 (glViewBarcodePrivate, 1); + + gl_debug (DEBUG_VIEW, "END"); +} + +static void +gl_view_barcode_finalize (GObject *object) +{ + glViewBarcode *view_barcode = GL_VIEW_BARCODE (object); + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (object && GL_IS_VIEW_BARCODE (object)); + + g_free (view_barcode->priv); + + G_OBJECT_CLASS (gl_view_barcode_parent_class)->finalize (object); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* NEW barcode object view. */ +/*****************************************************************************/ +glViewObject * +gl_view_barcode_new (glLabelBarcode *object, + glView *view) +{ + glViewBarcode *view_barcode; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_BARCODE (object), NULL); + g_return_val_if_fail (view && GL_IS_VIEW (view), NULL); + + view_barcode = g_object_new (gl_view_barcode_get_type(), NULL); + + gl_view_object_set_object (GL_VIEW_OBJECT(view_barcode), + GL_LABEL_OBJECT(object), + GL_VIEW_OBJECT_HANDLES_BOX); + gl_view_object_set_view (GL_VIEW_OBJECT(view_barcode), view); + + gl_debug (DEBUG_VIEW, "END"); + + return GL_VIEW_OBJECT (view_barcode); +} + +/*****************************************************************************/ +/* Create a properties dialog for a barcode object. */ +/*****************************************************************************/ +static GtkWidget * +construct_properties_editor (glViewObject *view_object) +{ + GtkWidget *editor; + glViewBarcode *view_bc = (glViewBarcode *)view_object; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + object = gl_view_object_get_object (GL_VIEW_OBJECT(view_bc)); + + /* Build editor. */ + editor = gl_object_editor_new (GL_STOCK_BARCODE, _("Barcode object properties"), + GL_OBJECT_EDITOR_POSITION_PAGE, + GL_OBJECT_EDITOR_SIZE_PAGE, + GL_OBJECT_EDITOR_BC_PAGE, + GL_OBJECT_EDITOR_DATA_PAGE, + 0); + + /* Update */ + update_editor_from_label_cb (object->parent, GL_OBJECT_EDITOR(editor)); + update_editor_from_object_cb (object, GL_OBJECT_EDITOR(editor)); + update_editor_from_move_cb (object, 0, 0, GL_OBJECT_EDITOR(editor)); + + /* Connect signals. */ + g_signal_connect (G_OBJECT (editor), "changed", + G_CALLBACK(update_object_from_editor_cb), object); + g_signal_connect (G_OBJECT (object), "changed", + G_CALLBACK (update_editor_from_object_cb), editor); + g_signal_connect (G_OBJECT (object), "moved", + G_CALLBACK (update_editor_from_move_cb), editor); + g_signal_connect (G_OBJECT (object->parent), "size_changed", + G_CALLBACK (update_editor_from_label_cb), editor); + g_signal_connect (G_OBJECT (object->parent), "merge_changed", + G_CALLBACK (update_editor_from_label_cb), editor); + + gl_debug (DEBUG_VIEW, "END"); + + return editor; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. editor "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_object_from_editor_cb (glObjectEditor *editor, + glLabelObject *object) +{ + gdouble x, y, w, h; + glTextNode *text_node; + gchar *id; + gboolean text_flag, cs_flag; + glColorNode *color_node; + guint format_digits; + + gl_debug (DEBUG_VIEW, "START"); + + g_signal_handlers_block_by_func (G_OBJECT(object), + update_editor_from_object_cb, + editor); + g_signal_handlers_block_by_func (G_OBJECT(object), + update_editor_from_move_cb, + editor); + + + gl_object_editor_get_position (editor, &x, &y); + gl_label_object_set_position (object, x, y); + + gl_object_editor_get_size (editor, &w, &h); + gl_label_object_set_size (object, w, h); + + text_node = gl_object_editor_get_data (editor); + gl_label_barcode_set_data (GL_LABEL_BARCODE(object), text_node); + gl_text_node_free (&text_node); + + gl_object_editor_get_bc_style (editor, &id, &text_flag, &cs_flag, &format_digits); + color_node = gl_object_editor_get_bc_color (editor); + gl_label_barcode_set_props (GL_LABEL_BARCODE(object), + id, text_flag, cs_flag, format_digits); + gl_label_object_set_line_color (object, color_node); + gl_color_node_free (&color_node); + g_free (id); + + g_signal_handlers_unblock_by_func (G_OBJECT(object), + update_editor_from_object_cb, + editor); + g_signal_handlers_unblock_by_func (G_OBJECT(object), + update_editor_from_move_cb, + editor); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label object "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_object_cb (glLabelObject *object, + glObjectEditor *editor) +{ + gdouble w, h; + glTextNode *text_node; + gchar *id; + gboolean text_flag, cs_flag; + glColorNode *color_node; + glMerge *merge; + guint format_digits; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_object_get_size (object, &w, &h); + gl_object_editor_set_size (editor, w, h); + + merge = gl_label_get_merge (GL_LABEL(object->parent)); + + gl_label_barcode_get_props (GL_LABEL_BARCODE(object), + &id, &text_flag, &cs_flag, &format_digits); + color_node = gl_label_object_get_line_color (object); + gl_object_editor_set_bc_style (editor, id, text_flag, cs_flag, format_digits); + gl_object_editor_set_bc_color (editor, (merge != NULL), color_node); + gl_color_node_free (&color_node); + g_free (id); + + text_node = gl_label_barcode_get_data (GL_LABEL_BARCODE(object)); + gl_object_editor_set_data (editor, (merge != NULL), text_node); + gl_text_node_free (&text_node); + + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label object "moved" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_move_cb (glLabelObject *object, + gdouble dx, + gdouble dy, + glObjectEditor *editor) +{ + gdouble x, y; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_object_get_position (object, &x, &y); + gl_object_editor_set_position (editor, x, y); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_label_cb (glLabel *label, + glObjectEditor *editor) +{ + gdouble label_width, label_height; + glMerge *merge; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_get_size (label, &label_width, &label_height); + gl_object_editor_set_max_position (GL_OBJECT_EDITOR (editor), + label_width, label_height); + gl_object_editor_set_max_size (GL_OBJECT_EDITOR (editor), + label_width, label_height); + + merge = gl_label_get_merge (label); + gl_object_editor_set_key_names (editor, merge); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Is object at (x,y)? */ +/*****************************************************************************/ +static gboolean +object_at (glViewObject *view_object, + cairo_t *cr, + gdouble x, + gdouble y) +{ + glLabelObject *object; + gdouble w, h; + + object = gl_view_object_get_object (view_object); + + gl_label_object_get_size (object, &w, &h); + + cairo_rectangle (cr, 0.0, 0.0, w, h); + + if (cairo_in_fill (cr, x, y)) + { + return TRUE; + } + + return FALSE; +} + + +/*****************************************************************************/ +/* Return apropos cursor for create object mode. */ +/*****************************************************************************/ +GdkCursor * +gl_view_barcode_get_create_cursor (void) +{ + GdkCursor *cursor = NULL; + GdkPixmap *pixmap_data, *pixmap_mask; + GdkColor fg = { 0, 0, 0, 0 }; + GdkColor bg = { 0, 65535, 65535, 65535 }; + + gl_debug (DEBUG_VIEW, "START"); + + pixmap_data = gdk_bitmap_create_from_data (NULL, + (gchar *)cursor_barcode_bits, + cursor_barcode_width, + cursor_barcode_height); + pixmap_mask = gdk_bitmap_create_from_data (NULL, + (gchar *)cursor_barcode_mask_bits, + cursor_barcode_mask_width, + cursor_barcode_mask_height); + cursor = gdk_cursor_new_from_pixmap (pixmap_data, pixmap_mask, &fg, + &bg, cursor_barcode_x_hot, + cursor_barcode_y_hot); + + gl_debug (DEBUG_VIEW, "END"); + + return cursor; +} + +/*****************************************************************************/ +/* Object creation handler: button press event. */ +/*****************************************************************************/ +void +gl_view_barcode_create_button_press_event (glView *view, + gdouble x, + gdouble y) +{ + GObject *object; + glTextNode *text_node; + glColorNode *line_color_node; + + gl_view_unselect_all (view); + + line_color_node = gl_color_node_new_default (); + + object = gl_label_barcode_new (view->label); + gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y); + text_node = gl_text_node_new_from_text ("123456789"); + gl_label_barcode_set_data (GL_LABEL_BARCODE(object), text_node); + line_color_node->color = gl_color_set_opacity (gl_view_get_default_line_color(view), 0.5); + gl_label_object_set_line_color (GL_LABEL_OBJECT(object), + line_color_node); + + gl_color_node_free (&line_color_node); + + view->create_object = GL_LABEL_OBJECT (object); + view->create_x0 = x; + view->create_y0 = y; +} + +/*****************************************************************************/ +/* Object creation handler: motion event. */ +/*****************************************************************************/ +void +gl_view_barcode_create_motion_event (glView *view, + gdouble x, + gdouble y) +{ + gl_label_object_set_position (GL_LABEL_OBJECT(view->create_object), x, y); +} + +/*****************************************************************************/ +/* Object creation handler: button relesase event. */ +/*****************************************************************************/ +void +gl_view_barcode_create_button_release_event (glView *view, + gdouble x, + gdouble y) +{ + glColorNode *line_color_node; + + line_color_node = gl_color_node_new_default (); + + gl_label_object_set_position (GL_LABEL_OBJECT(view->create_object), x, y); + line_color_node->color = gl_view_get_default_line_color(view); + gl_label_object_set_line_color (GL_LABEL_OBJECT(view->create_object), line_color_node); + gl_color_node_free (&line_color_node); +} + diff --git a/glabels2/src/view-barcode.h b/glabels2/src/view-barcode.h new file mode 100644 index 00000000..1587f195 --- /dev/null +++ b/glabels2/src/view-barcode.h @@ -0,0 +1,81 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * view_barcode.h: GLabels label barcode object view + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __VIEW_BARCODE_H__ +#define __VIEW_BARCODE_H__ + +#include "view-object.h" +#include "label-barcode.h" + +G_BEGIN_DECLS + + +#define GL_TYPE_VIEW_BARCODE (gl_view_barcode_get_type ()) +#define GL_VIEW_BARCODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_VIEW_BARCODE, glViewBarcode)) +#define GL_VIEW_BARCODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_VIEW_BARCODE, glViewBarcodeClass)) +#define GL_IS_VIEW_BARCODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_VIEW_BARCODE)) +#define GL_IS_VIEW_BARCODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_VIEW_BARCODE)) + +typedef struct _glViewBarcode glViewBarcode; +typedef struct _glViewBarcodeClass glViewBarcodeClass; + +typedef struct _glViewBarcodePrivate glViewBarcodePrivate; + +struct _glViewBarcode { + glViewObject parent_object; + + glViewBarcodePrivate *priv; +}; + +struct _glViewBarcodeClass { + glViewObjectClass parent_class; +}; + + +GType gl_view_barcode_get_type (void) G_GNUC_CONST; + +glViewObject *gl_view_barcode_new (glLabelBarcode *object, + glView *view); + + +/* cursor for creating barcode objects */ +GdkCursor *gl_view_barcode_get_create_cursor (void); + +/* Object creation handlers. */ +void gl_view_barcode_create_button_press_event (glView *view, + gdouble x, + gdouble y); + +void gl_view_barcode_create_motion_event (glView *view, + gdouble x, + gdouble y); + +void gl_view_barcode_create_button_release_event (glView *view, + gdouble x, + gdouble y); + + +G_END_DECLS + +#endif /* __VIEW_BARCODE_H__ */ diff --git a/glabels2/src/view-box.c b/glabels2/src/view-box.c new file mode 100644 index 00000000..710bce27 --- /dev/null +++ b/glabels2/src/view-box.c @@ -0,0 +1,519 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * view_box.c: GLabels label box object view + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "view-box.h" + +#include +#include + +#include "color.h" +#include "object-editor.h" +#include "stock.h" + +#include "pixmaps/cursor_box.xbm" +#include "pixmaps/cursor_box_mask.xbm" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glViewBoxPrivate { +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_view_box_finalize (GObject *object); + +static GtkWidget *construct_properties_editor (glViewObject *view_object); + +static void update_object_from_editor_cb (glObjectEditor *editor, + glLabelObject *object); + +static void update_editor_from_object_cb (glLabelObject *object, + glObjectEditor *editor); + +static void update_editor_from_move_cb (glLabelObject *object, + gdouble dx, + gdouble dy, + glObjectEditor *editor); + +static void update_editor_from_label_cb (glLabel *label, + glObjectEditor *editor); + +static gboolean object_at (glViewObject *view_object, + cairo_t *cr, + gdouble x, + gdouble y); + + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glViewBox, gl_view_box, GL_TYPE_VIEW_OBJECT); + + +static void +gl_view_box_class_init (glViewBoxClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + glViewObjectClass *view_object_class = GL_VIEW_OBJECT_CLASS (class); + + gl_debug (DEBUG_VIEW, "START"); + + gl_view_box_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_view_box_finalize; + + view_object_class->construct_editor = construct_properties_editor; + view_object_class->object_at = object_at; + + gl_debug (DEBUG_VIEW, "END"); +} + +static void +gl_view_box_init (glViewBox *view_box) +{ + gl_debug (DEBUG_VIEW, "START"); + + view_box->priv = g_new0 (glViewBoxPrivate, 1); + + gl_debug (DEBUG_VIEW, "END"); +} + +static void +gl_view_box_finalize (GObject *object) +{ + glViewBox *view_box = GL_VIEW_BOX (object); + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (object && GL_IS_VIEW_BOX (object)); + + g_free (view_box->priv); + + G_OBJECT_CLASS (gl_view_box_parent_class)->finalize (object); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* NEW box object view. */ +/*****************************************************************************/ +glViewObject * +gl_view_box_new (glLabelBox *object, + glView *view) +{ + glViewBox *view_box; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_BOX (object), NULL); + g_return_val_if_fail (view && GL_IS_VIEW (view), NULL); + + view_box = g_object_new (gl_view_box_get_type(), NULL); + + gl_view_object_set_object (GL_VIEW_OBJECT(view_box), + GL_LABEL_OBJECT(object), + GL_VIEW_OBJECT_HANDLES_BOX); + gl_view_object_set_view (GL_VIEW_OBJECT(view_box), view); + + gl_debug (DEBUG_VIEW, "END"); + + return GL_VIEW_OBJECT (view_box); +} + +/*****************************************************************************/ +/* Create a properties dialog for a box object. */ +/*****************************************************************************/ +static GtkWidget * +construct_properties_editor (glViewObject *view_object) +{ + GtkWidget *editor; + glViewBox *view_box = (glViewBox *)view_object; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + object = gl_view_object_get_object (GL_VIEW_OBJECT(view_box)); + + /* Build editor. */ + editor = gl_object_editor_new (GL_STOCK_BOX, _("Box object properties"), + GL_OBJECT_EDITOR_SHADOW_PAGE, + GL_OBJECT_EDITOR_POSITION_PAGE, + GL_OBJECT_EDITOR_SIZE_PAGE, + GL_OBJECT_EDITOR_FILL_PAGE, + GL_OBJECT_EDITOR_LINE_PAGE, + 0); + + /* Update */ + update_editor_from_label_cb (object->parent, GL_OBJECT_EDITOR(editor)); + update_editor_from_object_cb (object, GL_OBJECT_EDITOR(editor)); + update_editor_from_move_cb (object, 0, 0, GL_OBJECT_EDITOR(editor)); + + /* Connect signals. */ + g_signal_connect (G_OBJECT (editor), "changed", + G_CALLBACK(update_object_from_editor_cb), object); + g_signal_connect (G_OBJECT (object), "changed", + G_CALLBACK (update_editor_from_object_cb), editor); + g_signal_connect (G_OBJECT (object), "moved", + G_CALLBACK (update_editor_from_move_cb), editor); + g_signal_connect (G_OBJECT (object->parent), "size_changed", + G_CALLBACK (update_editor_from_label_cb), editor); + g_signal_connect (G_OBJECT (object->parent), "merge_changed", + G_CALLBACK (update_editor_from_label_cb), editor); + + gl_debug (DEBUG_VIEW, "END"); + + return editor; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. editor "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_object_from_editor_cb (glObjectEditor *editor, + glLabelObject *object) +{ + gdouble x, y, w, h; + glColorNode *line_color_node; + gdouble line_width; + glColorNode *fill_color_node; + gboolean shadow_state; + gdouble shadow_x, shadow_y; + glColorNode *shadow_color_node; + gdouble shadow_opacity; + + + gl_debug (DEBUG_VIEW, "START"); + + g_signal_handlers_block_by_func (G_OBJECT(object), + update_editor_from_object_cb, + editor); + g_signal_handlers_block_by_func (G_OBJECT(object), + update_editor_from_move_cb, + editor); + + gl_object_editor_get_position (editor, &x, &y); + gl_label_object_set_position (object, x, y); + + gl_object_editor_get_size (editor, &w, &h); + gl_label_object_set_size (object, w, h); + + fill_color_node = gl_object_editor_get_fill_color (editor); + gl_label_object_set_fill_color (object, fill_color_node); + gl_color_node_free (&fill_color_node); + + line_color_node = gl_object_editor_get_line_color (editor); + gl_label_object_set_line_color (object, line_color_node); + gl_color_node_free (&line_color_node); + + line_width = gl_object_editor_get_line_width (editor); + gl_label_object_set_line_width (object, line_width); + + shadow_state = gl_object_editor_get_shadow_state (editor); + gl_label_object_set_shadow_state (object, shadow_state); + + gl_object_editor_get_shadow_offset (editor, &shadow_x, &shadow_y); + gl_label_object_set_shadow_offset (object, shadow_x, shadow_y); + + shadow_color_node = gl_object_editor_get_shadow_color (editor); + gl_label_object_set_shadow_color (object, shadow_color_node); + gl_color_node_free (&shadow_color_node); + + shadow_opacity = gl_object_editor_get_shadow_opacity (editor); + gl_label_object_set_shadow_opacity (object, shadow_opacity); + + g_signal_handlers_unblock_by_func (G_OBJECT(object), + update_editor_from_object_cb, + editor); + g_signal_handlers_unblock_by_func (G_OBJECT(object), + update_editor_from_move_cb, + editor); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label object "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_object_cb (glLabelObject *object, + glObjectEditor *editor) +{ + gdouble w, h; + glColorNode *line_color_node; + gdouble line_width; + glColorNode *fill_color_node; + gboolean shadow_state; + gdouble shadow_x, shadow_y; + glColorNode *shadow_color_node; + gdouble shadow_opacity; + glMerge *merge; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_object_get_size (object, &w, &h); + gl_object_editor_set_size (editor, w, h); + merge = gl_label_get_merge (GL_LABEL(object->parent)); + + fill_color_node = gl_label_object_get_fill_color (GL_LABEL_OBJECT(object)); + gl_object_editor_set_fill_color (editor, (merge != NULL), fill_color_node); + gl_color_node_free (&fill_color_node); + + line_color_node = gl_label_object_get_line_color (GL_LABEL_OBJECT(object)); + gl_object_editor_set_line_color (editor, (merge != NULL), line_color_node); + gl_color_node_free (&line_color_node); + + line_width = gl_label_object_get_line_width (GL_LABEL_OBJECT(object)); + gl_object_editor_set_line_width (editor, line_width); + + shadow_state = gl_label_object_get_shadow_state (object); + gl_object_editor_set_shadow_state (editor, shadow_state); + + gl_label_object_get_shadow_offset (object, &shadow_x, &shadow_y); + gl_object_editor_set_shadow_offset (editor, shadow_x, shadow_y); + + shadow_color_node = gl_label_object_get_shadow_color (object); + gl_object_editor_set_shadow_color (editor, (merge != NULL), shadow_color_node); + gl_color_node_free (&shadow_color_node); + + shadow_opacity = gl_label_object_get_shadow_opacity (object); + gl_object_editor_set_shadow_opacity (editor, shadow_opacity); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label object "moved" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_move_cb (glLabelObject *object, + gdouble dx, + gdouble dy, + glObjectEditor *editor) +{ + gdouble x, y; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_object_get_position (object, &x, &y); + gl_object_editor_set_position (editor, x, y); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_label_cb (glLabel *label, + glObjectEditor *editor) +{ + gdouble label_width, label_height; + glMerge *merge; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_get_size (label, &label_width, &label_height); + gl_object_editor_set_max_position (GL_OBJECT_EDITOR (editor), + label_width, label_height); + gl_object_editor_set_max_size (GL_OBJECT_EDITOR (editor), + label_width, label_height); + gl_object_editor_set_max_shadow_offset (GL_OBJECT_EDITOR (editor), + label_width, label_height); + + merge = gl_label_get_merge (label); + gl_object_editor_set_key_names (editor, merge); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Is object at (x,y)? */ +/*****************************************************************************/ +static gboolean +object_at (glViewObject *view_object, + cairo_t *cr, + gdouble x, + gdouble y) +{ + glLabelObject *object; + gdouble w, h; + gdouble line_width; + + object = gl_view_object_get_object (view_object); + + gl_label_object_get_size (object, &w, &h); + + cairo_rectangle (cr, 0.0, 0.0, w, h); + + if (cairo_in_fill (cr, x, y)) + { + return TRUE; + } + + line_width = gl_label_object_get_line_width (object); + cairo_set_line_width (cr, line_width); + if (cairo_in_stroke (cr, x, y)) + { + return TRUE; + } + + return FALSE; +} + + +/*****************************************************************************/ +/* Return apropos cursor for create object mode. */ +/*****************************************************************************/ +GdkCursor * +gl_view_box_get_create_cursor (void) +{ + GdkCursor *cursor = NULL; + GdkPixmap *pixmap_data, *pixmap_mask; + GdkColor fg = { 0, 0, 0, 0 }; + GdkColor bg = { 0, 65535, 65535, 65535 }; + + gl_debug (DEBUG_VIEW, "START"); + + pixmap_data = gdk_bitmap_create_from_data (NULL, + (gchar *)cursor_box_bits, + cursor_box_width, + cursor_box_height); + pixmap_mask = gdk_bitmap_create_from_data (NULL, + (gchar *)cursor_box_mask_bits, + cursor_box_mask_width, + cursor_box_mask_height); + cursor = gdk_cursor_new_from_pixmap (pixmap_data, pixmap_mask, &fg, + &bg, cursor_box_x_hot, + cursor_box_y_hot); + + gl_debug (DEBUG_VIEW, "END"); + + return cursor; +} + +/*****************************************************************************/ +/* Object creation handler: button press event. */ +/*****************************************************************************/ +void +gl_view_box_create_button_press_event (glView *view, + gdouble x, + gdouble y) +{ + GObject *object; + glColorNode *fill_color_node; + glColorNode *line_color_node; + + gl_view_unselect_all (view); + + fill_color_node = gl_color_node_new_default (); + line_color_node = gl_color_node_new_default (); + + object = gl_label_box_new (view->label); + gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y); + gl_label_object_set_size (GL_LABEL_OBJECT(object), 0.0, 0.0); + line_color_node->color = gl_color_set_opacity (gl_view_get_default_line_color(view), 0.5); + fill_color_node->color = gl_color_set_opacity (gl_view_get_default_fill_color(view), 0.5); + gl_label_object_set_line_width (GL_LABEL_OBJECT(object), + gl_view_get_default_line_width(view)); + gl_label_object_set_line_color (GL_LABEL_OBJECT(object), + line_color_node); + gl_label_object_set_fill_color (GL_LABEL_OBJECT(object), + fill_color_node); + + gl_color_node_free (&fill_color_node); + gl_color_node_free (&line_color_node); + + view->create_object = GL_LABEL_OBJECT (object); + view->create_x0 = x; + view->create_y0 = y; +} + +/*****************************************************************************/ +/* Object creation handler: motion event. */ +/*****************************************************************************/ +void +gl_view_box_create_motion_event (glView *view, + gdouble x, + gdouble y) +{ + gdouble w, h; + + gl_label_object_set_position (GL_LABEL_OBJECT(view->create_object), + MIN (x, view->create_x0), MIN (y, view->create_y0)); + w = MAX (x, view->create_x0) - MIN (x, view->create_x0); + h = MAX (y, view->create_y0) - MIN (y, view->create_y0); + gl_label_object_set_size (GL_LABEL_OBJECT(view->create_object), w, h); +} + +/*****************************************************************************/ +/* Object creation handler: button relesase event. */ +/*****************************************************************************/ +void +gl_view_box_create_button_release_event (glView *view, + gdouble x, + gdouble y) +{ + glColorNode *fill_color_node; + glColorNode *line_color_node; + gdouble w, h; + + fill_color_node = gl_color_node_new_default (); + line_color_node = gl_color_node_new_default (); + + if ((view->create_x0 == x) && (view->create_y0 == y)) { + x = view->create_x0 + 36.0; + y = view->create_y0 + 36.0; + } + gl_label_object_set_position (GL_LABEL_OBJECT(view->create_object), + MIN (x, view->create_x0), MIN (y, view->create_y0)); + w = MAX (x, view->create_x0) - MIN (x, view->create_x0); + h = MAX (y, view->create_y0) - MIN (y, view->create_y0); + gl_label_object_set_size (GL_LABEL_OBJECT(view->create_object), w, h); + line_color_node->color = gl_view_get_default_line_color(view); + gl_label_object_set_line_color (GL_LABEL_OBJECT(view->create_object), line_color_node); + fill_color_node->color = gl_view_get_default_fill_color(view); + gl_label_object_set_fill_color (GL_LABEL_OBJECT(view->create_object), fill_color_node); + gl_color_node_free (&fill_color_node); + gl_color_node_free (&line_color_node); +} + diff --git a/glabels2/src/view-box.h b/glabels2/src/view-box.h new file mode 100644 index 00000000..f2ebb058 --- /dev/null +++ b/glabels2/src/view-box.h @@ -0,0 +1,81 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * view_box.h: GLabels label box object view + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __VIEW_BOX_H__ +#define __VIEW_BOX_H__ + +#include "view-object.h" +#include "label-box.h" + +G_BEGIN_DECLS + + +#define GL_TYPE_VIEW_BOX (gl_view_box_get_type ()) +#define GL_VIEW_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_VIEW_BOX, glViewBox)) +#define GL_VIEW_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_VIEW_BOX, glViewBoxClass)) +#define GL_IS_VIEW_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_VIEW_BOX)) +#define GL_IS_VIEW_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_VIEW_BOX)) + +typedef struct _glViewBox glViewBox; +typedef struct _glViewBoxClass glViewBoxClass; + +typedef struct _glViewBoxPrivate glViewBoxPrivate; + +struct _glViewBox { + glViewObject parent_object; + + glViewBoxPrivate *priv; +}; + +struct _glViewBoxClass { + glViewObjectClass parent_class; +}; + + +GType gl_view_box_get_type (void) G_GNUC_CONST; + +glViewObject *gl_view_box_new (glLabelBox *object, + glView *view); + + +/* cursor for creating box objects */ +GdkCursor *gl_view_box_get_create_cursor (void); + +/* Object creation handlers. */ +void gl_view_box_create_button_press_event (glView *view, + gdouble x, + gdouble y); + +void gl_view_box_create_motion_event (glView *view, + gdouble x, + gdouble y); + +void gl_view_box_create_button_release_event (glView *view, + gdouble x, + gdouble y); + + +G_END_DECLS + +#endif /* __VIEW_BOX_H__ */ diff --git a/glabels2/src/view-ellipse.c b/glabels2/src/view-ellipse.c new file mode 100644 index 00000000..bed1eb7d --- /dev/null +++ b/glabels2/src/view-ellipse.c @@ -0,0 +1,519 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * view_ellipse.c: GLabels label ellipse object view + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "view-ellipse.h" + +#include +#include +#include + +#include "cairo-ellipse-path.h" +#include "color.h" +#include "object-editor.h" +#include "stock.h" + +#include "pixmaps/cursor_ellipse.xbm" +#include "pixmaps/cursor_ellipse_mask.xbm" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glViewEllipsePrivate { +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_view_ellipse_finalize (GObject *object); + +static GtkWidget *construct_properties_editor (glViewObject *view_object); + +static void update_object_from_editor_cb (glObjectEditor *editor, + glLabelObject *object); + +static void update_editor_from_object_cb (glLabelObject *object, + glObjectEditor *editor); + +static void update_editor_from_move_cb (glLabelObject *object, + gdouble dx, + gdouble dy, + glObjectEditor *editor); + +static void update_editor_from_label_cb (glLabel *label, + glObjectEditor *editor); + +static gboolean object_at (glViewObject *view_object, + cairo_t *cr, + gdouble x, + gdouble y); + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glViewEllipse, gl_view_ellipse, GL_TYPE_VIEW_OBJECT); + + +static void +gl_view_ellipse_class_init (glViewEllipseClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + glViewObjectClass *view_object_class = GL_VIEW_OBJECT_CLASS (class); + + gl_debug (DEBUG_VIEW, "START"); + + gl_view_ellipse_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_view_ellipse_finalize; + + view_object_class->construct_editor = construct_properties_editor; + view_object_class->object_at = object_at; + + gl_debug (DEBUG_VIEW, "END"); +} + +static void +gl_view_ellipse_init (glViewEllipse *view_ellipse) +{ + gl_debug (DEBUG_VIEW, "START"); + + view_ellipse->priv = g_new0 (glViewEllipsePrivate, 1); + + gl_debug (DEBUG_VIEW, "END"); +} + +static void +gl_view_ellipse_finalize (GObject *object) +{ + glViewEllipse *view_ellipse = GL_VIEW_ELLIPSE (object); + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (object && GL_IS_VIEW_ELLIPSE (object)); + + g_free (view_ellipse->priv); + + G_OBJECT_CLASS (gl_view_ellipse_parent_class)->finalize (object); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* NEW ellipse object view. */ +/*****************************************************************************/ +glViewObject * +gl_view_ellipse_new (glLabelEllipse *object, + glView *view) +{ + glViewEllipse *view_ellipse; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_ELLIPSE (object), NULL); + g_return_val_if_fail (view && GL_IS_VIEW (view), NULL); + + view_ellipse = g_object_new (gl_view_ellipse_get_type(), NULL); + + gl_view_object_set_object (GL_VIEW_OBJECT(view_ellipse), + GL_LABEL_OBJECT(object), + GL_VIEW_OBJECT_HANDLES_BOX); + gl_view_object_set_view (GL_VIEW_OBJECT(view_ellipse), view); + + gl_debug (DEBUG_VIEW, "END"); + + return GL_VIEW_OBJECT (view_ellipse); +} + +/*****************************************************************************/ +/* Create a properties dialog for a ellipse object. */ +/*****************************************************************************/ +static GtkWidget * +construct_properties_editor (glViewObject *view_object) +{ + GtkWidget *editor; + glViewEllipse *view_ellipse = (glViewEllipse *)view_object; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + object = gl_view_object_get_object (GL_VIEW_OBJECT(view_ellipse)); + + /* Build editor. */ + editor = gl_object_editor_new (GL_STOCK_ELLIPSE, _("Ellipse object properties"), + GL_OBJECT_EDITOR_SHADOW_PAGE, + GL_OBJECT_EDITOR_POSITION_PAGE, + GL_OBJECT_EDITOR_SIZE_PAGE, + GL_OBJECT_EDITOR_FILL_PAGE, + GL_OBJECT_EDITOR_LINE_PAGE, + 0); + + /* Update */ + update_editor_from_label_cb (object->parent, GL_OBJECT_EDITOR(editor)); + update_editor_from_object_cb (object, GL_OBJECT_EDITOR(editor)); + update_editor_from_move_cb (object, 0, 0, GL_OBJECT_EDITOR(editor)); + + /* Connect signals. */ + g_signal_connect (G_OBJECT (editor), "changed", + G_CALLBACK(update_object_from_editor_cb), object); + g_signal_connect (G_OBJECT (object), "changed", + G_CALLBACK (update_editor_from_object_cb), editor); + g_signal_connect (G_OBJECT (object), "moved", + G_CALLBACK (update_editor_from_move_cb), editor); + g_signal_connect (G_OBJECT (object->parent), "size_changed", + G_CALLBACK (update_editor_from_label_cb), editor); + g_signal_connect (G_OBJECT (object->parent), "merge_changed", + G_CALLBACK (update_editor_from_label_cb), editor); + + gl_debug (DEBUG_VIEW, "END"); + + return editor; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. editor "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_object_from_editor_cb (glObjectEditor *editor, + glLabelObject *object) +{ + gdouble x, y, w, h; + glColorNode *line_color_node; + gdouble line_width; + glColorNode *fill_color_node; + gboolean shadow_state; + gdouble shadow_x, shadow_y; + glColorNode *shadow_color_node; + gdouble shadow_opacity; + + + gl_debug (DEBUG_VIEW, "START"); + + g_signal_handlers_block_by_func (G_OBJECT(object), + update_editor_from_object_cb, + editor); + g_signal_handlers_block_by_func (G_OBJECT(object), + update_editor_from_move_cb, + editor); + + gl_object_editor_get_position (editor, &x, &y); + gl_label_object_set_position (object, x, y); + + gl_object_editor_get_size (editor, &w, &h); + gl_label_object_set_size (object, w, h); + + fill_color_node = gl_object_editor_get_fill_color (editor); + gl_label_object_set_fill_color (object, fill_color_node); + gl_color_node_free (&fill_color_node); + + line_color_node = gl_object_editor_get_line_color (editor); + gl_label_object_set_line_color (object, line_color_node); + gl_color_node_free (&line_color_node); + + line_width = gl_object_editor_get_line_width (editor); + gl_label_object_set_line_width (object, line_width); + + shadow_state = gl_object_editor_get_shadow_state (editor); + gl_label_object_set_shadow_state (object, shadow_state); + + gl_object_editor_get_shadow_offset (editor, &shadow_x, &shadow_y); + gl_label_object_set_shadow_offset (object, shadow_x, shadow_y); + + shadow_color_node = gl_object_editor_get_shadow_color (editor); + gl_label_object_set_shadow_color (object, shadow_color_node); + gl_color_node_free (&shadow_color_node); + + shadow_opacity = gl_object_editor_get_shadow_opacity (editor); + gl_label_object_set_shadow_opacity (object, shadow_opacity); + + g_signal_handlers_unblock_by_func (G_OBJECT(object), + update_editor_from_object_cb, + editor); + g_signal_handlers_unblock_by_func (G_OBJECT(object), + update_editor_from_move_cb, + editor); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label object "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_object_cb (glLabelObject *object, + glObjectEditor *editor) +{ + gdouble w, h; + glColorNode *line_color_node; + gdouble line_width; + glColorNode *fill_color_node; + gboolean shadow_state; + gdouble shadow_x, shadow_y; + glColorNode *shadow_color_node; + gdouble shadow_opacity; + glMerge *merge; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_object_get_size (object, &w, &h); + gl_object_editor_set_size (editor, w, h); + merge = gl_label_get_merge (GL_LABEL(object->parent)); + + fill_color_node = gl_label_object_get_fill_color (GL_LABEL_OBJECT(object)); + gl_object_editor_set_fill_color (editor, (merge != NULL), fill_color_node); + gl_color_node_free (&fill_color_node); + + line_color_node = gl_label_object_get_line_color (GL_LABEL_OBJECT(object)); + gl_object_editor_set_line_color (editor, (merge != NULL), line_color_node); + gl_color_node_free (&line_color_node); + + line_width = gl_label_object_get_line_width (GL_LABEL_OBJECT(object)); + gl_object_editor_set_line_width (editor, line_width); + + shadow_state = gl_label_object_get_shadow_state (object); + gl_object_editor_set_shadow_state (editor, shadow_state); + + gl_label_object_get_shadow_offset (object, &shadow_x, &shadow_y); + gl_object_editor_set_shadow_offset (editor, shadow_x, shadow_y); + + shadow_color_node = gl_label_object_get_shadow_color (object); + gl_object_editor_set_shadow_color (editor, (merge != NULL), shadow_color_node); + gl_color_node_free (&shadow_color_node); + + shadow_opacity = gl_label_object_get_shadow_opacity (object); + gl_object_editor_set_shadow_opacity (editor, shadow_opacity); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label object "moved" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_move_cb (glLabelObject *object, + gdouble dx, + gdouble dy, + glObjectEditor *editor) +{ + gdouble x, y; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_object_get_position (object, &x, &y); + gl_object_editor_set_position (editor, x, y); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_label_cb (glLabel *label, + glObjectEditor *editor) +{ + gdouble label_width, label_height; + glMerge *merge; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_get_size (label, &label_width, &label_height); + gl_object_editor_set_max_position (GL_OBJECT_EDITOR (editor), + label_width, label_height); + gl_object_editor_set_max_size (GL_OBJECT_EDITOR (editor), + label_width, label_height); + gl_object_editor_set_max_shadow_offset (GL_OBJECT_EDITOR (editor), + label_width, label_height); + + merge = gl_label_get_merge (label); + gl_object_editor_set_key_names (editor, merge); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Is object at (x,y)? */ +/*****************************************************************************/ +static gboolean +object_at (glViewObject *view_object, + cairo_t *cr, + gdouble x, + gdouble y) +{ + glLabelObject *object; + gdouble w, h; + gdouble line_width; + + object = gl_view_object_get_object (view_object); + + gl_label_object_get_size (object, &w, &h); + + gl_cairo_ellipse_path (cr, w/2, h/2); + + if (cairo_in_fill (cr, x, y)) + { + return TRUE; + } + + line_width = gl_label_object_get_line_width (object); + cairo_set_line_width (cr, line_width); + if (cairo_in_stroke (cr, x, y)) + { + return TRUE; + } + + return FALSE; +} + + +/*****************************************************************************/ +/* Return apropos cursor for create object mode. */ +/*****************************************************************************/ +GdkCursor * +gl_view_ellipse_get_create_cursor (void) +{ + GdkCursor *cursor = NULL; + GdkPixmap *pixmap_data, *pixmap_mask; + GdkColor fg = { 0, 0, 0, 0 }; + GdkColor bg = { 0, 65535, 65535, 65535 }; + + gl_debug (DEBUG_VIEW, "START"); + + pixmap_data = gdk_bitmap_create_from_data (NULL, + (gchar *)cursor_ellipse_bits, + cursor_ellipse_width, + cursor_ellipse_height); + pixmap_mask = gdk_bitmap_create_from_data (NULL, + (gchar *)cursor_ellipse_mask_bits, + cursor_ellipse_mask_width, + cursor_ellipse_mask_height); + cursor = gdk_cursor_new_from_pixmap (pixmap_data, pixmap_mask, &fg, + &bg, cursor_ellipse_x_hot, + cursor_ellipse_y_hot); + + gl_debug (DEBUG_VIEW, "END"); + + return cursor; +} + +/*****************************************************************************/ +/* Object creation handler: button press event. */ +/*****************************************************************************/ +void +gl_view_ellipse_create_button_press_event (glView *view, + gdouble x, + gdouble y) +{ + GObject *object; + glColorNode *fill_color_node; + glColorNode *line_color_node; + + gl_view_unselect_all (view); + + fill_color_node = gl_color_node_new_default (); + line_color_node = gl_color_node_new_default (); + + object = gl_label_ellipse_new (view->label); + gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y); + gl_label_object_set_size (GL_LABEL_OBJECT(object), 0.0, 0.0); + line_color_node->color = gl_color_set_opacity (gl_view_get_default_line_color(view), 0.5); + fill_color_node->color = gl_color_set_opacity (gl_view_get_default_fill_color(view), 0.5); + gl_label_object_set_line_width (GL_LABEL_OBJECT(object), + gl_view_get_default_line_width(view)); + gl_label_object_set_line_color (GL_LABEL_OBJECT(object), + line_color_node); + gl_label_object_set_fill_color (GL_LABEL_OBJECT(object), + fill_color_node); + + gl_color_node_free (&fill_color_node); + gl_color_node_free (&line_color_node); + + view->create_object = GL_LABEL_OBJECT (object); + view->create_x0 = x; + view->create_y0 = y; +} + +/*****************************************************************************/ +/* Object creation handler: motion event. */ +/*****************************************************************************/ +void +gl_view_ellipse_create_motion_event (glView *view, + gdouble x, + gdouble y) +{ + gdouble w, h; + + gl_label_object_set_position (GL_LABEL_OBJECT(view->create_object), + MIN (x, view->create_x0), MIN (y, view->create_y0)); + w = MAX (x, view->create_x0) - MIN (x, view->create_x0); + h = MAX (y, view->create_y0) - MIN (y, view->create_y0); + gl_label_object_set_size (GL_LABEL_OBJECT(view->create_object), w, h); +} + +/*****************************************************************************/ +/* Object creation handler: button relesase event. */ +/*****************************************************************************/ +void +gl_view_ellipse_create_button_release_event (glView *view, + gdouble x, + gdouble y) +{ + glColorNode *fill_color_node; + glColorNode *line_color_node; + gdouble w, h; + + fill_color_node = gl_color_node_new_default (); + line_color_node = gl_color_node_new_default (); + + if ((view->create_x0 == x) && (view->create_y0 == y)) { + x = view->create_x0 + 36.0; + y = view->create_y0 + 36.0; + } + gl_label_object_set_position (GL_LABEL_OBJECT(view->create_object), + MIN (x, view->create_x0), MIN (y, view->create_y0)); + w = MAX (x, view->create_x0) - MIN (x, view->create_x0); + h = MAX (y, view->create_y0) - MIN (y, view->create_y0); + gl_label_object_set_size (GL_LABEL_OBJECT(view->create_object), w, h); + line_color_node->color = gl_view_get_default_line_color(view); + gl_label_object_set_line_color (GL_LABEL_OBJECT(view->create_object), line_color_node); + fill_color_node->color = gl_view_get_default_fill_color(view); + gl_label_object_set_fill_color (GL_LABEL_OBJECT(view->create_object), fill_color_node); + gl_color_node_free (&fill_color_node); + gl_color_node_free (&line_color_node); +} + diff --git a/glabels2/src/view-ellipse.h b/glabels2/src/view-ellipse.h new file mode 100644 index 00000000..b6d6aae2 --- /dev/null +++ b/glabels2/src/view-ellipse.h @@ -0,0 +1,81 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * view_ellipse.h: GLabels label ellipse object view + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __VIEW_ELLIPSE_H__ +#define __VIEW_ELLIPSE_H__ + +#include "view-object.h" +#include "label-ellipse.h" + +G_BEGIN_DECLS + + +#define GL_TYPE_VIEW_ELLIPSE (gl_view_ellipse_get_type ()) +#define GL_VIEW_ELLIPSE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_VIEW_ELLIPSE, glViewEllipse)) +#define GL_VIEW_ELLIPSE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_VIEW_ELLIPSE, glViewEllipseClass)) +#define GL_IS_VIEW_ELLIPSE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_VIEW_ELLIPSE)) +#define GL_IS_VIEW_ELLIPSE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_VIEW_ELLIPSE)) + +typedef struct _glViewEllipse glViewEllipse; +typedef struct _glViewEllipseClass glViewEllipseClass; + +typedef struct _glViewEllipsePrivate glViewEllipsePrivate; + +struct _glViewEllipse { + glViewObject parent_object; + + glViewEllipsePrivate *priv; +}; + +struct _glViewEllipseClass { + glViewObjectClass parent_class; +}; + + +GType gl_view_ellipse_get_type (void) G_GNUC_CONST; + +glViewObject *gl_view_ellipse_new (glLabelEllipse *object, + glView *view); + + +/* cursor for creating ellipse objects */ +GdkCursor *gl_view_ellipse_get_create_cursor (void); + +/* Object creation handlers. */ +void gl_view_ellipse_create_button_press_event (glView *view, + gdouble x, + gdouble y); + +void gl_view_ellipse_create_motion_event (glView *view, + gdouble x, + gdouble y); + +void gl_view_ellipse_create_button_release_event (glView *view, + gdouble x, + gdouble y); + + +G_END_DECLS + +#endif /* __VIEW_ELLIPSE_H__ */ diff --git a/glabels2/src/view-image.c b/glabels2/src/view-image.c new file mode 100644 index 00000000..c1ec5946 --- /dev/null +++ b/glabels2/src/view-image.c @@ -0,0 +1,447 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * view_image.c: GLabels label image object view + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "view-image.h" + +#include +#include + +#include "color.h" +#include "object-editor.h" +#include "stock.h" + +#include "pixmaps/cursor_image.xbm" +#include "pixmaps/cursor_image_mask.xbm" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glViewImagePrivate { +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_view_image_finalize (GObject *object); + +static GtkWidget *construct_properties_editor (glViewObject *view_object); + +static void update_object_from_editor_cb (glObjectEditor *editor, + glLabelObject *object); + +static void update_editor_from_object_cb (glLabelObject *object, + glObjectEditor *editor); + +static void update_editor_from_move_cb (glLabelObject *object, + gdouble dx, + gdouble dy, + glObjectEditor *editor); + +static void update_editor_from_label_cb (glLabel *label, + glObjectEditor *editor); + +static gboolean object_at (glViewObject *view_object, + cairo_t *cr, + gdouble x, + gdouble y); + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glViewImage, gl_view_image, GL_TYPE_VIEW_OBJECT); + + +static void +gl_view_image_class_init (glViewImageClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + glViewObjectClass *view_object_class = GL_VIEW_OBJECT_CLASS (class); + + gl_debug (DEBUG_VIEW, "START"); + + gl_view_image_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_view_image_finalize; + + view_object_class->construct_editor = construct_properties_editor; + view_object_class->object_at = object_at; + + gl_debug (DEBUG_VIEW, "END"); +} + +static void +gl_view_image_init (glViewImage *view_image) +{ + gl_debug (DEBUG_VIEW, "START"); + + view_image->priv = g_new0 (glViewImagePrivate, 1); + + gl_debug (DEBUG_VIEW, "END"); +} + +static void +gl_view_image_finalize (GObject *object) +{ + glViewImage *view_image = GL_VIEW_IMAGE (object); + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (object && GL_IS_VIEW_IMAGE (object)); + + g_free (view_image->priv); + + G_OBJECT_CLASS (gl_view_image_parent_class)->finalize (object); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* NEW image object view. */ +/*****************************************************************************/ +glViewObject * +gl_view_image_new (glLabelImage *object, + glView *view) +{ + glViewImage *view_image; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_IMAGE (object), NULL); + g_return_val_if_fail (view && GL_IS_VIEW (view), NULL); + + view_image = g_object_new (gl_view_image_get_type(), NULL); + + gl_view_object_set_object (GL_VIEW_OBJECT(view_image), + GL_LABEL_OBJECT(object), + GL_VIEW_OBJECT_HANDLES_BOX); + gl_view_object_set_view (GL_VIEW_OBJECT(view_image), view); + + gl_debug (DEBUG_VIEW, "END"); + + return GL_VIEW_OBJECT (view_image); +} + +/*****************************************************************************/ +/* Create a properties dialog for a image object. */ +/*****************************************************************************/ +static GtkWidget * +construct_properties_editor (glViewObject *view_object) +{ + GtkWidget *editor; + glViewImage *view_image = (glViewImage *)view_object; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + object = gl_view_object_get_object (GL_VIEW_OBJECT(view_image)); + + /* Build editor. */ + editor = gl_object_editor_new (GL_STOCK_IMAGE, _("Image object properties"), + GL_OBJECT_EDITOR_POSITION_PAGE, + GL_OBJECT_EDITOR_SIZE_IMAGE_PAGE, + GL_OBJECT_EDITOR_IMAGE_PAGE, + 0); + + /* Update */ + update_editor_from_label_cb (object->parent, GL_OBJECT_EDITOR(editor)); + update_editor_from_object_cb (object, GL_OBJECT_EDITOR(editor)); + update_editor_from_move_cb (object, 0, 0, GL_OBJECT_EDITOR(editor)); + + /* Connect signals. */ + g_signal_connect (G_OBJECT (editor), "changed", + G_CALLBACK(update_object_from_editor_cb), object); + g_signal_connect (G_OBJECT (object), "changed", + G_CALLBACK (update_editor_from_object_cb), editor); + g_signal_connect (G_OBJECT (object), "moved", + G_CALLBACK (update_editor_from_move_cb), editor); + g_signal_connect (G_OBJECT (object->parent), "size_changed", + G_CALLBACK (update_editor_from_label_cb), editor); + g_signal_connect (G_OBJECT (object->parent), "merge_changed", + G_CALLBACK (update_editor_from_label_cb), editor); + + gl_debug (DEBUG_VIEW, "END"); + + return editor; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. editor "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_object_from_editor_cb (glObjectEditor *editor, + glLabelObject *object) +{ + gdouble x, y, w, h; + glTextNode *filename; + const GdkPixbuf *pixbuf; + gdouble image_w, image_h; + + gl_debug (DEBUG_VIEW, "START"); + + g_signal_handlers_block_by_func (G_OBJECT(object), + update_editor_from_object_cb, + editor); + g_signal_handlers_block_by_func (G_OBJECT(object), + update_editor_from_move_cb, + editor); + + + gl_object_editor_get_position (editor, &x, &y); + gl_label_object_set_position (object, x, y); + + gl_object_editor_get_size (editor, &w, &h); + gl_label_object_set_size (object, w, h); + + filename = gl_object_editor_get_image (editor); + gl_label_image_set_filename (GL_LABEL_IMAGE(object), filename); + gl_text_node_free (&filename); + + /* Setting filename may have modified the size. */ + gl_label_object_get_size (object, &w, &h); + gl_object_editor_set_size (editor, w, h); + + /* It may also have a new base size. */ + pixbuf = gl_label_image_get_pixbuf (GL_LABEL_IMAGE(object), NULL); + image_w = gdk_pixbuf_get_width (pixbuf); + image_h = gdk_pixbuf_get_height (pixbuf); + gl_object_editor_set_base_size (editor, image_w, image_h); + + g_signal_handlers_unblock_by_func (G_OBJECT(object), + update_editor_from_object_cb, + editor); + g_signal_handlers_unblock_by_func (G_OBJECT(object), + update_editor_from_move_cb, + editor); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label object "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_object_cb (glLabelObject *object, + glObjectEditor *editor) +{ + gdouble w, h; + const GdkPixbuf *pixbuf; + gdouble image_w, image_h; + glTextNode *filename; + glMerge *merge; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_object_get_size (object, &w, &h); + gl_object_editor_set_size (editor, w, h); + + pixbuf = gl_label_image_get_pixbuf (GL_LABEL_IMAGE(object), NULL); + image_w = gdk_pixbuf_get_width (pixbuf); + image_h = gdk_pixbuf_get_height (pixbuf); + gl_object_editor_set_base_size (editor, image_w, image_h); + + filename = gl_label_image_get_filename (GL_LABEL_IMAGE(object)); + merge = gl_label_get_merge (GL_LABEL(object->parent)); + if ( filename != NULL ) { + gl_object_editor_set_image (editor, (merge != NULL), filename); + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label object "moved" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_move_cb (glLabelObject *object, + gdouble dx, + gdouble dy, + glObjectEditor *editor) +{ + gdouble x, y; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_object_get_position (object, &x, &y); + gl_object_editor_set_position (editor, x, y); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_label_cb (glLabel *label, + glObjectEditor *editor) +{ + gdouble label_width, label_height; + glMerge *merge; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_get_size (label, &label_width, &label_height); + gl_object_editor_set_max_position (GL_OBJECT_EDITOR (editor), + label_width, label_height); + gl_object_editor_set_max_size (GL_OBJECT_EDITOR (editor), + label_width, label_height); + + merge = gl_label_get_merge (label); + gl_object_editor_set_key_names (editor, merge); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Is object at (x,y)? */ +/*****************************************************************************/ +static gboolean +object_at (glViewObject *view_object, + cairo_t *cr, + gdouble x, + gdouble y) +{ + glLabelObject *object; + gdouble w, h; + + object = gl_view_object_get_object (view_object); + + gl_label_object_get_size (object, &w, &h); + + cairo_rectangle (cr, 0.0, 0.0, w, h); + + if (cairo_in_fill (cr, x, y)) + { + return TRUE; + } + + return FALSE; +} + + +/*****************************************************************************/ +/* Return apropos cursor for create object mode. */ +/*****************************************************************************/ +GdkCursor * +gl_view_image_get_create_cursor (void) +{ + GdkCursor *cursor = NULL; + GdkPixmap *pixmap_data, *pixmap_mask; + GdkColor fg = { 0, 0, 0, 0 }; + GdkColor bg = { 0, 65535, 65535, 65535 }; + + gl_debug (DEBUG_VIEW, "START"); + + pixmap_data = gdk_bitmap_create_from_data (NULL, + (gchar *)cursor_image_bits, + cursor_image_width, + cursor_image_height); + pixmap_mask = gdk_bitmap_create_from_data (NULL, + (gchar *)cursor_image_mask_bits, + cursor_image_mask_width, + cursor_image_mask_height); + cursor = gdk_cursor_new_from_pixmap (pixmap_data, pixmap_mask, &fg, + &bg, cursor_image_x_hot, + cursor_image_y_hot); + + gl_debug (DEBUG_VIEW, "END"); + + return cursor; +} + +/*****************************************************************************/ +/* Object creation handler: button press event. */ +/*****************************************************************************/ +void +gl_view_image_create_button_press_event (glView *view, + gdouble x, + gdouble y) +{ + GObject *object; + + gl_view_unselect_all (view); + + object = gl_label_image_new (view->label); + gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y); + gl_label_object_set_size (GL_LABEL_OBJECT(object), 0.0, 0.0); + + view->create_object = GL_LABEL_OBJECT (object); + view->create_x0 = x; + view->create_y0 = y; +} + +/*****************************************************************************/ +/* Object creation handler: motion event. */ +/*****************************************************************************/ +void +gl_view_image_create_motion_event (glView *view, + gdouble x, + gdouble y) +{ + gdouble w, h; + + gl_label_object_set_position (GL_LABEL_OBJECT(view->create_object), + MIN (x, view->create_x0), MIN (y, view->create_y0)); + w = MAX (x, view->create_x0) - MIN (x, view->create_x0); + h = MAX (y, view->create_y0) - MIN (y, view->create_y0); + gl_label_object_set_size (GL_LABEL_OBJECT(view->create_object), w, h); +} + +/*****************************************************************************/ +/* Object creation handler: button relesase event. */ +/*****************************************************************************/ +void +gl_view_image_create_button_release_event (glView *view, + gdouble x, + gdouble y) +{ + gdouble w, h; + + if ((view->create_x0 == x) && (view->create_y0 == y)) { + x = view->create_x0 + 36.0; + y = view->create_y0 + 36.0; + } + gl_label_object_set_position (GL_LABEL_OBJECT(view->create_object), + MIN (x, view->create_x0), MIN (y, view->create_y0)); + w = MAX (x, view->create_x0) - MIN (x, view->create_x0); + h = MAX (y, view->create_y0) - MIN (y, view->create_y0); + gl_label_object_set_size (GL_LABEL_OBJECT(view->create_object), w, h); +} + diff --git a/glabels2/src/view-image.h b/glabels2/src/view-image.h new file mode 100644 index 00000000..7bb3ce10 --- /dev/null +++ b/glabels2/src/view-image.h @@ -0,0 +1,81 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * view_image.h: GLabels label image object view + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __VIEW_IMAGE_H__ +#define __VIEW_IMAGE_H__ + +#include "view-object.h" +#include "label-image.h" + +G_BEGIN_DECLS + + +#define GL_TYPE_VIEW_IMAGE (gl_view_image_get_type ()) +#define GL_VIEW_IMAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_VIEW_IMAGE, glViewImage)) +#define GL_VIEW_IMAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_VIEW_IMAGE, glViewImageClass)) +#define GL_IS_VIEW_IMAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_VIEW_IMAGE)) +#define GL_IS_VIEW_IMAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_VIEW_IMAGE)) + +typedef struct _glViewImage glViewImage; +typedef struct _glViewImageClass glViewImageClass; + +typedef struct _glViewImagePrivate glViewImagePrivate; + +struct _glViewImage { + glViewObject parent_object; + + glViewImagePrivate *priv; +}; + +struct _glViewImageClass { + glViewObjectClass parent_class; +}; + + +GType gl_view_image_get_type (void) G_GNUC_CONST; + +glViewObject *gl_view_image_new (glLabelImage *object, + glView *view); + + +/* cursor for creating image objects */ +GdkCursor *gl_view_image_get_create_cursor (void); + +/* Object creation handlers. */ +void gl_view_image_create_button_press_event (glView *view, + gdouble x, + gdouble y); + +void gl_view_image_create_motion_event (glView *view, + gdouble x, + gdouble y); + +void gl_view_image_create_button_release_event (glView *view, + gdouble x, + gdouble y); + + +G_END_DECLS + +#endif /* __VIEW_IMAGE_H__ */ diff --git a/glabels2/src/view-line.c b/glabels2/src/view-line.c new file mode 100644 index 00000000..7b0412d1 --- /dev/null +++ b/glabels2/src/view-line.c @@ -0,0 +1,488 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * view_line.c: GLabels label line object view + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "view-line.h" + +#include +#include + +#include "color.h" +#include "object-editor.h" +#include "stock.h" + +#include "pixmaps/cursor_line.xbm" +#include "pixmaps/cursor_line_mask.xbm" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glViewLinePrivate { +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_view_line_finalize (GObject *object); + +static GtkWidget *construct_properties_editor (glViewObject *view_object); + +static void update_object_from_editor_cb (glObjectEditor *editor, + glLabelObject *object); + +static void update_editor_from_object_cb (glLabelObject *object, + glObjectEditor *editor); + +static void update_editor_from_move_cb (glLabelObject *object, + gdouble dx, + gdouble dy, + glObjectEditor *editor); + +static void update_editor_from_label_cb (glLabel *label, + glObjectEditor *editor); + +static gboolean object_at (glViewObject *view_object, + cairo_t *cr, + gdouble x, + gdouble y); + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glViewLine, gl_view_line, GL_TYPE_VIEW_OBJECT); + + +static void +gl_view_line_class_init (glViewLineClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + glViewObjectClass *view_object_class = GL_VIEW_OBJECT_CLASS (class); + + gl_debug (DEBUG_VIEW, "START"); + + gl_view_line_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_view_line_finalize; + + view_object_class->construct_editor = construct_properties_editor; + view_object_class->object_at = object_at; + + gl_debug (DEBUG_VIEW, "END"); +} + +static void +gl_view_line_init (glViewLine *view_line) +{ + gl_debug (DEBUG_VIEW, "START"); + + view_line->priv = g_new0 (glViewLinePrivate, 1); + + gl_debug (DEBUG_VIEW, "END"); +} + +static void +gl_view_line_finalize (GObject *object) +{ + glViewLine *view_line = GL_VIEW_LINE (object); + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (object && GL_IS_VIEW_LINE (object)); + + g_free (view_line->priv); + + G_OBJECT_CLASS (gl_view_line_parent_class)->finalize (object); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* NEW line object view. */ +/*****************************************************************************/ +glViewObject * +gl_view_line_new (glLabelLine *object, + glView *view) +{ + glViewLine *view_line; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_LINE (object), NULL); + g_return_val_if_fail (view && GL_IS_VIEW (view), NULL); + + view_line = g_object_new (gl_view_line_get_type(), NULL); + + gl_view_object_set_object (GL_VIEW_OBJECT(view_line), + GL_LABEL_OBJECT(object), + GL_VIEW_OBJECT_HANDLES_LINE); + gl_view_object_set_view (GL_VIEW_OBJECT(view_line), view); + + gl_debug (DEBUG_VIEW, "END"); + + return GL_VIEW_OBJECT (view_line); +} + +/*****************************************************************************/ +/* Create a properties dialog for a line object. */ +/*****************************************************************************/ +static GtkWidget * +construct_properties_editor (glViewObject *view_object) +{ + GtkWidget *editor; + glViewLine *view_line = (glViewLine *)view_object; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + object = gl_view_object_get_object (GL_VIEW_OBJECT(view_line)); + + /* Build editor. */ + editor = gl_object_editor_new (GL_STOCK_LINE, _("Line object properties"), + GL_OBJECT_EDITOR_SHADOW_PAGE, + GL_OBJECT_EDITOR_POSITION_PAGE, + GL_OBJECT_EDITOR_SIZE_LINE_PAGE, + GL_OBJECT_EDITOR_LINE_PAGE, + 0); + + /* Update */ + update_editor_from_label_cb (object->parent, GL_OBJECT_EDITOR(editor)); + update_editor_from_object_cb (object, GL_OBJECT_EDITOR(editor)); + update_editor_from_move_cb (object, 0, 0, GL_OBJECT_EDITOR(editor)); + + /* Connect signals. */ + g_signal_connect (G_OBJECT (editor), "changed", + G_CALLBACK(update_object_from_editor_cb), object); + g_signal_connect (G_OBJECT (object), "changed", + G_CALLBACK (update_editor_from_object_cb), editor); + g_signal_connect (G_OBJECT (object), "moved", + G_CALLBACK (update_editor_from_move_cb), editor); + g_signal_connect (G_OBJECT (object->parent), "size_changed", + G_CALLBACK (update_editor_from_label_cb), editor); + g_signal_connect (G_OBJECT (object->parent), "merge_changed", + G_CALLBACK (update_editor_from_label_cb), editor); + + gl_debug (DEBUG_VIEW, "END"); + + return editor; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. editor "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_object_from_editor_cb (glObjectEditor *editor, + glLabelObject *object) +{ + gdouble x, y, w, h; + glColorNode *line_color_node; + gdouble line_width; + gboolean shadow_state; + gdouble shadow_x, shadow_y; + glColorNode *shadow_color_node; + gdouble shadow_opacity; + + + gl_debug (DEBUG_VIEW, "START"); + + g_signal_handlers_block_by_func (G_OBJECT(object), + update_editor_from_object_cb, + editor); + g_signal_handlers_block_by_func (G_OBJECT(object), + update_editor_from_move_cb, + editor); + + gl_object_editor_get_position (editor, &x, &y); + gl_label_object_set_position (object, x, y); + + gl_object_editor_get_lsize (editor, &w, &h); + gl_label_object_set_size (object, w, h); + + line_color_node = gl_object_editor_get_line_color (editor); + gl_label_object_set_line_color (object, line_color_node); + gl_color_node_free (&line_color_node); + + line_width = gl_object_editor_get_line_width (editor); + gl_label_object_set_line_width (object, line_width); + + shadow_state = gl_object_editor_get_shadow_state (editor); + gl_label_object_set_shadow_state (object, shadow_state); + + gl_object_editor_get_shadow_offset (editor, &shadow_x, &shadow_y); + gl_label_object_set_shadow_offset (object, shadow_x, shadow_y); + + shadow_color_node = gl_object_editor_get_shadow_color (editor); + gl_label_object_set_shadow_color (object, shadow_color_node); + gl_color_node_free (&shadow_color_node); + + shadow_opacity = gl_object_editor_get_shadow_opacity (editor); + gl_label_object_set_shadow_opacity (object, shadow_opacity); + + g_signal_handlers_unblock_by_func (G_OBJECT(object), + update_editor_from_object_cb, + editor); + g_signal_handlers_unblock_by_func (G_OBJECT(object), + update_editor_from_move_cb, + editor); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label object "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_object_cb (glLabelObject *object, + glObjectEditor *editor) +{ + gdouble w, h; + glColorNode *line_color_node; + gdouble line_width; + gboolean shadow_state; + gdouble shadow_x, shadow_y; + glColorNode *shadow_color_node; + gdouble shadow_opacity; + glMerge *merge; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_object_get_size (object, &w, &h); + gl_object_editor_set_lsize (editor, w, h); + merge = gl_label_get_merge (GL_LABEL(object->parent)); + + line_color_node = gl_label_object_get_line_color (GL_LABEL_OBJECT(object)); + gl_object_editor_set_line_color (editor, (merge != NULL), line_color_node); + gl_color_node_free (&line_color_node); + + line_width = gl_label_object_get_line_width (GL_LABEL_OBJECT(object)); + gl_object_editor_set_line_width (editor, line_width); + + shadow_state = gl_label_object_get_shadow_state (object); + gl_object_editor_set_shadow_state (editor, shadow_state); + + gl_label_object_get_shadow_offset (object, &shadow_x, &shadow_y); + gl_object_editor_set_shadow_offset (editor, shadow_x, shadow_y); + + shadow_color_node = gl_label_object_get_shadow_color (object); + gl_object_editor_set_shadow_color (editor, (merge != NULL), shadow_color_node); + gl_color_node_free (&shadow_color_node); + + shadow_opacity = gl_label_object_get_shadow_opacity (object); + gl_object_editor_set_shadow_opacity (editor, shadow_opacity); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label object "moved" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_move_cb (glLabelObject *object, + gdouble dx, + gdouble dy, + glObjectEditor *editor) +{ + gdouble x, y; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_object_get_position (object, &x, &y); + gl_object_editor_set_position (editor, x, y); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_label_cb (glLabel *label, + glObjectEditor *editor) +{ + gdouble label_width, label_height; + glMerge *merge; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_get_size (label, &label_width, &label_height); + gl_object_editor_set_max_position (GL_OBJECT_EDITOR (editor), + label_width, label_height); + gl_object_editor_set_max_lsize (GL_OBJECT_EDITOR (editor), + label_width, label_height); + gl_object_editor_set_max_shadow_offset (GL_OBJECT_EDITOR (editor), + label_width, label_height); + + merge = gl_label_get_merge (label); + gl_object_editor_set_key_names (editor, merge); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Is object at (x,y)? */ +/*****************************************************************************/ +static gboolean +object_at (glViewObject *view_object, + cairo_t *cr, + gdouble x, + gdouble y) +{ + glLabelObject *object; + gdouble w, h; + gdouble line_width; + + object = gl_view_object_get_object (view_object); + + gl_label_object_get_size (object, &w, &h); + + cairo_move_to (cr, 0.0, 0.0); + cairo_line_to (cr, w, h); + + line_width = gl_label_object_get_line_width (object); + cairo_set_line_width (cr, line_width); + if (cairo_in_stroke (cr, x, y)) + { + return TRUE; + } + + return FALSE; +} + + +/*****************************************************************************/ +/* Return apropos cursor for create object mode. */ +/*****************************************************************************/ +GdkCursor * +gl_view_line_get_create_cursor (void) +{ + GdkCursor *cursor = NULL; + GdkPixmap *pixmap_data, *pixmap_mask; + GdkColor fg = { 0, 0, 0, 0 }; + GdkColor bg = { 0, 65535, 65535, 65535 }; + + gl_debug (DEBUG_VIEW, "START"); + + pixmap_data = gdk_bitmap_create_from_data (NULL, + (gchar *)cursor_line_bits, + cursor_line_width, + cursor_line_height); + pixmap_mask = gdk_bitmap_create_from_data (NULL, + (gchar *)cursor_line_mask_bits, + cursor_line_mask_width, + cursor_line_mask_height); + cursor = gdk_cursor_new_from_pixmap (pixmap_data, pixmap_mask, &fg, + &bg, cursor_line_x_hot, + cursor_line_y_hot); + + gl_debug (DEBUG_VIEW, "END"); + + return cursor; +} + +/*****************************************************************************/ +/* Object creation handler: button press event. */ +/*****************************************************************************/ +void +gl_view_line_create_button_press_event (glView *view, + gdouble x, + gdouble y) +{ + GObject *object; + glColorNode *line_color_node; + + gl_view_unselect_all (view); + + line_color_node = gl_color_node_new_default (); + + object = gl_label_line_new (view->label); + gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y); + gl_label_object_set_size (GL_LABEL_OBJECT(object), 0.0, 0.0); + line_color_node->color = gl_color_set_opacity (gl_view_get_default_line_color(view), 0.5); + gl_label_object_set_line_width (GL_LABEL_OBJECT(object), + gl_view_get_default_line_width(view)); + gl_label_object_set_line_color (GL_LABEL_OBJECT(object), + line_color_node); + + gl_color_node_free (&line_color_node); + + view->create_object = GL_LABEL_OBJECT (object); + view->create_x0 = x; + view->create_y0 = y; +} + +/*****************************************************************************/ +/* Object creation handler: motion event. */ +/*****************************************************************************/ +void +gl_view_line_create_motion_event (glView *view, + gdouble x, + gdouble y) +{ + gdouble w, h; + + w = x - view->create_x0; + h = y - view->create_y0; + gl_label_object_set_size (GL_LABEL_OBJECT(view->create_object), w, h); +} + +/*****************************************************************************/ +/* Object creation handler: button relesase event. */ +/*****************************************************************************/ +void +gl_view_line_create_button_release_event (glView *view, + gdouble x, + gdouble y) +{ + glColorNode *line_color_node; + gdouble w, h; + + line_color_node = gl_color_node_new_default (); + + if ((view->create_x0 == x) && (view->create_y0 == y)) { + x = view->create_x0 + 36.0; + y = view->create_y0 + 36.0; + } + w = x - view->create_x0; + h = y - view->create_y0; + gl_label_object_set_size (GL_LABEL_OBJECT(view->create_object), w, h); + line_color_node->color = gl_view_get_default_line_color(view); + gl_label_object_set_line_color (GL_LABEL_OBJECT(view->create_object), line_color_node); + gl_color_node_free (&line_color_node); +} + diff --git a/glabels2/src/view-line.h b/glabels2/src/view-line.h new file mode 100644 index 00000000..a938a115 --- /dev/null +++ b/glabels2/src/view-line.h @@ -0,0 +1,81 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * view_line.h: GLabels label line object view + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __VIEW_LINE_H__ +#define __VIEW_LINE_H__ + +#include "view-object.h" +#include "label-line.h" + +G_BEGIN_DECLS + + +#define GL_TYPE_VIEW_LINE (gl_view_line_get_type ()) +#define GL_VIEW_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_VIEW_LINE, glViewLine)) +#define GL_VIEW_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_VIEW_LINE, glViewLineClass)) +#define GL_IS_VIEW_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_VIEW_LINE)) +#define GL_IS_VIEW_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_VIEW_LINE)) + +typedef struct _glViewLine glViewLine; +typedef struct _glViewLineClass glViewLineClass; + +typedef struct _glViewLinePrivate glViewLinePrivate; + +struct _glViewLine { + glViewObject parent_object; + + glViewLinePrivate *priv; +}; + +struct _glViewLineClass { + glViewObjectClass parent_class; +}; + + +GType gl_view_line_get_type (void) G_GNUC_CONST; + +glViewObject *gl_view_line_new (glLabelLine *object, + glView *view); + + +/* cursor for creating line objects */ +GdkCursor *gl_view_line_get_create_cursor (void); + +/* Object creation handlers. */ +void gl_view_line_create_button_press_event (glView *view, + gdouble x, + gdouble y); + +void gl_view_line_create_motion_event (glView *view, + gdouble x, + gdouble y); + +void gl_view_line_create_button_release_event (glView *view, + gdouble x, + gdouble y); + + +G_END_DECLS + +#endif /* __VIEW_LINE_H__ */ diff --git a/glabels2/src/view-object.c b/glabels2/src/view-object.c new file mode 100644 index 00000000..ccbf153f --- /dev/null +++ b/glabels2/src/view-object.c @@ -0,0 +1,764 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * view_object.c: GLabels label object base class + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "view-object.h" + +#include + +#include "debug.h" + +/*========================================================*/ +/* Private constants and macros. */ +/*========================================================*/ + +#define HANDLE_FILL_RGBA_ARGS 0.0, 0.75, 0.0, 0.4 +#define HANDLE_OUTLINE_RGBA_ARGS 0.0, 0.0, 0.0, 0.8 + +#define HANDLE_OUTLINE_WIDTH_PIXELS 1.0 +#define HANDLE_PIXELS 7 + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glViewObjectPrivate { + + glLabelObject *object; + + glView *view; + glViewObjectHandlesStyle handles_style; + + GtkWidget *property_editor; +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_view_object_finalize (GObject *object); + +static void object_removed_cb (glViewObject *view_object, + glLabelObject *object); + +static void object_top_cb (glViewObject *view_object, + glLabelObject *object); + +static void object_bottom_cb (glViewObject *view_object, + glLabelObject *object); + + + + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glViewObject, gl_view_object, G_TYPE_OBJECT); + +static void +gl_view_object_class_init (glViewObjectClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_debug (DEBUG_VIEW, "START"); + + gl_view_object_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_view_object_finalize; + + gl_debug (DEBUG_VIEW, "END"); +} + +static void +gl_view_object_init (glViewObject *view_object) +{ + gl_debug (DEBUG_VIEW, "START"); + + view_object->priv = g_new0 (glViewObjectPrivate, 1); + + gl_debug (DEBUG_VIEW, "END"); +} + +static void +gl_view_object_finalize (GObject *object) +{ + glViewObject *view_object = GL_VIEW_OBJECT (object); + glView *view; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (object && GL_IS_VIEW_OBJECT (object)); + + view = view_object->priv->view; + view->object_list = g_list_remove (view->object_list, object); + view->selected_object_list = + g_list_remove (view->selected_object_list, object); + + g_object_unref (view_object->priv->object); + if (view_object->priv->property_editor) { + gtk_object_destroy (GTK_OBJECT(view_object->priv->property_editor)); + } + g_free (view_object->priv); + + G_OBJECT_CLASS (gl_view_object_parent_class)->finalize (object); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* NEW object view. */ +/*****************************************************************************/ +GObject * +gl_view_object_new (void) +{ + glViewObject *view_object; + + gl_debug (DEBUG_VIEW, "START"); + + view_object = g_object_new (gl_view_object_get_type(), NULL); + + gl_debug (DEBUG_VIEW, "END"); + + return G_OBJECT (view_object); +} + +/*****************************************************************************/ +/* Set parent view to which this object view belongs. */ +/*****************************************************************************/ +void +gl_view_object_set_view (glViewObject *view_object, + glView *view) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object)); + g_return_if_fail (view && GL_IS_VIEW (view)); + + view_object->priv->view = view; + + view->object_list = g_list_append (view->object_list, view_object); + + g_signal_connect_swapped (G_OBJECT (view_object->priv->object), "changed", + G_CALLBACK (gl_view_update), view); + g_signal_connect_swapped (G_OBJECT (view_object->priv->object), "moved", + G_CALLBACK (gl_view_update), view); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Set Label object to follow. */ +/*****************************************************************************/ +void +gl_view_object_set_object (glViewObject *view_object, + glLabelObject *object, + glViewObjectHandlesStyle style) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object)); + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + view_object->priv->object = g_object_ref (G_OBJECT (object)); + view_object->priv->handles_style = style; + + g_signal_connect_swapped (G_OBJECT (object), "removed", + G_CALLBACK (object_removed_cb), view_object); + g_signal_connect_swapped (G_OBJECT (object), "top", + G_CALLBACK (object_top_cb), view_object); + g_signal_connect_swapped (G_OBJECT (object), "bottom", + G_CALLBACK (object_bottom_cb), view_object); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Handle object "removed" signal. */ +/*---------------------------------------------------------------------------*/ +static void +object_removed_cb (glViewObject *view_object, + glLabelObject *object) +{ + glView *view; + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object)); + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + view = gl_view_object_get_view (view_object); + view->object_list = g_list_remove (view->object_list, view_object); + g_object_unref (G_OBJECT (view_object)); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Handle object "top" signal. */ +/*---------------------------------------------------------------------------*/ +static void +object_top_cb (glViewObject *view_object, + glLabelObject *object) +{ + glView *view; + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object)); + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + view = gl_view_object_get_view (view_object); + + /* Move to end of list, representing front most object */ + view->object_list = g_list_remove (view->object_list, view_object); + view->object_list = g_list_append (view->object_list, view_object); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Handle object "removed" signal. */ +/*---------------------------------------------------------------------------*/ +static void +object_bottom_cb (glViewObject *view_object, + glLabelObject *object) +{ + glView *view; + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object)); + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + view = gl_view_object_get_view (view_object); + + /* Move to front of list, representing rear most object */ + view->object_list = g_list_remove (view->object_list, view_object); + view->object_list = g_list_prepend (view->object_list, view_object); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Return parent view associated with this view. */ +/*****************************************************************************/ +glView * +gl_view_object_get_view (glViewObject *view_object) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object), NULL); + + gl_debug (DEBUG_VIEW, "END"); + + return view_object->priv->view; +} + +/*****************************************************************************/ +/* Return label object that we are following. */ +/*****************************************************************************/ +glLabelObject * +gl_view_object_get_object (glViewObject *view_object) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object), NULL); + + gl_debug (DEBUG_VIEW, "END"); + + return view_object->priv->object; +} + +/*****************************************************************************/ +/* Get property editor. */ +/*****************************************************************************/ +GtkWidget * +gl_view_object_get_editor (glViewObject *view_object) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object), NULL); + + if ( GL_VIEW_OBJECT_GET_CLASS(view_object)->construct_editor != NULL ) { + + if (view_object->priv->property_editor == NULL) { + view_object->priv->property_editor = + GL_VIEW_OBJECT_GET_CLASS(view_object)->construct_editor (view_object); + } + g_signal_connect (G_OBJECT (view_object->priv->property_editor), + "destroy", + G_CALLBACK (gtk_widget_destroyed), + &view_object->priv->property_editor); + + gtk_widget_show (view_object->priv->property_editor); + + } + + + gl_debug (DEBUG_VIEW, "END"); + + return view_object->priv->property_editor; +} + + +/*****************************************************************************/ +/* Select object. */ +/*****************************************************************************/ +void +gl_view_object_select (glViewObject *view_object) +{ + gl_debug (DEBUG_VIEW, "START"); + + gl_view_select_object(view_object->priv->view, view_object); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Is object at (x,y)? */ +/*****************************************************************************/ +gboolean +gl_view_object_at (glViewObject *view_object, + cairo_t *cr, + gdouble x, + gdouble y) +{ + glLabelObject *object = view_object->priv->object; + gdouble x0, y0; + cairo_matrix_t matrix; + gboolean return_val = FALSE; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object), FALSE); + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), FALSE); + + gl_label_object_get_position (object, &x0, &y0); + gl_label_object_get_matrix (object, &matrix); + + cairo_save (cr); + cairo_translate (cr, x0, y0); + cairo_transform (cr, &matrix); + + cairo_device_to_user (cr, &x, &y); + + if ( GL_VIEW_OBJECT_GET_CLASS(view_object)->object_at != NULL ) { + + return_val = GL_VIEW_OBJECT_GET_CLASS(view_object)->object_at (view_object, cr, x, y); + + } + + cairo_restore (cr); + + return return_val; + + gl_debug (DEBUG_VIEW, "END"); +} + + +/*--------------------------------------------------------------------------*/ +/* Create handle path */ +/*--------------------------------------------------------------------------*/ +static void +create_handle_path (cairo_t *cr, + glLabelObject *object, + gdouble scale, + gdouble x_handle, + gdouble y_handle) +{ + gl_debug (DEBUG_VIEW, "START"); + + cairo_rectangle (cr, + x_handle - HANDLE_PIXELS/scale/2, y_handle - HANDLE_PIXELS/scale/2, + HANDLE_PIXELS/scale, HANDLE_PIXELS/scale); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Draw object handles */ +/*****************************************************************************/ +void +gl_view_object_draw_handles (glViewObject *view_object, + cairo_t *cr) +{ + glLabelObject *object = view_object->priv->object; + gdouble x0, y0; + cairo_matrix_t matrix; + gdouble scale; + gdouble w, h; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object)); + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + scale = view_object->priv->view->home_scale * view_object->priv->view->zoom; + + gl_label_object_get_position (object, &x0, &y0); + gl_label_object_get_matrix (object, &matrix); + + gl_label_object_get_size (GL_LABEL_OBJECT(object), &w, &h); + + cairo_save (cr); + + cairo_translate (cr, x0, y0); + cairo_transform (cr, &matrix); + + switch (view_object->priv->handles_style) + { + case GL_VIEW_OBJECT_HANDLES_BOX: + + /* North */ + cairo_new_path (cr); + create_handle_path (cr, object, scale, w/2, 0); + + /* North East */ + cairo_new_sub_path (cr); + create_handle_path (cr, object, scale, w, 0); + + /* East */ + cairo_new_sub_path (cr); + create_handle_path (cr, object, scale, w, h/2); + + /* South East */ + cairo_new_sub_path (cr); + create_handle_path (cr, object, scale, w, h); + + /* South */ + cairo_new_sub_path (cr); + create_handle_path (cr, object, scale, w/2, h); + + /* South West */ + cairo_new_sub_path (cr); + create_handle_path (cr, object, scale, 0, h); + + /* West */ + cairo_new_sub_path (cr); + create_handle_path (cr, object, scale, 0, h/2); + + /* North West */ + cairo_new_sub_path (cr); + create_handle_path (cr, object, scale, 0, 0); + + break; + + case GL_VIEW_OBJECT_HANDLES_LINE: + /* P1 */ + cairo_new_path (cr); + create_handle_path (cr, object, scale, 0, 0); + + /* P2 */ + cairo_new_sub_path (cr); + create_handle_path (cr, object, scale, w, h); + + break; + } + + cairo_set_source_rgba (cr, HANDLE_FILL_RGBA_ARGS); + cairo_fill_preserve (cr); + + cairo_set_line_width (cr, HANDLE_OUTLINE_WIDTH_PIXELS/scale); + cairo_set_source_rgba (cr, HANDLE_OUTLINE_RGBA_ARGS); + cairo_stroke (cr); + + cairo_restore (cr); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Is there an object handle at (x,y). */ +/*****************************************************************************/ +glViewObjectHandle +gl_view_object_handle_at (glViewObject *view_object, + cairo_t *cr, + gdouble x, + gdouble y) +{ + glLabelObject *object = view_object->priv->object; + gdouble x0, y0; + cairo_matrix_t matrix; + gdouble scale; + gdouble w, h; + glViewObjectHandle handle = GL_VIEW_OBJECT_HANDLE_NONE; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object), handle); + g_return_val_if_fail (object && GL_IS_LABEL_OBJECT (object), handle); + + scale = view_object->priv->view->home_scale * view_object->priv->view->zoom; + + gl_label_object_get_position (object, &x0, &y0); + gl_label_object_get_matrix (object, &matrix); + + gl_label_object_get_size (GL_LABEL_OBJECT(object), &w, &h); + + cairo_save (cr); + + cairo_translate (cr, x0, y0); + cairo_transform (cr, &matrix); + + cairo_device_to_user (cr, &x, &y); + + switch (view_object->priv->handles_style) + { + case GL_VIEW_OBJECT_HANDLES_BOX: + + /* South East */ + create_handle_path (cr, object, scale, w, h); + if (cairo_in_fill (cr, x, y)) {handle = GL_VIEW_OBJECT_HANDLE_SE; break;} + + /* South West */ + create_handle_path (cr, object, scale, 0, h); + if (cairo_in_fill (cr, x, y)) {handle = GL_VIEW_OBJECT_HANDLE_SW; break;} + + /* North East */ + create_handle_path (cr, object, scale, w, 0); + if (cairo_in_fill (cr, x, y)) {handle = GL_VIEW_OBJECT_HANDLE_NE; break;} + + /* North West */ + create_handle_path (cr, object, scale, 0, 0); + if (cairo_in_fill (cr, x, y)) {handle = GL_VIEW_OBJECT_HANDLE_NW; break;} + + /* East */ + create_handle_path (cr, object, scale, w, h/2); + if (cairo_in_fill (cr, x, y)) {handle = GL_VIEW_OBJECT_HANDLE_E; break;} + + /* South */ + create_handle_path (cr, object, scale, w/2, h); + if (cairo_in_fill (cr, x, y)) {handle = GL_VIEW_OBJECT_HANDLE_S; break;} + + /* West */ + create_handle_path (cr, object, scale, 0, h/2); + if (cairo_in_fill (cr, x, y)) {handle = GL_VIEW_OBJECT_HANDLE_W; break;} + + /* North */ + create_handle_path (cr, object, scale, w/2, 0); + if (cairo_in_fill (cr, x, y)) {handle = GL_VIEW_OBJECT_HANDLE_N; break;} + + break; + + case GL_VIEW_OBJECT_HANDLES_LINE: + /* P2 */ + create_handle_path (cr, object, scale, w, h); + if (cairo_in_fill (cr, x, y)) {handle = GL_VIEW_OBJECT_HANDLE_P2; break;} + + /* P1 */ + create_handle_path (cr, object, scale, 0, 0); + if (cairo_in_fill (cr, x, y)) {handle = GL_VIEW_OBJECT_HANDLE_P1; break;} + + break; + + } + + cairo_restore (cr); + + return handle; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Resize object. */ +/*---------------------------------------------------------------------------*/ +void +gl_view_object_resize_event (glViewObject *view_object, + glViewObjectHandle handle, + gboolean honor_aspect, + cairo_t *cr, + gdouble x, + gdouble y) +{ + glLabelObject *object; + cairo_matrix_t matrix; + gdouble x0, y0, x1, y1, x2, y2; + gdouble w, h; + gdouble dx=0, dy=0; + + gl_debug (DEBUG_VIEW, "x,y world = %g, %g", x, y); + + object = view_object->priv->object; + + /* + * Change to item relative coordinates + */ + cairo_save (cr); + gl_label_object_get_position (object, &x0, &y0); + cairo_translate (cr, x0, y0); + gl_label_object_get_matrix (object, &matrix); + cairo_transform (cr, &matrix); + + /* + * Initialize origin and 2 corners in object relative coordinates. + */ + x0 = 0.0; + y0 = 0.0; + + x1 = 0.0; + y1 = 0.0; + + gl_label_object_get_size (object, &x2, &y2); + + gl_debug (DEBUG_VIEW, "x0,y0 object = %g, %g", x0, y0); + gl_debug (DEBUG_VIEW, "x1,y1 object = %g, %g", x1, y1); + gl_debug (DEBUG_VIEW, "x2,y2 object = %g, %g", x2, y2); + + /* + * Translate x,y into object relative coordinates. + */ + cairo_device_to_user (cr, &x, &y); + + gl_debug (DEBUG_VIEW, "x,y object = %g, %g", x, y); + + /* + * Get new size + */ + switch (handle) + { + + case GL_VIEW_OBJECT_HANDLE_NW: + w = MAX (x2 - x, 0); + h = MAX (y2 - y, 0); + break; + + case GL_VIEW_OBJECT_HANDLE_N: + w = x2 - x1; + h = MAX (y2 - y, 0); + break; + + case GL_VIEW_OBJECT_HANDLE_NE: + w = MAX (x - x1, 0); + h = MAX (y2 - y, 0); + break; + + case GL_VIEW_OBJECT_HANDLE_E: + w = MAX (x - x1, 0); + h = y2 - y1; + break; + + case GL_VIEW_OBJECT_HANDLE_SE: + w = MAX (x - x1, 0); + h = MAX (y - y1, 0); + break; + + case GL_VIEW_OBJECT_HANDLE_S: + w = x2 - x1; + h = MAX (y - y1, 0); + break; + + case GL_VIEW_OBJECT_HANDLE_SW: + w = MAX (x2 - x, 0); + h = MAX (y - y1, 0); + break; + + case GL_VIEW_OBJECT_HANDLE_W: + w = MAX (x2 - x, 0); + h = y2 - y1; + break; + case GL_VIEW_OBJECT_HANDLE_P1: + x1 = x; + y1 = y; + dx = (x2 - x); + dy = (y2 - y); + x0 = x0 + x1; + y0 = y0 + y1; + break; + + case GL_VIEW_OBJECT_HANDLE_P2: + dx = x - x1; + dy = y - y1; + x0 = x0 + x1; + y0 = y0 + y1; + break; + + default: + g_print ("Invalid handle.\n"); /* Should not happen! */ + + } + if ( (handle != GL_VIEW_OBJECT_HANDLE_P1) && (handle != GL_VIEW_OBJECT_HANDLE_P2) ) + { + if ( honor_aspect ) + { + gl_label_object_set_size_honor_aspect (object, w, h); + } + else + { + gl_label_object_set_size (object, w, h); + } + + /* + * Query the new size in case it was constrained. + */ + gl_label_object_get_size (object, &w, &h); + + /* + * Get new position + */ + switch (handle) + { + + case GL_VIEW_OBJECT_HANDLE_NW: + x0 += x2 - w; + y0 += y2 - h; + break; + + case GL_VIEW_OBJECT_HANDLE_N: + case GL_VIEW_OBJECT_HANDLE_NE: + /* x unchanged */ + y0 += y2 - h; + break; + + case GL_VIEW_OBJECT_HANDLE_E: + case GL_VIEW_OBJECT_HANDLE_SE: + case GL_VIEW_OBJECT_HANDLE_S: + /* unchanged */ + break; + + case GL_VIEW_OBJECT_HANDLE_SW: + case GL_VIEW_OBJECT_HANDLE_W: + x0 += x2 - w; + /* y unchanged */ + break; + + default: + g_print ("Invalid handle.\n"); /* Should not happen! */ + } + } + else + { + gl_label_object_set_size (object, dx, dy); + } + + /* + * Put new origin back into world coordinates and set. + */ + cairo_user_to_device (cr, &x0, &y0); + cairo_restore (cr); + cairo_device_to_user (cr, &x0, &y0); + gl_label_object_set_position (object, x0, y0); +} diff --git a/glabels2/src/view-object.h b/glabels2/src/view-object.h new file mode 100644 index 00000000..2ae9f84f --- /dev/null +++ b/glabels2/src/view-object.h @@ -0,0 +1,137 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * view_object.h: GLabels canvas item wrapper widget + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __VIEW_OBJECT_H__ +#define __VIEW_OBJECT_H__ + +#include +#include "label-object.h" + +typedef enum { + GL_VIEW_OBJECT_HANDLES_BOX, + GL_VIEW_OBJECT_HANDLES_LINE, +} glViewObjectHandlesStyle; + +typedef enum { + GL_VIEW_OBJECT_HANDLE_NONE = 0, + GL_VIEW_OBJECT_HANDLE_N, + GL_VIEW_OBJECT_HANDLE_E, + GL_VIEW_OBJECT_HANDLE_W, + GL_VIEW_OBJECT_HANDLE_S, + GL_VIEW_OBJECT_HANDLE_NW, + GL_VIEW_OBJECT_HANDLE_NE, + GL_VIEW_OBJECT_HANDLE_SE, + GL_VIEW_OBJECT_HANDLE_SW, + GL_VIEW_OBJECT_HANDLE_P1, + GL_VIEW_OBJECT_HANDLE_P2, +} glViewObjectHandle; + + +#define GL_TYPE_VIEW_OBJECT (gl_view_object_get_type ()) +#define GL_VIEW_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_VIEW_OBJECT, glViewObject)) +#define GL_VIEW_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_VIEW_OBJECT, glViewObjectClass)) +#define GL_IS_VIEW_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_VIEW_OBJECT)) +#define GL_IS_VIEW_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_VIEW_OBJECT)) +#define GL_VIEW_OBJECT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), GL_TYPE_VIEW_OBJECT, glViewObjectClass)) + +typedef struct _glViewObject glViewObject; +typedef struct _glViewObjectClass glViewObjectClass; + +typedef struct _glViewObjectPrivate glViewObjectPrivate; + + +#include "view.h" + +#include "cairo.h" + +struct _glViewObject { + GObject parent_object; + + glViewObjectPrivate *priv; +}; + +struct _glViewObjectClass { + GObjectClass parent_class; + + /* + * Methods + */ + + GtkWidget * (*construct_editor) (glViewObject *view_object); + + gboolean (*object_at) (glViewObject *view_object, + cairo_t *cr, + gdouble x_device, + gdouble y_device); +}; + + + + +G_BEGIN_DECLS + +GType gl_view_object_get_type (void) G_GNUC_CONST; + +GObject *gl_view_object_new (void); + + +void gl_view_object_set_view (glViewObject *view_object, + glView *view); + +void gl_view_object_set_object (glViewObject *view_object, + glLabelObject *object, + glViewObjectHandlesStyle style); + +gboolean gl_view_object_at (glViewObject *view_object, + cairo_t *cr, + gdouble x, + gdouble y); + +void gl_view_object_draw_handles (glViewObject *view_object, + cairo_t *cr); + +glViewObjectHandle gl_view_object_handle_at (glViewObject *view_object, + cairo_t *cr, + gdouble x, + gdouble y); + +glView *gl_view_object_get_view (glViewObject *view_object); + +glLabelObject *gl_view_object_get_object (glViewObject *view_object); + +GtkWidget *gl_view_object_get_editor (glViewObject *view_object); + +void gl_view_object_select (glViewObject *view_object); + +void gl_view_object_resize_event (glViewObject *view_object, + glViewObjectHandle handle, + gboolean honor_aspect, + cairo_t *cr, + gdouble x, + gdouble y); + + +G_END_DECLS + +#endif /* __VIEW_OBJECT_H__ */ diff --git a/glabels2/src/view-text.c b/glabels2/src/view-text.c new file mode 100644 index 00000000..55d9ac9c --- /dev/null +++ b/glabels2/src/view-text.c @@ -0,0 +1,564 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * view_text.c: GLabels label text object view + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#include "view-text.h" + +#include +#include + +#include "color.h" +#include "object-editor.h" +#include "stock.h" + +#include "pixmaps/cursor_text.xbm" +#include "pixmaps/cursor_text_mask.xbm" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +struct _glViewTextPrivate { +}; + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static void gl_view_text_finalize (GObject *object); + +static GtkWidget *construct_properties_editor (glViewObject *view_object); + +static void update_object_from_editor_cb (glObjectEditor *editor, + glLabelObject *object); + +static void update_object_from_editor_size_cb (glObjectEditor *editor, + glLabelObject *object); + +static void update_editor_from_object_cb (glLabelObject *object, + glObjectEditor *editor); + +static void update_editor_from_move_cb (glLabelObject *object, + gdouble dx, + gdouble dy, + glObjectEditor *editor); + +static void update_editor_from_label_cb (glLabel *label, + glObjectEditor *editor); + +static gboolean object_at (glViewObject *view_object, + cairo_t *cr, + gdouble x, + gdouble y); + + + + +/*****************************************************************************/ +/* Boilerplate object stuff. */ +/*****************************************************************************/ +G_DEFINE_TYPE (glViewText, gl_view_text, GL_TYPE_VIEW_OBJECT); + + +static void +gl_view_text_class_init (glViewTextClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + glViewObjectClass *view_object_class = GL_VIEW_OBJECT_CLASS (class); + + gl_debug (DEBUG_VIEW, "START"); + + gl_view_text_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_view_text_finalize; + + view_object_class->construct_editor = construct_properties_editor; + view_object_class->object_at = object_at; + + gl_debug (DEBUG_VIEW, "END"); +} + +static void +gl_view_text_init (glViewText *view_text) +{ + gl_debug (DEBUG_VIEW, "START"); + + view_text->priv = g_new0 (glViewTextPrivate, 1); + + gl_debug (DEBUG_VIEW, "END"); +} + +static void +gl_view_text_finalize (GObject *object) +{ + glViewText *view_text = GL_VIEW_TEXT (object); + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (object && GL_IS_VIEW_TEXT (object)); + + g_free (view_text->priv); + + G_OBJECT_CLASS (gl_view_text_parent_class)->finalize (object); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* NEW text object view. */ +/*****************************************************************************/ +glViewObject * +gl_view_text_new (glLabelText *object, + glView *view) +{ + glViewText *view_text; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (object && GL_IS_LABEL_TEXT (object), NULL); + g_return_val_if_fail (view && GL_IS_VIEW (view), NULL); + + view_text = g_object_new (gl_view_text_get_type(), NULL); + + gl_view_object_set_object (GL_VIEW_OBJECT(view_text), + GL_LABEL_OBJECT(object), + GL_VIEW_OBJECT_HANDLES_BOX); + gl_view_object_set_view (GL_VIEW_OBJECT(view_text), view); + + gl_debug (DEBUG_VIEW, "END"); + + return GL_VIEW_OBJECT (view_text); +} + +/*****************************************************************************/ +/* Create a properties dialog for a text object. */ +/*****************************************************************************/ +static GtkWidget * +construct_properties_editor (glViewObject *view_object) +{ + GtkWidget *editor; + glViewText *view_text = (glViewText *)view_object; + glLabelObject *object; + GtkTextBuffer *buffer; + + gl_debug (DEBUG_VIEW, "START"); + + object = gl_view_object_get_object (GL_VIEW_OBJECT(view_text)); + + /* Build editor. */ + editor = gl_object_editor_new (GL_STOCK_TEXT, _("Text object properties"), + GL_OBJECT_EDITOR_SHADOW_PAGE, + GL_OBJECT_EDITOR_POSITION_PAGE, + GL_OBJECT_EDITOR_SIZE_PAGE, + GL_OBJECT_EDITOR_TEXT_PAGE, + GL_OBJECT_EDITOR_EDIT_PAGE, + 0); + + buffer = gl_label_text_get_buffer (GL_LABEL_TEXT(object)); + gl_object_editor_set_text_buffer (GL_OBJECT_EDITOR(editor), buffer); + + /* Update */ + update_editor_from_label_cb (object->parent, GL_OBJECT_EDITOR(editor)); + update_editor_from_object_cb (object, GL_OBJECT_EDITOR(editor)); + update_editor_from_move_cb (object, 0, 0, GL_OBJECT_EDITOR(editor)); + + /* Connect signals. */ + g_signal_connect (G_OBJECT (editor), "changed", + G_CALLBACK(update_object_from_editor_cb), object); + g_signal_connect (G_OBJECT (editor), "size_changed", + G_CALLBACK(update_object_from_editor_size_cb), object); + g_signal_connect (G_OBJECT (object), "changed", + G_CALLBACK (update_editor_from_object_cb), editor); + g_signal_connect (G_OBJECT (object), "moved", + G_CALLBACK (update_editor_from_move_cb), editor); + g_signal_connect (G_OBJECT (object->parent), "size_changed", + G_CALLBACK (update_editor_from_label_cb), editor); + g_signal_connect (G_OBJECT (object->parent), "merge_changed", + G_CALLBACK (update_editor_from_label_cb), editor); + + gl_debug (DEBUG_VIEW, "END"); + + return editor; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. editor "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_object_from_editor_cb (glObjectEditor *editor, + glLabelObject *object) +{ + gdouble x, y; + gchar *font_family; + gdouble font_size; + PangoWeight font_weight; + gboolean font_italic_flag; + glColorNode *color_node; + PangoAlignment align; + gdouble text_line_spacing; + gboolean auto_shrink; + gboolean shadow_state; + gdouble shadow_x, shadow_y; + glColorNode *shadow_color_node; + gdouble shadow_opacity; + + gl_debug (DEBUG_VIEW, "START"); + + g_signal_handlers_block_by_func (G_OBJECT(object), + update_editor_from_object_cb, + editor); + g_signal_handlers_block_by_func (G_OBJECT(object), + update_editor_from_move_cb, + editor); + + gl_object_editor_get_position (editor, &x, &y); + font_family = gl_object_editor_get_font_family (editor); + font_size = gl_object_editor_get_font_size (editor); + font_weight = gl_object_editor_get_font_weight (editor); + font_italic_flag = gl_object_editor_get_font_italic_flag (editor); + color_node = gl_object_editor_get_text_color (editor); + align = gl_object_editor_get_text_alignment (editor); + text_line_spacing = gl_object_editor_get_text_line_spacing (editor); + auto_shrink = gl_object_editor_get_text_auto_shrink (editor); + + gl_label_object_set_position (object, x, y); + gl_label_object_set_font_family (object, font_family); + gl_label_object_set_font_size (object, font_size); + gl_label_object_set_font_weight (object, font_weight); + gl_label_object_set_font_italic_flag (object, font_italic_flag); + gl_label_object_set_text_color (object, color_node); + gl_label_object_set_text_alignment (object, align); + gl_label_object_set_text_line_spacing (object, text_line_spacing); + gl_label_text_set_auto_shrink (GL_LABEL_TEXT (object), auto_shrink); + + gl_color_node_free (&color_node); + g_free (font_family); + + shadow_state = gl_object_editor_get_shadow_state (editor); + gl_label_object_set_shadow_state (object, shadow_state); + + gl_object_editor_get_shadow_offset (editor, &shadow_x, &shadow_y); + gl_label_object_set_shadow_offset (object, shadow_x, shadow_y); + + shadow_color_node = gl_object_editor_get_shadow_color (editor); + gl_label_object_set_shadow_color (object, shadow_color_node); + gl_color_node_free (&shadow_color_node); + + shadow_opacity = gl_object_editor_get_shadow_opacity (editor); + gl_label_object_set_shadow_opacity (object, shadow_opacity); + + g_signal_handlers_unblock_by_func (G_OBJECT(object), + update_editor_from_object_cb, + editor); + g_signal_handlers_unblock_by_func (G_OBJECT(object), + update_editor_from_move_cb, + editor); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. editor "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_object_from_editor_size_cb (glObjectEditor *editor, + glLabelObject *object) +{ + gdouble w, h; + + gl_debug (DEBUG_VIEW, "START"); + + g_signal_handlers_block_by_func (G_OBJECT(object), + update_editor_from_object_cb, + editor); + g_signal_handlers_block_by_func (G_OBJECT(object), + update_editor_from_move_cb, + editor); + + gl_object_editor_get_size (editor, &w, &h); + + gl_label_object_set_size (object, w, h); + + g_signal_handlers_unblock_by_func (G_OBJECT(object), + update_editor_from_object_cb, + editor); + g_signal_handlers_unblock_by_func (G_OBJECT(object), + update_editor_from_move_cb, + editor); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label object "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_object_cb (glLabelObject *object, + glObjectEditor *editor) +{ + gdouble w, h; + gchar *font_family; + gdouble font_size; + PangoWeight font_weight; + gboolean font_italic_flag; + glColorNode *color_node; + PangoAlignment align; + gdouble text_line_spacing; + gboolean auto_shrink; + gboolean shadow_state; + gdouble shadow_x, shadow_y; + glColorNode *shadow_color_node; + gdouble shadow_opacity; + glMerge *merge; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_object_get_size (object, &w, &h); + gl_object_editor_set_size (editor, w, h); + merge = gl_label_get_merge (GL_LABEL(object->parent)); + + font_family = gl_label_object_get_font_family (object); + font_size = gl_label_object_get_font_size (object); + font_weight = gl_label_object_get_font_weight (object); + font_italic_flag = gl_label_object_get_font_italic_flag (object); + color_node = gl_label_object_get_text_color (object); + align = gl_label_object_get_text_alignment (object); + text_line_spacing = gl_label_object_get_text_line_spacing (object); + auto_shrink = gl_label_text_get_auto_shrink (GL_LABEL_TEXT (object)); + + gl_object_editor_set_font_family (editor, font_family); + gl_object_editor_set_font_size (editor, font_size); + gl_object_editor_set_font_weight (editor, font_weight); + gl_object_editor_set_font_italic_flag (editor, font_italic_flag); + gl_object_editor_set_text_color (editor, (merge != NULL), color_node); + gl_object_editor_set_text_alignment (editor, align); + gl_object_editor_set_text_line_spacing (editor, text_line_spacing); + gl_object_editor_set_text_auto_shrink (editor, auto_shrink); + + gl_color_node_free (&color_node); + g_free (font_family); + + shadow_state = gl_label_object_get_shadow_state (object); + gl_object_editor_set_shadow_state (editor, shadow_state); + + gl_label_object_get_shadow_offset (object, &shadow_x, &shadow_y); + gl_object_editor_set_shadow_offset (editor, shadow_x, shadow_y); + + shadow_color_node = gl_label_object_get_shadow_color (object); + gl_object_editor_set_shadow_color (editor, (merge != NULL), shadow_color_node); + gl_color_node_free (&shadow_color_node); + + shadow_opacity = gl_label_object_get_shadow_opacity (object); + gl_object_editor_set_shadow_opacity (editor, shadow_opacity); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label object "moved" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_move_cb (glLabelObject *object, + gdouble dx, + gdouble dy, + glObjectEditor *editor) +{ + gdouble x, y; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_object_get_position (object, &x, &y); + gl_object_editor_set_position (editor, x, y); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. label "changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +update_editor_from_label_cb (glLabel *label, + glObjectEditor *editor) +{ + gdouble label_width, label_height; + glMerge *merge; + + gl_debug (DEBUG_VIEW, "START"); + + gl_label_get_size (label, &label_width, &label_height); + gl_object_editor_set_max_position (GL_OBJECT_EDITOR (editor), + label_width, label_height); + gl_object_editor_set_max_size (GL_OBJECT_EDITOR (editor), + label_width, label_height); + gl_object_editor_set_max_shadow_offset (GL_OBJECT_EDITOR (editor), + label_width, label_height); + + merge = gl_label_get_merge (label); + gl_object_editor_set_key_names (editor, merge); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Is object at (x,y)? */ +/*****************************************************************************/ +static gboolean +object_at (glViewObject *view_object, + cairo_t *cr, + gdouble x, + gdouble y) +{ + glLabelObject *object; + gdouble w, h; + + object = gl_view_object_get_object (view_object); + + gl_label_object_get_size (object, &w, &h); + + cairo_rectangle (cr, 0.0, 0.0, w, h); + + if (cairo_in_fill (cr, x, y)) + { + return TRUE; + } + + return FALSE; +} + + +/*****************************************************************************/ +/* Return apropos cursor for create object mode. */ +/*****************************************************************************/ +GdkCursor * +gl_view_text_get_create_cursor (void) +{ + GdkCursor *cursor = NULL; + GdkPixmap *pixmap_data, *pixmap_mask; + GdkColor fg = { 0, 0, 0, 0 }; + GdkColor bg = { 0, 65535, 65535, 65535 }; + + gl_debug (DEBUG_VIEW, "START"); + + pixmap_data = gdk_bitmap_create_from_data (NULL, + (gchar *)cursor_text_bits, + cursor_text_width, + cursor_text_height); + pixmap_mask = gdk_bitmap_create_from_data (NULL, + (gchar *)cursor_text_mask_bits, + cursor_text_mask_width, + cursor_text_mask_height); + cursor = gdk_cursor_new_from_pixmap (pixmap_data, pixmap_mask, &fg, + &bg, cursor_text_x_hot, + cursor_text_y_hot); + + gl_debug (DEBUG_VIEW, "END"); + + return cursor; +} + +/*****************************************************************************/ +/* Object creation handler: button press event. */ +/*****************************************************************************/ +void +gl_view_text_create_button_press_event (glView *view, + gdouble x, + gdouble y) +{ + GObject *object; + glViewObject *view_text; + GList *lines; + gchar *family; + glColorNode *color_node; + + gl_view_unselect_all (view); + + object = gl_label_text_new (view->label); + color_node = gl_color_node_new_default (); + gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y); + family = gl_view_get_default_font_family (view); + gl_label_object_set_font_family (GL_LABEL_OBJECT(object), family); + gl_label_object_set_font_size (GL_LABEL_OBJECT(object), + gl_view_get_default_font_size (view)); + gl_label_object_set_font_weight (GL_LABEL_OBJECT(object), + gl_view_get_default_font_weight (view)); + gl_label_object_set_font_italic_flag (GL_LABEL_OBJECT(object), + gl_view_get_default_font_italic_flag (view)); + + color_node->color = gl_color_set_opacity (gl_view_get_default_text_color (view), 0.5); + gl_label_object_set_text_color (GL_LABEL_OBJECT(object), + color_node); + gl_label_object_set_text_alignment (GL_LABEL_OBJECT(object), + gl_view_get_default_text_alignment (view)); + gl_label_object_set_text_line_spacing (GL_LABEL_OBJECT(object), gl_view_get_default_text_line_spacing (view)); + + g_free (family); + lines = gl_text_node_lines_new_from_text (_("Text")); + gl_label_text_set_lines (GL_LABEL_TEXT(object), lines); + view_text = gl_view_text_new (GL_LABEL_TEXT(object), view); + gl_color_node_free (&color_node); + + view->create_object = GL_LABEL_OBJECT (object); + view->create_x0 = x; + view->create_y0 = y; +} + +/*****************************************************************************/ +/* Object creation handler: motion event. */ +/*****************************************************************************/ +void +gl_view_text_create_motion_event (glView *view, + gdouble x, + gdouble y) +{ + gl_label_object_set_position (GL_LABEL_OBJECT(view->create_object), x, y); +} + +/*****************************************************************************/ +/* Object creation handler: button relesase event. */ +/*****************************************************************************/ +void +gl_view_text_create_button_release_event (glView *view, + gdouble x, + gdouble y) +{ + glColorNode *color_node; + + color_node = gl_color_node_new_default (); + gl_label_object_set_position (GL_LABEL_OBJECT(view->create_object), x, y); + color_node->color = gl_view_get_default_text_color(view); + gl_label_object_set_text_color (GL_LABEL_OBJECT(view->create_object), color_node); + gl_color_node_free (&color_node); +} + diff --git a/glabels2/src/view-text.h b/glabels2/src/view-text.h new file mode 100644 index 00000000..bb28c90b --- /dev/null +++ b/glabels2/src/view-text.h @@ -0,0 +1,81 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * view_text.h: GLabels label text object view + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __VIEW_TEXT_H__ +#define __VIEW_TEXT_H__ + +#include "view-object.h" +#include "label-text.h" + +G_BEGIN_DECLS + + +#define GL_TYPE_VIEW_TEXT (gl_view_text_get_type ()) +#define GL_VIEW_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_TYPE_VIEW_TEXT, glViewText)) +#define GL_VIEW_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_TYPE_VIEW_TEXT, glViewTextClass)) +#define GL_IS_VIEW_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_TYPE_VIEW_TEXT)) +#define GL_IS_VIEW_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_TYPE_VIEW_TEXT)) + +typedef struct _glViewText glViewText; +typedef struct _glViewTextClass glViewTextClass; + +typedef struct _glViewTextPrivate glViewTextPrivate; + +struct _glViewText { + glViewObject parent_object; + + glViewTextPrivate *priv; +}; + +struct _glViewTextClass { + glViewObjectClass parent_class; +}; + + +GType gl_view_text_get_type (void) G_GNUC_CONST; + +glViewObject *gl_view_text_new (glLabelText *object, + glView *view); + + +/* cursor for creating text objects */ +GdkCursor *gl_view_text_get_create_cursor (void); + +/* Object creation handlers. */ +void gl_view_text_create_button_press_event (glView *view, + gdouble x, + gdouble y); + +void gl_view_text_create_motion_event (glView *view, + gdouble x, + gdouble y); + +void gl_view_text_create_button_release_event (glView *view, + gdouble x, + gdouble y); + + +G_END_DECLS + +#endif /* __VIEW_TEXT_H__ */ diff --git a/glabels2/src/view.c b/glabels2/src/view.c new file mode 100644 index 00000000..c35db8d3 --- /dev/null +++ b/glabels2/src/view.c @@ -0,0 +1,3658 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * view.c: GLabels View module + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "view.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "label.h" +#include "cairo-label-path.h" +#include "cairo-markup-path.h" +#include "view-object.h" +#include "view-box.h" +#include "view-ellipse.h" +#include "view-line.h" +#include "view-image.h" +#include "view-text.h" +#include "view-barcode.h" +#include "xml-label.h" +#include "color.h" +#include "prefs.h" +#include "marshal.h" + +#include "debug.h" + +/*==========================================================================*/ +/* Private macros and constants. */ +/*==========================================================================*/ + +#define BG_COLOR GL_COLOR (192, 192, 192) + +#define PAPER_RGB_ARGS 1.0, 1.0, 1.0 +#define GRID_RGB_ARGS 0.753, 0.753, 0.753 +#define MARKUP_RGB_ARGS 0.94, 0.39, 0.39 +#define OUTLINE_RGB_ARGS 0.68, 0.85, 0.90 +#define SELECT_LINE_RGBA_ARGS 0.0, 0.0, 1.0, 0.5 +#define SELECT_FILL_RGBA_ARGS 0.75, 0.75, 1.0, 0.5 + +#define GRID_LINE_WIDTH_PIXELS 1.0 +#define MARKUP_LINE_WIDTH_PIXELS 1.0 +#define OUTLINE_WIDTH_PIXELS 3.0 +#define SELECT_LINE_WIDTH_PIXELS 3.0 + +#define ZOOMTOFIT_PAD 16 + +#define POINTS_PER_MM 2.83464566929 + +/*==========================================================================*/ +/* Private types. */ +/*==========================================================================*/ + +enum { + SELECTION_CHANGED, + CONTEXT_MENU_ACTIVATE, + ZOOM_CHANGED, + POINTER_MOVED, + POINTER_EXIT, + MODE_CHANGED, + LAST_SIGNAL +}; + + +/*==========================================================================*/ +/* Private globals */ +/*==========================================================================*/ + +static guint signals[LAST_SIGNAL] = {0}; + +/* "CLIPBOARD" selection */ +static GdkAtom clipboard_atom = GDK_NONE; + +static gdouble zooms[] = { + 8.00, + 6.00, + 4.00, + 3.00, + 2.00, + 1.50, + 1.00, + 0.75, + 0.67, + 0.50, + 0.33, + 0.25, + 0.20, + 0.15, + 0.10, +}; +#define N_ZOOMS G_N_ELEMENTS(zooms) + + +/*==========================================================================*/ +/* Local function prototypes */ +/*==========================================================================*/ + +static void gl_view_finalize (GObject *object); + +static void gl_view_construct (glView *view, + glLabel *label); + +static gdouble get_home_scale (glView *view); + +static gboolean expose_cb (glView *view, + GdkEventExpose *event); + +static void realize_cb (glView *view); + +static void size_allocate_cb (glView *view, + GtkAllocation *allocation); + +static void screen_changed_cb (glView *view); + +static void label_changed_cb (glView *view); + +static void label_resized_cb (glView *view); + +static void label_object_added_cb (glView *view, + glLabelObject *object); + +static void draw_layers (glView *view, + cairo_t *cr); + +static void draw_bg_layer (glView *view, + cairo_t *cr); +static void draw_grid_layer (glView *view, + cairo_t *cr); +static void draw_markup_layer (glView *view, + cairo_t *cr); +static void draw_objects_layer (glView *view, + cairo_t *cr); +static void draw_fg_layer (glView *view, + cairo_t *cr); +static void draw_highlight_layer (glView *view, + cairo_t *cr); +static void draw_select_region_layer (glView *view, + cairo_t *cr); + +static void select_object_real (glView *view, + glViewObject *view_object); +static void unselect_object_real (glView *view, + glViewObject *view_object); + +static glViewObject *view_view_object_at (glView *view, + cairo_t *cr, + gdouble x, + gdouble y); + +static void set_zoom_real (glView *view, + gdouble zoom, + gboolean scale_to_fit_flag); + +static void selection_clear_cb (GtkWidget *widget, + GdkEventSelection *event, + glView *view); + +static void selection_get_cb (GtkWidget *widget, + GtkSelectionData *selection_data, + guint info, + guint time, + glView *view); + +static void selection_received_cb (GtkWidget *widget, + GtkSelectionData *selection_data, + guint time, + glView *view); + +static gboolean focus_in_event_cb (glView *view, + GdkEventFocus *event); + +static gboolean focus_out_event_cb (glView *view, + GdkEventFocus *event); + +static gboolean enter_notify_event_cb (glView *view, + GdkEventCrossing *event); + +static gboolean leave_notify_event_cb (glView *view, + GdkEventCrossing *event); + +static gboolean motion_notify_event_cb (glView *view, + GdkEventMotion *event); + +static gboolean button_press_event_cb (glView *view, + GdkEventButton *event); + +static gboolean button_release_event_cb (glView *view, + GdkEventButton *event); + +static gboolean key_press_event_cb (glView *view, + GdkEventKey *event); + + +/****************************************************************************/ +/* Boilerplate Object stuff. */ +/****************************************************************************/ +G_DEFINE_TYPE (glView, gl_view, GTK_TYPE_VBOX); + +static void +gl_view_class_init (glViewClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_debug (DEBUG_VIEW, "START"); + + gl_view_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_view_finalize; + + signals[SELECTION_CHANGED] = + g_signal_new ("selection_changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glViewClass, selection_changed), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + + signals[CONTEXT_MENU_ACTIVATE] = + g_signal_new ("context_menu_activate", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glViewClass, context_menu_activate), + NULL, NULL, + gl_marshal_VOID__INT_UINT, + G_TYPE_NONE, + 2, G_TYPE_INT, G_TYPE_UINT); + + signals[ZOOM_CHANGED] = + g_signal_new ("zoom_changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glViewClass, zoom_changed), + NULL, NULL, + gl_marshal_VOID__DOUBLE, + G_TYPE_NONE, + 1, G_TYPE_DOUBLE); + + signals[POINTER_MOVED] = + g_signal_new ("pointer_moved", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glViewClass, pointer_moved), + NULL, NULL, + gl_marshal_VOID__DOUBLE_DOUBLE, + G_TYPE_NONE, + 2, G_TYPE_DOUBLE, G_TYPE_DOUBLE); + + signals[POINTER_EXIT] = + g_signal_new ("pointer_exit", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glViewClass, pointer_exit), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + + signals[MODE_CHANGED] = + g_signal_new ("mode_changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glViewClass, mode_changed), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + + gl_debug (DEBUG_VIEW, "END"); +} + +static void +gl_view_init (glView *view) +{ + GtkWidget *wscroll; + GdkColor *bg_color; + + gl_debug (DEBUG_VIEW, "START"); + + view->label = NULL; + view->grid_visible = TRUE; + view->grid_spacing = 9; + view->markup_visible = TRUE; + view->default_font_family = NULL; + view->mode = GL_VIEW_MODE_ARROW; + view->object_list = NULL; + view->selected_object_list = NULL; + view->zoom = 1.0; + view->home_scale = get_home_scale (view); + + /* + * Canvas + */ + view->canvas = gtk_layout_new (NULL, NULL); + wscroll = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (wscroll), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_box_pack_start (GTK_BOX (view), wscroll, TRUE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (wscroll), view->canvas); + + bg_color = gl_color_to_gdk_color (BG_COLOR); + gtk_widget_modify_bg (GTK_WIDGET (view->canvas), GTK_STATE_NORMAL, bg_color); + g_free (bg_color); + + GTK_WIDGET_SET_FLAGS (GTK_WIDGET (view->canvas), GTK_CAN_FOCUS); + + gtk_widget_add_events (GTK_WIDGET (view->canvas), + (GDK_FOCUS_CHANGE_MASK | + GDK_ENTER_NOTIFY_MASK | + GDK_LEAVE_NOTIFY_MASK | + GDK_POINTER_MOTION_MASK | + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_KEY_PRESS_MASK)); + + g_signal_connect_swapped (G_OBJECT (view->canvas), "expose-event", + G_CALLBACK (expose_cb), view); + g_signal_connect_swapped (G_OBJECT (view->canvas), "realize", + G_CALLBACK (realize_cb), view); + g_signal_connect_swapped (G_OBJECT (view->canvas), "size-allocate", + G_CALLBACK (size_allocate_cb), view); + g_signal_connect_swapped (G_OBJECT (view->canvas), "screen-changed", + G_CALLBACK (screen_changed_cb), view); + g_signal_connect_swapped (G_OBJECT (view->canvas), "focus-in-event", + G_CALLBACK (focus_in_event_cb), view); + g_signal_connect_swapped (G_OBJECT (view->canvas), "focus-out-event", + G_CALLBACK (focus_out_event_cb), view); + g_signal_connect_swapped (G_OBJECT (view->canvas), "enter-notify-event", + G_CALLBACK (enter_notify_event_cb), view); + g_signal_connect_swapped (G_OBJECT (view->canvas), "leave-notify-event", + G_CALLBACK (leave_notify_event_cb), view); + g_signal_connect_swapped (G_OBJECT (view->canvas), "motion-notify-event", + G_CALLBACK (motion_notify_event_cb), view); + g_signal_connect_swapped (G_OBJECT (view->canvas), "button-press-event", + G_CALLBACK (button_press_event_cb), view); + g_signal_connect_swapped (G_OBJECT (view->canvas), "button-release-event", + G_CALLBACK (button_release_event_cb), view); + g_signal_connect_swapped (G_OBJECT (view->canvas), "key-press-event", + G_CALLBACK (key_press_event_cb), view); + + /* + * Clipboard + */ + view->have_selection = FALSE; + view->selection_data = NULL; + view->invisible = gtk_invisible_new (); + if (!clipboard_atom) { + clipboard_atom = gdk_atom_intern ("GLABELS_CLIPBOARD", FALSE); + } + gtk_selection_add_target (view->invisible, + clipboard_atom, GDK_SELECTION_TYPE_STRING, 1); + g_signal_connect (G_OBJECT (view->invisible), + "selection_clear_event", + G_CALLBACK (selection_clear_cb), view); + g_signal_connect (G_OBJECT (view->invisible), "selection_get", + G_CALLBACK (selection_get_cb), view); + g_signal_connect (G_OBJECT (view->invisible), + "selection_received", + G_CALLBACK (selection_received_cb), view); + + /* + * Defaults from preferences + */ + gl_view_set_default_font_family (view, gl_prefs->default_font_family); + gl_view_set_default_font_size (view, gl_prefs->default_font_size); + gl_view_set_default_font_weight (view, gl_prefs->default_font_weight); + gl_view_set_default_font_italic_flag (view, gl_prefs->default_font_italic_flag); + gl_view_set_default_text_color (view, gl_prefs->default_text_color); + gl_view_set_default_text_alignment (view, gl_prefs->default_text_alignment); + gl_view_set_default_text_line_spacing (view, gl_prefs->default_text_line_spacing); + gl_view_set_default_line_width (view, gl_prefs->default_line_width); + gl_view_set_default_line_color (view, gl_prefs->default_line_color); + gl_view_set_default_fill_color (view, gl_prefs->default_fill_color); + + gl_debug (DEBUG_VIEW, "END"); +} + +static void +gl_view_finalize (GObject *object) +{ + glView *view = GL_VIEW (object); + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (object != NULL); + g_return_if_fail (GL_IS_VIEW (object)); + + if (view->default_font_family) { + g_free (view->default_font_family); + } + + G_OBJECT_CLASS (gl_view_parent_class)->finalize (object); + + gl_debug (DEBUG_VIEW, "END"); +} + +/****************************************************************************/ +/* NEW view object. */ +/****************************************************************************/ +GtkWidget * +gl_view_new (glLabel *label) +{ + glView *view; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (label && GL_IS_LABEL (label), NULL); + + view = g_object_new (GL_TYPE_VIEW, NULL); + + gl_view_construct (view, label); + + gl_debug (DEBUG_VIEW, "END"); + + return GTK_WIDGET (view); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Construct composite widget. */ +/*---------------------------------------------------------------------------*/ +static void +gl_view_construct (glView *view, + glLabel *label) +{ + GList *p_obj; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (GL_IS_VIEW (view)); + + view->label = label; + + for (p_obj = label->objects; p_obj != NULL; p_obj = p_obj->next) + { + object = GL_LABEL_OBJECT (p_obj->data); + + if (GL_IS_LABEL_BOX (object)) { + gl_view_box_new (GL_LABEL_BOX(object), view); + } else if (GL_IS_LABEL_ELLIPSE (object)) { + gl_view_ellipse_new (GL_LABEL_ELLIPSE(object), view); + } else if (GL_IS_LABEL_LINE (object)) { + gl_view_line_new (GL_LABEL_LINE(object), view); + } else if (GL_IS_LABEL_IMAGE (object)) { + gl_view_image_new (GL_LABEL_IMAGE(object), view); + } else if (GL_IS_LABEL_TEXT (object)) { + gl_view_text_new (GL_LABEL_TEXT(object), view); + } else if (GL_IS_LABEL_BARCODE (object)) { + gl_view_barcode_new (GL_LABEL_BARCODE(object), view); + } else { + /* Should not happen! */ + g_message ("Invalid label object type."); + } + } + + g_signal_connect_swapped (G_OBJECT (view->label), "changed", + G_CALLBACK (label_changed_cb), view); + g_signal_connect_swapped (G_OBJECT (view->label), "size_changed", + G_CALLBACK (label_resized_cb), view); + g_signal_connect_swapped (G_OBJECT (view->label), "object_added", + G_CALLBACK (label_object_added_cb), view); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIAVTE. Calculate 1:1 scale for screen. */ +/*---------------------------------------------------------------------------*/ +static gdouble +get_home_scale (glView *view) +{ + GdkScreen *screen; + gdouble screen_width_pixels; + gdouble screen_width_mm; + gdouble screen_height_pixels; + gdouble screen_height_mm; + gdouble x_pixels_per_mm; + gdouble y_pixels_per_mm; + gdouble scale; + + if (view->canvas == NULL) return 1.0; + + if (!gtk_widget_has_screen (GTK_WIDGET (view->canvas))) return 1.0; + + screen = gtk_widget_get_screen (GTK_WIDGET (view->canvas)); + + gl_debug (DEBUG_VIEW, "Screen = %p", screen); + + screen_width_pixels = gdk_screen_get_width (screen); + screen_width_mm = gdk_screen_get_width_mm (screen); + screen_height_pixels = gdk_screen_get_height (screen); + screen_height_mm = gdk_screen_get_height_mm (screen); + + x_pixels_per_mm = screen_width_pixels / screen_width_mm; + y_pixels_per_mm = screen_height_pixels / screen_height_mm; + + gl_debug (DEBUG_VIEW, "Horizontal dot pitch: %g pixels/mm (%g dpi)", + x_pixels_per_mm, x_pixels_per_mm * 25.4); + gl_debug (DEBUG_VIEW, "Vertical dot pitch: %g pixels/mm (%g dpi)", + y_pixels_per_mm, y_pixels_per_mm * 25.4); + + scale = (x_pixels_per_mm + y_pixels_per_mm) / 2.0; + + gl_debug (DEBUG_VIEW, "Average dot pitch: %g pixels/mm (%g dpi)", + scale, scale * 25.4); + + scale /= POINTS_PER_MM; + + gl_debug (DEBUG_VIEW, "Scale = %g pixels/point", scale); + + /* Make sure scale is somewhat sane. */ + if ( (scale < 0.25) || (scale > 4.0) ) return 1.0; + + return scale; +} + +/*---------------------------------------------------------------------------*/ +/* Schedule canvas update. */ +/*---------------------------------------------------------------------------*/ +void +gl_view_update (glView *view) +{ + GtkWidget *widget; + GdkRegion *region; + + gl_debug (DEBUG_VIEW, "START"); + + widget = GTK_WIDGET (view->canvas); + + if (!widget->window) return; + + if ( !view->update_scheduled_flag ) + { + view->update_scheduled_flag = TRUE; + + region = gdk_drawable_get_clip_region (widget->window); + /* redraw the cairo canvas completely by exposing it */ + gdk_window_invalidate_region (widget->window, region, TRUE); + gdk_region_destroy (region); + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* Schedule canvas region update. */ +/*---------------------------------------------------------------------------*/ +void +gl_view_update_region (glView *view, + cairo_t *cr, + glLabelRegion *region) +{ + GtkWidget *widget; + GdkRectangle rect; + gdouble x, y, w, h; + + gl_debug (DEBUG_VIEW, "START"); + + widget = GTK_WIDGET (view->canvas); + + if (!widget->window) return; + + x = MIN (region->x1, region->x2); + y = MIN (region->y1, region->y2); + w = fabs (region->x2 - region->x1); + h = fabs (region->y2 - region->y1); + + cairo_user_to_device (cr, &x, &y); + cairo_user_to_device_distance (cr, &w, &h); + + rect.x = x - 3; + rect.y = y - 3; + rect.width = w + 6; + rect.height = h + 6; + + gdk_window_invalidate_rect (widget->window, &rect, TRUE); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Expose handler. */ +/*---------------------------------------------------------------------------*/ +static gboolean +expose_cb (glView *view, + GdkEventExpose *event) +{ + cairo_t *cr; + + gl_debug (DEBUG_VIEW, "START"); + + view->update_scheduled_flag = FALSE; + + /* get a cairo_t */ + cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window); + + cairo_rectangle (cr, + event->area.x, event->area.y, + event->area.width, event->area.height); + cairo_clip (cr); + + draw_layers (view, cr); + + cairo_destroy (cr); + + gl_debug (DEBUG_VIEW, "END"); + + return FALSE; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Realize handler. */ +/*---------------------------------------------------------------------------*/ +static void +realize_cb (glView *view) +{ + g_return_if_fail (view && GL_IS_VIEW (view)); + + gl_debug (DEBUG_VIEW, "START"); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Size allocation changed callback. */ +/*---------------------------------------------------------------------------*/ +static void +size_allocate_cb (glView *view, + GtkAllocation *allocation) +{ + gl_debug (DEBUG_VIEW, "START"); + + GTK_LAYOUT (view->canvas)->hadjustment->page_size = allocation->width; + GTK_LAYOUT (view->canvas)->hadjustment->page_increment = allocation->width / 2; + + GTK_LAYOUT (view->canvas)->vadjustment->page_size = allocation->height; + GTK_LAYOUT (view->canvas)->vadjustment->page_increment = allocation->height / 2; + + g_signal_emit_by_name (GTK_LAYOUT (view->canvas)->hadjustment, "changed"); + g_signal_emit_by_name (GTK_LAYOUT (view->canvas)->vadjustment, "changed"); + + if (view->zoom_to_fit_flag) { + /* Maintain best fit zoom */ + gl_view_zoom_to_fit (view); + } + + gl_debug (DEBUG_VIEW, "END"); +} + + + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Screen changed callback. */ +/*---------------------------------------------------------------------------*/ +static void +screen_changed_cb (glView *view) +{ + gl_debug (DEBUG_VIEW, "START"); + + if (gtk_widget_has_screen (GTK_WIDGET (view->canvas))) { + + view->home_scale = get_home_scale (view); + + if (view->zoom_to_fit_flag) { + /* Maintain best fit zoom */ + gl_view_zoom_to_fit (view); + } + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Handle label changed event. */ +/*---------------------------------------------------------------------------*/ +static void +label_changed_cb (glView *view) +{ + g_return_if_fail (view && GL_IS_VIEW (view)); + + gl_debug (DEBUG_VIEW, "START"); + + gl_view_update (view); + + gl_debug (DEBUG_VIEW, "END"); +} + + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Handle label resize event. */ +/*---------------------------------------------------------------------------*/ +static void +label_resized_cb (glView *view) +{ + g_return_if_fail (view && GL_IS_VIEW (view)); + + gl_debug (DEBUG_VIEW, "START"); + + g_signal_emit_by_name (GTK_LAYOUT (view->canvas)->hadjustment, "changed"); + g_signal_emit_by_name (GTK_LAYOUT (view->canvas)->vadjustment, "changed"); + + gl_view_update (view); + + gl_debug (DEBUG_VIEW, "END"); +} + + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Handle new label object. */ +/*---------------------------------------------------------------------------*/ +static void +label_object_added_cb (glView *view, + glLabelObject *object) +{ + glViewObject *view_object; + + g_return_if_fail (view && GL_IS_VIEW (view)); + g_return_if_fail (object && GL_IS_LABEL_OBJECT (object)); + + if (GL_IS_LABEL_BOX (object)) { + view_object = gl_view_box_new (GL_LABEL_BOX(object), view); + } else if (GL_IS_LABEL_ELLIPSE (object)) { + view_object = gl_view_ellipse_new (GL_LABEL_ELLIPSE(object), view); + } else if (GL_IS_LABEL_LINE (object)) { + view_object = gl_view_line_new (GL_LABEL_LINE(object), view); + } else if (GL_IS_LABEL_IMAGE (object)) { + view_object = gl_view_image_new (GL_LABEL_IMAGE(object), view); + } else if (GL_IS_LABEL_TEXT (object)) { + view_object = gl_view_text_new (GL_LABEL_TEXT(object), view); + } else if (GL_IS_LABEL_BARCODE (object)) { + view_object = gl_view_barcode_new (GL_LABEL_BARCODE(object), view); + } else { + /* Should not happen! */ + view_object = NULL; + g_message ("Invalid label object type."); + } + + gl_view_select_object (view, view_object); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Create, draw and order layers. */ +/*---------------------------------------------------------------------------*/ +static void +draw_layers (glView *view, + cairo_t *cr) +{ + gdouble scale; + gdouble w, h; + gint canvas_w, canvas_h; + + g_return_if_fail (view && GL_IS_VIEW (view)); + g_return_if_fail (view->label && GL_IS_LABEL (view->label)); + + gl_debug (DEBUG_VIEW, "START"); + + scale = view->zoom * view->home_scale; + + gl_label_get_size (view->label, &w, &h); + + scale = view->home_scale * view->zoom; + gtk_layout_set_size (GTK_LAYOUT (view->canvas), w*scale+8, h*scale+8); + + gdk_drawable_get_size (GTK_LAYOUT (view->canvas)->bin_window, &canvas_w, &canvas_h); + + view->x0 = (canvas_w/scale - w) / 2.0; + view->y0 = (canvas_h/scale - h) / 2.0; + view->w = w; + view->h = h; + + cairo_save (cr); + + cairo_scale (cr, scale, scale); + cairo_translate (cr, view->x0, view->y0); + + draw_bg_layer (view, cr); + draw_grid_layer (view, cr); + draw_markup_layer (view, cr); + draw_objects_layer (view, cr); + draw_fg_layer (view, cr); + draw_highlight_layer (view, cr); + draw_select_region_layer (view, cr); + + cairo_restore (cr); + + gl_debug (DEBUG_VIEW, "END"); + +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Draw background */ +/*---------------------------------------------------------------------------*/ +static void +draw_bg_layer (glView *view, + cairo_t *cr) +{ + g_return_if_fail (view && GL_IS_VIEW (view)); + g_return_if_fail (view->label && GL_IS_LABEL (view->label)); + + gl_cairo_label_path (cr, view->label->template, view->label->rotate_flag, FALSE); + + cairo_set_source_rgb (cr, PAPER_RGB_ARGS); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_fill (cr); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Draw grid lines. */ +/*---------------------------------------------------------------------------*/ +static void +draw_grid_layer (glView *view, + cairo_t *cr) +{ + gdouble w, h; + gdouble x, y; + gdouble x0, y0; + const lglTemplateFrame *frame; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + g_return_if_fail (view->label && GL_IS_LABEL(view->label)); + + if (view->grid_visible) + { + + frame = (lglTemplateFrame *)view->label->template->frames->data; + + gl_label_get_size (view->label, &w, &h); + + if (frame->shape == LGL_TEMPLATE_FRAME_SHAPE_RECT) { + x0 = 0.0; + y0 = 0.0; + } else { + /* round labels, adjust grid to line up with center of label. */ + x0 = fmod (w/2.0, view->grid_spacing); + y0 = fmod (h/2.0, view->grid_spacing); + } + + + cairo_save (cr); + + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + cairo_set_line_width (cr, GRID_LINE_WIDTH_PIXELS/(view->home_scale * view->zoom)); + cairo_set_source_rgb (cr, GRID_RGB_ARGS); + + for ( x=x0+view->grid_spacing; x < w; x += view->grid_spacing ) + { + cairo_move_to (cr, x, 0); + cairo_line_to (cr, x, h); + cairo_stroke (cr); + } + + for ( y=y0+view->grid_spacing; y < h; y += view->grid_spacing ) + { + cairo_move_to (cr, 0, y); + cairo_line_to (cr, w, y); + cairo_stroke (cr); + } + + cairo_restore (cr); + + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Draw markup layer. */ +/*---------------------------------------------------------------------------*/ +static void +draw_markup_layer (glView *view, + cairo_t *cr) +{ + glLabel *label; + const lglTemplateFrame *frame; + GList *p; + lglTemplateMarkup *markup; + + g_return_if_fail (view && GL_IS_VIEW (view)); + g_return_if_fail (view->label && GL_IS_LABEL (view->label)); + + if (view->markup_visible) + { + + label = view->label; + frame = (lglTemplateFrame *)view->label->template->frames->data; + + cairo_save (cr); + + cairo_set_line_width (cr, MARKUP_LINE_WIDTH_PIXELS/(view->home_scale * view->zoom)); + cairo_set_source_rgb (cr, MARKUP_RGB_ARGS); + + for ( p=frame->all.markups; p != NULL; p=p->next ) + { + markup = (lglTemplateMarkup *)p->data; + + gl_cairo_markup_path (cr, markup, label); + + cairo_stroke (cr); + } + + cairo_restore (cr); + } + +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Draw objects layer. */ +/*---------------------------------------------------------------------------*/ +static void +draw_objects_layer (glView *view, + cairo_t *cr) +{ + gl_label_draw (view->label, cr, TRUE, NULL); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Draw foreground */ +/*---------------------------------------------------------------------------*/ +static void +draw_fg_layer (glView *view, + cairo_t *cr) +{ + g_return_if_fail (view && GL_IS_VIEW (view)); + g_return_if_fail (view->label && GL_IS_LABEL (view->label)); + + gl_cairo_label_path (cr, view->label->template, view->label->rotate_flag, FALSE); + + cairo_set_line_width (cr, OUTLINE_WIDTH_PIXELS/(view->home_scale * view->zoom)); + cairo_set_source_rgb (cr, OUTLINE_RGB_ARGS); + cairo_stroke (cr); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Create highlight layer. */ +/*---------------------------------------------------------------------------*/ +static void +draw_highlight_layer (glView *view, + cairo_t *cr) +{ + GList *p_obj; + glViewObject *view_object; + + g_return_if_fail (view && GL_IS_VIEW (view)); + + cairo_save (cr); + + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + for (p_obj = view->selected_object_list; p_obj != NULL; p_obj = p_obj->next) + { + view_object = GL_VIEW_OBJECT (p_obj->data); + + gl_view_object_draw_handles (view_object, cr); + } + + cairo_restore (cr); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Draw select region layer. */ +/*---------------------------------------------------------------------------*/ +static void +draw_select_region_layer (glView *view, + cairo_t *cr) +{ + gdouble x1, y1; + gdouble w, h; + + g_return_if_fail (view && GL_IS_VIEW (view)); + + if (view->select_region_visible) + { + x1 = MIN (view->select_region.x1, view->select_region.x2); + y1 = MIN (view->select_region.y1, view->select_region.y2); + w = fabs (view->select_region.x2 - view->select_region.x1); + h = fabs (view->select_region.y2 - view->select_region.y1); + + cairo_save (cr); + + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + cairo_rectangle (cr, x1, y1, w, h); + + cairo_set_source_rgba (cr, SELECT_FILL_RGBA_ARGS); + cairo_fill_preserve (cr); + + cairo_set_line_width (cr, SELECT_LINE_WIDTH_PIXELS/(view->home_scale * view->zoom)); + cairo_set_source_rgba (cr, SELECT_LINE_RGBA_ARGS); + cairo_stroke (cr); + + cairo_restore (cr); + } +} + +/*****************************************************************************/ +/* Show grid. */ +/*****************************************************************************/ +void +gl_view_show_grid (glView *view) +{ + g_return_if_fail (view && GL_IS_VIEW (view)); + + view->grid_visible = TRUE; + gl_view_update (view); +} + +/*****************************************************************************/ +/* Hide grid. */ +/*****************************************************************************/ +void +gl_view_hide_grid (glView *view) +{ + g_return_if_fail (view && GL_IS_VIEW (view)); + + view->grid_visible = FALSE; + gl_view_update (view); +} + +/*****************************************************************************/ +/* Set grid spacing. */ +/*****************************************************************************/ +void +gl_view_set_grid_spacing (glView *view, + gdouble spacing) +{ + g_return_if_fail (view && GL_IS_VIEW (view)); + + view->grid_spacing = spacing; + gl_view_update (view); +} + +/*****************************************************************************/ +/* Show markup. */ +/*****************************************************************************/ +void +gl_view_show_markup (glView *view) +{ + g_return_if_fail (view && GL_IS_VIEW (view)); + + view->markup_visible = TRUE; + gl_view_update (view); +} + +/*****************************************************************************/ +/* Hide markup. */ +/*****************************************************************************/ +void +gl_view_hide_markup (glView *view) +{ + g_return_if_fail (view && GL_IS_VIEW (view)); + + view->markup_visible = FALSE; + gl_view_update (view); +} + +/*****************************************************************************/ +/* Set arrow mode. */ +/*****************************************************************************/ +void +gl_view_arrow_mode (glView *view) +{ + GdkCursor *cursor; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + cursor = gdk_cursor_new (GDK_LEFT_PTR); + gdk_window_set_cursor (view->canvas->window, cursor); + gdk_cursor_unref (cursor); + + view->mode = GL_VIEW_MODE_ARROW; + view->state = GL_VIEW_IDLE; + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Set create text object mode. */ +/*****************************************************************************/ +void +gl_view_object_create_mode (glView *view, + glLabelObjectType type) +{ + GdkCursor *cursor = NULL; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + switch (type) + { + case GL_LABEL_OBJECT_BOX: + cursor = gl_view_box_get_create_cursor (); + break; + case GL_LABEL_OBJECT_ELLIPSE: + cursor = gl_view_ellipse_get_create_cursor (); + break; + case GL_LABEL_OBJECT_LINE: + cursor = gl_view_line_get_create_cursor (); + break; + case GL_LABEL_OBJECT_IMAGE: + cursor = gl_view_image_get_create_cursor (); + break; + case GL_LABEL_OBJECT_TEXT: + cursor = gl_view_text_get_create_cursor (); + break; + case GL_LABEL_OBJECT_BARCODE: + cursor = gl_view_barcode_get_create_cursor (); + break; + default: + g_message ("Invalid label object type.");/*Should not happen!*/ + break; + } + + gdk_window_set_cursor (view->canvas->window, cursor); + gdk_cursor_unref (cursor); + + view->mode = GL_VIEW_MODE_OBJECT_CREATE; + view->state = GL_VIEW_IDLE; + view->create_type = type; + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Select given object (adding to current selection). */ +/*****************************************************************************/ +void +gl_view_select_object (glView *view, + glViewObject *view_object) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + select_object_real (view, view_object); + + g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Unselect given object (removing from current selection). */ +/*****************************************************************************/ +void +gl_view_unselect_object (glView *view, + glViewObject *view_object) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + unselect_object_real (view, view_object); + + g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Select all items. */ +/*****************************************************************************/ +void +gl_view_select_all (glView *view) +{ + GList *p, *p_next; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + /* 1st unselect anything already selected. */ + for (p = view->selected_object_list; p != NULL; p = p_next) { + p_next = p->next; + unselect_object_real (view, GL_VIEW_OBJECT (p->data)); + } + + /* Finally select all objects. */ + for (p = view->object_list; p != NULL; p = p->next) { + select_object_real (view, GL_VIEW_OBJECT (p->data)); + } + + g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Remove all selections */ +/*****************************************************************************/ +void +gl_view_unselect_all (glView *view) +{ + GList *p; + GList *p_next; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p_next) { + p_next = p->next; + unselect_object_real (view, GL_VIEW_OBJECT (p->data)); + } + + g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Select all objects within given rectangular region (adding to selection). */ +/*****************************************************************************/ +void +gl_view_select_region (glView *view, + glLabelRegion *region) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + gdouble r_x1, r_y1; + gdouble r_x2, r_y2; + glLabelRegion obj_extent; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + r_x1 = MIN (region->x1, region->x2); + r_y1 = MIN (region->y1, region->y2); + r_x2 = MAX (region->x1, region->x2); + r_y2 = MAX (region->y1, region->y2); + + for (p = view->object_list; p != NULL; p = p->next) + { + view_object = GL_VIEW_OBJECT(p->data); + if (!gl_view_is_object_selected (view, view_object)) + { + + object = gl_view_object_get_object (view_object); + + gl_label_object_get_extent (object, &obj_extent); + if ((obj_extent.x1 >= r_x1) && + (obj_extent.x2 <= r_x2) && + (obj_extent.y1 >= r_y1) && + (obj_extent.y2 <= r_y2)) + { + select_object_real (view, view_object); + } + + } + } + + g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Select an object. */ +/*---------------------------------------------------------------------------*/ +static void +select_object_real (glView *view, + glViewObject *view_object) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + g_return_if_fail (GL_IS_VIEW_OBJECT (view_object)); + + if (!gl_view_is_object_selected (view, view_object)) { + view->selected_object_list = + g_list_append (view->selected_object_list, view_object); + } + gtk_widget_grab_focus (GTK_WIDGET (view->canvas)); + + gl_view_update (view); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Un-select object. */ +/*---------------------------------------------------------------------------*/ +static void +unselect_object_real (glView *view, + glViewObject *view_object) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + g_return_if_fail (GL_IS_VIEW_OBJECT (view_object)); + + view->selected_object_list = + g_list_remove (view->selected_object_list, view_object); + + gl_view_update (view); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Return object at (x,y). */ +/*---------------------------------------------------------------------------*/ +static glViewObject * +view_view_object_at (glView *view, + cairo_t *cr, + gdouble x, + gdouble y) +{ + GList *p_obj; + glViewObject *view_object; + + g_return_val_if_fail (view && GL_IS_VIEW (view), NULL); + + for (p_obj = g_list_last (view->object_list); p_obj != NULL; p_obj = p_obj->prev) + { + + view_object = GL_VIEW_OBJECT (p_obj->data); + + if (gl_view_object_at (view_object, cr, x, y)) + { + return view_object; + } + + } + + return NULL; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Return object handle at (x,y). */ +/*---------------------------------------------------------------------------*/ +static glViewObject * +view_handle_at (glView *view, + cairo_t *cr, + gdouble x, + gdouble y, + glViewObjectHandle *handle) +{ + GList *p_obj; + glViewObject *view_object; + + g_return_val_if_fail (view && GL_IS_VIEW (view), NULL); + + for (p_obj = g_list_last (view->selected_object_list); p_obj != NULL; p_obj = p_obj->prev) + { + + view_object = GL_VIEW_OBJECT (p_obj->data); + + if ((*handle = gl_view_object_handle_at (view_object, cr, x, y))) + { + return view_object; + } + + } + + return NULL; +} + +/*****************************************************************************/ +/* Is the object in our current selection? */ +/*****************************************************************************/ +gboolean +gl_view_is_object_selected (glView *view, + glViewObject *view_object) +{ + gl_debug (DEBUG_VIEW, ""); + + g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE); + g_return_val_if_fail (GL_IS_VIEW_OBJECT (view_object), FALSE); + + if (g_list_find (view->selected_object_list, view_object) == NULL) { + return FALSE; + } + return TRUE; +} + +/*****************************************************************************/ +/* Is our current selection empty? */ +/*****************************************************************************/ +gboolean +gl_view_is_selection_empty (glView *view) +{ + gl_debug (DEBUG_VIEW, ""); + + g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE); + + if (view->selected_object_list == NULL) { + return TRUE; + } else { + return FALSE; + } +} + +/*****************************************************************************/ +/* Is our current selection atomic? I.e. only one item selected. */ +/*****************************************************************************/ +gboolean +gl_view_is_selection_atomic (glView *view) +{ + gl_debug (DEBUG_VIEW, ""); + + g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE); + + if (view->selected_object_list == NULL) + return FALSE; + if (view->selected_object_list->next == NULL) + return TRUE; + return FALSE; +} + +/*****************************************************************************/ +/* Delete selected objects. (Bypass clipboard) */ +/*****************************************************************************/ +void +gl_view_delete_selection (glView *view) +{ + GList *object_list; + GList *p; + GList *p_next; + glViewObject *view_object; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + object_list = view->selected_object_list; + view->selected_object_list = NULL; + g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0); + + for (p = object_list; p != NULL; p = p_next) { + p_next = p->next; + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_remove (object); + } + + g_list_free (object_list); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Get object property editor of first selected object. */ +/*****************************************************************************/ +GtkWidget * +gl_view_get_editor (glView *view) +{ + glViewObject *view_object; + GtkWidget *editor = NULL; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (view && GL_IS_VIEW (view), NULL); + + if (!gl_view_is_selection_empty (view)) { + + view_object = GL_VIEW_OBJECT(view->selected_object_list->data); + editor = gl_view_object_get_editor (view_object); + + } + + gl_debug (DEBUG_VIEW, "END"); + + return editor; +} + +/*****************************************************************************/ +/* Raise selected items to top. */ +/*****************************************************************************/ +void +gl_view_raise_selection (glView *view) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_raise_to_top (object); + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Lower selected items to bottom. */ +/*****************************************************************************/ +void +gl_view_lower_selection (glView *view) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_lower_to_bottom (object); + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Rotate selected objects by given angle. */ +/*****************************************************************************/ +void +gl_view_rotate_selection (glView *view, + gdouble theta_degs) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_rotate (object, theta_degs); + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Rotate selected objects 90 degrees left. */ +/*****************************************************************************/ +void +gl_view_rotate_selection_left (glView *view) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_rotate (object, -90.0); + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Rotate selected objects 90 degrees right. */ +/*****************************************************************************/ +void +gl_view_rotate_selection_right (glView *view) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_rotate (object, 90.0); + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Flip selected objects horizontally. */ +/*****************************************************************************/ +void +gl_view_flip_selection_horiz (glView *view) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_flip_horiz (object); + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Flip selected objects vertically. */ +/*****************************************************************************/ +void +gl_view_flip_selection_vert (glView *view) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_flip_vert (object); + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Align selected objects to left most edge. */ +/*****************************************************************************/ +void +gl_view_align_selection_left (glView *view) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + gdouble dx, x1_min; + glLabelRegion obj_extent; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + g_return_if_fail (!gl_view_is_selection_empty (view) && + !gl_view_is_selection_atomic (view)); + + /* find left most edge */ + p = view->selected_object_list; + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + x1_min = obj_extent.x1; + for (p = p->next; p != NULL; p = p->next) + { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + if ( obj_extent.x1 < x1_min ) x1_min = obj_extent.x1; + } + + /* now adjust the object positions to line up the left edges */ + for (p = view->selected_object_list; p != NULL; p = p->next) + { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + dx = x1_min - obj_extent.x1; + gl_label_object_set_position_relative (object, dx, 0.0); + } + + gl_debug (DEBUG_VIEW, "END"); +} + + +/*****************************************************************************/ +/* Align selected objects to right most edge. */ +/*****************************************************************************/ +void +gl_view_align_selection_right (glView *view) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + gdouble dx, x2_max; + glLabelRegion obj_extent; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + g_return_if_fail (!gl_view_is_selection_empty (view) && + !gl_view_is_selection_atomic (view)); + + /* find right most edge */ + p = view->selected_object_list; + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + x2_max = obj_extent.x2; + for (p = p->next; p != NULL; p = p->next) + { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + if ( obj_extent.x2 > x2_max ) x2_max = obj_extent.x2; + } + + /* now adjust the object positions to line up the right edges */ + for (p = view->selected_object_list; p != NULL; p = p->next) + { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + dx = x2_max - obj_extent.x2; + gl_label_object_set_position_relative (object, dx, 0.0); + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Align selected objects to horizontal center of objects. */ +/*****************************************************************************/ +void +gl_view_align_selection_hcenter (glView *view) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + gdouble dx; + gdouble dxmin; + gdouble xsum, xavg; + glLabelRegion obj_extent; + gdouble xcenter; + gint n; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + g_return_if_fail (!gl_view_is_selection_empty (view) && + !gl_view_is_selection_atomic (view)); + + /* find average center of objects */ + xsum = 0.0; + n = 0; + for (p = view->selected_object_list; p != NULL; p = p->next) + { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + xsum += (obj_extent.x1 + obj_extent.x2) / 2.0; + n++; + } + xavg = xsum / n; + + /* find center of object closest to average center */ + p = view->selected_object_list; + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + dxmin = fabs (xavg - (obj_extent.x1 + obj_extent.x2)/2.0); + xcenter = (obj_extent.x1 + obj_extent.x2)/2.0; + for (p = p->next; p != NULL; p = p->next) + { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + dx = fabs (xavg - (obj_extent.x1 + obj_extent.x2)/2.0); + if ( dx < dxmin ) + { + dxmin = dx; + xcenter = (obj_extent.x1 + obj_extent.x2)/2.0; + } + } + + /* now adjust the object positions to line up this center */ + for (p = view->selected_object_list; p != NULL; p = p->next) { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + dx = xcenter - (obj_extent.x1 + obj_extent.x2)/2.0; + gl_label_object_set_position_relative (object, dx, 0.0); + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Align selected objects to top most edge. */ +/*****************************************************************************/ +void +gl_view_align_selection_top (glView *view) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + gdouble dy, y1_min; + glLabelRegion obj_extent; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + g_return_if_fail (!gl_view_is_selection_empty (view) && + !gl_view_is_selection_atomic (view)); + + /* find top most edge */ + p = view->selected_object_list; + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + y1_min = obj_extent.y1; + for (p = p->next; p != NULL; p = p->next) + { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + if ( obj_extent.y1 < y1_min ) y1_min = obj_extent.y1; + } + + /* now adjust the object positions to line up the top edges */ + for (p = view->selected_object_list; p != NULL; p = p->next) + { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + dy = y1_min - obj_extent.y1; + gl_label_object_set_position_relative (object, 0.0, dy); + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Align selected objects to bottom most edge. */ +/*****************************************************************************/ +void +gl_view_align_selection_bottom (glView *view) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + gdouble dy, y2_max; + glLabelRegion obj_extent; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + g_return_if_fail (!gl_view_is_selection_empty (view) && + !gl_view_is_selection_atomic (view)); + + /* find bottom most edge */ + p = view->selected_object_list; + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + y2_max = obj_extent.y2; + for (p = p->next; p != NULL; p = p->next) + { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + if ( obj_extent.y2 > y2_max ) y2_max = obj_extent.y2; + } + + /* now adjust the object positions to line up the bottom edges */ + for (p = view->selected_object_list; p != NULL; p = p->next) + { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + dy = y2_max - obj_extent.y2; + gl_label_object_set_position_relative (object, 0.0, dy); + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Align selected objects to viertical center of objects. */ +/*****************************************************************************/ +void +gl_view_align_selection_vcenter (glView *view) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + gdouble dy; + gdouble dymin; + gdouble ysum, yavg; + glLabelRegion obj_extent; + gdouble ycenter; + gint n; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + g_return_if_fail (!gl_view_is_selection_empty (view) && + !gl_view_is_selection_atomic (view)); + + /* find average center of objects */ + ysum = 0.0; + n = 0; + for (p = view->selected_object_list; p != NULL; p = p->next) + { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + ysum += (obj_extent.y1 + obj_extent.y2) / 2.0; + n++; + } + yavg = ysum / n; + + /* find center of object closest to average center */ + p = view->selected_object_list; + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + dymin = fabs (yavg - (obj_extent.y1 + obj_extent.y2)/2.0); + ycenter = (obj_extent.y1 + obj_extent.y2)/2.0; + for (p = p->next; p != NULL; p = p->next) + { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + dy = fabs (yavg - (obj_extent.y1 + obj_extent.y2)/2.0); + if ( dy < dymin ) + { + dymin = dy; + ycenter = (obj_extent.y1 + obj_extent.y2)/2.0; + } + } + + /* now adjust the object positions to line up this center */ + for (p = view->selected_object_list; p != NULL; p = p->next) + { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + dy = ycenter - (obj_extent.y1 + obj_extent.y2)/2.0; + gl_label_object_set_position_relative (object, 0.0, dy); + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Center selected objects to in center of label. */ +/*****************************************************************************/ +void +gl_view_center_selection_horiz (glView *view) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + gdouble dx; + gdouble x_label_center; + gdouble x_obj_center; + glLabelRegion obj_extent; + gdouble w, h; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + g_return_if_fail (!gl_view_is_selection_empty (view)); + + gl_label_get_size (view->label, &w, &h); + x_label_center = w / 2.0; + + /* adjust the object positions */ + for (p = view->selected_object_list; p != NULL; p = p->next) + { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + x_obj_center = (obj_extent.x1 + obj_extent.x2) / 2.0; + dx = x_label_center - x_obj_center; + gl_label_object_set_position_relative (object, dx, 0.0); + } + + gl_debug (DEBUG_VIEW, "END"); +} + + +/*****************************************************************************/ +/* Center selected objects to in center of label. */ +/*****************************************************************************/ +void +gl_view_center_selection_vert (glView *view) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + gdouble dy; + gdouble y_label_center; + gdouble y_obj_center; + glLabelRegion obj_extent; + gdouble w, h; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + g_return_if_fail (!gl_view_is_selection_empty (view)); + + gl_label_get_size (view->label, &w, &h); + y_label_center = h / 2.0; + + /* adjust the object positions */ + for (p = view->selected_object_list; p != NULL; p = p->next) + { + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + gl_label_object_get_extent (object, &obj_extent); + y_obj_center = (obj_extent.y1 + obj_extent.y2) / 2.0; + dy = y_label_center - y_obj_center; + gl_label_object_set_position_relative (object, 0.0, dy); + } + + gl_debug (DEBUG_VIEW, "END"); +} + + +/*****************************************************************************/ +/* Move selected objects */ +/*****************************************************************************/ +void +gl_view_move_selection (glView *view, + gdouble dx, + gdouble dy) +{ + GList *p; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) + { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + gl_label_object_set_position_relative (object, dx, dy); + + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Can text properties be set for selection? */ +/*****************************************************************************/ +gboolean +gl_view_can_selection_text (glView *view) +{ + GList *p; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, ""); + + g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE); + + for (p = view->selected_object_list; p != NULL; p = p->next) + { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + if (gl_label_object_can_text (object)) + { + return TRUE; + } + + } + + return FALSE; +} + +/*****************************************************************************/ +/* Set font family for all text contained in selected objects. */ +/*****************************************************************************/ +void +gl_view_set_selection_font_family (glView *view, + const gchar *font_family) +{ + GList *p; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + gl_label_object_set_font_family (object, font_family); + + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Set font size for all text contained in selected objects. */ +/*****************************************************************************/ +void +gl_view_set_selection_font_size (glView *view, + gdouble font_size) +{ + GList *p; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + gl_label_object_set_font_size (object, font_size); + + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Set font weight for all text contained in selected objects. */ +/*****************************************************************************/ +void +gl_view_set_selection_font_weight (glView *view, + PangoWeight font_weight) +{ + GList *p; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + gl_label_object_set_font_weight (object, font_weight); + + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Set font italic flag for all text contained in selected objects. */ +/*****************************************************************************/ +void +gl_view_set_selection_font_italic_flag (glView *view, + gboolean font_italic_flag) +{ + GList *p; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + gl_label_object_set_font_italic_flag (object, font_italic_flag); + + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Set text alignment for all text contained in selected objects. */ +/*****************************************************************************/ +void +gl_view_set_selection_text_alignment (glView *view, + PangoAlignment text_alignment) +{ + GList *p; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + gl_label_object_set_text_alignment (object, text_alignment); + + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Set text line spacing for all text contained in selected objects. */ +/*****************************************************************************/ +void +gl_view_set_selection_text_line_spacing (glView *view, + gdouble text_line_spacing) +{ + GList *p; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + gl_label_object_set_text_line_spacing (object, text_line_spacing); + + } + + gl_debug (DEBUG_VIEW, "END"); +} +/*****************************************************************************/ +/* Set text color for all text contained in selected objects. */ +/*****************************************************************************/ +void +gl_view_set_selection_text_color (glView *view, + glColorNode *text_color_node) +{ + GList *p; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + gl_label_object_set_text_color (object, text_color_node); + + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Can fill properties be set for selection? */ +/*****************************************************************************/ +gboolean +gl_view_can_selection_fill (glView *view) +{ + GList *p; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, ""); + + g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + if (gl_label_object_can_fill (object)) { + return TRUE; + } + + } + + return FALSE; +} + +/*****************************************************************************/ +/* Set fill color for all selected objects. */ +/*****************************************************************************/ +void +gl_view_set_selection_fill_color (glView *view, + glColorNode *fill_color_node) +{ + GList *p; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + gl_label_object_set_fill_color (object, fill_color_node); + + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Can line color properties be set for selection? */ +/*****************************************************************************/ +gboolean +gl_view_can_selection_line_color (glView *view) +{ + GList *p; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, ""); + + g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + if (gl_label_object_can_line_color (object)) { + return TRUE; + } + + } + + return FALSE; +} + +/*****************************************************************************/ +/* Set line color for all selected objects. */ +/*****************************************************************************/ +void +gl_view_set_selection_line_color (glView *view, + glColorNode *line_color_node) +{ + GList *p; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + gl_label_object_set_line_color (object, line_color_node); + + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Can line width properties be set for selection? */ +/*****************************************************************************/ +gboolean +gl_view_can_selection_line_width (glView *view) +{ + GList *p; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, ""); + + g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + if (gl_label_object_can_line_width (object)) { + return TRUE; + } + + } + + return FALSE; +} + +/*****************************************************************************/ +/* Set line width for all selected objects. */ +/*****************************************************************************/ +void +gl_view_set_selection_line_width (glView *view, + gdouble line_width) +{ + GList *p; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + + object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data)); + gl_label_object_set_line_width (object, line_width); + + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* "Cut" selected items and place in clipboard selections. */ +/*****************************************************************************/ +void +gl_view_cut (glView *view) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + gl_view_copy (view); + gl_view_delete_selection (view); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* "Copy" selected items to clipboard selections. */ +/*****************************************************************************/ +void +gl_view_copy (glView *view) +{ + GList *p; + glViewObject *view_object; + glLabelObject *object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + if (view->selected_object_list) { + + if ( view->selection_data ) { + g_object_unref (view->selection_data); + } + view->selection_data = GL_LABEL(gl_label_new ()); + gl_label_set_template (view->selection_data, view->label->template); + gl_label_set_rotate_flag (view->selection_data, view->label->rotate_flag); + + for (p = view->selected_object_list; p != NULL; p = p->next) { + + view_object = GL_VIEW_OBJECT (p->data); + object = gl_view_object_get_object (view_object); + + gl_label_object_dup (object, view->selection_data); + + } + + gtk_selection_owner_set (view->invisible, + clipboard_atom, GDK_CURRENT_TIME); + view->have_selection = TRUE; + + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* "Paste" from private clipboard selection. */ +/*****************************************************************************/ +void +gl_view_paste (glView *view) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + gtk_selection_convert (GTK_WIDGET (view->invisible), + clipboard_atom, GDK_SELECTION_TYPE_STRING, + GDK_CURRENT_TIME); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Zoom in one "notch" */ +/*****************************************************************************/ +void +gl_view_zoom_in (glView *view) +{ + gint i, i_min; + gdouble dist, dist_min; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + /* Find index of current scale (or best match) */ + i_min = 1; /* start with 2nd largest scale */ + dist_min = fabs (zooms[1] - view->zoom); + for (i = 2; i < N_ZOOMS; i++) { + dist = fabs (zooms[i] - view->zoom); + if (dist < dist_min) { + i_min = i; + dist_min = dist; + } + } + + /* zoom in one "notch" */ + i = MAX (0, i_min - 1); + gl_debug (DEBUG_VIEW, "zoom[%d] = %g", i, zooms[i]); + set_zoom_real (view, zooms[i], FALSE); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Zoom out one "notch" */ +/*****************************************************************************/ +void +gl_view_zoom_out (glView *view) +{ + gint i, i_min; + gdouble dist, dist_min; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + /* Find index of current scale (or best match) */ + i_min = 0; /* start with largest scale */ + dist_min = fabs (zooms[0] - view->zoom); + for (i = 1; i < N_ZOOMS; i++) { + dist = fabs (zooms[i] - view->zoom); + if (dist < dist_min) { + i_min = i; + dist_min = dist; + } + } + + /* zoom out one "notch" */ + if (i_min >= N_ZOOMS) + return; + i = i_min + 1; + if (i >= N_ZOOMS) + return; + set_zoom_real (view, zooms[i], FALSE); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*****************************************************************************/ +/* Set zoom to best fit. */ +/*****************************************************************************/ +void +gl_view_zoom_to_fit (glView *view) +{ + gint w_view, h_view; + gdouble w_label, h_label; + gdouble x_scale, y_scale, scale; + + gl_debug (DEBUG_VIEW, ""); + + if ( ! GTK_WIDGET_VISIBLE(view)) { + set_zoom_real (view, 1.0, TRUE); + return; + } + + w_view = GTK_WIDGET(view)->allocation.width; + h_view = GTK_WIDGET(view)->allocation.height; + + gl_label_get_size (GL_LABEL(view->label), &w_label, &h_label); + + gl_debug (DEBUG_VIEW, "View size: %d, %d", w_view, h_view); + gl_debug (DEBUG_VIEW, "Label size: %g, %g", w_label, h_label); + + /* Calculate best scale */ + x_scale = (double)(w_view - ZOOMTOFIT_PAD) / w_label; + y_scale = (double)(h_view - ZOOMTOFIT_PAD) / h_label; + scale = MIN (x_scale, y_scale); + gl_debug (DEBUG_VIEW, "Candidate zooms: %g, %g => %g", x_scale, y_scale, scale); + + /* Limit */ + gl_debug (DEBUG_VIEW, "Scale: %g", scale); + scale = MIN (scale, zooms[0]*view->home_scale); + scale = MAX (scale, zooms[N_ZOOMS-1]*view->home_scale); + gl_debug (DEBUG_VIEW, "Limitted scale: %g", scale); + + set_zoom_real (view, scale/view->home_scale, TRUE); +} + +/*****************************************************************************/ +/* Set current zoom factor to explicit value. */ +/*****************************************************************************/ +void +gl_view_set_zoom (glView *view, + gdouble zoom) +{ + gl_debug (DEBUG_VIEW, "START"); + + set_zoom_real (view, zoom, FALSE); + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Set canvas scale. */ +/*---------------------------------------------------------------------------*/ +static void +set_zoom_real (glView *view, + gdouble zoom, + gboolean zoom_to_fit_flag) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + g_return_if_fail (zoom > 0.0); + + /* Limit, if needed */ + gl_debug (DEBUG_VIEW, "Zoom requested: %g", zoom); + zoom = MIN (zoom, zooms[0]); + zoom = MAX (zoom, zooms[N_ZOOMS-1]); + gl_debug (DEBUG_VIEW, "Limitted zoom: %g", zoom); + + if ( zoom != view->zoom ) { + + view->zoom = zoom; + view->zoom_to_fit_flag = zoom_to_fit_flag; + + gl_view_update (view); + + g_signal_emit (G_OBJECT(view), signals[ZOOM_CHANGED], 0, zoom); + + } + + gl_debug (DEBUG_VIEW, "END"); + +} + + +/*****************************************************************************/ +/* Get current zoom factor. */ +/*****************************************************************************/ +gdouble +gl_view_get_zoom (glView *view) +{ + gl_debug (DEBUG_VIEW, ""); + + g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0); + + return view->zoom; +} + +/*****************************************************************************/ +/* Is this the maximum zoom level. */ +/*****************************************************************************/ +gboolean +gl_view_is_zoom_max (glView *view) +{ + gl_debug (DEBUG_VIEW, ""); + + g_return_val_if_fail (GL_IS_VIEW (view), FALSE); + + return view->zoom >= zooms[0]; +} + +/*****************************************************************************/ +/* Is this the minimum zoom level. */ +/*****************************************************************************/ +gboolean +gl_view_is_zoom_min (glView *view) +{ + gl_debug (DEBUG_VIEW, ""); + + g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE); + + return view->zoom <= zooms[N_ZOOMS-1]; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Handle "selection-clear" signal. */ +/*---------------------------------------------------------------------------*/ +static void +selection_clear_cb (GtkWidget *widget, + GdkEventSelection *event, + glView *view) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + view->have_selection = FALSE; + g_object_unref (view->selection_data); + view->selection_data = NULL; + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Handle "selection-get" signal. */ +/*---------------------------------------------------------------------------*/ +static void +selection_get_cb (GtkWidget *widget, + GtkSelectionData *selection_data, + guint info, + guint time, + glView *view) +{ + gchar *buffer; + glXMLLabelStatus status; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + if (view->have_selection) { + + buffer = gl_xml_label_save_buffer (view->selection_data, + &status); + gtk_selection_data_set (selection_data, + GDK_SELECTION_TYPE_STRING, 8, + (guchar *)buffer, strlen (buffer)); + g_free (buffer); + } + + gl_debug (DEBUG_VIEW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Handle "selection-received" signal. (Result of Paste) */ +/*---------------------------------------------------------------------------*/ +static void +selection_received_cb (GtkWidget *widget, + GtkSelectionData *selection_data, + guint time, + glView *view) +{ + glLabel *label = NULL; + glXMLLabelStatus status; + GList *p, *p_next; + glLabelObject *object, *newobject; + glViewObject *view_object; + + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + if (selection_data->length < 0) { + return; + } + if (selection_data->type != GDK_SELECTION_TYPE_STRING) { + return; + } + + gl_view_unselect_all (view); + + label = gl_xml_label_open_buffer ((gchar *)selection_data->data, &status); + for (p = label->objects; p != NULL; p = p_next) { + p_next = p->next; + + object = (glLabelObject *) p->data; + newobject = gl_label_object_dup (object, view->label); + + gl_debug (DEBUG_VIEW, "object pasted"); + + if (GL_IS_LABEL_BOX (newobject)) { + view_object = gl_view_box_new (GL_LABEL_BOX(newobject), + view); + } else if (GL_IS_LABEL_ELLIPSE (newobject)) { + view_object = gl_view_ellipse_new (GL_LABEL_ELLIPSE(newobject), + view); + } else if (GL_IS_LABEL_LINE (newobject)) { + view_object = gl_view_line_new (GL_LABEL_LINE(newobject), + view); + } else if (GL_IS_LABEL_IMAGE (newobject)) { + view_object = gl_view_image_new (GL_LABEL_IMAGE(newobject), + view); + } else if (GL_IS_LABEL_TEXT (newobject)) { + view_object = gl_view_text_new (GL_LABEL_TEXT(newobject), + view); + } else if (GL_IS_LABEL_BARCODE (newobject)) { + view_object = gl_view_barcode_new (GL_LABEL_BARCODE(newobject), + view); + } else { + /* Should not happen! */ + view_object = NULL; + g_message ("Invalid label object type."); + } + gl_view_select_object (view, view_object); + } + g_object_unref (label); + + gl_debug (DEBUG_VIEW, "END"); +} + +/****************************************************************************/ +/* Set default font family. */ +/****************************************************************************/ +void +gl_view_set_default_font_family (glView *view, + const gchar *font_family) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + if (view->default_font_family) { + g_free (view->default_font_family); + } + view->default_font_family = g_strdup (font_family); + + gl_debug (DEBUG_VIEW, "END"); +} + + +/****************************************************************************/ +/* Set default font size. */ +/****************************************************************************/ +void +gl_view_set_default_font_size (glView *view, + gdouble font_size) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + view->default_font_size = font_size; + + gl_debug (DEBUG_VIEW, "END"); +} + + +/****************************************************************************/ +/* Set default font weight. */ +/****************************************************************************/ +void +gl_view_set_default_font_weight (glView *view, + PangoWeight font_weight) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + view->default_font_weight = font_weight; + + gl_debug (DEBUG_VIEW, "END"); +} + + +/****************************************************************************/ +/* Set default font italic flag. */ +/****************************************************************************/ +void +gl_view_set_default_font_italic_flag (glView *view, + gboolean font_italic_flag) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + view->default_font_italic_flag = font_italic_flag; + + gl_debug (DEBUG_VIEW, "END"); +} + + +/****************************************************************************/ +/* Set default text color. */ +/****************************************************************************/ +void +gl_view_set_default_text_color (glView *view, + guint text_color) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + view->default_text_color = text_color; + + gl_debug (DEBUG_VIEW, "END"); +} + + +/****************************************************************************/ +/* Set default text alignment. */ +/****************************************************************************/ +void +gl_view_set_default_text_alignment (glView *view, + PangoAlignment text_alignment) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + view->default_text_alignment = text_alignment; + gl_debug (DEBUG_VIEW, "END"); +} + +/****************************************************************************/ +/* Set default text line spacing. */ +/****************************************************************************/ +void +gl_view_set_default_text_line_spacing (glView *view, + gdouble text_line_spacing) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + view->default_text_line_spacing = text_line_spacing; + + gl_debug (DEBUG_VIEW, "END"); +} + + +/****************************************************************************/ +/* Set default line width. */ +/****************************************************************************/ +void +gl_view_set_default_line_width (glView *view, + gdouble line_width) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + view->default_line_width = line_width; + + gl_debug (DEBUG_VIEW, "END"); +} + + +/****************************************************************************/ +/* Set default line color. */ +/****************************************************************************/ +void +gl_view_set_default_line_color (glView *view, + guint line_color) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + view->default_line_color = line_color; + + gl_debug (DEBUG_VIEW, "END"); +} + + +/****************************************************************************/ +/* Set default fill color. */ +/****************************************************************************/ +void +gl_view_set_default_fill_color (glView *view, + guint fill_color) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + + view->default_fill_color = fill_color; + + gl_debug (DEBUG_VIEW, "END"); +} + + + +/****************************************************************************/ +/* Get default font family. */ +/****************************************************************************/ +gchar * +gl_view_get_default_font_family (glView *view) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (view && GL_IS_VIEW (view), NULL); + + gl_debug (DEBUG_VIEW, "END"); + + return g_strdup (view->default_font_family); +} + + +/****************************************************************************/ +/* Get default font size. */ +/****************************************************************************/ +gdouble +gl_view_get_default_font_size (glView *view) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (view && GL_IS_VIEW (view), 12.0); + + gl_debug (DEBUG_VIEW, "END"); + + return view->default_font_size; +} + + +/****************************************************************************/ +/* Get default font weight. */ +/****************************************************************************/ +PangoWeight +gl_view_get_default_font_weight (glView *view) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (view && GL_IS_VIEW (view), PANGO_WEIGHT_NORMAL); + + gl_debug (DEBUG_VIEW, "END"); + + return view->default_font_weight; +} + + +/****************************************************************************/ +/* Get default font italic flag. */ +/****************************************************************************/ +gboolean +gl_view_get_default_font_italic_flag (glView *view) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE); + + gl_debug (DEBUG_VIEW, "END"); + + return view->default_font_italic_flag; +} + + +/****************************************************************************/ +/* Get default text color. */ +/****************************************************************************/ +guint +gl_view_get_default_text_color (glView *view) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (view && GL_IS_VIEW (view), 0); + + gl_debug (DEBUG_VIEW, "END"); + + return view->default_text_color; +} + + +/****************************************************************************/ +/* Get default text alignment. */ +/****************************************************************************/ +PangoAlignment +gl_view_get_default_text_alignment (glView *view) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (view && GL_IS_VIEW (view), PANGO_ALIGN_LEFT); + + gl_debug (DEBUG_VIEW, "END"); + + return view->default_text_alignment; +} + +/****************************************************************************/ +/* Get default text line spacing. */ +/****************************************************************************/ +gdouble +gl_view_get_default_text_line_spacing (glView *view) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0); + + gl_debug (DEBUG_VIEW, "END"); + + return view->default_text_line_spacing; +} + + + +/****************************************************************************/ +/* Get default line width. */ +/****************************************************************************/ +gdouble +gl_view_get_default_line_width (glView *view) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0); + + gl_debug (DEBUG_VIEW, "END"); + + return view->default_line_width; +} + + +/****************************************************************************/ +/* Get default line color. */ +/****************************************************************************/ +guint +gl_view_get_default_line_color (glView *view) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (view && GL_IS_VIEW (view), 0); + + gl_debug (DEBUG_VIEW, "END"); + + return view->default_line_color; +} + + +/****************************************************************************/ +/* Get default fill color. */ +/****************************************************************************/ +guint +gl_view_get_default_fill_color (glView *view) +{ + gl_debug (DEBUG_VIEW, "START"); + + g_return_val_if_fail (view && GL_IS_VIEW (view), 0); + + gl_debug (DEBUG_VIEW, "END"); + + return view->default_fill_color; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Focus in event handler. */ +/*---------------------------------------------------------------------------*/ +static gboolean +focus_in_event_cb (glView *view, + GdkEventFocus *event) +{ + GTK_WIDGET_SET_FLAGS (GTK_WIDGET (view->canvas), GTK_HAS_FOCUS); + + return FALSE; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Focus out event handler. */ +/*---------------------------------------------------------------------------*/ +static gboolean +focus_out_event_cb (glView *view, + GdkEventFocus *event) +{ + GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (view->canvas), GTK_HAS_FOCUS); + + return FALSE; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Enter notify event handler. */ +/*---------------------------------------------------------------------------*/ +static gboolean +enter_notify_event_cb (glView *view, + GdkEventCrossing *event) +{ + gtk_widget_grab_focus(GTK_WIDGET (view->canvas)); + + return FALSE; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Leave notify event handler. */ +/*---------------------------------------------------------------------------*/ +static gboolean +leave_notify_event_cb (glView *view, + GdkEventCrossing *event) +{ + + g_signal_emit (G_OBJECT(view), signals[POINTER_EXIT], 0); + + return FALSE; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Motion notify event handler. */ +/*---------------------------------------------------------------------------*/ +static gboolean +motion_notify_event_cb (glView *view, + GdkEventMotion *event) +{ + gboolean return_value = FALSE; + cairo_t *cr; + gdouble scale; + gdouble x, y; + GdkCursor *cursor; + glViewObjectHandle handle; + + cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window); + + /* + * Translate to label coordinates + */ + scale = view->zoom * view->home_scale; + cairo_scale (cr, scale, scale); + cairo_translate (cr, view->x0, view->y0); + + x = event->x; + y = event->y; + cairo_device_to_user (cr, &x, &y); + + /* + * Emit signal regardless of mode + */ + g_signal_emit (G_OBJECT(view), signals[POINTER_MOVED], 0, x, y); + + /* + * Handle event as appropriate for mode + */ + switch (view->mode) + { + + case GL_VIEW_MODE_ARROW: + switch (view->state) + { + + case GL_VIEW_IDLE: + if (view_handle_at (view, cr, event->x, event->y, &handle)) + { + cursor = gdk_cursor_new (GDK_CROSSHAIR); + } + else if (view_view_object_at (view, cr, event->x, event->y)) + { + cursor = gdk_cursor_new (GDK_FLEUR); + } + else + { + cursor = gdk_cursor_new (GDK_LEFT_PTR); + } + gdk_window_set_cursor (view->canvas->window, cursor); + gdk_cursor_unref (cursor); + break; + + case GL_VIEW_ARROW_SELECT_REGION: +#ifdef CLIP_UPDATES + gl_view_update_region (view, cr, &view->select_region); +#endif + view->select_region.x2 = x; + view->select_region.y2 = y; +#ifdef CLIP_UPDATES + gl_view_update_region (view, cr, &view->select_region); +#else + gl_view_update (view); +#endif + break; + + case GL_VIEW_ARROW_MOVE: + gl_view_move_selection (view, + (x - view->move_last_x), + (y - view->move_last_y)); + view->move_last_x = x; + view->move_last_y = y; + break; + + case GL_VIEW_ARROW_RESIZE: + gl_view_object_resize_event (view->resize_object, + view->resize_handle, + view->resize_honor_aspect, + cr, + event->x, + event->y); + break; + + default: + g_message ("Invalid arrow state."); /*Should not happen!*/ + } + return_value = TRUE; + break; + + + case GL_VIEW_MODE_OBJECT_CREATE: + if (view->state != GL_VIEW_IDLE) + { + switch (view->create_type) + { + case GL_LABEL_OBJECT_BOX: + gl_view_box_create_motion_event (view, x, y); + break; + case GL_LABEL_OBJECT_ELLIPSE: + gl_view_ellipse_create_motion_event (view, x, y); + break; + case GL_LABEL_OBJECT_LINE: + gl_view_line_create_motion_event (view, x, y); + break; + case GL_LABEL_OBJECT_IMAGE: + gl_view_image_create_motion_event (view, x, y); + break; + case GL_LABEL_OBJECT_TEXT: + gl_view_text_create_motion_event (view, x, y); + break; + case GL_LABEL_OBJECT_BARCODE: + gl_view_barcode_create_motion_event (view, x, y); + break; + default: + g_message ("Invalid create type."); /*Should not happen!*/ + } + } + break; + + + default: + g_message ("Invalid view mode."); /*Should not happen!*/ + + } + + cairo_destroy (cr); + + /* + * FIXME: we re-establish grabs here if the grab has been lost. We seem to be + * losing grabs when we emit signals that lead to the manipulation of + * the GtkUIManager. Needs more investigation + */ + if (view->grabbed_flag && !gdk_pointer_is_grabbed ()) + { + gdk_pointer_grab (GTK_LAYOUT (view->canvas)->bin_window, + FALSE, + (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK), + NULL, + NULL, + event->time); + } + + return return_value; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Button press event handler. */ +/*---------------------------------------------------------------------------*/ +static gboolean +button_press_event_cb (glView *view, + GdkEventButton *event) +{ + gboolean return_value = FALSE; + cairo_t *cr; + gdouble scale; + gdouble x, y; + glViewObject *view_object; + glViewObjectHandle handle; + + cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window); + + /* + * Translate to label coordinates + */ + scale = view->zoom * view->home_scale; + cairo_scale (cr, scale, scale); + cairo_translate (cr, view->x0, view->y0); + + x = event->x; + y = event->y; + cairo_device_to_user (cr, &x, &y); + + switch (event->button) + { + + case 1: + /* + * Handle event as appropriate for mode + */ + switch (view->mode) + { + case GL_VIEW_MODE_ARROW: + if ((view_object = view_handle_at (view, cr, event->x, event->y, &handle))) + { + view->resize_object = view_object; + view->resize_handle = handle; + view->resize_honor_aspect = event->state & GDK_CONTROL_MASK; + + view->state = GL_VIEW_ARROW_RESIZE; + } + else if ((view_object = view_view_object_at (view, cr, event->x, event->y))) + { + if (event->state & GDK_CONTROL_MASK) + { + if (gl_view_is_object_selected (view, view_object)) + { + /* Un-selecting a selected item */ + gl_view_unselect_object (view, view_object); + } else { + /* Add to current selection */ + gl_view_select_object (view, view_object); + } + } + else + { + if (!gl_view_is_object_selected (view, view_object)) + { + /* remove any selections before adding */ + gl_view_unselect_all (view); + /* Add to current selection */ + gl_view_select_object (view, view_object); + } + } + view->move_last_x = x; + view->move_last_y = y; + + view->state = GL_VIEW_ARROW_MOVE; + } + else + { + if (!(event->state & GDK_CONTROL_MASK)) + { + gl_view_unselect_all (view); + } + + view->select_region_visible = TRUE; + view->select_region.x1 = x; + view->select_region.y1 = y; + view->select_region.x2 = x; + view->select_region.y2 = y; + + view->state = GL_VIEW_ARROW_SELECT_REGION; + } + + + return_value = TRUE; + break; + + case GL_VIEW_MODE_OBJECT_CREATE: + switch (view->create_type) + { + case GL_LABEL_OBJECT_BOX: + gl_view_box_create_button_press_event (view, x, y); + break; + case GL_LABEL_OBJECT_ELLIPSE: + gl_view_ellipse_create_button_press_event (view, x, y); + break; + case GL_LABEL_OBJECT_LINE: + gl_view_line_create_button_press_event (view, x, y); + break; + case GL_LABEL_OBJECT_IMAGE: + gl_view_image_create_button_press_event (view, x, y); + break; + case GL_LABEL_OBJECT_TEXT: + gl_view_text_create_button_press_event (view, x, y); + break; + case GL_LABEL_OBJECT_BARCODE: + gl_view_barcode_create_button_press_event (view, x, y); + break; + default: + g_message ("Invalid create type."); /*Should not happen!*/ + } + view->state = GL_VIEW_CREATE_DRAG; + return_value = TRUE; + break; + + default: + g_message ("Invalid view mode."); /*Should not happen!*/ + } + + view->grabbed_flag = TRUE; + gdk_pointer_grab (GTK_LAYOUT (view->canvas)->bin_window, + FALSE, + (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK), + NULL, + NULL, + event->time); + break; + + case 3: + g_signal_emit (G_OBJECT (view), + signals[CONTEXT_MENU_ACTIVATE], 0, + event->button, event->time); + return_value = TRUE; + break; + + } + + cairo_destroy (cr); + + return return_value; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Button release event handler. */ +/*---------------------------------------------------------------------------*/ +static gboolean +button_release_event_cb (glView *view, + GdkEventButton *event) +{ + gboolean return_value = FALSE; + cairo_t *cr; + gdouble scale; + gdouble x, y; + GdkCursor *cursor; + + cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window); + + /* + * Translate to label coordinates + */ + scale = view->zoom * view->home_scale; + cairo_scale (cr, scale, scale); + cairo_translate (cr, view->x0, view->y0); + + x = event->x; + y = event->y; + cairo_device_to_user (cr, &x, &y); + + switch (event->button) + { + + case 1: + view->grabbed_flag = FALSE; + gdk_pointer_ungrab (event->time); + /* + * Handle event as appropriate for mode + */ + switch (view->mode) + { + case GL_VIEW_MODE_ARROW: + switch (view->state) + { + case GL_VIEW_ARROW_RESIZE: + view->resize_object = NULL; + + view->state = GL_VIEW_IDLE; + break; + + case GL_VIEW_ARROW_SELECT_REGION: +#ifdef CLIP_UPDATES + gl_view_update_region (view, cr, &view->select_region); +#else + gl_view_update (view); +#endif + + view->select_region_visible = FALSE; + view->select_region.x2 = x; + view->select_region.y2 = y; + + gl_view_select_region (view, &view->select_region); + + view->state = GL_VIEW_IDLE; + break; + + default: + view->state = GL_VIEW_IDLE; + break; + + } + + return_value = TRUE; + break; + + + case GL_VIEW_MODE_OBJECT_CREATE: + switch (view->create_type) + { + case GL_LABEL_OBJECT_BOX: + gl_view_box_create_button_release_event (view, x, y); + break; + case GL_LABEL_OBJECT_ELLIPSE: + gl_view_ellipse_create_button_release_event (view, x, y); + break; + case GL_LABEL_OBJECT_LINE: + gl_view_line_create_button_release_event (view, x, y); + break; + case GL_LABEL_OBJECT_IMAGE: + gl_view_image_create_button_release_event (view, x, y); + break; + case GL_LABEL_OBJECT_TEXT: + gl_view_text_create_button_release_event (view, x, y); + break; + case GL_LABEL_OBJECT_BARCODE: + gl_view_barcode_create_button_release_event (view, x, y); + break; + default: + g_message ("Invalid create type."); /*Should not happen!*/ + } + view->mode = GL_VIEW_MODE_ARROW; + view->state = GL_VIEW_IDLE; + cursor = gdk_cursor_new (GDK_LEFT_PTR); + gdk_window_set_cursor (view->canvas->window, cursor); + gdk_cursor_unref (cursor); + break; + + + default: + g_message ("Invalid view mode."); /*Should not happen!*/ + } + + } + + cairo_destroy (cr); + + return return_value; +} + +/*---------------------------------------------------------------------------*/ +/* PRIVATE. Key press event handler. */ +/*---------------------------------------------------------------------------*/ +static gboolean +key_press_event_cb (glView *view, + GdkEventKey *event) +{ + GdkCursor *cursor; + + gl_debug (DEBUG_VIEW, ""); + + if ( (view->mode == GL_VIEW_MODE_ARROW) && + (view->state == GL_VIEW_IDLE) ) + { + switch (event->keyval) { + + case GDK_Left: + case GDK_KP_Left: + gl_view_move_selection (view, -1.0 / (view->zoom), 0.0); + break; + case GDK_Up: + case GDK_KP_Up: + gl_view_move_selection (view, 0.0, -1.0 / (view->zoom)); + break; + case GDK_Right: + case GDK_KP_Right: + gl_view_move_selection (view, 1.0 / (view->zoom), 0.0); + break; + case GDK_Down: + case GDK_KP_Down: + gl_view_move_selection (view, 0.0, 1.0 / (view->zoom)); + break; + case GDK_Delete: + case GDK_KP_Delete: + gl_view_delete_selection (view); + cursor = gdk_cursor_new (GDK_LEFT_PTR); + gdk_window_set_cursor (GTK_WIDGET (view->canvas)->window +, cursor); + gdk_cursor_unref (cursor); + break; + default: + return FALSE; + + } + } + return TRUE; /* We handled this or we were dragging. */ +} + diff --git a/glabels2/src/view.h b/glabels2/src/view.h new file mode 100644 index 00000000..38c3ed80 --- /dev/null +++ b/glabels2/src/view.h @@ -0,0 +1,357 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * view.h: GLabels View module header file + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __VIEW_H__ +#define __VIEW_H__ + +#include + +#include "label-object.h" + +typedef enum { + GL_VIEW_MODE_ARROW, + GL_VIEW_MODE_OBJECT_CREATE +} glViewMode; + +typedef enum { + GL_VIEW_IDLE = 0, + GL_VIEW_ARROW_SELECT_REGION, + GL_VIEW_ARROW_MOVE, + GL_VIEW_ARROW_RESIZE, + GL_VIEW_CREATE_DRAG, +} glViewState; + +#define GL_TYPE_VIEW (gl_view_get_type ()) +#define GL_VIEW(obj) (GTK_CHECK_CAST((obj), GL_TYPE_VIEW, glView )) +#define GL_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GL_TYPE_VIEW, glViewClass)) +#define GL_IS_VIEW(obj) (GTK_CHECK_TYPE ((obj), GL_TYPE_VIEW)) +#define GL_IS_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GL_TYPE_VIEW)) + +typedef struct _glView glView; +typedef struct _glViewClass glViewClass; + +#include "view-object.h" +#include "color.h" + +struct _glView { + GtkVBox parent_widget; + + glLabel *label; + + GtkWidget *canvas; + gdouble zoom; + gboolean zoom_to_fit_flag; + gdouble home_scale; + gdouble x0, y0; + gdouble w, h; + + gboolean update_scheduled_flag; + gboolean grid_visible; + gdouble grid_spacing; + + gboolean markup_visible; + + glViewMode mode; + glLabelObjectType create_type; + glViewState state; + gboolean grabbed_flag; + + /* GL_VIEW_ARROW_MOVE state */ + gdouble move_last_x; + gdouble move_last_y; + + /* GL_VIEW_ARROW_SELECT_REGION state */ + gboolean select_region_visible; + glLabelRegion select_region; + + /* GL_VIEW_ARROW_RESIZE state */ + glViewObject *resize_object; + glViewObjectHandle resize_handle; + gboolean resize_honor_aspect; + + /* GL_VIEW_CREATE_DRAG state */ + glLabelObject *create_object; + gdouble create_x0; + gdouble create_y0; + + GList *object_list; /* glViewObjects */ + GList *selected_object_list; /* glViewObjects */ + + /* Clipboard selection stuff */ + gint have_selection; + glLabel *selection_data; + GtkWidget *invisible; + + /* Default object text properties */ + gchar *default_font_family; + gdouble default_font_size; + PangoWeight default_font_weight; + gboolean default_font_italic_flag; + guint default_text_color; + PangoAlignment default_text_alignment; + gdouble default_text_line_spacing; + + /* Default object line properties */ + gdouble default_line_width; + guint default_line_color; + + /* Default object fill properties */ + guint default_fill_color; + +}; + +struct _glViewClass { + GtkVBoxClass parent_class; + + /* Selection changed signal */ + void (*selection_changed) (glView *view, + gpointer user_data); + + /* Signal to launch a context menu */ + void (*context_menu_activate) (glView *view, + gint button, + guint32 activate_time, + gpointer user_data); + + /* Signals to support a status bar */ + void (*zoom_changed) (glView *view, + gdouble zoom, + gpointer user_data); + void (*pointer_moved) (glView *view, + gdouble x, + gdouble y, + gpointer user_data); + void (*pointer_exit) (glView *view, + gpointer user_data); + void (*mode_changed) (glView *view, + gpointer user_data); +}; + +G_BEGIN_DECLS + +GType gl_view_get_type (void) G_GNUC_CONST; + +GtkWidget *gl_view_new (glLabel *label); + + +void gl_view_update (glView *view); + +void gl_view_update_region (glView *view, + cairo_t *cr, + glLabelRegion *region); + +void gl_view_show_grid (glView *view); + +void gl_view_hide_grid (glView *view); + +void gl_view_set_grid_spacing (glView *view, + gdouble spacing); + +void gl_view_show_markup (glView *view); + +void gl_view_hide_markup (glView *view); + +void gl_view_arrow_mode (glView *view); + +void gl_view_object_create_mode (glView *view, + glLabelObjectType type); + + +void gl_view_select_object (glView *view, + glViewObject *view_object); + +void gl_view_unselect_object (glView *view, + glViewObject *view_object); + +void gl_view_select_all (glView *view); + +void gl_view_unselect_all (glView *view); + +void gl_view_select_region (glView *view, + glLabelRegion *region); + +gboolean gl_view_is_object_selected (glView *view, + glViewObject *view_object); + +gboolean gl_view_is_selection_empty (glView *view); + +gboolean gl_view_is_selection_atomic (glView *view); + +void gl_view_delete_selection (glView *view); + +GtkWidget *gl_view_get_editor (glView *view); + +void gl_view_raise_selection (glView *view); + +void gl_view_lower_selection (glView *view); + +void gl_view_rotate_selection (glView *view, + gdouble theta_degs); + +void gl_view_rotate_selection_left (glView *view); + +void gl_view_rotate_selection_right (glView *view); + +void gl_view_flip_selection_horiz (glView *view); + +void gl_view_flip_selection_vert (glView *view); + +void gl_view_align_selection_left (glView *view); + +void gl_view_align_selection_right (glView *view); + +void gl_view_align_selection_hcenter (glView *view); + +void gl_view_align_selection_top (glView *view); + +void gl_view_align_selection_bottom (glView *view); + +void gl_view_align_selection_vcenter (glView *view); + +void gl_view_center_selection_horiz (glView *view); + +void gl_view_center_selection_vert (glView *view); + +void gl_view_move_selection (glView *view, + gdouble dx, + gdouble dy); + +gboolean gl_view_can_selection_text (glView *view); + +void gl_view_set_selection_font_family (glView *view, + const gchar *font_family); + +void gl_view_set_selection_font_size (glView *view, + gdouble font_size); + +void gl_view_set_selection_font_weight (glView *view, + PangoWeight font_weight); + +void gl_view_set_selection_text_line_spacing (glView *view, + gdouble text_line_spacing); + +void gl_view_set_selection_font_italic_flag (glView *view, + gboolean font_italic_flag); + +void gl_view_set_selection_text_alignment (glView *view, + PangoAlignment text_alignment); + +void gl_view_set_selection_text_color (glView *view, + glColorNode *text_color_node); + +gboolean gl_view_can_selection_fill (glView *view); + +void gl_view_set_selection_fill_color (glView *view, + glColorNode *fill_color); + +gboolean gl_view_can_selection_line_color (glView *view); + +void gl_view_set_selection_line_color (glView *view, + glColorNode *line_color_node); + +gboolean gl_view_can_selection_line_width (glView *view); + +void gl_view_set_selection_line_width (glView *view, + gdouble line_width); + + +void gl_view_cut (glView *view); + +void gl_view_copy (glView *view); + +void gl_view_paste (glView *view); + + +void gl_view_zoom_in (glView *view); + +void gl_view_zoom_out (glView *view); + +void gl_view_zoom_to_fit (glView *view); + +void gl_view_set_zoom (glView *view, + gdouble zoom); + +gdouble gl_view_get_zoom (glView *view); + +gboolean gl_view_is_zoom_max (glView *view); + +gboolean gl_view_is_zoom_min (glView *view); + + +void gl_view_set_default_font_family (glView *view, + const gchar *font_family); + +void gl_view_set_default_font_size (glView *view, + gdouble font_size); + +void gl_view_set_default_font_weight (glView *view, + PangoWeight font_weight); + +void gl_view_set_default_font_italic_flag (glView *view, + gboolean font_italic_flag); + +void gl_view_set_default_text_color (glView *view, + guint text_color); + +void gl_view_set_default_text_alignment (glView *view, + PangoAlignment text_alignment); + +void gl_view_set_default_line_width (glView *view, + gdouble line_width); + +void gl_view_set_default_line_color (glView *view, + guint line_color); + +void gl_view_set_default_fill_color (glView *view, + guint fill_color); +void gl_view_set_default_text_line_spacing (glView *view, + gdouble text_line_spacing); + + + +gchar *gl_view_get_default_font_family (glView *view); + +gdouble gl_view_get_default_font_size (glView *view); + +PangoWeight gl_view_get_default_font_weight (glView *view); + +gboolean gl_view_get_default_font_italic_flag (glView *view); + +guint gl_view_get_default_text_color (glView *view); + +PangoAlignment gl_view_get_default_text_alignment (glView *view); + +gdouble gl_view_get_default_text_line_spacing (glView *view); + +gdouble gl_view_get_default_line_width (glView *view); + +guint gl_view_get_default_line_color (glView *view); + +guint gl_view_get_default_fill_color (glView *view); + + + +G_END_DECLS + +#endif diff --git a/glabels2/src/warning-handler.c b/glabels2/src/warning-handler.c new file mode 100644 index 00000000..caa8b1f9 --- /dev/null +++ b/glabels2/src/warning-handler.c @@ -0,0 +1,81 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * warning-handler.c: non-critical error handler + * + * Copyright (C) 2005 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include + +#include "warning-handler.h" + +#include +#include +#include +#include +#include + +static void warning_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data); + + +/***************************************************************************/ +/* Initialize error handler. */ +/***************************************************************************/ +void +gl_warning_handler_init (void) +{ + g_log_set_handler ("LibGlabels", + G_LOG_LEVEL_WARNING, + warning_handler, + "libglabels"); + + g_log_set_handler (G_LOG_DOMAIN, + G_LOG_LEVEL_WARNING, + warning_handler, + "glabels"); +} + +/*-------------------------------------------------------------------------*/ +/* PRIVATE. Actual error handler. */ +/*-------------------------------------------------------------------------*/ +static void +warning_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data) +{ + GtkWidget *dialog; + + dialog = gtk_message_dialog_new (NULL, + GTK_DIALOG_MODAL, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_CLOSE, + _("gLabels Error!")); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + message); + + gtk_dialog_run (GTK_DIALOG (dialog)); + + gtk_widget_destroy (GTK_WIDGET (dialog)); +} + diff --git a/glabels2/src/warning-handler.h b/glabels2/src/warning-handler.h new file mode 100644 index 00000000..911cc16a --- /dev/null +++ b/glabels2/src/warning-handler.h @@ -0,0 +1,36 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * warning-handler.h: non-critical error handler header file + * + * Copyright (C) 2005 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __WARNING_HANDLER_H__ +#define __WARNING_HANDLER_H__ + +#include + +G_BEGIN_DECLS + +void gl_warning_handler_init (void); + +G_END_DECLS + +#endif diff --git a/glabels2/src/wdgt-chain-button.c b/glabels2/src/wdgt-chain-button.c new file mode 100644 index 00000000..7491311f --- /dev/null +++ b/glabels2/src/wdgt-chain-button.c @@ -0,0 +1,324 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* wdgt-chain-button.c + * Modified version of gimpchainbutton.c for gLabels: + * + * LIBGIMP - The GIMP Library + * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball + * + * gimpchainbutton.c + * Copyright (C) 1999-2000 Sven Neumann + * + * Modified or gLabels by Jim Evins + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "wdgt-chain-button.h" + +#include +#include +#include + +#include "stock.h" + + +enum +{ + TOGGLED, + LAST_SIGNAL +}; + + +static void gl_wdgt_chain_button_clicked_callback (GtkWidget *widget, + glWdgtChainButton *button); +static gboolean gl_wdgt_chain_button_draw_lines (GtkWidget *widget, + GdkEventExpose *eevent, + glWdgtChainButton *button); + + +static const gchar *gl_wdgt_chain_stock_items[] = +{ + GL_STOCK_HCHAIN, + GL_STOCK_HCHAIN_BROKEN, + GL_STOCK_VCHAIN, + GL_STOCK_VCHAIN_BROKEN +}; + + +static guint gl_wdgt_chain_button_signals[LAST_SIGNAL] = { 0 }; + + + +G_DEFINE_TYPE (glWdgtChainButton, gl_wdgt_chain_button, GTK_TYPE_TABLE); + + +static void +gl_wdgt_chain_button_class_init (glWdgtChainButtonClass *class) +{ + gl_wdgt_chain_button_parent_class = g_type_class_peek_parent (class); + + gl_wdgt_chain_button_signals[TOGGLED] = + g_signal_new ("toggled", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (glWdgtChainButtonClass, toggled), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + class->toggled = NULL; +} + +static void +gl_wdgt_chain_button_init (glWdgtChainButton *button) +{ + button->position = GL_WDGT_CHAIN_TOP; + button->active = FALSE; + + button->line1 = gtk_drawing_area_new (); + button->line2 = gtk_drawing_area_new (); + button->image = gtk_image_new (); + + button->button = gtk_button_new (); + + gtk_button_set_relief (GTK_BUTTON (button->button), GTK_RELIEF_NONE); + gtk_container_add (GTK_CONTAINER (button->button), button->image); + gtk_widget_show (button->image); + + g_signal_connect (button->button, "clicked", + G_CALLBACK (gl_wdgt_chain_button_clicked_callback), + button); + g_signal_connect (button->line1, "expose_event", + G_CALLBACK (gl_wdgt_chain_button_draw_lines), + button); + g_signal_connect (button->line2, "expose_event", + G_CALLBACK (gl_wdgt_chain_button_draw_lines), + button); +} + + +/** + * gl_wdgt_chain_button_new: + * @position: The position you are going to use for the button + * with respect to the widgets you want to chain. + * + * Creates a new #glWdgtChainButton widget. + * + * This returns a button showing either a broken or a linked chain and + * small clamps attached to both sides that visually group the two widgets + * you want to connect. This widget looks best when attached + * to a table taking up two columns (or rows respectively) next + * to the widgets that it is supposed to connect. It may work + * for more than two widgets, but the look is optimized for two. + * + * Returns: Pointer to the new #glWdgtChainButton, which is inactive + * by default. Use gl_wdgt_chain_button_set_active() to + * change its state. + */ +GtkWidget * +gl_wdgt_chain_button_new (glWdgtChainPosition position) +{ + glWdgtChainButton *button; + + button = g_object_new (GL_WDGT_TYPE_CHAIN_BUTTON, NULL); + + button->position = position; + + gtk_image_set_from_stock + (GTK_IMAGE (button->image), + gl_wdgt_chain_stock_items[((position & GL_WDGT_CHAIN_LEFT) << 1) + ! button->active], + GTK_ICON_SIZE_BUTTON); + + if (position & GL_WDGT_CHAIN_LEFT) /* are we a vertical chainbutton? */ + { + gtk_table_resize (GTK_TABLE (button), 3, 1); + gtk_table_attach (GTK_TABLE (button), button->button, 0, 1, 1, 2, + GTK_SHRINK, GTK_SHRINK, 0, 0); + gtk_table_attach_defaults (GTK_TABLE (button), + button->line1, 0, 1, 0, 1); + gtk_table_attach_defaults (GTK_TABLE (button), + button->line2, 0, 1, 2, 3); + } + else + { + gtk_table_resize (GTK_TABLE (button), 1, 3); + gtk_table_attach (GTK_TABLE (button), button->button, 1, 2, 0, 1, + GTK_SHRINK, GTK_SHRINK, 0, 0); + gtk_table_attach_defaults (GTK_TABLE (button), + button->line1, 0, 1, 0, 1); + gtk_table_attach_defaults (GTK_TABLE (button), + button->line2, 2, 3, 0, 1); + } + + gtk_widget_show (button->button); + gtk_widget_show (button->line1); + gtk_widget_show (button->line2); + + return GTK_WIDGET (button); +} + +/** + * gl_wdgt_chain_button_set_active: + * @button: Pointer to a #glWdgtChainButton. + * @active: The new state. + * + * Sets the state of the #glWdgtChainButton to be either locked (%TRUE) or + * unlocked (%FALSE) and changes the showed pixmap to reflect the new state. + */ +void +gl_wdgt_chain_button_set_active (glWdgtChainButton *button, + gboolean active) +{ + g_return_if_fail (GL_WDGT_IS_CHAIN_BUTTON (button)); + + if (button->active != active) + { + guint num; + + button->active = active ? TRUE : FALSE; + + num = ((button->position & GL_WDGT_CHAIN_LEFT) << 1) + (active ? 0 : 1); + + gtk_image_set_from_stock (GTK_IMAGE (button->image), + gl_wdgt_chain_stock_items[num], + GTK_ICON_SIZE_BUTTON); + } +} + +/** + * gl_wdgt_chain_button_get_active + * @button: Pointer to a #glWdgtChainButton. + * + * Checks the state of the #glWdgtChainButton. + * + * Returns: %TRUE if the #glWdgtChainButton is active (locked). + */ +gboolean +gl_wdgt_chain_button_get_active (glWdgtChainButton *button) +{ + g_return_val_if_fail (GL_WDGT_IS_CHAIN_BUTTON (button), FALSE); + + return button->active; +} + +static void +gl_wdgt_chain_button_clicked_callback (GtkWidget *widget, + glWdgtChainButton *button) +{ + g_return_if_fail (GL_WDGT_IS_CHAIN_BUTTON (button)); + + gl_wdgt_chain_button_set_active (button, ! button->active); + + g_signal_emit (button, gl_wdgt_chain_button_signals[TOGGLED], 0); +} + +static gboolean +gl_wdgt_chain_button_draw_lines (GtkWidget *widget, + GdkEventExpose *eevent, + glWdgtChainButton *button) +{ + GdkPoint points[3]; + GdkPoint buf; + GtkShadowType shadow; + glWdgtChainPosition position; + gint which_line; + +#define SHORT_LINE 4 + /* don't set this too high, there's no check against drawing outside + the widgets bounds yet (and probably never will be) */ + + g_return_val_if_fail (GL_WDGT_IS_CHAIN_BUTTON (button), FALSE); + + points[0].x = widget->allocation.width / 2; + points[0].y = widget->allocation.height / 2; + + which_line = (widget == button->line1) ? 1 : -1; + + position = button->position; + + if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) + switch (position) + { + case GL_WDGT_CHAIN_LEFT: + position = GL_WDGT_CHAIN_RIGHT; + break; + case GL_WDGT_CHAIN_RIGHT: + position = GL_WDGT_CHAIN_LEFT; + break; + default: + break; + } + + switch (position) + { + case GL_WDGT_CHAIN_LEFT: + points[0].x += SHORT_LINE; + points[1].x = points[0].x - SHORT_LINE; + points[1].y = points[0].y; + points[2].x = points[1].x; + points[2].y = (which_line == 1) ? widget->allocation.height - 1 : 0; + shadow = GTK_SHADOW_ETCHED_IN; + break; + case GL_WDGT_CHAIN_RIGHT: + points[0].x -= SHORT_LINE; + points[1].x = points[0].x + SHORT_LINE; + points[1].y = points[0].y; + points[2].x = points[1].x; + points[2].y = (which_line == 1) ? widget->allocation.height - 1 : 0; + shadow = GTK_SHADOW_ETCHED_OUT; + break; + case GL_WDGT_CHAIN_TOP: + points[0].y += SHORT_LINE; + points[1].x = points[0].x; + points[1].y = points[0].y - SHORT_LINE; + points[2].x = (which_line == 1) ? widget->allocation.width - 1 : 0; + points[2].y = points[1].y; + shadow = GTK_SHADOW_ETCHED_OUT; + break; + case GL_WDGT_CHAIN_BOTTOM: + points[0].y -= SHORT_LINE; + points[1].x = points[0].x; + points[1].y = points[0].y + SHORT_LINE; + points[2].x = (which_line == 1) ? widget->allocation.width - 1 : 0; + points[2].y = points[1].y; + shadow = GTK_SHADOW_ETCHED_IN; + break; + default: + return FALSE; + } + + if ( ((shadow == GTK_SHADOW_ETCHED_OUT) && (which_line == -1)) || + ((shadow == GTK_SHADOW_ETCHED_IN) && (which_line == 1)) ) + { + buf = points[0]; + points[0] = points[2]; + points[2] = buf; + } + + gtk_paint_polygon (widget->style, + widget->window, + GTK_STATE_NORMAL, + shadow, + &eevent->area, + widget, + "chainbutton", + points, + 3, + FALSE); + + return TRUE; +} diff --git a/glabels2/src/wdgt-chain-button.h b/glabels2/src/wdgt-chain-button.h new file mode 100644 index 00000000..382af2a4 --- /dev/null +++ b/glabels2/src/wdgt-chain-button.h @@ -0,0 +1,98 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* wdgt-chain-button.h + * Modified version of gimpchainbutton.h for gLabels: + * + * LIBGIMP - The GIMP Library + * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball + * + * gimpchainbutton.h + * Copyright (C) 1999-2000 Sven Neumann + * + * Modified or gLabels by Jim Evins + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * This implements a widget derived from GtkTable that visualizes + * it's state with two different pixmaps showing a closed and a + * broken chain. It's intented to be used with the GimpSizeEntry + * widget. The usage is quite similar to the one the GtkToggleButton + * provides. + */ + +#ifndef __WDGT_CHAIN_BUTTON_H__ +#define __WDGT_CHAIN_BUTTON_H__ + +#include + +G_BEGIN_DECLS + + +typedef enum +{ + GL_WDGT_CHAIN_TOP, + GL_WDGT_CHAIN_LEFT, + GL_WDGT_CHAIN_BOTTOM, + GL_WDGT_CHAIN_RIGHT +} glWdgtChainPosition; + + +#define GL_WDGT_TYPE_CHAIN_BUTTON (gl_wdgt_chain_button_get_type ()) +#define GL_WDGT_CHAIN_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GL_WDGT_TYPE_CHAIN_BUTTON, glWdgtChainButton)) +#define GL_WDGT_CHAIN_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GL_WDGT_TYPE_CHAIN_BUTTON, glWdgtChainButtonClass)) +#define GL_WDGT_IS_CHAIN_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GL_WDGT_TYPE_CHAIN_BUTTON)) +#define GL_WDGT_IS_CHAIN_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GL_WDGT_TYPE_CHAIN_BUTTON)) +#define GL_WDGT_CHAIN_BUTTON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GL_WDGT_TYPE_CHAIN_BUTTON, glWdgtChainButtonClass)) + + +typedef struct _glWdgtChainButton glWdgtChainButton; +typedef struct _glWdgtChainButtonClass glWdgtChainButtonClass; + +struct _glWdgtChainButton +{ + GtkTable parent_instance; + + glWdgtChainPosition position; + gboolean active; + + GtkWidget *button; + GtkWidget *line1; + GtkWidget *line2; + GtkWidget *image; +}; + +struct _glWdgtChainButtonClass +{ + GtkTableClass parent_class; + + void (* toggled) (glWdgtChainButton *button); +}; + + +GType gl_wdgt_chain_button_get_type (void) G_GNUC_CONST; + +GtkWidget * gl_wdgt_chain_button_new (glWdgtChainPosition position); + +void gl_wdgt_chain_button_set_active (glWdgtChainButton *button, + gboolean active); +gboolean gl_wdgt_chain_button_get_active (glWdgtChainButton *button); + + +G_END_DECLS + +#endif /* __WDGT_CHAIN_BUTTON_H__ */ diff --git a/glabels2/src/wdgt-media-select.c b/glabels2/src/wdgt-media-select.c new file mode 100644 index 00000000..edb469aa --- /dev/null +++ b/glabels2/src/wdgt-media-select.c @@ -0,0 +1,878 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * wdgt_media_select.c: media selection widget module + * + * Copyright (C) 2001-2006 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "wdgt-media-select.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mini-preview-pixbuf-cache.h" +#include "prefs.h" +#include "util.h" +#include "color.h" +#include "marshal.h" +#include + +#include "debug.h" + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + +enum { + NAME_COLUMN, + PREVIEW_COLUMN, + PREVIEW_COLUMN_STOCK, + PREVIEW_COLUMN_STOCK_SIZE, + DESCRIPTION_COLUMN, + N_COLUMNS +}; + +struct _glWdgtMediaSelectPrivate { + + GtkWidget *notebook; + guint current_page_num; + + gint recent_page_num; + GtkWidget *recent_tab_vbox; + GtkWidget *recent_treeview; + GtkListStore *recent_store; + + gint search_all_page_num; + GtkWidget *search_all_tab_vbox; + GtkWidget *brand_combo; + GtkWidget *page_size_combo; + GtkWidget *category_combo; + GtkWidget *search_all_treeview; + GtkListStore *search_all_store; + + /* Prevent recursion */ + gboolean stop_signals; +}; + +enum { + CHANGED, + LAST_SIGNAL +}; + +typedef void (*glWdgtMediaSelectSignal) (GObject * object, gpointer data); + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +static gint wdgt_media_select_signals[LAST_SIGNAL] = { 0 }; + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void gl_wdgt_media_select_finalize (GObject *object); + +static void gl_wdgt_media_select_construct (glWdgtMediaSelect *media_select); + +static void filter_changed_cb (GtkComboBox *combo, + gpointer user_data); +static void selection_changed_cb (GtkTreeSelection *selection, + gpointer user_data); +static void page_changed_cb (GtkNotebook *notebook, + GtkNotebookPage *page, + guint page_num, + gpointer user_data); + +static gchar *get_layout_desc (const lglTemplate *template); +static gchar *get_label_size_desc (const lglTemplate *template); +static void load_recent_list (GtkListStore *store, + GtkTreeSelection *selection, + GSList *list); +static void load_search_all_list (GtkListStore *store, + GtkTreeSelection *selection, + GList *list); + +/****************************************************************************/ +/* Boilerplate Object stuff. */ +/****************************************************************************/ +G_DEFINE_TYPE (glWdgtMediaSelect, gl_wdgt_media_select, GTK_TYPE_VBOX); + + +static void +gl_wdgt_media_select_class_init (glWdgtMediaSelectClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_debug (DEBUG_MEDIA_SELECT, "START"); + + gl_wdgt_media_select_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_wdgt_media_select_finalize; + + wdgt_media_select_signals[CHANGED] = + g_signal_new ("changed", + G_OBJECT_CLASS_TYPE(object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glWdgtMediaSelectClass, changed), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + gl_debug (DEBUG_MEDIA_SELECT, "END"); +} + +static void +gl_wdgt_media_select_init (glWdgtMediaSelect *media_select) +{ + gl_debug (DEBUG_MEDIA_SELECT, "START"); + + media_select->priv = g_new0 (glWdgtMediaSelectPrivate, 1); + + gl_debug (DEBUG_MEDIA_SELECT, "END"); +} + +static void +gl_wdgt_media_select_finalize (GObject *object) +{ + glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (object); + + gl_debug (DEBUG_MEDIA_SELECT, "START"); + + g_return_if_fail (object != NULL); + g_return_if_fail (GL_IS_WDGT_MEDIA_SELECT (object)); + + g_object_unref (media_select->priv->recent_store); + g_object_unref (media_select->priv->search_all_store); + g_free (media_select->priv); + + G_OBJECT_CLASS (gl_wdgt_media_select_parent_class)->finalize (object); + + gl_debug (DEBUG_MEDIA_SELECT, "END"); +} + +GtkWidget * +gl_wdgt_media_select_new (void) +{ + glWdgtMediaSelect *media_select; + + gl_debug (DEBUG_MEDIA_SELECT, "START"); + + media_select = g_object_new (gl_wdgt_media_select_get_type (), NULL); + + gl_wdgt_media_select_construct (media_select); + + gl_debug (DEBUG_MEDIA_SELECT, "END"); + + return GTK_WIDGET (media_select); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Construct composite widget. */ +/*--------------------------------------------------------------------------*/ +static void +gl_wdgt_media_select_construct (glWdgtMediaSelect *media_select) +{ + GladeXML *gui; + GtkWidget *hbox; + GList *brands = NULL; + GList *page_sizes = NULL; + GList *categories = NULL; + GList *search_all_names = NULL; + const gchar *page_size_id; + gchar *page_size_name; + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + GtkTreeSelection *recent_selection; + GtkTreeSelection *search_all_selection; + + gl_debug (DEBUG_MEDIA_SELECT, "START"); + + g_return_if_fail (GL_IS_WDGT_MEDIA_SELECT (media_select)); + g_return_if_fail (media_select->priv != NULL); + + gui = glade_xml_new (GLABELS_GLADE_DIR "wdgt-media-select.glade", + "wdgt_media_select_hbox", NULL); + + if (!gui) { + g_critical ("Could not open wdgt-media-select.glade. gLabels may not be installed correctly!"); + return; + } + + hbox = glade_xml_get_widget (gui, "wdgt_media_select_hbox"); + gtk_container_add (GTK_CONTAINER (media_select), hbox); + + media_select->priv->notebook = + glade_xml_get_widget (gui, "notebook"); + + media_select->priv->recent_tab_vbox = + glade_xml_get_widget (gui, "recent_tab_vbox"); + media_select->priv->recent_treeview = + glade_xml_get_widget (gui, "recent_treeview"); + + media_select->priv->search_all_tab_vbox = + glade_xml_get_widget (gui, "search_all_tab_vbox"); + media_select->priv->brand_combo = + glade_xml_get_widget (gui, "brand_combo"); + media_select->priv->page_size_combo = + glade_xml_get_widget (gui, "page_size_combo"); + media_select->priv->category_combo = + glade_xml_get_widget (gui, "category_combo"); + media_select->priv->search_all_treeview = + glade_xml_get_widget (gui, "search_all_treeview"); + + g_object_unref (gui); + + media_select->priv->recent_page_num = + gtk_notebook_page_num (GTK_NOTEBOOK (media_select->priv->notebook), + media_select->priv->recent_tab_vbox); + media_select->priv->search_all_page_num = + gtk_notebook_page_num (GTK_NOTEBOOK (media_select->priv->notebook), + media_select->priv->search_all_tab_vbox); + + /* Recent templates treeview */ + media_select->priv->recent_store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING); + gtk_tree_view_set_model (GTK_TREE_VIEW (media_select->priv->recent_treeview), + GTK_TREE_MODEL (media_select->priv->recent_store)); + renderer = gtk_cell_renderer_pixbuf_new (); + column = gtk_tree_view_column_new_with_attributes ("", renderer, + "pixbuf", PREVIEW_COLUMN, + "stock-id", PREVIEW_COLUMN_STOCK, + "stock-size", PREVIEW_COLUMN_STOCK_SIZE, + NULL); + gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->recent_treeview), column); + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("", renderer, + "markup", DESCRIPTION_COLUMN, + NULL); + gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->recent_treeview), column); + recent_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->recent_treeview)); + load_recent_list (media_select->priv->recent_store, recent_selection, gl_prefs->recent_templates); + + page_size_id = gl_prefs_get_page_size (); + page_size_name = lgl_db_lookup_paper_name_from_id (page_size_id); + + /* Brand selection control */ + gl_util_combo_box_add_text_model (GTK_COMBO_BOX (media_select->priv->brand_combo)); + brands = lgl_db_get_brand_list (NULL, NULL); + brands = g_list_prepend (brands, g_strdup (_("Any"))); + gl_util_combo_box_set_strings (GTK_COMBO_BOX (media_select->priv->brand_combo), brands); + lgl_db_free_brand_list (brands); + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->brand_combo), + _("Any")); + + /* Page size selection control */ + gl_util_combo_box_add_text_model (GTK_COMBO_BOX (media_select->priv->page_size_combo)); + page_sizes = lgl_db_get_paper_name_list (); + page_sizes = g_list_prepend (page_sizes, g_strdup (_("Any"))); + gl_util_combo_box_set_strings (GTK_COMBO_BOX (media_select->priv->page_size_combo), page_sizes); + lgl_db_free_paper_name_list (page_sizes); + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo), + page_size_name); + + /* Category selection control */ + gl_util_combo_box_add_text_model (GTK_COMBO_BOX (media_select->priv->category_combo)); + categories = lgl_db_get_category_name_list (); + categories = g_list_prepend (categories, g_strdup (_("Any"))); + gl_util_combo_box_set_strings (GTK_COMBO_BOX (media_select->priv->category_combo), categories); + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->category_combo), + _("Any")); + lgl_db_free_category_name_list (categories); + + /* Search all treeview */ + media_select->priv->search_all_store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING); + gtk_tree_view_set_model (GTK_TREE_VIEW (media_select->priv->search_all_treeview), + GTK_TREE_MODEL (media_select->priv->search_all_store)); + renderer = gtk_cell_renderer_pixbuf_new (); + column = gtk_tree_view_column_new_with_attributes ("", renderer, + "pixbuf", PREVIEW_COLUMN, + "stock-id", PREVIEW_COLUMN_STOCK, + "stock-size", PREVIEW_COLUMN_STOCK_SIZE, + NULL); + gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->search_all_treeview), column); + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("", renderer, + "markup", DESCRIPTION_COLUMN, + NULL); + gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->search_all_treeview), column); + search_all_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->search_all_treeview)); + search_all_names = lgl_db_get_template_name_list_all (NULL, page_size_id, NULL); + load_search_all_list (media_select->priv->search_all_store, search_all_selection, search_all_names); + lgl_db_free_template_name_list (search_all_names); + + /* Connect signals to controls */ + g_signal_connect (G_OBJECT (media_select->priv->brand_combo), "changed", + G_CALLBACK (filter_changed_cb), + media_select); + g_signal_connect (G_OBJECT (media_select->priv->page_size_combo), "changed", + G_CALLBACK (filter_changed_cb), + media_select); + g_signal_connect (G_OBJECT (media_select->priv->category_combo), "changed", + G_CALLBACK (filter_changed_cb), + media_select); + g_signal_connect (G_OBJECT (recent_selection), "changed", + G_CALLBACK (selection_changed_cb), + media_select); + g_signal_connect (G_OBJECT (search_all_selection), "changed", + G_CALLBACK (selection_changed_cb), + media_select); + g_signal_connect (G_OBJECT (media_select->priv->notebook), "switch-page", + G_CALLBACK (page_changed_cb), + media_select); + + g_free (page_size_name); + + gtk_widget_show_all (GTK_WIDGET (media_select)); + if ( gl_prefs->recent_templates ) + { + gtk_notebook_set_current_page (GTK_NOTEBOOK (media_select->priv->notebook), + media_select->priv->recent_page_num); + } + else + { + gtk_notebook_set_current_page (GTK_NOTEBOOK (media_select->priv->notebook), + media_select->priv->search_all_page_num); + } + + gl_debug (DEBUG_MEDIA_SELECT, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. modify widget due to change in selection */ +/*--------------------------------------------------------------------------*/ +static void +filter_changed_cb (GtkComboBox *combo, + gpointer user_data) +{ + glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data); + gchar *brand; + gchar *page_size_name, *page_size_id; + gchar *category_name, *category_id; + GList *search_all_names; + GtkTreeSelection *selection; + + gl_debug (DEBUG_MEDIA_SELECT, "START"); + + + media_select->priv->stop_signals = TRUE; + + /* Update template selections for new filter settings */ + brand = gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->brand_combo)); + page_size_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo)); + category_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->category_combo)); + if ( brand && strlen(brand) && + page_size_name && strlen(page_size_name) && + category_name && strlen(category_name) ) + { + gl_debug (DEBUG_MEDIA_SELECT, "brand = \"%s\"", brand); + gl_debug (DEBUG_MEDIA_SELECT, "page_size_name = \"%s\"", page_size_name); + gl_debug (DEBUG_MEDIA_SELECT, "category_name = \"%s\"", category_name); + if (!g_utf8_collate (brand, _("Any"))) + { + g_free (brand); + brand = NULL; + } + page_size_id = lgl_db_lookup_paper_id_from_name (page_size_name); + category_id = lgl_db_lookup_category_id_from_name (category_name); + gl_debug (DEBUG_MEDIA_SELECT, "page_size_id = \"%s\"", page_size_id); + gl_debug (DEBUG_MEDIA_SELECT, "category_id = \"%s\"", category_id); + search_all_names = lgl_db_get_template_name_list_all (brand, page_size_id, category_id); + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->search_all_treeview)); + load_search_all_list (media_select->priv->search_all_store, selection, search_all_names); + lgl_db_free_template_name_list (search_all_names); + g_free (page_size_id); + g_free (category_id); + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (user_data), + wdgt_media_select_signals[CHANGED], 0); + } + g_free (brand); + g_free (page_size_name); + g_free (category_name); + + + media_select->priv->stop_signals = FALSE; + + gl_debug (DEBUG_MEDIA_SELECT, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. modify widget due to change in selection */ +/*--------------------------------------------------------------------------*/ +static void +selection_changed_cb (GtkTreeSelection *selection, + gpointer user_data) +{ + glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data); + + if (media_select->priv->stop_signals) return; + + gl_debug (DEBUG_MEDIA_SELECT, "START"); + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (user_data), + wdgt_media_select_signals[CHANGED], 0); + + gl_debug (DEBUG_MEDIA_SELECT, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. modify widget due to change in selection */ +/*--------------------------------------------------------------------------*/ +static void +page_changed_cb (GtkNotebook *notebook, + GtkNotebookPage *page, + guint page_num, + gpointer user_data) +{ + glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data); + + if (media_select->priv->stop_signals) return; + + gl_debug (DEBUG_MEDIA_SELECT, "START"); + + /* + * Store new current page, because this signal is emitted before the actual page change. + */ + media_select->priv->current_page_num = page_num; + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (user_data), + wdgt_media_select_signals[CHANGED], 0); + + gl_debug (DEBUG_MEDIA_SELECT, "END"); +} + +/****************************************************************************/ +/* query selected label template name. */ +/****************************************************************************/ +gchar * +gl_wdgt_media_select_get_name (glWdgtMediaSelect *media_select) +{ + gint page_num; + GtkTreeSelection *selection; + GtkTreeIter iter; + GtkTreeModel *model; + gchar *name; + + gl_debug (DEBUG_MEDIA_SELECT, "START"); + + page_num = media_select->priv->current_page_num; + if (page_num == media_select->priv->recent_page_num) + { + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->recent_treeview)); + } + else if (page_num == media_select->priv->search_all_page_num) + { + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->search_all_treeview)); + } + else + { + g_print ("notebook page = %d\n", page_num); + g_assert_not_reached (); + } + + if (gtk_tree_selection_get_mode (selection) == GTK_SELECTION_NONE) + { + name = NULL; + } + else + { + gtk_tree_selection_get_selected (selection, &model, &iter); + gtk_tree_model_get (model, &iter, NAME_COLUMN, &name, -1); + } + + gl_debug (DEBUG_MEDIA_SELECT, "END"); + return name; +} + +/****************************************************************************/ +/* set selected label template name. */ +/****************************************************************************/ +void +gl_wdgt_media_select_set_name (glWdgtMediaSelect *media_select, + gchar *name) +{ + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreePath *path; + gchar *name_i; + gboolean flag; + + gl_debug (DEBUG_MEDIA_SELECT, "START"); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->search_all_treeview)); + g_return_if_fail (GTK_IS_TREE_SELECTION (selection)); + + model = GTK_TREE_MODEL (media_select->priv->search_all_store); + + for ( flag = gtk_tree_model_get_iter_first (model, &iter); + flag; + flag = gtk_tree_model_iter_next(model, &iter) ) + { + gtk_tree_model_get (model, &iter, NAME_COLUMN, &name_i, -1); + if (strcasecmp(name, name_i) == 0) + { + gtk_tree_selection_select_iter (selection, &iter); + path = gtk_tree_model_get_path (model, &iter); + gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (media_select->priv->search_all_treeview), + path, + NULL, + TRUE, 0.5, 0.0); + gtk_tree_path_free (path); + break; + } + } + + gl_debug (DEBUG_MEDIA_SELECT, "END"); +} + +/****************************************************************************/ +/* query current filter parameters. */ +/****************************************************************************/ +void +gl_wdgt_media_select_get_filter_parameters (glWdgtMediaSelect *media_select, + gchar **page_size_id, + gchar **category_id) +{ + gchar *page_size_name, *category_name; + + gl_debug (DEBUG_MEDIA_SELECT, ""); + + g_free (*page_size_id); + g_free (*category_id); + + page_size_name = + gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo)); + + *page_size_id = lgl_db_lookup_paper_id_from_name (page_size_name); + + category_name = + gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->category_combo)); + + *category_id = lgl_db_lookup_category_id_from_name (category_name); + + g_free (page_size_name); + g_free (category_name); +} + +/****************************************************************************/ +/* set filter parameters. */ +/****************************************************************************/ +void +gl_wdgt_media_select_set_filter_parameters (glWdgtMediaSelect *media_select, + const gchar *page_size_id, + const gchar *category_id) +{ + gchar *page_size_name; + gchar *category_name; + + gl_debug (DEBUG_MEDIA_SELECT, "START"); + + page_size_name = lgl_db_lookup_paper_name_from_id (page_size_id); + if (page_size_name == NULL) + { + page_size_name = g_strdup (_("Any")); + } + + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo), + page_size_name); + + category_name = lgl_db_lookup_category_name_from_id (category_id); + if (category_name == NULL) + { + category_name = g_strdup (_("Any")); + } + + gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->category_combo), + category_name); + g_free (page_size_name); + g_free (category_name); + + gl_debug (DEBUG_MEDIA_SELECT, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Get a description of the layout and number of labels. */ +/*--------------------------------------------------------------------------*/ +static gchar * +get_layout_desc (const lglTemplate *template) +{ + const lglTemplateFrame *frame; + gint n_labels; + gchar *string; + + frame = (lglTemplateFrame *)template->frames->data; + + n_labels = lgl_template_frame_get_n_labels (frame); + + string = g_strdup_printf (_("%d per sheet"), n_labels); + + return string; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Get label size description. */ +/*--------------------------------------------------------------------------*/ +static gchar * +get_label_size_desc (const lglTemplate *template) +{ + lglUnitsType units; + const gchar *units_string; + gdouble units_per_point; + const lglTemplateFrame *frame; + gchar *string = NULL; + + units = gl_prefs_get_units (); + units_string = gl_prefs_get_units_string (); + units_per_point = gl_prefs_get_units_per_point (); + + frame = (lglTemplateFrame *)template->frames->data; + + switch (frame->shape) { + case LGL_TEMPLATE_FRAME_SHAPE_RECT: + if ( units == LGL_UNITS_INCH ) { + gchar *xstr, *ystr; + + xstr = gl_util_fraction (frame->rect.w*units_per_point); + ystr = gl_util_fraction (frame->rect.h*units_per_point); + string = g_strdup_printf (_("%s x %s %s"), + xstr, ystr, units_string); + g_free (xstr); + g_free (ystr); + } else { + string = g_strdup_printf (_("%.5g x %.5g %s"), + frame->rect.w*units_per_point, + frame->rect.h*units_per_point, + units_string); + } + break; + case LGL_TEMPLATE_FRAME_SHAPE_ROUND: + if ( units == LGL_UNITS_INCH ) { + gchar *dstr; + + dstr = gl_util_fraction (2.0*frame->round.r*units_per_point); + string = g_strdup_printf (_("%s %s diameter"), + dstr, units_string); + g_free (dstr); + } else { + string = g_strdup_printf (_("%.5g %s diameter"), + 2.0*frame->round.r*units_per_point, + units_string); + } + break; + case LGL_TEMPLATE_FRAME_SHAPE_CD: + if ( units == LGL_UNITS_INCH ) { + gchar *dstr; + + dstr = gl_util_fraction (2.0*frame->cd.r1*units_per_point); + string = g_strdup_printf (_("%s %s diameter"), + dstr, units_string); + g_free (dstr); + } else { + string = g_strdup_printf (_("%.5g %s diameter"), + 2.0*frame->cd.r1*units_per_point, + units_string); + } + break; + default: + break; + } + + return string; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Load list store from template name list. */ +/*--------------------------------------------------------------------------*/ +static void +load_recent_list (GtkListStore *store, + GtkTreeSelection *selection, + GSList *list) +{ + GSList *p; + GtkTreeIter iter; + lglTemplate *template; + GdkPixbuf *pixbuf; + gchar *size; + gchar *layout; + gchar *description; + + gl_debug (DEBUG_MEDIA_SELECT, "START"); + + gtk_list_store_clear (store); + + if (list) + { + + for ( p=list; p!=NULL; p=p->next ) + { + + gl_debug (DEBUG_MEDIA_SELECT, "p->data = \"%s\"", p->data); + + template = lgl_db_lookup_template_from_name (p->data); + pixbuf = gl_mini_preview_pixbuf_cache_get_pixbuf (p->data); + + size = get_label_size_desc (template); + layout = get_layout_desc (template); + description = g_strdup_printf ("%s: %s\n%s\n%s", + (gchar *)p->data, + template->description, + size, + layout); + g_free (size); + g_free (layout); + + lgl_template_free (template); + + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, + NAME_COLUMN, p->data, + PREVIEW_COLUMN, pixbuf, + DESCRIPTION_COLUMN, description, + -1); + + g_object_unref (G_OBJECT (pixbuf)); + g_free (description); + } + + gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE); + gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter); + gtk_tree_selection_select_iter (selection, &iter); + + } + else + { + gchar *text = g_strdup_printf ("%s\n%s", + _("No recent templates found."), + _("Try selecting a template from the \"Search all templates\" page.")); + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, + NAME_COLUMN, "empty", + PREVIEW_COLUMN_STOCK, GTK_STOCK_DIALOG_WARNING, + PREVIEW_COLUMN_STOCK_SIZE, GTK_ICON_SIZE_DIALOG, + DESCRIPTION_COLUMN, text, + -1); + g_free (text); + + gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE); + + } + + gl_debug (DEBUG_MEDIA_SELECT, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Load list store from template name list. */ +/*--------------------------------------------------------------------------*/ +static void +load_search_all_list (GtkListStore *store, + GtkTreeSelection *selection, + GList *list) +{ + GList *p; + GtkTreeIter iter; + lglTemplate *template; + GdkPixbuf *pixbuf; + gchar *size; + gchar *layout; + gchar *description; + + gl_debug (DEBUG_MEDIA_SELECT, "START"); + + gtk_list_store_clear (store); + + if (list) + { + + for ( p=list; p!=NULL; p=p->next ) + { + + gl_debug (DEBUG_MEDIA_SELECT, "p->data = \"%s\"", p->data); + + template = lgl_db_lookup_template_from_name (p->data); + pixbuf = gl_mini_preview_pixbuf_cache_get_pixbuf (p->data); + + size = get_label_size_desc (template); + layout = get_layout_desc (template); + description = g_strdup_printf ("%s: %s\n%s\n%s", + (gchar *)p->data, + template->description, + size, + layout); + g_free (size); + g_free (layout); + + lgl_template_free (template); + + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, + NAME_COLUMN, p->data, + PREVIEW_COLUMN, pixbuf, + DESCRIPTION_COLUMN, description, + -1); + + g_object_unref (G_OBJECT (pixbuf)); + g_free (description); + } + + gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE); + gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter); + gtk_tree_selection_select_iter (selection, &iter); + + } + else + { + gchar *text = g_strdup_printf ("%s\n%s", + _("No match."), + _("Try selecting a different brand, page size or category.")); + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, + NAME_COLUMN, "empty", + PREVIEW_COLUMN_STOCK, GTK_STOCK_DIALOG_WARNING, + PREVIEW_COLUMN_STOCK_SIZE, GTK_ICON_SIZE_DIALOG, + DESCRIPTION_COLUMN, text, + -1); + g_free (text); + + gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE); + + } + + gl_debug (DEBUG_MEDIA_SELECT, "END"); +} + diff --git a/glabels2/src/wdgt-media-select.h b/glabels2/src/wdgt-media-select.h new file mode 100644 index 00000000..c8e95fce --- /dev/null +++ b/glabels2/src/wdgt-media-select.h @@ -0,0 +1,78 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * wdgt_media_select.h: media selection widget module header file + * + * Copyright (C) 2001-2006 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WDGT_MEDIA_SELECT_H__ +#define __WDGT_MEDIA_SELECT_H__ + +#include + +G_BEGIN_DECLS + +#define GL_TYPE_WDGT_MEDIA_SELECT (gl_wdgt_media_select_get_type ()) +#define GL_WDGT_MEDIA_SELECT(obj) \ + (GTK_CHECK_CAST((obj), GL_TYPE_WDGT_MEDIA_SELECT, glWdgtMediaSelect )) +#define GL_WDGT_MEDIA_SELECT_CLASS(klass) \ + (GTK_CHECK_CLASS_CAST ((klass), GL_TYPE_WDGT_MEDIA_SELECT, glWdgtMediaSelectClass)) +#define GL_IS_WDGT_MEDIA_SELECT(obj) \ + (GTK_CHECK_TYPE ((obj), GL_TYPE_WDGT_MEDIA_SELECT)) +#define GL_IS_WDGT_MEDIA_SELECT_CLASS(klass) \ + (GTK_CHECK_CLASS_TYPE ((klass), GL_TYPE_WDGT_MEDIA_SELECT)) + +typedef struct _glWdgtMediaSelect glWdgtMediaSelect; +typedef struct _glWdgtMediaSelectClass glWdgtMediaSelectClass; + +typedef struct _glWdgtMediaSelectPrivate glWdgtMediaSelectPrivate; + +struct _glWdgtMediaSelect { + GtkVBox parent_widget; + + glWdgtMediaSelectPrivate *priv; +}; + +struct _glWdgtMediaSelectClass { + GtkVBoxClass parent_class; + + void (*changed) (glWdgtMediaSelect * media_select, gpointer user_data); +}; + +GType gl_wdgt_media_select_get_type (void) G_GNUC_CONST; + +GtkWidget *gl_wdgt_media_select_new (void); + +gchar *gl_wdgt_media_select_get_name (glWdgtMediaSelect *media_select); + +void gl_wdgt_media_select_set_name (glWdgtMediaSelect *media_select, + gchar *name); + +void gl_wdgt_media_select_get_filter_parameters (glWdgtMediaSelect *media_select, + gchar **page_size_id, + gchar **category_id); + +void gl_wdgt_media_select_set_filter_parameters (glWdgtMediaSelect *media_select, + const gchar *page_size_id, + const gchar *category_id); + +G_END_DECLS + +#endif diff --git a/glabels2/src/wdgt-mini-preview.c b/glabels2/src/wdgt-mini-preview.c new file mode 100644 index 00000000..c539e6bf --- /dev/null +++ b/glabels2/src/wdgt-mini-preview.c @@ -0,0 +1,724 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * wdgt_mini_preview.c: mini preview widget module + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "wdgt-mini-preview.h" + +#include + +#include "libglabels/db.h" +#include "cairo-label-path.h" +#include "marshal.h" +#include "color.h" + +#include "debug.h" + +/*===========================================*/ +/* Private macros and constants. */ +/*===========================================*/ + +#define PAPER_RGB_ARGS 1.0, 1.0, 1.0 +#define PAPER_OUTLINE_RGB_ARGS 0.0, 0.0, 0.0 +#define LABEL_OUTLINE_RGB_ARGS 0.5, 0.5, 0.5 + +#define SHADOW_X_OFFSET 5 +#define SHADOW_Y_OFFSET 5 + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + +enum { + CLICKED, + PRESSED, + LAST_SIGNAL +}; + +typedef struct { + gdouble x; + gdouble y; +} LabelCenter; + +struct _glWdgtMiniPreviewPrivate { + + gint height; + gint width; + + lglTemplate *template; + gdouble scale; + gdouble offset_x; + gdouble offset_y; + gint labels_per_sheet; + LabelCenter *centers; + + gint highlight_first; + gint highlight_last; + + gboolean dragging; + gint first_i; + gint last_i; + gint prev_i; +}; + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +static gint wdgt_mini_preview_signals[LAST_SIGNAL] = { 0 }; + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void gl_wdgt_mini_preview_finalize (GObject *object); + +static void gl_wdgt_mini_preview_construct (glWdgtMiniPreview *preview, + gint height, + gint width); + +static gboolean expose_event_cb (GtkWidget *widget, + GdkEventExpose *event); +static void style_set_cb (GtkWidget *widget, + GtkStyle *previous_style); +static gboolean button_press_event_cb (GtkWidget *widget, + GdkEventButton *event); +static gboolean motion_notify_event_cb (GtkWidget *widget, + GdkEventMotion *event); +static gboolean button_release_event_cb (GtkWidget *widget, + GdkEventButton *event); + + +static void redraw (GtkWidget *widget); +static void draw (glWdgtMiniPreview *preview, + cairo_t *cr); + +static void draw_shadow (glWdgtMiniPreview *preview, + cairo_t *cr, + gdouble x, + gdouble y, + gdouble width, + gdouble height); +static void draw_paper (glWdgtMiniPreview *preview, + cairo_t *cr, + gdouble width, + gdouble height, + gdouble line_width); +static void draw_labels (glWdgtMiniPreview *preview, + cairo_t *cr, + lglTemplate *template, + gdouble line_width); + +static gint find_closest_label (glWdgtMiniPreview *preview, + gdouble x, + gdouble y); + + + +/****************************************************************************/ +/* Boilerplate Object stuff. */ +/****************************************************************************/ +G_DEFINE_TYPE (glWdgtMiniPreview, gl_wdgt_mini_preview, GTK_TYPE_DRAWING_AREA); + + +static void +gl_wdgt_mini_preview_class_init (glWdgtMiniPreviewClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); + + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + gl_wdgt_mini_preview_parent_class = gtk_type_class (gtk_hbox_get_type ()); + + object_class->finalize = gl_wdgt_mini_preview_finalize; + + widget_class->expose_event = expose_event_cb; + widget_class->style_set = style_set_cb; + widget_class->button_press_event = button_press_event_cb; + widget_class->motion_notify_event = motion_notify_event_cb; + widget_class->button_release_event = button_release_event_cb; + + wdgt_mini_preview_signals[CLICKED] = + g_signal_new ("clicked", + G_OBJECT_CLASS_TYPE(object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glWdgtMiniPreviewClass, clicked), + NULL, NULL, + gl_marshal_VOID__INT, + G_TYPE_NONE, 1, G_TYPE_INT); + + wdgt_mini_preview_signals[PRESSED] = + g_signal_new ("pressed", + G_OBJECT_CLASS_TYPE(object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glWdgtMiniPreviewClass, pressed), + NULL, NULL, + gl_marshal_VOID__INT_INT, + G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); +} + +static void +gl_wdgt_mini_preview_init (glWdgtMiniPreview *preview) +{ + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + preview->priv = g_new0 (glWdgtMiniPreviewPrivate, 1); + + gtk_widget_add_events (GTK_WIDGET (preview), + GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | + GDK_POINTER_MOTION_MASK); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); +} + +static void +gl_wdgt_mini_preview_finalize (GObject *object) +{ + glWdgtMiniPreview *preview = GL_WDGT_MINI_PREVIEW (object); + + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + g_return_if_fail (object != NULL); + g_return_if_fail (GL_IS_WDGT_MINI_PREVIEW (object)); + + lgl_template_free (preview->priv->template); + g_free (preview->priv->centers); + g_free (preview->priv); + + G_OBJECT_CLASS (gl_wdgt_mini_preview_parent_class)->finalize (object); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); +} + +GtkWidget * +gl_wdgt_mini_preview_new (gint height, + gint width) +{ + glWdgtMiniPreview *preview; + + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + preview = g_object_new (gl_wdgt_mini_preview_get_type (), NULL); + + gl_wdgt_mini_preview_construct (preview, height, width); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); + + return GTK_WIDGET (preview); +} + +/*--------------------------------------------------------------------------*/ +/* Construct composite widget. */ +/*--------------------------------------------------------------------------*/ +static void +gl_wdgt_mini_preview_construct (glWdgtMiniPreview *preview, + gint height, + gint width) +{ + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + preview->priv->height = height; + preview->priv->width = width; + + gtk_widget_set_size_request (GTK_WIDGET (preview), width, height); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); +} + +/****************************************************************************/ +/* Set label for mini-preview to determine geometry. */ +/****************************************************************************/ +void gl_wdgt_mini_preview_set_label_by_name (glWdgtMiniPreview *preview, + const gchar *name) +{ + lglTemplate *template; + + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + /* Fetch template */ + template = lgl_db_lookup_template_from_name (name); + + gl_wdgt_mini_preview_set_template (preview, template); + + lgl_template_free (template); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); +} + +/****************************************************************************/ +/* Set label for mini-preview to determine geometry. */ +/****************************************************************************/ +void gl_wdgt_mini_preview_set_template (glWdgtMiniPreview *preview, + const lglTemplate *template) +{ + const lglTemplateFrame *frame; + lglTemplateOrigin *origins; + gdouble w, h; + gint i; + + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + frame = (lglTemplateFrame *)template->frames->data; + + /* + * Set template + */ + lgl_template_free (preview->priv->template); + preview->priv->template = lgl_template_dup (template); + + /* + * Set scale and offsets + */ + w = preview->priv->width - 4 - 2*SHADOW_X_OFFSET; + h = preview->priv->height - 4 - 2*SHADOW_Y_OFFSET; + if ( (w/template->page_width) > (h/template->page_height) ) { + preview->priv->scale = h / template->page_height; + } else { + preview->priv->scale = w / template->page_width; + } + preview->priv->offset_x = (preview->priv->width/preview->priv->scale - template->page_width) / 2.0; + preview->priv->offset_y = (preview->priv->height/preview->priv->scale - template->page_height) / 2.0; + + /* + * Set labels per sheet + */ + preview->priv->labels_per_sheet = lgl_template_frame_get_n_labels (frame); + + /* + * Initialize centers + */ + g_free (preview->priv->centers); + preview->priv->centers = g_new0 (LabelCenter, preview->priv->labels_per_sheet); + origins = lgl_template_frame_get_origins (frame); + lgl_template_frame_get_size (frame, &w, &h); + for ( i=0; ipriv->labels_per_sheet; i++ ) + { + preview->priv->centers[i].x = origins[i].x + w/2.0; + preview->priv->centers[i].y = origins[i].y + h/2.0; + } + g_free (origins); + + /* + * Redraw modified preview + */ + redraw( GTK_WIDGET (preview)); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); +} + +/****************************************************************************/ +/* Highlight given label outlines. */ +/****************************************************************************/ +void +gl_wdgt_mini_preview_highlight_range (glWdgtMiniPreview *preview, + gint first_label, + gint last_label) +{ + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + preview->priv->highlight_first = first_label; + preview->priv->highlight_last = last_label; + + redraw( GTK_WIDGET (preview)); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); +} + + +/*--------------------------------------------------------------------------*/ +/* Expose event handler. */ +/*--------------------------------------------------------------------------*/ +static gboolean +expose_event_cb (GtkWidget *widget, + GdkEventExpose *event) +{ + cairo_t *cr; + + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + cr = gdk_cairo_create (widget->window); + + cairo_rectangle (cr, + event->area.x, event->area.y, + event->area.width, event->area.height); + cairo_clip (cr); + + draw (GL_WDGT_MINI_PREVIEW (widget), cr); + + cairo_destroy (cr); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); + return FALSE; +} + +/*--------------------------------------------------------------------------*/ +/* Button press event handler */ +/*--------------------------------------------------------------------------*/ +static gboolean +button_press_event_cb (GtkWidget *widget, + GdkEventButton *event) +{ + glWdgtMiniPreview *preview = GL_WDGT_MINI_PREVIEW (widget); + cairo_t *cr; + gdouble x, y; + gint i; + + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + if ( event->button == 1 ) + { + cr = gdk_cairo_create (widget->window); + + /* Set transformation. */ + cairo_identity_matrix (cr); + cairo_scale (cr, preview->priv->scale, preview->priv->scale); + cairo_translate (cr, preview->priv->offset_x, preview->priv->offset_y); + + x = event->x; + y = event->y; + cairo_device_to_user (cr, &x, &y); + + i = find_closest_label (preview, x, y); + + g_signal_emit (G_OBJECT(preview), + wdgt_mini_preview_signals[CLICKED], + 0, i); + + preview->priv->first_i = i; + preview->priv->last_i = i; + g_signal_emit (G_OBJECT(preview), + wdgt_mini_preview_signals[PRESSED], + 0, preview->priv->first_i, preview->priv->last_i); + + preview->priv->dragging = TRUE; + preview->priv->prev_i = i; + + cairo_destroy (cr); + } + + gl_debug (DEBUG_MINI_PREVIEW, "END"); + return FALSE; +} + +/*--------------------------------------------------------------------------*/ +/* Motion notify event handler */ +/*--------------------------------------------------------------------------*/ +static gboolean +motion_notify_event_cb (GtkWidget *widget, + GdkEventMotion *event) +{ + glWdgtMiniPreview *preview = GL_WDGT_MINI_PREVIEW (widget); + cairo_t *cr; + gdouble x, y; + gint i; + + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + if (preview->priv->dragging) + { + cr = gdk_cairo_create (widget->window); + + /* Set transformation. */ + cairo_identity_matrix (cr); + cairo_scale (cr, preview->priv->scale, preview->priv->scale); + cairo_translate (cr, preview->priv->offset_x, preview->priv->offset_y); + + x = event->x; + y = event->y; + cairo_device_to_user (cr, &x, &y); + + i = find_closest_label (preview, x, y); + + if ( i != preview->priv->prev_i ) + { + preview->priv->last_i = i; + + g_signal_emit (G_OBJECT(preview), + wdgt_mini_preview_signals[PRESSED], + 0, + MIN (preview->priv->first_i, preview->priv->last_i), + MAX (preview->priv->first_i, preview->priv->last_i)); + + preview->priv->prev_i = i; + } + cairo_destroy (cr); + } + + gl_debug (DEBUG_MINI_PREVIEW, "END"); + return FALSE; +} + +/*--------------------------------------------------------------------------*/ +/* Button release event handler */ +/*--------------------------------------------------------------------------*/ +static gboolean +button_release_event_cb (GtkWidget *widget, + GdkEventButton *event) +{ + glWdgtMiniPreview *preview = GL_WDGT_MINI_PREVIEW (widget); + + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + if ( event->button == 1 ) + { + preview->priv->dragging = FALSE; + + } + + gl_debug (DEBUG_MINI_PREVIEW, "END"); + return FALSE; +} + +/*--------------------------------------------------------------------------*/ +/* Style set handler (updates colors when style/theme changes). */ +/*--------------------------------------------------------------------------*/ +static void +style_set_cb (GtkWidget *widget, + GtkStyle *previous_style) +{ + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + redraw( widget ); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* Redraw. */ +/*--------------------------------------------------------------------------*/ +static void +redraw (GtkWidget *widget) +{ + GdkRegion *region; + + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + if (widget->window) + { + + region = gdk_drawable_get_clip_region (widget->window); + + gdk_window_invalidate_region (widget->window, region, TRUE); + gdk_window_process_updates (widget->window, TRUE); + + gdk_region_destroy (region); + } + + gl_debug (DEBUG_MINI_PREVIEW, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* Find index+1 of label closest to given coordinates. */ +/*--------------------------------------------------------------------------*/ +static gint +find_closest_label (glWdgtMiniPreview *preview, + gdouble x, + gdouble y) +{ + gint i; + gint min_i; + gdouble dx, dy, d2, min_d2; + + dx = x - preview->priv->centers[0].x; + dy = y - preview->priv->centers[0].y; + min_d2 = dx*dx + dy*dy; + min_i = 0; + + for ( i=1; ipriv->labels_per_sheet; i++ ) + { + dx = x - preview->priv->centers[i].x; + dy = y - preview->priv->centers[i].y; + d2 = dx*dx + dy*dy; + + if ( d2 < min_d2 ) + { + min_d2 = d2; + min_i = i; + } + } + + return min_i + 1; +} + +/*--------------------------------------------------------------------------*/ +/* Draw mini preview. */ +/*--------------------------------------------------------------------------*/ +static void +draw (glWdgtMiniPreview *preview, + cairo_t *cr) +{ + lglTemplate *template = preview->priv->template; + gdouble shadow_x, shadow_y; + + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + if (template) + { + + /* Set transformation. */ + cairo_identity_matrix (cr); + cairo_scale (cr, preview->priv->scale, preview->priv->scale); + cairo_translate (cr, preview->priv->offset_x, preview->priv->offset_y); + + + /* update shadow */ + shadow_x = SHADOW_X_OFFSET/preview->priv->scale; + shadow_y = SHADOW_Y_OFFSET/preview->priv->scale; + + draw_shadow (preview, cr, + shadow_x, shadow_y, + template->page_width, template->page_height); + + draw_paper (preview, cr, + template->page_width, template->page_height, + 1.0/preview->priv->scale); + + draw_labels (preview, cr, template, 1.0/preview->priv->scale); + + } + + gl_debug (DEBUG_MINI_PREVIEW, "END"); + +} + + +/*--------------------------------------------------------------------------*/ +/* Draw page shadow */ +/*--------------------------------------------------------------------------*/ +static void +draw_shadow (glWdgtMiniPreview *preview, + cairo_t *cr, + gdouble x, + gdouble y, + gdouble width, + gdouble height) +{ + GtkStyle *style; + guint shadow_color; + + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + cairo_save (cr); + + cairo_rectangle (cr, x, y, width, height); + + style = gtk_widget_get_style (GTK_WIDGET(preview)); + shadow_color = gl_color_from_gdk_color (&style->bg[GTK_STATE_ACTIVE]); + cairo_set_source_rgb (cr, GL_COLOR_RGB_ARGS (shadow_color)); + + cairo_fill (cr); + + cairo_restore (cr); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* Draw page */ +/*--------------------------------------------------------------------------*/ +static void +draw_paper (glWdgtMiniPreview *preview, + cairo_t *cr, + gdouble width, + gdouble height, + gdouble line_width) +{ + cairo_save (cr); + + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + cairo_rectangle (cr, 0.0, 0.0, width, height); + + cairo_set_source_rgb (cr, PAPER_RGB_ARGS); + cairo_fill_preserve (cr); + + cairo_set_source_rgb (cr, PAPER_OUTLINE_RGB_ARGS); + cairo_set_line_width (cr, line_width); + cairo_stroke (cr); + + cairo_restore (cr); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* Draw labels */ +/*--------------------------------------------------------------------------*/ +static void +draw_labels (glWdgtMiniPreview *preview, + cairo_t *cr, + lglTemplate *template, + gdouble line_width) +{ + const lglTemplateFrame *frame; + gint i, n_labels; + lglTemplateOrigin *origins; + GtkStyle *style; + guint highlight_color; + + gl_debug (DEBUG_MINI_PREVIEW, "START"); + + frame = (lglTemplateFrame *)template->frames->data; + + n_labels = lgl_template_frame_get_n_labels (frame); + origins = lgl_template_frame_get_origins (frame); + + style = gtk_widget_get_style (GTK_WIDGET(preview)); + highlight_color = gl_color_from_gdk_color (&style->base[GTK_STATE_SELECTED]); + + for ( i=0; i < n_labels; i++ ) { + + cairo_save (cr); + + cairo_translate (cr, origins[i].x, origins[i].y); + gl_cairo_label_path (cr, template, FALSE, FALSE); + + if ( ((i+1) >= preview->priv->highlight_first) && + ((i+1) <= preview->priv->highlight_last) ) + { + cairo_set_source_rgb (cr, GL_COLOR_RGB_ARGS (highlight_color)); + } + else + { + cairo_set_source_rgb (cr, PAPER_RGB_ARGS); + } + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_fill_preserve (cr); + + cairo_set_line_width (cr, line_width); + cairo_set_source_rgb (cr, LABEL_OUTLINE_RGB_ARGS); + cairo_stroke (cr); + + cairo_restore (cr); + + } + + g_free (origins); + + gl_debug (DEBUG_MINI_PREVIEW, "END"); +} + diff --git a/glabels2/src/wdgt-mini-preview.h b/glabels2/src/wdgt-mini-preview.h new file mode 100644 index 00000000..8754b857 --- /dev/null +++ b/glabels2/src/wdgt-mini-preview.h @@ -0,0 +1,83 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * wdgt_mini_preview.h: mini-preview widget module header file + * + * Copyright (C) 2001-2007 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WDGT_MINI_PREVIEW_H__ +#define __WDGT_MINI_PREVIEW_H__ + +#include +#include "label.h" + +G_BEGIN_DECLS + +#define GL_TYPE_WDGT_MINI_PREVIEW (gl_wdgt_mini_preview_get_type ()) +#define GL_WDGT_MINI_PREVIEW(obj) \ + (GTK_CHECK_CAST((obj), GL_TYPE_WDGT_MINI_PREVIEW, glWdgtMiniPreview )) +#define GL_WDGT_MINI_PREVIEW_CLASS(klass) \ + (GTK_CHECK_CLASS_CAST ((klass), GL_TYPE_WDGT_MINI_PREVIEW, glWdgtMiniPreviewClass)) +#define GL_IS_WDGT_MINI_PREVIEW(obj) \ + (GTK_CHECK_TYPE ((obj), GL_TYPE_WDGT_MINI_PREVIEW)) +#define GL_IS_WDGT_MINI_PREVIEW_CLASS(klass) \ + (GTK_CHECK_CLASS_TYPE ((klass), GL_TYPE_WDGT_MINI_PREVIEW)) + +typedef struct _glWdgtMiniPreview glWdgtMiniPreview; +typedef struct _glWdgtMiniPreviewPrivate glWdgtMiniPreviewPrivate; +typedef struct _glWdgtMiniPreviewClass glWdgtMiniPreviewClass; + +struct _glWdgtMiniPreview { + GtkDrawingArea parent_widget; + + glWdgtMiniPreviewPrivate *priv; +}; + +struct _glWdgtMiniPreviewClass { + GtkDrawingAreaClass parent_class; + + void (*clicked) (glWdgtMiniPreview *preview, + gint index, + gpointer user_data); + + void (*pressed) (glWdgtMiniPreview *preview, + gint index1, + gint index2, + gpointer user_data); +}; + +GType gl_wdgt_mini_preview_get_type (void) G_GNUC_CONST; + +GtkWidget *gl_wdgt_mini_preview_new (gint height, + gint width); + +void gl_wdgt_mini_preview_set_label_by_name (glWdgtMiniPreview *preview, + const gchar *name); + +void gl_wdgt_mini_preview_set_template (glWdgtMiniPreview *preview, + const lglTemplate *template); + +void gl_wdgt_mini_preview_highlight_range (glWdgtMiniPreview *preview, + gint first_label, + gint last_label); + +G_END_DECLS + +#endif diff --git a/glabels2/src/wdgt-print-copies.c b/glabels2/src/wdgt-print-copies.c new file mode 100644 index 00000000..f09522a0 --- /dev/null +++ b/glabels2/src/wdgt-print-copies.c @@ -0,0 +1,368 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * wdgt_print_copies.c: custom print copies widget module + * + * Copyright (C) 2001 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "wdgt-print-copies.h" + +#include +#include +#include +#include +#include +#include + +#include "hig.h" +#include "wdgt-mini-preview.h" +#include "marshal.h" + +#include "debug.h" + +#define WDGT_MINI_PREVIEW_HEIGHT 175 +#define WDGT_MINI_PREVIEW_WIDTH 150 + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void gl_wdgt_print_copies_finalize (GObject * object); + +static void gl_wdgt_print_copies_construct (glWdgtPrintCopies * copies, + glLabel * label); + +static void sheets_radio_cb (GtkToggleButton * togglebutton, + gpointer user_data); +static void first_spin_cb (GtkSpinButton * spinbutton, + gpointer user_data); +static void last_spin_cb (GtkSpinButton * spinbutton, + gpointer user_data); + +static void +preview_pressed (glWdgtMiniPreview *mini_preview, + gint first, gint last, gpointer user_data); + + +/****************************************************************************/ +/* Boilerplate Object stuff. */ +/****************************************************************************/ +G_DEFINE_TYPE (glWdgtPrintCopies, gl_wdgt_print_copies, GTK_TYPE_HBOX); + +static void +gl_wdgt_print_copies_class_init (glWdgtPrintCopiesClass * class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_wdgt_print_copies_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_wdgt_print_copies_finalize; +} + +static void +gl_wdgt_print_copies_init (glWdgtPrintCopies * copies) +{ + copies->labels_per_sheet = 0; + + copies->mini_preview = NULL; + + copies->sheets_radio = NULL; + copies->sheets_spin = NULL; + + copies->labels_radio = NULL; + copies->first_spin = NULL; + copies->last_spin = NULL; +} + +static void +gl_wdgt_print_copies_finalize (GObject * object) +{ + g_return_if_fail (object != NULL); + g_return_if_fail (GL_IS_WDGT_PRINT_COPIES (object)); + + G_OBJECT_CLASS (gl_wdgt_print_copies_parent_class)->finalize (object); +} + +GtkWidget * +gl_wdgt_print_copies_new (glLabel * label) +{ + glWdgtPrintCopies *copies; + + copies = g_object_new (gl_wdgt_print_copies_get_type (), NULL); + + gl_wdgt_print_copies_construct (copies, label); + + return GTK_WIDGET (copies); +} + +/*--------------------------------------------------------------------------*/ +/* Construct composite widget. */ +/*--------------------------------------------------------------------------*/ +static void +gl_wdgt_print_copies_construct (glWdgtPrintCopies *copies, + glLabel *label) +{ + const lglTemplateFrame *frame; + GtkWidget *whbox, *wvbox, *whbox1; + GSList *radio_group = NULL; + GtkObject *adjust; + + whbox = GTK_WIDGET (copies); + + frame = (lglTemplateFrame *)label->template->frames->data; + + copies->labels_per_sheet = lgl_template_frame_get_n_labels (frame); + + /* mini_preview canvas */ + copies->mini_preview = gl_wdgt_mini_preview_new (WDGT_MINI_PREVIEW_HEIGHT, + WDGT_MINI_PREVIEW_WIDTH); + gl_wdgt_mini_preview_set_template (GL_WDGT_MINI_PREVIEW(copies->mini_preview), + label->template); + gtk_box_pack_start (GTK_BOX(whbox), copies->mini_preview, FALSE, FALSE, 0); + + wvbox = gtk_vbox_new (FALSE, GL_HIG_PAD1); + gtk_box_pack_start (GTK_BOX(whbox), wvbox, FALSE, FALSE, 0); + + /* Sheet controls */ + whbox1 = gtk_hbox_new (FALSE, GL_HIG_PAD2); + gtk_box_pack_start (GTK_BOX(wvbox), whbox1, FALSE, FALSE, 0); + copies->sheets_radio = + gtk_radio_button_new_with_label (radio_group, _("Sheets:")); + gtk_box_pack_start (GTK_BOX(whbox1), copies->sheets_radio, FALSE, FALSE, 0); + adjust = gtk_adjustment_new (1, 1.0, 10.0, 1.0, 10.0, 10.0); + copies->sheets_spin = gtk_spin_button_new (GTK_ADJUSTMENT (adjust), + 1.0, 0); + gtk_box_pack_start (GTK_BOX(whbox1), copies->sheets_spin, FALSE, FALSE, 0); + gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW(copies->mini_preview), + 1, copies->labels_per_sheet); + + /* Blank line */ + gtk_box_pack_start (GTK_BOX(wvbox), gtk_label_new (""), FALSE, FALSE, 0); + + /* Label controls */ + whbox1 = gtk_hbox_new (FALSE, GL_HIG_PAD2); + gtk_box_pack_start (GTK_BOX(wvbox), whbox1, FALSE, FALSE, 0); + radio_group = + gtk_radio_button_get_group (GTK_RADIO_BUTTON (copies->sheets_radio)); + copies->labels_radio = + gtk_radio_button_new_with_label (radio_group, _("Labels")); + gtk_box_pack_start (GTK_BOX(whbox1), copies->labels_radio, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(whbox1), gtk_label_new (_("from:")), FALSE, FALSE, 0); + adjust = gtk_adjustment_new (1, 1.0, copies->labels_per_sheet, + 1.0, 10.0, 10.0); + copies->first_spin = gtk_spin_button_new (GTK_ADJUSTMENT (adjust), + 1.0, 0); + gtk_box_pack_start (GTK_BOX(whbox1), copies->first_spin, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(whbox1), gtk_label_new (_("to:")), FALSE, FALSE, 0); + adjust = gtk_adjustment_new (copies->labels_per_sheet, + 1.0, copies->labels_per_sheet, + 1.0, 10.0, 10.0); + copies->last_spin = gtk_spin_button_new (GTK_ADJUSTMENT (adjust), + 1.0, 0); + gtk_box_pack_start (GTK_BOX(whbox1), copies->last_spin, FALSE, FALSE, 0); + gtk_widget_set_sensitive (copies->first_spin, FALSE); + gtk_widget_set_sensitive (copies->last_spin, FALSE); + + /* Connect signals to controls */ + g_signal_connect (G_OBJECT (copies->mini_preview), "pressed", + G_CALLBACK (preview_pressed), copies); + g_signal_connect (G_OBJECT (copies->sheets_radio), "toggled", + G_CALLBACK (sheets_radio_cb), copies); + g_signal_connect (G_OBJECT (copies->first_spin), "changed", + G_CALLBACK (first_spin_cb), copies); + g_signal_connect (G_OBJECT (copies->last_spin), "changed", + G_CALLBACK (last_spin_cb), copies); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Enable/Disable appropriate controls due to radio button toggle.*/ +/*--------------------------------------------------------------------------*/ +static void +sheets_radio_cb (GtkToggleButton * togglebutton, + gpointer user_data) +{ + glWdgtPrintCopies *copies = GL_WDGT_PRINT_COPIES (user_data); + gint first, last; + + if (gtk_toggle_button_get_active (togglebutton)) { + + gtk_widget_set_sensitive (copies->sheets_spin, TRUE); + gtk_widget_set_sensitive (copies->first_spin, FALSE); + gtk_widget_set_sensitive (copies->last_spin, FALSE); + + gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW(copies->mini_preview), + 1, copies->labels_per_sheet); + + } else { + + gtk_widget_set_sensitive (copies->sheets_spin, FALSE); + gtk_widget_set_sensitive (copies->first_spin, TRUE); + gtk_widget_set_sensitive (copies->last_spin, TRUE); + + first = + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON + (copies->first_spin)); + last = + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON + (copies->last_spin)); + gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW(copies->mini_preview), + first, last); + + } +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. modify widget due to change of first spin button */ +/*--------------------------------------------------------------------------*/ +static void +first_spin_cb (GtkSpinButton * spinbutton, + gpointer user_data) +{ + glWdgtPrintCopies *copies = GL_WDGT_PRINT_COPIES (user_data); + gint first, last; + + first = + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON + (copies->first_spin)); + last = + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON + (copies->last_spin)); + + gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (copies->last_spin))-> + lower = first; + + gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW(copies->mini_preview), + first, last); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. modify widget due to change of last spin button */ +/*--------------------------------------------------------------------------*/ +static void +last_spin_cb (GtkSpinButton * spinbutton, + gpointer user_data) +{ + glWdgtPrintCopies *copies = GL_WDGT_PRINT_COPIES (user_data); + gint first, last; + + first = + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON + (copies->first_spin)); + last = + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON + (copies->last_spin)); + + gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (copies->first_spin))-> + upper = last; + + gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW(copies->mini_preview), + first, last); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Canvas event handler, select first and last items. */ +/*--------------------------------------------------------------------------*/ +static void +preview_pressed (glWdgtMiniPreview *mini_preview, + gint first, + gint last, + gpointer user_data) +{ + glWdgtPrintCopies *copies = GL_WDGT_PRINT_COPIES (user_data); + + gl_wdgt_print_copies_set_range (copies, 1, first, last); +} + +/****************************************************************************/ +/* query selected range of labels within sheet or number of sheets. */ +/****************************************************************************/ +void +gl_wdgt_print_copies_get_range (glWdgtPrintCopies * copies, + gint * n_sheets, + gint * first_label, + gint * last_label) +{ + gboolean sheets_active; + + sheets_active = + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON + (copies->sheets_radio)); + + if (sheets_active) { + *n_sheets = + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON + (copies->sheets_spin)); + *first_label = 1; + *last_label = copies->labels_per_sheet; + } else { + *n_sheets = 1; + *first_label = + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON + (copies->first_spin)); + *last_label = + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON + (copies->last_spin)); + } +} + +/****************************************************************************/ +/* set range of labels within sheet or number of sheets */ +/****************************************************************************/ +void +gl_wdgt_print_copies_set_range (glWdgtPrintCopies * copies, + gint n_sheets, + gint first_label, + gint last_label) +{ + gint old_first_label; + + old_first_label = + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON + (copies->first_spin)); + + if (first_label > old_first_label) { + gtk_spin_button_set_value (GTK_SPIN_BUTTON (copies->last_spin), + last_label); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (copies->first_spin), + first_label); + } else { + gtk_spin_button_set_value (GTK_SPIN_BUTTON (copies->first_spin), + first_label); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (copies->last_spin), + last_label); + } + if ((first_label == 1) && (last_label == copies->labels_per_sheet)) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (copies->sheets_radio), TRUE); + gtk_spin_button_set_value (GTK_SPIN_BUTTON + (copies->sheets_spin), n_sheets); + } else { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (copies->labels_radio), TRUE); + gtk_spin_button_set_value (GTK_SPIN_BUTTON + (copies->sheets_spin), 1.0); + } +} diff --git a/glabels2/src/wdgt-print-copies.h b/glabels2/src/wdgt-print-copies.h new file mode 100644 index 00000000..7e24dee3 --- /dev/null +++ b/glabels2/src/wdgt-print-copies.h @@ -0,0 +1,81 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * wdgt_print_copies.h: custom print copies widget module header file + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WDGT_PRINT_COPIES_H__ +#define __WDGT_PRINT_COPIES_H__ + +#include "label.h" +#include + +G_BEGIN_DECLS + +#define GL_TYPE_WDGT_PRINT_COPIES (gl_wdgt_print_copies_get_type ()) +#define GL_WDGT_PRINT_COPIES(obj) \ + (GTK_CHECK_CAST((obj), GL_TYPE_WDGT_PRINT_COPIES, glWdgtPrintCopies )) +#define GL_WDGT_PRINT_COPIES_CLASS(klass) \ + (GTK_CHECK_CLASS_CAST ((klass), GL_TYPE_WDGT_PRINT_COPIES, glWdgtPrintCopiesClass)) +#define GL_IS_WDGT_PRINT_COPIES(obj) \ + (GTK_CHECK_TYPE ((obj), GL_TYPE_WDGT_PRINT_COPIES)) +#define GL_IS_WDGT_PRINT_COPIES_CLASS(klass) \ + (GTK_CHECK_CLASS_TYPE ((klass), GL_TYPE_WDGT_PRINT_COPIES)) + +typedef struct _glWdgtPrintCopies glWdgtPrintCopies; +typedef struct _glWdgtPrintCopiesClass glWdgtPrintCopiesClass; + +struct _glWdgtPrintCopies { + GtkHBox parent_widget; + + gint labels_per_sheet; + + GtkWidget *mini_preview; + + GtkWidget *sheets_radio; + GtkWidget *sheets_spin; + + GtkWidget *labels_radio; + GtkWidget *first_spin; + GtkWidget *last_spin; +}; + +struct _glWdgtPrintCopiesClass { + GtkHBoxClass parent_class; +}; + +GType gl_wdgt_print_copies_get_type (void) G_GNUC_CONST; + +GtkWidget *gl_wdgt_print_copies_new (glLabel *label); + +void gl_wdgt_print_copies_get_range (glWdgtPrintCopies *copies, + gint *n_sheets, + gint *first_label, + gint *last_label); + +void gl_wdgt_print_copies_set_range (glWdgtPrintCopies *copies, + gint n_sheets, + gint first_label, + gint last_label); + +G_END_DECLS + +#endif diff --git a/glabels2/src/wdgt-print-merge.c b/glabels2/src/wdgt-print-merge.c new file mode 100644 index 00000000..bc1fe6fd --- /dev/null +++ b/glabels2/src/wdgt-print-merge.c @@ -0,0 +1,317 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * wdgt_print_merge.c: print merge widget module + * + * Copyright (C) 2001 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "wdgt-print-merge.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "hig.h" +#include "wdgt-mini-preview.h" +#include "marshal.h" + +#include "pixmaps/collate.xpm" +#include "pixmaps/nocollate.xpm" + +#include "debug.h" + +#define WDGT_MINI_PREVIEW_HEIGHT 175 +#define WDGT_MINI_PREVIEW_WIDTH 150 + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void gl_wdgt_print_merge_finalize (GObject * object); + +static void gl_wdgt_print_merge_construct (glWdgtPrintMerge * merge, + glLabel * label); + +static void preview_clicked (glWdgtMiniPreview *mini_preview, + gint i_label, + gpointer user_data); + +static void collate_check_cb (GtkToggleButton * togglebutton, + gpointer user_data); +static void spin_cb (GtkSpinButton * spinbutton, + gpointer user_data); + + +/****************************************************************************/ +/* Boilerplate Object stuff. */ +/****************************************************************************/ +G_DEFINE_TYPE (glWdgtPrintMerge, gl_wdgt_print_merge, GTK_TYPE_HBOX); + + +static void +gl_wdgt_print_merge_class_init (glWdgtPrintMergeClass * class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_wdgt_print_merge_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_wdgt_print_merge_finalize; +} + +static void +gl_wdgt_print_merge_init (glWdgtPrintMerge * merge) +{ + merge->mini_preview = NULL; + + merge->copies_spin = NULL; + merge->first_spin = NULL; + merge->collate_image = NULL; + merge->collate_check = NULL; +} + +static void +gl_wdgt_print_merge_finalize (GObject * object) +{ + g_return_if_fail (object != NULL); + g_return_if_fail (GL_IS_WDGT_PRINT_MERGE (object)); + + G_OBJECT_CLASS (gl_wdgt_print_merge_parent_class)->finalize (object); +} + +GtkWidget * +gl_wdgt_print_merge_new (glLabel * label) +{ + glWdgtPrintMerge *merge; + + merge = g_object_new (gl_wdgt_print_merge_get_type (), NULL); + + gl_wdgt_print_merge_construct (merge, label); + + return GTK_WIDGET (merge); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Construct composite widget. */ +/*--------------------------------------------------------------------------*/ +static void +gl_wdgt_print_merge_construct (glWdgtPrintMerge * merge, + glLabel * label) +{ + const lglTemplateFrame *frame; + GtkWidget *whbox, *wvbox, *whbox1; + GtkObject *adjust; + GdkPixbuf *pixbuf; + + whbox = GTK_WIDGET (merge); + + frame = (lglTemplateFrame *)label->template->frames->data; + + merge->labels_per_sheet = lgl_template_frame_get_n_labels (frame); + + /* mini_preview canvas */ + merge->mini_preview = gl_wdgt_mini_preview_new (WDGT_MINI_PREVIEW_HEIGHT, + WDGT_MINI_PREVIEW_WIDTH); + gl_wdgt_mini_preview_set_template( GL_WDGT_MINI_PREVIEW (merge->mini_preview), + label->template ); + gtk_box_pack_start (GTK_BOX(whbox), merge->mini_preview, FALSE, FALSE, 0); + gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW(merge->mini_preview), + 1, 1); + + wvbox = gtk_vbox_new (FALSE, GL_HIG_PAD1); + gtk_box_pack_start (GTK_BOX(whbox), wvbox, FALSE, FALSE, 0); + + /* First Label controls */ + whbox1 = gtk_hbox_new (FALSE, GL_HIG_PAD2); + gtk_box_pack_start (GTK_BOX(wvbox), whbox1, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(whbox1), + gtk_label_new (_("Start on label")), FALSE, FALSE, 0); + adjust = + gtk_adjustment_new (1, 1.0, merge->labels_per_sheet, 1.0, 10.0, + 10.0); + merge->first_spin = + gtk_spin_button_new (GTK_ADJUSTMENT (adjust), 1.0, 0); + gtk_box_pack_start (GTK_BOX(whbox1), merge->first_spin, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(whbox1), + gtk_label_new (_("on 1st sheet")), FALSE, FALSE, 0); + + /* Blank line */ + gtk_box_pack_start (GTK_BOX(wvbox), gtk_label_new (""), FALSE, FALSE, 0); + + /* Copy & collate controls*/ + whbox1 = gtk_hbox_new (FALSE, GL_HIG_PAD2); + gtk_box_pack_start (GTK_BOX(wvbox), whbox1, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(whbox1), + gtk_label_new (_("Copies:")), FALSE, FALSE, 0); + adjust = gtk_adjustment_new (1, 1.0, 10.0, 1.0, 10.0, 10.0); + merge->copies_spin = gtk_spin_button_new (GTK_ADJUSTMENT (adjust), + 1.0, 0); + gtk_box_pack_start (GTK_BOX(whbox1), merge->copies_spin, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(whbox1), gtk_label_new (" "), FALSE, FALSE, 0); + merge->collate_check = gtk_check_button_new_with_label (_("Collate")); + gtk_box_pack_start (GTK_BOX(whbox1), merge->collate_check, FALSE, FALSE, 0); + pixbuf = gdk_pixbuf_new_from_xpm_data ( (const char **)nocollate_xpm); + merge->collate_image = gtk_image_new_from_pixbuf(pixbuf); + gtk_widget_set_sensitive (merge->collate_check, FALSE); + gtk_widget_set_sensitive (merge->collate_image, FALSE); + + gtk_box_pack_start (GTK_BOX(whbox1), merge->collate_image, FALSE, FALSE, 0); + + /* Connect signals to controls */ + g_signal_connect (G_OBJECT (merge->mini_preview), "clicked", + G_CALLBACK (preview_clicked), merge); + g_signal_connect (G_OBJECT (merge->collate_check), "toggled", + G_CALLBACK (collate_check_cb), merge); + g_signal_connect (G_OBJECT (merge->copies_spin), "changed", + G_CALLBACK (spin_cb), merge); + g_signal_connect (G_OBJECT (merge->first_spin), "changed", + G_CALLBACK (spin_cb), merge); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Enable/Disable appropriate controls due to radio button toggle.*/ +/*--------------------------------------------------------------------------*/ +static void +collate_check_cb (GtkToggleButton * togglebutton, + gpointer user_data) +{ + glWdgtPrintMerge *merge = GL_WDGT_PRINT_MERGE (user_data); + GdkPixbuf *pixbuf; + + if (gtk_toggle_button_get_active (togglebutton)) { + + pixbuf = + gdk_pixbuf_new_from_xpm_data ( (const char **)collate_xpm); + + } else { + + pixbuf = + gdk_pixbuf_new_from_xpm_data ( (const char **)nocollate_xpm); + + } + gtk_image_set_from_pixbuf (GTK_IMAGE (merge->collate_image), + pixbuf); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. modify widget due to change of first spin button */ +/*--------------------------------------------------------------------------*/ +static void +spin_cb (GtkSpinButton * spinbutton, + gpointer user_data) +{ + glWdgtPrintMerge *merge = GL_WDGT_PRINT_MERGE (user_data); + gint first, last, n_copies; + + first = + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON + (merge->first_spin)); + + n_copies = + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON + (merge->copies_spin)); + last = first + (n_copies * merge->n_records) - 1; + gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW(merge->mini_preview), + first, last ); + + gtk_widget_set_sensitive (merge->collate_check, (n_copies > 1)); + gtk_widget_set_sensitive (merge->collate_image, (n_copies > 1)); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Canvas event handler, select first and last items. */ +/*--------------------------------------------------------------------------*/ +static void +preview_clicked (glWdgtMiniPreview *mini_preview, + gint first, + gpointer user_data) +{ + glWdgtPrintMerge *merge = GL_WDGT_PRINT_MERGE (user_data); + gint n_copies, last; + + gtk_spin_button_set_value (GTK_SPIN_BUTTON (merge->first_spin), + first); + + n_copies = + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON + (merge->copies_spin)); + last = first + (n_copies * merge->n_records) - 1; + gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW (merge->mini_preview), + first, last); + +} + +/****************************************************************************/ +/* query selected range of labels within sheet or number of sheets. */ +/****************************************************************************/ +void +gl_wdgt_print_merge_get_copies (glWdgtPrintMerge *merge, + gint *n_copies, + gint *first_label, + gboolean *collate_flag, + gint *n_sheets) +{ + *n_copies = + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON + (merge->copies_spin)); + *first_label = + gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON + (merge->first_spin)); + *collate_flag = + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON + (merge->collate_check)); + + *n_sheets = ceil ( (double)(*first_label - 1 + (*n_copies * merge->n_records))/ (double)merge->labels_per_sheet ); +} + +/****************************************************************************/ +/* set range of labels within sheet or number of sheets */ +/****************************************************************************/ +void +gl_wdgt_print_merge_set_copies (glWdgtPrintMerge * merge, + gint n_copies, + gint first_label, + gint n_records, + gboolean collate_flag) +{ + gint last_label; + + merge->n_records = n_records; + + gtk_spin_button_set_value (GTK_SPIN_BUTTON (merge->copies_spin), + n_copies); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (merge->first_spin), + first_label); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (merge->collate_check), + collate_flag); + + last_label = first_label + (n_copies * n_records) - 1; + gl_wdgt_mini_preview_highlight_range (GL_WDGT_MINI_PREVIEW (merge->mini_preview), + first_label, last_label ); +} diff --git a/glabels2/src/wdgt-print-merge.h b/glabels2/src/wdgt-print-merge.h new file mode 100644 index 00000000..9e3a24da --- /dev/null +++ b/glabels2/src/wdgt-print-merge.h @@ -0,0 +1,82 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * wdgt_print_merge.h: print merge widget module header file + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WDGT_PRINT_MERGE_H__ +#define __WDGT_PRINT_MERGE_H__ + +#include "label.h" +#include + +G_BEGIN_DECLS + +#define GL_TYPE_WDGT_PRINT_MERGE (gl_wdgt_print_merge_get_type ()) +#define GL_WDGT_PRINT_MERGE(obj) \ + (GTK_CHECK_CAST((obj), GL_TYPE_WDGT_PRINT_MERGE, glWdgtPrintMerge )) +#define GL_WDGT_PRINT_MERGE_CLASS(klass) \ + (GTK_CHECK_CLASS_CAST ((klass), GL_TYPE_WDGT_PRINT_MERGE, glWdgtPrintMergeClass)) +#define GL_IS_WDGT_PRINT_MERGE(obj) \ + (GTK_CHECK_TYPE ((obj), GL_TYPE_WDGT_PRINT_MERGE)) +#define GL_IS_WDGT_PRINT_MERGE_CLASS(klass) \ + (GTK_CHECK_CLASS_TYPE ((klass), GL_TYPE_WDGT_PRINT_MERGE)) + +typedef struct _glWdgtPrintMerge glWdgtPrintMerge; +typedef struct _glWdgtPrintMergeClass glWdgtPrintMergeClass; + +struct _glWdgtPrintMerge { + GtkHBox parent_widget; + + gint labels_per_sheet; + GtkWidget *mini_preview; + + gint n_records; + + GtkWidget *copies_spin; + GtkWidget *first_spin; + GtkWidget *collate_image; + GtkWidget *collate_check; +}; + +struct _glWdgtPrintMergeClass { + GtkHBoxClass parent_class; +}; + +GType gl_wdgt_print_merge_get_type (void) G_GNUC_CONST; + +GtkWidget *gl_wdgt_print_merge_new (glLabel *label); + +void gl_wdgt_print_merge_get_copies (glWdgtPrintMerge *merge, + gint *n_copies, + gint *first_label, + gboolean *collate_flag, + gint *n_sheets); + +void gl_wdgt_print_merge_set_copies (glWdgtPrintMerge *merge, + gint n_copies, + gint first_label, + gint n_records, + gboolean collate_flag); + +G_END_DECLS + +#endif diff --git a/glabels2/src/wdgt-rotate-label.c b/glabels2/src/wdgt-rotate-label.c new file mode 100644 index 00000000..4edca601 --- /dev/null +++ b/glabels2/src/wdgt-rotate-label.c @@ -0,0 +1,395 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * wdgt_rotate_label.c: label rotate selection widget module + * + * Copyright (C) 2001-2006 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "wdgt-rotate-label.h" + +#include +#include +#include +#include +#include +#include + +#include "marshal.h" +#include "color.h" +#include +#include "cairo-label-path.h" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ +#define MINI_PREVIEW_MAX_PIXELS 48 +#define MINI_PREVIEW_CANVAS_PIXELS (MINI_PREVIEW_MAX_PIXELS + 8) + +#define LINE_COLOR GL_COLOR(0,0,0) +#define FILL_COLOR GL_COLOR(255,255,255) + +#define LINE_WIDTH_PIXELS 1.0 + +#define SHADOW_X_OFFSET 3 +#define SHADOW_Y_OFFSET 3 + + +/*===========================================*/ +/* Private types */ +/*===========================================*/ + +struct _glWdgtRotateLabelPrivate { + + GtkWidget *rotate_check; + GtkWidget *rotate_drawingarea; + + lglTemplate *template; +}; + +enum { + CHANGED, + LAST_SIGNAL +}; + +/*===========================================*/ +/* Private globals */ +/*===========================================*/ + +static gint wdgt_rotate_label_signals[LAST_SIGNAL] = { 0 }; + +/*===========================================*/ +/* Local function prototypes */ +/*===========================================*/ + +static void gl_wdgt_rotate_label_finalize (GObject *object); + +static void gl_wdgt_rotate_label_construct (glWdgtRotateLabel *rotate_label); + +static void entry_changed_cb (GtkToggleButton *toggle, + gpointer user_data); + +static void drawingarea_update (GtkDrawingArea *drawing_area, + lglTemplate *template, + gboolean rotate_flag); + +static gboolean expose_cb (GtkWidget *drawingarea, + GdkEventExpose *event, + gpointer user_data); + + +/****************************************************************************/ +/* Boilerplate Object stuff. */ +/****************************************************************************/ +G_DEFINE_TYPE (glWdgtRotateLabel, gl_wdgt_rotate_label, GTK_TYPE_VBOX); + + +static void +gl_wdgt_rotate_label_class_init (glWdgtRotateLabelClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + gl_wdgt_rotate_label_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_wdgt_rotate_label_finalize; + + wdgt_rotate_label_signals[CHANGED] = + g_signal_new ("changed", + G_OBJECT_CLASS_TYPE(object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (glWdgtRotateLabelClass, changed), + NULL, NULL, + gl_marshal_VOID__VOID, + G_TYPE_NONE, 0); + +} + +static void +gl_wdgt_rotate_label_init (glWdgtRotateLabel *rotate_label) +{ + rotate_label->priv = g_new0 (glWdgtRotateLabelPrivate, 1); +} + +static void +gl_wdgt_rotate_label_finalize (GObject *object) +{ + glWdgtRotateLabel *rotate_label = GL_WDGT_ROTATE_LABEL (object); + + g_return_if_fail (object != NULL); + g_return_if_fail (GL_IS_WDGT_ROTATE_LABEL (object)); + + if (rotate_label->priv->template) { + lgl_template_free (rotate_label->priv->template); + rotate_label->priv->template = NULL; + } + g_free (rotate_label->priv); + + G_OBJECT_CLASS (gl_wdgt_rotate_label_parent_class)->finalize (object); +} + +GtkWidget * +gl_wdgt_rotate_label_new (void) +{ + glWdgtRotateLabel *rotate_label; + + rotate_label = g_object_new (gl_wdgt_rotate_label_get_type (), NULL); + + gl_wdgt_rotate_label_construct (rotate_label); + + return GTK_WIDGET (rotate_label); +} + +/*--------------------------------------------------------------------------*/ +/* Construct composite widget. */ +/*--------------------------------------------------------------------------*/ +static void +gl_wdgt_rotate_label_construct (glWdgtRotateLabel *rotate_label) +{ + GladeXML *gui; + GtkWidget *hbox; + + g_return_if_fail (GL_IS_WDGT_ROTATE_LABEL (rotate_label)); + g_return_if_fail (rotate_label->priv != NULL); + + gui = glade_xml_new (GLABELS_GLADE_DIR "wdgt-rotate-label.glade", + "rotate_hbox", NULL); + + if (!gui) { + g_critical ("Could not open wdgt-media-select.glade. gLabels may not be installed correctly!"); + return; + } + + hbox = glade_xml_get_widget (gui, "rotate_hbox"); + gtk_container_add (GTK_CONTAINER (rotate_label), hbox); + + rotate_label->priv->rotate_check = glade_xml_get_widget (gui, "rotate_check"); + rotate_label->priv->rotate_drawingarea = glade_xml_get_widget (gui, "rotate_drawingarea"); + + g_object_unref (gui); + + + gtk_widget_set_size_request (rotate_label->priv->rotate_drawingarea, + MINI_PREVIEW_CANVAS_PIXELS, + MINI_PREVIEW_CANVAS_PIXELS); + + /* Connect signals to controls */ + g_signal_connect (G_OBJECT (rotate_label->priv->rotate_check), + "toggled", + G_CALLBACK (entry_changed_cb), rotate_label); + g_signal_connect (G_OBJECT (rotate_label->priv->rotate_drawingarea), + "expose_event", + G_CALLBACK (expose_cb), rotate_label); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. modify widget due to change of check button */ +/*--------------------------------------------------------------------------*/ +static void +entry_changed_cb (GtkToggleButton *toggle, + gpointer user_data) +{ + glWdgtRotateLabel *rotate_label = GL_WDGT_ROTATE_LABEL (user_data); + + if (rotate_label->priv->template != NULL) { + /* Update mini_preview canvas & details with template */ + drawingarea_update (GTK_DRAWING_AREA (rotate_label->priv->rotate_drawingarea), + rotate_label->priv->template, + gtk_toggle_button_get_active (toggle)); + } + + /* Emit our "changed" signal */ + g_signal_emit (G_OBJECT (user_data), + wdgt_rotate_label_signals[CHANGED], 0); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Update mini-preview from template . */ +/*--------------------------------------------------------------------------*/ +static void +drawingarea_update (GtkDrawingArea *drawing_area, + lglTemplate *template, + gboolean rotate_flag) +{ + const lglTemplateFrame *frame; + gdouble m, m_canvas, w, h, scale; + GtkStyle *style; + guint line_color, fill_color, shadow_color; + cairo_t *cr; + + if (!GTK_WIDGET_DRAWABLE (GTK_WIDGET (drawing_area))) + { + return; + } + + /* Clear surface */ + gdk_window_clear (GTK_WIDGET (drawing_area)->window); + + if (template == NULL) + { + return; + } + + frame = (lglTemplateFrame *)template->frames->data; + + if (rotate_flag) + { + lgl_template_frame_get_size (frame, &h, &w); + } + else + { + lgl_template_frame_get_size (frame, &w, &h); + } + m = MAX (w, h); + scale = MINI_PREVIEW_MAX_PIXELS / m; + m_canvas = MINI_PREVIEW_CANVAS_PIXELS / scale; + + style = gtk_widget_get_style (GTK_WIDGET (drawing_area)); + + /* Adjust sensitivity (should the canvas be grayed?) */ + if (w != h) { + line_color = LINE_COLOR; + fill_color = FILL_COLOR; + } else { + line_color = gl_color_from_gdk_color (&style->text[GTK_STATE_INSENSITIVE]); + fill_color = gl_color_from_gdk_color (&style->base[GTK_STATE_INSENSITIVE]); + } + + shadow_color = gl_color_from_gdk_color (&style->bg[GTK_STATE_ACTIVE]); + + + cr = gdk_cairo_create (GTK_WIDGET (drawing_area)->window); + + cairo_identity_matrix (cr); + cairo_translate (cr, MINI_PREVIEW_CANVAS_PIXELS/2, MINI_PREVIEW_CANVAS_PIXELS/2); + cairo_scale (cr, scale, scale); + cairo_translate (cr, -w/2.0, -h/2.0); + + /* + * Shadow + */ + cairo_save (cr); + cairo_translate (cr, SHADOW_X_OFFSET/scale, SHADOW_Y_OFFSET/scale); + gl_cairo_label_path (cr, template, rotate_flag, FALSE); + + cairo_set_source_rgb (cr, GL_COLOR_RGB_ARGS (shadow_color)); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_fill (cr); + cairo_restore (cr); + + /* + * Label + outline + */ + gl_cairo_label_path (cr, template, rotate_flag, FALSE); + + cairo_set_source_rgb (cr, GL_COLOR_RGB_ARGS (fill_color)); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_fill_preserve (cr); + + cairo_set_line_width (cr, LINE_WIDTH_PIXELS/scale); + cairo_set_source_rgb (cr, GL_COLOR_RGB_ARGS (line_color)); + cairo_stroke (cr); + + + cairo_destroy (cr); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Expose handler. */ +/*--------------------------------------------------------------------------*/ +static gboolean +expose_cb (GtkWidget *drawingarea, GdkEventExpose *event, gpointer user_data) +{ + glWdgtRotateLabel *rotate_label = GL_WDGT_ROTATE_LABEL (user_data); + + drawingarea_update (GTK_DRAWING_AREA (drawingarea), + rotate_label->priv->template, + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rotate_label->priv->rotate_check))); + + return FALSE; +} + +/****************************************************************************/ +/* query state of widget. */ +/****************************************************************************/ +gboolean +gl_wdgt_rotate_label_get_state (glWdgtRotateLabel *rotate_label) +{ + return + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON + (rotate_label->priv->rotate_check)); +} + +/****************************************************************************/ +/* set state of widget. */ +/****************************************************************************/ +void +gl_wdgt_rotate_label_set_state (glWdgtRotateLabel *rotate_label, + gboolean state) +{ + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (rotate_label->priv->rotate_check), state); +} + +/****************************************************************************/ +/* set template for widget. */ +/****************************************************************************/ +void +gl_wdgt_rotate_label_set_template_name (glWdgtRotateLabel *rotate_label, + gchar *name) +{ + lglTemplate *template; + const lglTemplateFrame *frame; + gdouble raw_w, raw_h; + + if (name == NULL) + { + rotate_label->priv->template = NULL; + + gtk_widget_set_sensitive (rotate_label->priv->rotate_check, + FALSE); + + drawingarea_update (GTK_DRAWING_AREA (rotate_label->priv->rotate_drawingarea), + NULL, + FALSE); + } + else + { + template = lgl_db_lookup_template_from_name (name); + frame = (lglTemplateFrame *)template->frames->data; + + rotate_label->priv->template = template; + lgl_template_frame_get_size (frame, &raw_w, &raw_h); + + gtk_widget_set_sensitive (rotate_label->priv->rotate_check, + (raw_w != raw_h)); + + drawingarea_update (GTK_DRAWING_AREA (rotate_label->priv->rotate_drawingarea), + rotate_label->priv->template, + FALSE); + } + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON + (rotate_label->priv->rotate_check), FALSE); +} + diff --git a/glabels2/src/wdgt-rotate-label.h b/glabels2/src/wdgt-rotate-label.h new file mode 100644 index 00000000..3d8b412e --- /dev/null +++ b/glabels2/src/wdgt-rotate-label.h @@ -0,0 +1,74 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * wdgt_rotate_label.h: label rotate selection widget module header file + * + * Copyright (C) 2001-2006 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WDGT_ROTATE_LABEL_H__ +#define __WDGT_ROTATE_LABEL_H__ + +#include + +G_BEGIN_DECLS + +#define GL_TYPE_WDGT_ROTATE_LABEL (gl_wdgt_rotate_label_get_type ()) +#define GL_WDGT_ROTATE_LABEL(obj) \ + (GTK_CHECK_CAST((obj), GL_TYPE_WDGT_ROTATE_LABEL, glWdgtRotateLabel )) +#define GL_WDGT_ROTATE_LABEL_CLASS(klass) \ + (GTK_CHECK_CLASS_CAST ((klass), GL_TYPE_WDGT_ROTATE_LABEL, glWdgtRotateLabelClass)) +#define GL_IS_WDGT_ROTATE_LABEL(obj) \ + (GTK_CHECK_TYPE ((obj), GL_TYPE_WDGT_ROTATE_LABEL)) +#define GL_IS_WDGT_ROTATE_LABEL_CLASS(klass) \ + (GTK_CHECK_CLASS_TYPE ((klass), GL_TYPE_WDGT_ROTATE_LABEL)) + +typedef struct _glWdgtRotateLabel glWdgtRotateLabel; +typedef struct _glWdgtRotateLabelClass glWdgtRotateLabelClass; + +typedef struct _glWdgtRotateLabelPrivate glWdgtRotateLabelPrivate; + +struct _glWdgtRotateLabel { + GtkVBox parent_widget; + + glWdgtRotateLabelPrivate *priv; +}; + +struct _glWdgtRotateLabelClass { + GtkVBoxClass parent_class; + + void (*changed) (glWdgtRotateLabel *wdgt_rotate_label, + gpointer user_data); +}; + +GType gl_wdgt_rotate_label_get_type (void) G_GNUC_CONST; + +GtkWidget *gl_wdgt_rotate_label_new (void); + +gboolean gl_wdgt_rotate_label_get_state (glWdgtRotateLabel *rotate_label); + +void gl_wdgt_rotate_label_set_state (glWdgtRotateLabel *rotate_label, + gboolean state); + +void gl_wdgt_rotate_label_set_template_name (glWdgtRotateLabel *rotate_label, + gchar *name); + +G_END_DECLS + +#endif diff --git a/glabels2/src/window.c b/glabels2/src/window.c new file mode 100644 index 00000000..33e3b7e7 --- /dev/null +++ b/glabels2/src/window.c @@ -0,0 +1,616 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * window.c: a gLabels app window + * + * Copyright (C) 2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "window.h" + +#include +#include +#include +#include +#include +#include + +#include "ui.h" +#include "ui-commands.h" +#include "util.h" +#include "xml-label.h" +#include "prefs.h" +#include "file.h" + +#include "debug.h" + +/*===========================================================================*/ +/* Private macros and constants. */ +/*===========================================================================*/ + +#define DEFAULT_WINDOW_WIDTH 788 +#define DEFAULT_WINDOW_HEIGHT 600 + +#define CURSOR_INFO_WIDTH 150 +#define ZOOM_INFO_WIDTH 50 + +/*===========================================================================*/ +/* Private globals */ +/*===========================================================================*/ + +static GList *window_list = NULL; + + +/*===========================================================================*/ +/* Local function prototypes */ +/*===========================================================================*/ + +static void gl_window_finalize (GObject *object); +static void gl_window_destroy (GtkObject *gtk_object); + +static void set_window_title (glWindow *window, + glLabel *label); + +static gboolean window_delete_event_cb (glWindow *window, + GdkEvent *event, + gpointer user_data); + +static void selection_changed_cb (glView *view, + glWindow *window); + +static void context_menu_activate_cb (glView *view, + gint button, + guint32 activate_time, + glWindow *window); + +static void zoom_changed_cb (glView *view, + gdouble zoom, + glWindow *window); + +static void pointer_moved_cb (glView *view, + gdouble x, + gdouble y, + glWindow *window); + +static void pointer_exit_cb (glView *view, + glWindow *window); + +static void name_changed_cb (glLabel *label, + glWindow *window); + +static void modified_changed_cb (glLabel *label, + glWindow *window); + + +/****************************************************************************/ +/* Boilerplate Object stuff. */ +/****************************************************************************/ +G_DEFINE_TYPE (glWindow, gl_window, GTK_TYPE_WINDOW); + + +static void +gl_window_class_init (glWindowClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (class); + + gl_debug (DEBUG_WINDOW, "START"); + + gl_window_parent_class = g_type_class_peek_parent (class); + + object_class->finalize = gl_window_finalize; + + gtk_object_class->destroy = gl_window_destroy; + + gl_debug (DEBUG_WINDOW, "END"); +} + +static void +gl_window_init (glWindow *window) +{ + GtkWidget *vbox1; + GtkUIManager *ui; + GtkWidget *status_hbox; + + gl_debug (DEBUG_WINDOW, "START"); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (window), vbox1); + + window->ui = ui = gl_ui_new (window); + gtk_box_pack_start (GTK_BOX (vbox1), + gtk_ui_manager_get_widget (ui, "/MenuBar"), + FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox1), + gtk_ui_manager_get_widget (ui, "/MainToolBar"), + FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox1), + gtk_ui_manager_get_widget (ui, "/DrawingToolBar"), + FALSE, FALSE, 0); + + window->hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox1), window->hbox, TRUE, TRUE, 0); + + window->sidebar = GL_UI_SIDEBAR (gl_ui_sidebar_new ()); + gtk_box_pack_end (GTK_BOX (window->hbox), GTK_WIDGET (window->sidebar), FALSE, FALSE, 0); + + window->property_bar = GL_UI_PROPERTY_BAR (gl_ui_property_bar_new ()); + gtk_box_pack_start (GTK_BOX (vbox1), GTK_WIDGET (window->property_bar), FALSE, FALSE, 0); + + status_hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox1), status_hbox, FALSE, FALSE, 0); + + window->status_bar = gtk_statusbar_new (); + gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (window->status_bar), FALSE); + gtk_box_pack_start (GTK_BOX (status_hbox), + window->status_bar, + TRUE, TRUE, 0); + window->zoom_info = gtk_label_new (NULL); + gtk_widget_set_size_request (window->zoom_info, ZOOM_INFO_WIDTH, -1); + window->zoom_info_frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME(window->zoom_info_frame), GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER(window->zoom_info_frame), window->zoom_info); + gtk_widget_show_all (window->zoom_info_frame); + gtk_box_pack_end (GTK_BOX (status_hbox), + window->zoom_info_frame, + FALSE, FALSE, 0); + + window->cursor_info = gtk_label_new (NULL); + gtk_widget_set_size_request (window->cursor_info, CURSOR_INFO_WIDTH, -1); + window->cursor_info_frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME(window->cursor_info_frame), GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER(window->cursor_info_frame), window->cursor_info); + gtk_widget_show_all (window->cursor_info_frame); + gtk_box_pack_end (GTK_BOX (status_hbox), + window->cursor_info_frame, + FALSE, FALSE, 0); + + gtk_window_set_default_size (GTK_WINDOW (window), + DEFAULT_WINDOW_WIDTH, + DEFAULT_WINDOW_HEIGHT); + + g_signal_connect (G_OBJECT(window), "delete-event", + G_CALLBACK(window_delete_event_cb), NULL); + + window->menu_tips_context_id = + gtk_statusbar_get_context_id (GTK_STATUSBAR (window->status_bar), "menu_tips"); + + window->print_settings = NULL; + window->merge_dialog = NULL; + window->context_menu = GTK_MENU (gtk_ui_manager_get_widget (ui, "/ContextMenu")); + window->empty_selection_context_menu = + GTK_MENU (gtk_ui_manager_get_widget (ui, "/EmptySelectionContextMenu")); + + window->view = NULL; + + window_list = g_list_append (window_list, window); + + gl_debug (DEBUG_WINDOW, "END"); +} + +static void +gl_window_finalize (GObject *object) +{ + gl_debug (DEBUG_WINDOW, "START"); + + g_return_if_fail (object != NULL); + g_return_if_fail (GL_IS_WINDOW (object)); + + G_OBJECT_CLASS (gl_window_parent_class)->finalize (object); + + gl_debug (DEBUG_WINDOW, "END"); +} + +static void +gl_window_destroy (GtkObject *gtk_object) +{ + glWindow *window; + + gl_debug (DEBUG_WINDOW, "START"); + + g_return_if_fail (gtk_object != NULL); + g_return_if_fail (GL_IS_WINDOW (gtk_object)); + + window = GL_WINDOW (gtk_object); + window_list = g_list_remove (window_list, window); + + if (window->ui) { + gl_ui_unref(window->ui); + window->ui = NULL; + } + + if (GTK_OBJECT_CLASS (gl_window_parent_class)->destroy) { + GTK_OBJECT_CLASS (gl_window_parent_class)->destroy (gtk_object); + } + + gl_debug (DEBUG_WINDOW, "END"); +} + + +/****************************************************************************/ +/** Create a glabels window. */ +/****************************************************************************/ +GtkWidget * +gl_window_new (void) +{ + glWindow *window; + + gl_debug (DEBUG_WINDOW, "START"); + + window = g_object_new (GL_TYPE_WINDOW, + "title", _("(none) - gLabels"), + NULL); + + gl_debug (DEBUG_WINDOW, "window=%p", window); + gl_debug (DEBUG_WINDOW, "view=%p", window->view); + + gl_debug (DEBUG_WINDOW, "END"); + + return GTK_WIDGET(window); +} + +/****************************************************************************/ +/** Create a glabels window from a label. */ +/****************************************************************************/ +GtkWidget* +gl_window_new_from_label (glLabel *label) +{ + glWindow *window; + + gl_debug (DEBUG_WINDOW, "START"); + + window = GL_WINDOW (gl_window_new ()); + + gl_window_set_label (window, label); + + gl_debug (DEBUG_WINDOW, "END"); + + return GTK_WIDGET(window); +} + +/****************************************************************************/ +/** Create a glabels window from a glabels file. */ +/****************************************************************************/ +GtkWidget* +gl_window_new_from_file (const gchar *filename) +{ + glWindow *window; + glLabel *label; + gchar *abs_filename; + glXMLLabelStatus status; + + gl_debug (DEBUG_WINDOW, "START"); + + window = GL_WINDOW (gl_window_new ()); + + abs_filename = gl_util_make_absolute (filename); + label = gl_xml_label_open (abs_filename, &status); + g_free (abs_filename); + + gl_window_set_label (window, label); + + gl_debug (DEBUG_WINDOW, "END"); + + return GTK_WIDGET(window); +} + +/****************************************************************************/ +/** Is window empty? */ +/****************************************************************************/ +gboolean +gl_window_is_empty (glWindow *window) +{ + g_return_val_if_fail (GL_IS_WINDOW (window), FALSE); + + gl_debug (DEBUG_WINDOW, "return %d", (window->view == NULL) ); + return ( window->view == NULL ); +} + +/****************************************************************************/ +/** Create view from label and place in window. */ +/****************************************************************************/ +void +gl_window_set_label (glWindow *window, + glLabel *label) +{ + gchar *string; + + gl_debug (DEBUG_WINDOW, "START"); + + g_return_if_fail (GL_IS_WINDOW (window)); + g_return_if_fail (GL_IS_LABEL (label)); + + gl_label_clear_modified (label); + + set_window_title (window, label); + + if ( window->view != NULL ) { + gtk_widget_destroy (window->view); + window->view = NULL; + } + + window->view = gl_view_new (label); + gtk_box_pack_start (GTK_BOX (window->hbox), window->view,TRUE, TRUE, 0); + + gtk_widget_show_all (window->view); + + gl_view_zoom_to_fit (GL_VIEW(window->view)); + + if (gl_prefs->grid_visible) { + gl_view_show_grid (GL_VIEW(window->view)); + } else { + gl_view_hide_grid (GL_VIEW(window->view)); + } + + if (gl_prefs->markup_visible) { + gl_view_show_markup (GL_VIEW(window->view)); + } else { + gl_view_hide_markup (GL_VIEW(window->view)); + } + + gl_ui_update_all (window->ui, GL_VIEW(window->view)); + + gl_ui_property_bar_set_view (window->property_bar, GL_VIEW(window->view)); + gl_ui_sidebar_set_view (window->sidebar, GL_VIEW(window->view)); + + string = g_strdup_printf ("%3.0f%%", + 100.0*gl_view_get_zoom (GL_VIEW(window->view))); + gtk_label_set_text (GTK_LABEL(window->zoom_info), string); + g_free (string); + + g_signal_connect (G_OBJECT(window->view), "selection_changed", + G_CALLBACK(selection_changed_cb), window); + + g_signal_connect (G_OBJECT(window->view), "context_menu_activate", + G_CALLBACK(context_menu_activate_cb), window); + + g_signal_connect (G_OBJECT(window->view), "zoom_changed", + G_CALLBACK(zoom_changed_cb), window); + + g_signal_connect (G_OBJECT(window->view), "pointer_moved", + G_CALLBACK(pointer_moved_cb), window); + + g_signal_connect (G_OBJECT(window->view), "pointer_exit", + G_CALLBACK(pointer_exit_cb), window); + + g_signal_connect (G_OBJECT(label), "name_changed", + G_CALLBACK(name_changed_cb), window); + + g_signal_connect (G_OBJECT(label), "modified_changed", + G_CALLBACK(modified_changed_cb), window); + + gl_debug (DEBUG_WINDOW, "END"); +} + +/****************************************************************************/ +/** Return list of glabels windows. */ +/****************************************************************************/ +const GList * +gl_window_get_window_list (void) +{ + gl_debug (DEBUG_WINDOW, ""); + return window_list; +} + +/*---------------------------------------------------------------------------*/ +/** PRIVATE. Set window title based on name and state of label. */ +/*---------------------------------------------------------------------------*/ +static void +set_window_title (glWindow *window, + glLabel *label) +{ + gchar *name, *title; + + gl_debug (DEBUG_WINDOW, "START"); + + g_return_if_fail (window && GL_IS_WINDOW (window)); + g_return_if_fail (label && GL_IS_LABEL (label)); + + name = gl_label_get_short_name (label); + g_return_if_fail (name != NULL); + + if (gl_label_is_modified (label)) { + title = g_strdup_printf ("%s %s - gLabels", + name, _("(modified)")); + } else { + title = g_strdup_printf ("%s - gLabels", name); + } + + gtk_window_set_title (GTK_WINDOW(window), title); + + g_free (name); + g_free (title); + + gl_debug (DEBUG_WINDOW, "END"); +} + +/*-------------------------------------------------------------------------*/ +/** PRIVATE. Window "delete-event" callback. */ +/*-------------------------------------------------------------------------*/ +static gboolean +window_delete_event_cb (glWindow *window, + GdkEvent *event, + gpointer user_data) +{ + gl_debug (DEBUG_WINDOW, "START"); + + g_return_val_if_fail (window && GL_IS_WINDOW (window), TRUE); + + gl_file_close (window); + + gl_debug (DEBUG_WINDOW, "END"); + + return TRUE; +} + +/*---------------------------------------------------------------------------*/ +/** PRIVATE. View "selection state changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +selection_changed_cb (glView *view, + glWindow *window) +{ + gl_debug (DEBUG_WINDOW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + g_return_if_fail (window && GL_IS_WINDOW (window)); + + gl_ui_update_selection_verbs (window->ui, view); + + gl_debug (DEBUG_WINDOW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/** PRIVATE. View "context menu activate" callback. */ +/*---------------------------------------------------------------------------*/ +static void +context_menu_activate_cb (glView *view, + gint button, + guint32 activate_time, + glWindow *window) +{ + gl_debug (DEBUG_WINDOW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + g_return_if_fail (window && GL_IS_WINDOW (window)); + + if (gl_view_is_selection_empty (view)) { + + gtk_menu_popup (GTK_MENU (window->empty_selection_context_menu), + NULL, NULL, NULL, NULL, button, activate_time); + + } else { + + gtk_menu_popup (GTK_MENU (window->context_menu), + NULL, NULL, NULL, NULL, button, activate_time); + + } + + gl_debug (DEBUG_WINDOW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/** PRIVATE. View "zoom state changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +zoom_changed_cb (glView *view, + gdouble zoom, + glWindow *window) +{ + gchar *string; + + gl_debug (DEBUG_WINDOW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + g_return_if_fail (window && GL_IS_WINDOW (window)); + + string = g_strdup_printf ("%3.0f%%", 100.0*zoom); + gtk_label_set_text (GTK_LABEL(window->zoom_info), string); + g_free (string); + + gl_ui_update_zoom_verbs (window->ui, view); + + gl_debug (DEBUG_WINDOW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/** PRIVATE. View "pointer moved" callback. */ +/*---------------------------------------------------------------------------*/ +static void +pointer_moved_cb (glView *view, + gdouble x, + gdouble y, + glWindow *window) +{ + gchar *string; + gdouble units_per_point; + gint units_precision; + + gl_debug (DEBUG_WINDOW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + g_return_if_fail (window && GL_IS_WINDOW (window)); + + units_per_point = gl_prefs_get_units_per_point (); + units_precision = gl_prefs_get_units_precision (); + + string = g_strdup_printf ("%.*f, %.*f", + units_precision, x*units_per_point, + units_precision, y*units_per_point); + gtk_label_set_text (GTK_LABEL(window->cursor_info), string); + g_free (string); + + gl_debug (DEBUG_WINDOW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/** PRIVATE. View "pointer exit" callback. */ +/*---------------------------------------------------------------------------*/ +static void +pointer_exit_cb (glView *view, + glWindow *window) +{ + gl_debug (DEBUG_WINDOW, "START"); + + g_return_if_fail (view && GL_IS_VIEW (view)); + g_return_if_fail (window && GL_IS_WINDOW (window)); + + gtk_label_set_text (GTK_LABEL(window->cursor_info), ""); + + gl_debug (DEBUG_WINDOW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/** PRIVATE. Label "name changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +name_changed_cb (glLabel *label, + glWindow *window) +{ + gl_debug (DEBUG_WINDOW, "START"); + + g_return_if_fail (label && GL_IS_LABEL (label)); + g_return_if_fail (window && GL_IS_WINDOW (window)); + + set_window_title (window, label); + + gl_debug (DEBUG_WINDOW, "END"); +} + +/*---------------------------------------------------------------------------*/ +/** PRIVATE. Label "modified state changed" callback. */ +/*---------------------------------------------------------------------------*/ +static void +modified_changed_cb (glLabel *label, + glWindow *window) +{ + gl_debug (DEBUG_WINDOW, "START"); + + g_return_if_fail (label && GL_IS_LABEL (label)); + g_return_if_fail (window && GL_IS_WINDOW (window)); + + set_window_title (window, label); + + gl_ui_update_modified_verbs (window->ui, label); + + gl_debug (DEBUG_WINDOW, "END"); +} + diff --git a/glabels2/src/window.h b/glabels2/src/window.h new file mode 100644 index 00000000..e5a63ab1 --- /dev/null +++ b/glabels2/src/window.h @@ -0,0 +1,101 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * window.h: a gLabels app window + * + * Copyright (C) 2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WINDOW_H__ +#define __WINDOW_H__ + +#include +#include +#include + +#include "view.h" +#include "label.h" +#include "ui-property-bar.h" +#include "ui-sidebar.h" +#include "print-op.h" +#include "merge-properties-dialog.h" + +G_BEGIN_DECLS + +#define GL_TYPE_WINDOW (gl_window_get_type ()) +#define GL_WINDOW(obj) \ + (GTK_CHECK_CAST((obj), GL_TYPE_WINDOW, glWindow )) +#define GL_WINDOW_CLASS(klass) \ + (GTK_CHECK_CLASS_CAST ((klass), GL_TYPE_WINDOW, glWindowClass)) +#define GL_IS_WINDOW(obj) \ + (GTK_CHECK_TYPE ((obj), GL_TYPE_WINDOW)) +#define GL_IS_WINDOW_CLASS(klass) \ + (GTK_CHECK_CLASS_TYPE ((klass), GL_TYPE_WINDOW)) + +typedef struct _glWindow glWindow; +typedef struct _glWindowClass glWindowClass; + +struct _glWindow { + GtkWindow parent_widget; + + GtkUIManager *ui; + + GtkWidget *view; + + GtkWidget *hbox; + + glUIPropertyBar *property_bar; + glUISidebar *sidebar; + + GtkWidget *status_bar; + GtkWidget *cursor_info; + GtkWidget *cursor_info_frame; + GtkWidget *zoom_info; + GtkWidget *zoom_info_frame; + + guint menu_tips_context_id; + + glPrintOpSettings *print_settings; + glMergePropertiesDialog *merge_dialog; + GtkMenu *context_menu; + GtkMenu *empty_selection_context_menu; +}; + +struct _glWindowClass { + GtkWindowClass parent_class; +}; + +GType gl_window_get_type (void) G_GNUC_CONST; + +GtkWidget *gl_window_new (void); + +GtkWidget *gl_window_new_from_file (const gchar *filename); + +GtkWidget *gl_window_new_from_label (glLabel *label); + +gboolean gl_window_is_empty (glWindow *window); + +void gl_window_set_label (glWindow *window, + glLabel *label); + +const GList *gl_window_get_window_list (void); + +G_END_DECLS + +#endif /* __WINDOW_H__ */ diff --git a/glabels2/src/xml-label-04.c b/glabels2/src/xml-label-04.c new file mode 100644 index 00000000..89a94b6b --- /dev/null +++ b/glabels2/src/xml-label-04.c @@ -0,0 +1,504 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * xml-label-04.c: GLabels xml label compat module + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "xml-label-04.h" + +#include + +#include "label-text.h" +#include "label-box.h" +#include "label-line.h" +#include "label-ellipse.h" +#include "label-image.h" +#include "label-barcode.h" +#include +#include + +#include "util.h" +#include "debug.h" + +static gboolean xml04_parse_media_description (xmlNodePtr node, + glLabel *label); +static void xml04_parse_object (xmlNodePtr node, + glLabelObject *object); +static void xml04_parse_text_props (xmlNodePtr node, + glLabelText *object); +static void xml04_parse_box_props (xmlNodePtr node, + glLabelBox *object); +static void xml04_parse_line_props (xmlNodePtr node, + glLabelLine *object); +static void xml04_parse_ellipse_props (xmlNodePtr node, + glLabelEllipse *object); +static void xml04_parse_image_props (xmlNodePtr node, + glLabelImage *object); +static void xml04_parse_barcode_props (xmlNodePtr node, + glLabelBarcode *object); +static void xml04_parse_merge_properties (xmlNodePtr node, + glLabel *label); + + +/****************************************************************************/ +/* PRIVATE. Parse xml doc structure and create label. */ +/****************************************************************************/ +glLabel *gl_xml_label_04_parse (xmlNodePtr root, + glXMLLabelStatus *status) +{ + glLabel *label; + xmlNodePtr node; + GObject *object; + gboolean rotate_flag; + + gl_debug (DEBUG_XML, "START"); + + *status = XML_LABEL_OK; + + if (!xmlStrEqual (root->name, (xmlChar *)"Label")) { + g_message (_("Bad root node = \"%s\""), root->name); + *status = XML_LABEL_ERROR_OPEN_PARSE; + return NULL; + } + + label = GL_LABEL (gl_label_new ()); + + rotate_flag = lgl_xml_get_prop_boolean (root, "rotate", FALSE); + gl_label_set_rotate_flag (label, rotate_flag); + + for (node = root->xmlChildrenNode; node != NULL; node = node->next) { + + gl_debug (DEBUG_XML, "node name = \"%s\"", node->name); + + if (!xmlNodeIsText (node)) { + if (xmlStrEqual (node->name, (xmlChar *)"Media_Type")) { + if (!xml04_parse_media_description (node, label)) { + *status = XML_LABEL_UNKNOWN_MEDIA; + } + } else if (xmlStrEqual (node->name, (xmlChar *)"Text")) { + object = gl_label_text_new (label); + xml04_parse_object (node, GL_LABEL_OBJECT(object)); + xml04_parse_text_props (node, GL_LABEL_TEXT(object)); + } else if (xmlStrEqual (node->name, (xmlChar *)"Box")) { + object = gl_label_box_new (label); + xml04_parse_object (node, GL_LABEL_OBJECT(object)); + xml04_parse_box_props (node, GL_LABEL_BOX(object)); + } else if (xmlStrEqual (node->name, (xmlChar *)"Line")) { + object = gl_label_line_new (label); + xml04_parse_object (node, GL_LABEL_OBJECT(object)); + xml04_parse_line_props (node, GL_LABEL_LINE(object)); + } else if (xmlStrEqual (node->name, (xmlChar *)"Ellipse")) { + object = gl_label_ellipse_new (label); + xml04_parse_object (node, GL_LABEL_OBJECT(object)); + xml04_parse_ellipse_props (node, + GL_LABEL_ELLIPSE(object)); + } else if (xmlStrEqual (node->name, (xmlChar *)"Image")) { + object = gl_label_image_new (label); + xml04_parse_object (node, GL_LABEL_OBJECT(object)); + xml04_parse_image_props (node, GL_LABEL_IMAGE(object)); + } else if (xmlStrEqual (node->name, (xmlChar *)"Barcode")) { + object = gl_label_barcode_new (label); + xml04_parse_object (node, GL_LABEL_OBJECT(object)); + xml04_parse_barcode_props (node, + GL_LABEL_BARCODE(object)); + } else if (xmlStrEqual (node->name, (xmlChar *)"Merge_Properties")) { + xml04_parse_merge_properties (node, label); + } else { + g_message (_("bad node = \"%s\""), node->name); + } + } + } + + gl_debug (DEBUG_XML, "END"); + + return label; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse Media Description node. */ +/*--------------------------------------------------------------------------*/ +static gboolean +xml04_parse_media_description (xmlNodePtr node, + glLabel *label) +{ + xmlChar *template_name; + lglTemplate *template; + gboolean ret; + + gl_debug (DEBUG_XML, "START"); + + template_name = xmlNodeGetContent (node); + + template = lgl_db_lookup_template_from_name ((gchar *)template_name); + if (template == NULL) { + g_message ("Undefined template \"%s\"", template_name); + /* Get a default */ + template = lgl_db_lookup_template_from_name (NULL); + ret = FALSE; + } else { + ret = TRUE; + } + + gl_label_set_template (label, template); + + lgl_template_free (template); + xmlFree (template_name); + + gl_debug (DEBUG_XML, "END"); + + return ret; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Object Node */ +/*--------------------------------------------------------------------------*/ +static void +xml04_parse_object (xmlNodePtr object_node, + glLabelObject *object) +{ + gdouble x, y; + + gl_debug (DEBUG_XML, "START"); + + x = lgl_xml_get_prop_double (object_node, "x", 0); + y = lgl_xml_get_prop_double (object_node, "y", 0); + + gl_label_object_set_position (object, x, y); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Label->Text Node Properties */ +/*--------------------------------------------------------------------------*/ +static void +xml04_parse_text_props (xmlNodePtr object_node, + glLabelText *object) +{ + xmlChar *font_family; + gdouble font_size; + PangoWeight font_weight; + gboolean font_italic_flag; + glColorNode *color_node; + PangoAlignment align; + xmlNodePtr line_node, text_node; + glTextNode *node_text; + GList *nodes, *lines; + gdouble w, h, x, y; + xmlChar *string; + + gl_debug (DEBUG_XML, "START"); + + font_family = xmlGetProp (object_node, (xmlChar *)"font_family"); + font_size = lgl_xml_get_prop_double (object_node, "font_size", 0); + string = xmlGetProp (object_node, (xmlChar *)"font_weight"); + font_weight = gl_util_string_to_weight ((gchar *)string); + xmlFree (string); + font_italic_flag = lgl_xml_get_prop_boolean (object_node, "font_italic", FALSE); + + string = xmlGetProp (object_node, (xmlChar *)"justify"); + align = gl_util_string_to_align ((gchar *)string); + xmlFree (string); + + color_node = gl_color_node_new_default (); + color_node->color = lgl_xml_get_prop_uint (object_node, "color", 0); + + gl_label_object_set_font_family (GL_LABEL_OBJECT(object), (gchar *)font_family); + gl_label_object_set_font_size (GL_LABEL_OBJECT(object), font_size); + gl_label_object_set_font_weight (GL_LABEL_OBJECT(object), font_weight); + gl_label_object_set_font_italic_flag (GL_LABEL_OBJECT(object), font_italic_flag); + gl_label_object_set_text_color (GL_LABEL_OBJECT(object), color_node); + gl_label_object_set_text_alignment (GL_LABEL_OBJECT(object), align); + + gl_color_node_free (&color_node); + + lines = NULL; + for (line_node = object_node->xmlChildrenNode; line_node != NULL; + line_node = line_node->next) { + + if (xmlStrEqual (line_node->name, (xmlChar *)"Line")) { + + gl_debug (DEBUG_XML, "->Line node"); + + nodes = NULL; + for (text_node = line_node->xmlChildrenNode; + text_node != NULL; text_node = text_node->next) { + + if (xmlStrEqual (text_node->name, (xmlChar *)"Field")) { + gl_debug (DEBUG_XML, "->Line->Field node"); + node_text = g_new0 (glTextNode, 1); + node_text->field_flag = TRUE; + node_text->data = + (gchar *)xmlGetProp (text_node, (xmlChar *)"name"); + nodes = + g_list_append (nodes, node_text); + } else if (xmlNodeIsText (text_node)) { + gl_debug (DEBUG_XML, "->Line->\"literal\" node"); + node_text = g_new0 (glTextNode, 1); + node_text->field_flag = FALSE; + node_text->data = + (gchar *)xmlNodeGetContent (text_node); + gl_debug (DEBUG_XML, "text = \"%s\"", + node_text->data); + nodes = + g_list_append (nodes, node_text); + } else { + g_message ("Unexpected Text Line child: \"%s\"", + text_node->name); + } + + } + lines = g_list_append (lines, nodes); + + } else if (!xmlNodeIsText (line_node)) { + g_message ("Unexpected Text child: \"%s\"", + line_node->name); + } + + } + + gl_label_text_set_lines (object, lines); + + gl_text_node_lines_free (&lines); + xmlFree (font_family); + + /* Adjust location. In 0.4.x, text was anchored at x,y */ + gl_label_object_get_position (GL_LABEL_OBJECT(object), &x, &y); + gl_label_object_get_size (GL_LABEL_OBJECT(object), &w, &h); + switch (align) { + case PANGO_ALIGN_LEFT: + /* nothing */ + break; + case PANGO_ALIGN_CENTER: + x -= w/2.0; + gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y); + break; + case PANGO_ALIGN_RIGHT: + x -= w; + gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y); + break; + default: + /* should not happen */ + break; + } + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Label->Box Node Properties */ +/*--------------------------------------------------------------------------*/ +static void +xml04_parse_box_props (xmlNodePtr node, + glLabelBox *object) +{ + gdouble w, h, line_width; + glColorNode *line_color_node; + glColorNode *fill_color_node; + + gl_debug (DEBUG_XML, "START"); + + w = lgl_xml_get_prop_double (node, "w", 0); + h = lgl_xml_get_prop_double (node, "h", 0); + + line_width = lgl_xml_get_prop_double (node, "line_width", 0); + + line_color_node = gl_color_node_new_default (); + line_color_node->color = lgl_xml_get_prop_uint (node, "line_color", 0); + + fill_color_node = gl_color_node_new_default (); + fill_color_node->color = lgl_xml_get_prop_uint (node, "fill_color", 0); + + gl_label_object_set_size (GL_LABEL_OBJECT(object), w, h); + gl_label_object_set_line_width (GL_LABEL_OBJECT(object), line_width); + gl_label_object_set_line_color (GL_LABEL_OBJECT(object), line_color_node); + gl_label_object_set_fill_color (GL_LABEL_OBJECT(object), fill_color_node); + + gl_color_node_free (&line_color_node); + gl_color_node_free (&fill_color_node); + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Label->Line Node Properties */ +/*--------------------------------------------------------------------------*/ +static void +xml04_parse_line_props (xmlNodePtr node, + glLabelLine *object) +{ + gdouble w, h, line_width; + glColorNode *line_color_node; + + gl_debug (DEBUG_XML, "START"); + + w = lgl_xml_get_prop_double (node, "dx", 0); + h = lgl_xml_get_prop_double (node, "dy", 0); + + line_width = lgl_xml_get_prop_double (node, "line_width", 0); + + line_color_node = gl_color_node_new_default (); + line_color_node->color = lgl_xml_get_prop_uint (node, "line_color", 0); + + gl_label_object_set_size (GL_LABEL_OBJECT(object), w, h); + gl_label_object_set_line_width (GL_LABEL_OBJECT(object), line_width); + gl_label_object_set_line_color (GL_LABEL_OBJECT(object), line_color_node); + + gl_color_node_free (&line_color_node); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Label->Ellipse Node Properties */ +/*--------------------------------------------------------------------------*/ +static void +xml04_parse_ellipse_props (xmlNodePtr node, + glLabelEllipse *object) +{ + gdouble w, h, line_width; + glColorNode *line_color_node; + glColorNode *fill_color_node; + + gl_debug (DEBUG_XML, "START"); + + w = lgl_xml_get_prop_double (node, "w", 0); + h = lgl_xml_get_prop_double (node, "h", 0); + + line_width = lgl_xml_get_prop_double (node, "line_width", 0); + + line_color_node = gl_color_node_new_default (); + line_color_node->color = lgl_xml_get_prop_uint (node, "line_color", 0); + + fill_color_node = gl_color_node_new_default (); + fill_color_node->color = lgl_xml_get_prop_uint (node, "fill_color", 0); + + gl_label_object_set_size (GL_LABEL_OBJECT(object), w, h); + gl_label_object_set_line_width (GL_LABEL_OBJECT(object), line_width); + gl_label_object_set_line_color (GL_LABEL_OBJECT(object), line_color_node); + gl_label_object_set_fill_color (GL_LABEL_OBJECT(object), fill_color_node); + + gl_color_node_free (&line_color_node); + gl_color_node_free (&fill_color_node); + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Label->Image Node Properties */ +/*--------------------------------------------------------------------------*/ +static void +xml04_parse_image_props (xmlNodePtr node, + glLabelImage *object) +{ + gdouble w, h; + glTextNode *filename; + + gl_debug (DEBUG_XML, "START"); + + filename = g_new0 (glTextNode, 1); + filename->field_flag = FALSE; + filename->data = (gchar *)xmlGetProp (node, (xmlChar *)"filename"); + gl_label_image_set_filename (object, filename); + gl_text_node_free (&filename); + + w = lgl_xml_get_prop_double (node, "w", 0); + h = lgl_xml_get_prop_double (node, "h", 0); + gl_label_object_set_size (GL_LABEL_OBJECT(object), w, h); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Label->Barcode Node Properties */ +/*--------------------------------------------------------------------------*/ +static void +xml04_parse_barcode_props (xmlNodePtr node, + glLabelBarcode *object) +{ + xmlChar *id; + gboolean text_flag; + glColorNode *color_node; + gdouble scale; + xmlNodePtr child; + glTextNode *text_node; + + gl_debug (DEBUG_XML, "START"); + + color_node = gl_color_node_new_default (); + color_node->color = lgl_xml_get_prop_uint (node, "color", 0); + + id = xmlGetProp (node, (xmlChar *)"style"); + + text_flag = lgl_xml_get_prop_boolean (node, "text", FALSE); + scale = lgl_xml_get_prop_double (node, "scale", 1.0); + if (scale == 0.0) { + scale = 0.5; /* Set to a valid value */ + } + gl_label_barcode_set_props (object, (gchar *)id, text_flag, TRUE, 0); + gl_label_object_set_line_color (GL_LABEL_OBJECT(object), color_node); + + child = node->xmlChildrenNode; + text_node = g_new0 (glTextNode, 1); + if (xmlStrEqual (child->name, (xmlChar *)"Field")) { + text_node->field_flag = TRUE; + text_node->data = (gchar *)xmlGetProp (child, (xmlChar *)"name"); + } else if (xmlNodeIsText (child)) { + text_node->field_flag = FALSE; + text_node->data = (gchar *)xmlNodeGetContent (child); + } else { + g_message ("Unexpected Barcode child: \"%s\"", child->name); + } + gl_label_barcode_set_data (object, text_node); + + gl_color_node_free (&color_node); + gl_text_node_free (&text_node); + xmlFree (id); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML merge properties tag. */ +/*--------------------------------------------------------------------------*/ +static void +xml04_parse_merge_properties (xmlNodePtr node, + glLabel *label) +{ + glMerge *merge; + xmlChar *string; + + gl_debug (DEBUG_XML, "START"); + + string = xmlGetProp (node, (xmlChar *)"type"); + merge = gl_merge_new ((gchar *)string); + xmlFree (string); + + string = xmlGetProp (node, (xmlChar *)"src"); + gl_merge_set_src (merge, (gchar *)string); + xmlFree (string); + + gl_label_set_merge (label, merge); + + g_object_unref (G_OBJECT(merge)); + + gl_debug (DEBUG_XML, "END"); +} diff --git a/glabels2/src/xml-label-04.h b/glabels2/src/xml-label-04.h new file mode 100644 index 00000000..be11bafd --- /dev/null +++ b/glabels2/src/xml-label-04.h @@ -0,0 +1,40 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * xml-label-04.h: GLabels xml label compat module header file + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __XML_LABEL_04_H__ +#define __XML_LABEL_04_H__ + +#include +#include + +#include "xml-label.h" + +G_BEGIN_DECLS + +extern glLabel *gl_xml_label_04_parse (xmlNodePtr root, + glXMLLabelStatus *status); + +G_END_DECLS + + +#endif /* __XML_LABEL_04_H__ */ diff --git a/glabels2/src/xml-label.c b/glabels2/src/xml-label.c new file mode 100644 index 00000000..39729a51 --- /dev/null +++ b/glabels2/src/xml-label.c @@ -0,0 +1,1795 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * label.c: GLabels xml label module + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "xml-label.h" + +#include +#include +#include +#include +#include + +#include "label.h" +#include "label-object.h" +#include "label-text.h" +#include "label-box.h" +#include "label-line.h" +#include "label-ellipse.h" +#include "label-image.h" +#include "label-barcode.h" +#include "base64.h" +#include "xml-label-04.h" +#include +#include +#include +#include "util.h" + +#include "debug.h" + +/*========================================================*/ +/* Private macros and constants. */ +/*========================================================*/ +#define COMPAT01_NAME_SPACE "http://snaught.com/glabels/0.1/" +#define COMPAT04_NAME_SPACE "http://snaught.com/glabels/0.4/" +#define COMPAT20_NAME_SPACE "http://snaught.com/glabels/2.0/" + +/*========================================================*/ +/* Private types. */ +/*========================================================*/ + +/*========================================================*/ +/* Private globals. */ +/*========================================================*/ + +/*========================================================*/ +/* Private function prototypes. */ +/*========================================================*/ + +static glLabel *xml_doc_to_label (xmlDocPtr doc, + glXMLLabelStatus *status); + +static glLabel *xml_parse_label (xmlNodePtr root, + glXMLLabelStatus *status); + +static void xml_parse_objects (xmlNodePtr node, + glLabel *label); + +static void xml_parse_object_text (xmlNodePtr node, + glLabel *label); + +static void xml_parse_object_box (xmlNodePtr node, + glLabel *label); + +static void xml_parse_object_ellipse (xmlNodePtr node, + glLabel *label); + +static void xml_parse_object_line (xmlNodePtr node, + glLabel *label); + +static void xml_parse_object_image (xmlNodePtr node, + glLabel *label); + +static void xml_parse_object_barcode (xmlNodePtr node, + glLabel *label); + +static void xml_parse_merge_fields (xmlNodePtr node, + glLabel *label); + +static void xml_parse_data (xmlNodePtr node, + glLabel *label); + +static void xml_parse_pixdata (xmlNodePtr node, + glLabel *label); + +static void xml_parse_toplevel_span (xmlNodePtr node, + glLabelObject *object); + +static void xml_parse_affine_attrs (xmlNodePtr node, + glLabelObject *object); + +static void xml_parse_shadow_attrs (xmlNodePtr node, + glLabelObject *object); + +static xmlDocPtr xml_label_to_doc (glLabel *label, + glXMLLabelStatus *status); + +static void xml_create_objects (xmlNodePtr root, + xmlNsPtr ns, + glLabel *label); + +static void xml_create_object_text (xmlNodePtr root, + xmlNsPtr ns, + glLabelObject *object); + +static void xml_create_object_box (xmlNodePtr root, + xmlNsPtr ns, + glLabelObject *object); + +static void xml_create_object_line (xmlNodePtr root, + xmlNsPtr ns, + glLabelObject *object); + +static void xml_create_object_ellipse(xmlNodePtr root, + xmlNsPtr ns, + glLabelObject *object); + +static void xml_create_object_image (xmlNodePtr root, + xmlNsPtr ns, + glLabelObject *object); + +static void xml_create_object_barcode(xmlNodePtr root, + xmlNsPtr ns, + glLabelObject *object); + +static void xml_create_merge_fields (xmlNodePtr root, + xmlNsPtr ns, + glLabel *label); + +static void xml_create_data (xmlNodePtr root, + xmlNsPtr ns, + glLabel *label); + +static void xml_create_pixdata (xmlNodePtr root, + xmlNsPtr ns, + glLabel *label, + gchar *name); + +static void xml_create_toplevel_span (xmlNodePtr node, + xmlNsPtr ns, + glLabelText *object_text); + +static void xml_create_affine_attrs (xmlNodePtr node, + glLabelObject *object); + +static void xml_create_shadow_attrs (xmlNodePtr node, + glLabelObject *object); + + +/****************************************************************************/ +/* Open and read label from xml file. */ +/****************************************************************************/ +glLabel * +gl_xml_label_open (const gchar *utf8_filename, + glXMLLabelStatus *status) +{ + xmlDocPtr doc; + glLabel *label; + gchar *filename; + + gl_debug (DEBUG_XML, "START"); + + filename = g_filename_from_utf8 (utf8_filename, -1, NULL, NULL, NULL); + g_return_val_if_fail (filename, NULL); + + doc = xmlParseFile (filename); + if (!doc) { + g_message (_("xmlParseFile error")); + *status = XML_LABEL_ERROR_OPEN_PARSE; + return NULL; + } + + xmlXIncludeProcess (doc); + xmlReconciliateNs (doc, xmlDocGetRootElement (doc)); + + label = xml_doc_to_label (doc, status); + + xmlFreeDoc (doc); + + if (label) { + gl_label_set_filename (label, utf8_filename); + gl_label_clear_modified (label); + } + + g_free (filename); + gl_debug (DEBUG_XML, "END"); + + return label; +} + +/****************************************************************************/ +/* Read label from xml buffer. */ +/****************************************************************************/ +glLabel * +gl_xml_label_open_buffer (const gchar *buffer, + glXMLLabelStatus *status) +{ + xmlDocPtr doc; + glLabel *label; + + gl_debug (DEBUG_XML, "START"); + + doc = xmlParseDoc ((xmlChar *) buffer); + if (!doc) { + g_message (_("xmlParseFile error")); + *status = XML_LABEL_ERROR_OPEN_PARSE; + return NULL; + } + + label = xml_doc_to_label (doc, status); + + xmlFreeDoc (doc); + + if (label) { + gl_label_clear_modified (label); + } + + gl_debug (DEBUG_XML, "END"); + + return label; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse xml doc structure and create label. */ +/*--------------------------------------------------------------------------*/ +static glLabel * +xml_doc_to_label (xmlDocPtr doc, + glXMLLabelStatus *status) +{ + xmlNodePtr root; + xmlNsPtr ns; + glLabel *label; + + gl_debug (DEBUG_XML, "START"); + + LIBXML_TEST_VERSION; + + *status = XML_LABEL_OK; + + root = xmlDocGetRootElement (doc); + if (!root || !root->name) { + g_message (_("No document root")); + *status = XML_LABEL_ERROR_OPEN_PARSE; + return NULL; + } + + ns = xmlSearchNsByHref (doc, root, (xmlChar *)LGL_XML_NAME_SPACE); + if (ns == NULL) { + /* Try compatability mode 2.0 */ + ns = xmlSearchNsByHref (doc, root, (xmlChar *)COMPAT20_NAME_SPACE); + } + if (ns != NULL) { + label = xml_parse_label (root, status); + if (label) + gl_label_set_compression (label, xmlGetDocCompressMode (doc)); + } else { + /* Try compatability mode 0.1 */ + ns = xmlSearchNsByHref (doc, root, (xmlChar *)COMPAT01_NAME_SPACE); + if (ns != NULL) { + g_message (_("Importing from glabels 0.1 format")); + g_message ("TODO"); + label = NULL; /* TODO */ + } else { + /* Try compatability mode 0.4 */ + ns = xmlSearchNsByHref (doc, root, + (xmlChar *)COMPAT04_NAME_SPACE); + if (ns != NULL) { + g_message (_("Importing from glabels 0.4 format")); + label = gl_xml_label_04_parse (root, status); + } else { + g_message (_("bad document, unknown glabels Namespace")); + *status = XML_LABEL_ERROR_OPEN_PARSE; + return NULL; + } + } + } + + gl_debug (DEBUG_XML, "END"); + + return label; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse xml root node and create label. */ +/*--------------------------------------------------------------------------*/ +static glLabel * +xml_parse_label (xmlNodePtr root, + glXMLLabelStatus *status) +{ + xmlNodePtr child_node; + glLabel *label; + lglTemplate *template; + + gl_debug (DEBUG_XML, "START"); + + *status = XML_LABEL_OK; + + if (!lgl_xml_is_node (root, "Glabels-document")) { + g_message (_("Bad root node = \"%s\""), root->name); + *status = XML_LABEL_ERROR_OPEN_PARSE; + return NULL; + } + + label = GL_LABEL(gl_label_new ()); + + /* Pass 1, extract data nodes to pre-load cache. */ + for (child_node = root->xmlChildrenNode; child_node != NULL; child_node = child_node->next) { + if (lgl_xml_is_node (child_node, "Data")) { + xml_parse_data (child_node, label); + } + } + + /* Pass 2, now extract everything else. */ + for (child_node = root->xmlChildrenNode; + child_node != NULL; + child_node = child_node->next) { + + if (lgl_xml_is_node (child_node, "Template")) { + template = lgl_xml_template_parse_template_node (child_node); + if (!template) { + g_object_unref (label); + *status = XML_LABEL_UNKNOWN_MEDIA; + return NULL; + } + lgl_db_register_template (template); + gl_label_set_template (label, template); + lgl_template_free (template); + } else if (lgl_xml_is_node (child_node, "Objects")) { + xml_parse_objects (child_node, label); + } else if (lgl_xml_is_node (child_node, "Merge")) { + xml_parse_merge_fields (child_node, label); + } else if (lgl_xml_is_node (child_node, "Data")) { + /* Handled in pass 1. */ + } else { + if (!xmlNodeIsText (child_node)) { + g_message (_("bad node in Document node = \"%s\""), + child_node->name); + g_object_unref (label); + *status = XML_LABEL_ERROR_OPEN_PARSE; + return NULL; + } + } + } + + gl_debug (DEBUG_XML, "END"); + + return label; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse Objects node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_objects (xmlNodePtr node, + glLabel *label) +{ + gboolean rotate_flag; + xmlNodePtr child; + + gl_debug (DEBUG_XML, "START"); + + rotate_flag = lgl_xml_get_prop_boolean (node, "rotate", FALSE); + gl_label_set_rotate_flag (label, rotate_flag); + + for (child = node->xmlChildrenNode; child != NULL; child = child->next) { + + if (lgl_xml_is_node (child, "Object-text")) { + xml_parse_object_text (child, label); + } else if (lgl_xml_is_node (child, "Object-box")) { + xml_parse_object_box (child, label); + } else if (lgl_xml_is_node (child, "Object-ellipse")) { + xml_parse_object_ellipse (child, label); + } else if (lgl_xml_is_node (child, "Object-line")) { + xml_parse_object_line (child, label); + } else if (lgl_xml_is_node (child, "Object-image")) { + xml_parse_object_image (child, label); + } else if (lgl_xml_is_node (child, "Object-barcode")) { + xml_parse_object_barcode (child, label); + } else { + if (!xmlNodeIsText (child)) { + g_message (_("bad node = \"%s\""), child->name); + break; + } + } + } + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Objects->Object-text Node */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_object_text (xmlNodePtr node, + glLabel *label) +{ + GObject *object; + gdouble x, y; + gdouble w, h; + gchar *string; + PangoAlignment align; + gboolean auto_shrink; + xmlNodePtr child; + + gl_debug (DEBUG_XML, "START"); + + object = gl_label_text_new (label); + + /* position attrs */ + x = lgl_xml_get_prop_length (node, "x", 0.0); + y = lgl_xml_get_prop_length (node, "y", 0.0); + gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y); + + /* implied size attrs */ + w = lgl_xml_get_prop_length (node, "w", 0); + h = lgl_xml_get_prop_length (node, "h", 0); + gl_label_object_set_size (GL_LABEL_OBJECT(object), w, h); + + /* justify attr */ + string = lgl_xml_get_prop_string (node, "justify", NULL); + align = gl_util_string_to_align (string); + g_free (string); + gl_label_object_set_text_alignment (GL_LABEL_OBJECT(object), align); + + /* auto_shrink attr */ + auto_shrink = lgl_xml_get_prop_boolean (node, "auto_shrink", FALSE); + gl_label_text_set_auto_shrink (GL_LABEL_TEXT(object), auto_shrink); + + /* affine attrs */ + xml_parse_affine_attrs (node, GL_LABEL_OBJECT(object)); + + /* shadow attrs */ + xml_parse_shadow_attrs (node, GL_LABEL_OBJECT(object)); + + /* Process children */ + for (child = node->xmlChildrenNode; child != NULL; child = child->next) { + if (lgl_xml_is_node (child, "Span")) { + xml_parse_toplevel_span (child, GL_LABEL_OBJECT(object)); + break; + } else { + if (!xmlNodeIsText (child)) { + g_message ("Unexpected Object-text child: \"%s\"", + child->name); + } + } + } + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Objects->Object-box Node */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_object_box (xmlNodePtr node, + glLabel *label) +{ + GObject *object; + gdouble x, y; + gdouble w, h; + gdouble line_width; + glColorNode *line_color_node; + gchar *string; + glColorNode *fill_color_node; + + gl_debug (DEBUG_XML, "START"); + + object = gl_label_box_new (label); + + /* position attrs */ + x = lgl_xml_get_prop_length (node, "x", 0.0); + y = lgl_xml_get_prop_length (node, "y", 0.0); + gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y); + + /* size attrs */ + w = lgl_xml_get_prop_length (node, "w", 0); + h = lgl_xml_get_prop_length (node, "h", 0); + gl_label_object_set_size (GL_LABEL_OBJECT(object), w, h); + + /* line attrs */ + line_width = lgl_xml_get_prop_length (node, "line_width", 1.0); + gl_label_object_set_line_width (GL_LABEL_OBJECT(object), line_width); + + line_color_node = gl_color_node_new_default (); + string = lgl_xml_get_prop_string (node, "line_color_field", NULL); + if ( string ) { + line_color_node->field_flag = TRUE; + line_color_node->key = string; + } else { + line_color_node->color = lgl_xml_get_prop_uint (node, "line_color", 0); + } + gl_label_object_set_line_color (GL_LABEL_OBJECT(object), line_color_node); + gl_color_node_free (&line_color_node); + + + /* fill attrs */ + fill_color_node = gl_color_node_new_default (); + string = lgl_xml_get_prop_string (node, "fill_color_field", NULL); + if ( string ) { + fill_color_node->field_flag = TRUE; + fill_color_node->key = string; + } else { + fill_color_node->color = lgl_xml_get_prop_uint (node, "fill_color", 0); + } + gl_label_object_set_fill_color (GL_LABEL_OBJECT(object), fill_color_node); + gl_color_node_free (&fill_color_node); + + /* affine attrs */ + xml_parse_affine_attrs (node, GL_LABEL_OBJECT(object)); + + /* shadow attrs */ + xml_parse_shadow_attrs (node, GL_LABEL_OBJECT(object)); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Objects->Object-ellipse Node */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_object_ellipse (xmlNodePtr node, + glLabel *label) +{ + GObject *object; + gdouble x, y; + gdouble w, h; + gdouble line_width; + glColorNode *line_color_node; + gchar *string; + glColorNode *fill_color_node; + + gl_debug (DEBUG_XML, "START"); + + object = gl_label_ellipse_new (label); + + /* position attrs */ + x = lgl_xml_get_prop_length (node, "x", 0.0); + y = lgl_xml_get_prop_length (node, "y", 0.0); + gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y); + + /* size attrs */ + w = lgl_xml_get_prop_length (node, "w", 0); + h = lgl_xml_get_prop_length (node, "h", 0); + gl_label_object_set_size (GL_LABEL_OBJECT(object), w, h); + + /* line attrs */ + line_width = lgl_xml_get_prop_length (node, "line_width", 1.0); + gl_label_object_set_line_width (GL_LABEL_OBJECT(object), line_width); + + line_color_node = gl_color_node_new_default (); + string = lgl_xml_get_prop_string (node, "line_color_field", NULL); + if ( string ) { + line_color_node->field_flag = TRUE; + line_color_node->key = string; + } else { + line_color_node->color = lgl_xml_get_prop_uint (node, "line_color", 0); + } + gl_label_object_set_line_color (GL_LABEL_OBJECT(object), line_color_node); + gl_color_node_free (&line_color_node); + + + /* fill attrs */ + fill_color_node = gl_color_node_new_default (); + string = lgl_xml_get_prop_string (node, "fill_color_field", NULL); + if ( string ) { + fill_color_node->field_flag = TRUE; + fill_color_node->key = string; + } else { + fill_color_node->color = lgl_xml_get_prop_uint (node, "fill_color", 0); + } + gl_label_object_set_fill_color (GL_LABEL_OBJECT(object), fill_color_node); + gl_color_node_free (&fill_color_node); + + /* affine attrs */ + xml_parse_affine_attrs (node, GL_LABEL_OBJECT(object)); + + /* shadow attrs */ + xml_parse_shadow_attrs (node, GL_LABEL_OBJECT(object)); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Objects->Object-line Node */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_object_line (xmlNodePtr node, + glLabel *label) +{ + GObject *object; + gdouble x, y; + gdouble dx, dy; + gdouble line_width; + glColorNode *line_color_node; + gchar *string; + + gl_debug (DEBUG_XML, "START"); + + object = gl_label_line_new (label); + + /* position attrs */ + x = lgl_xml_get_prop_length (node, "x", 0.0); + y = lgl_xml_get_prop_length (node, "y", 0.0); + gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y); + + /* length attrs */ + dx = lgl_xml_get_prop_length (node, "dx", 0); + dy = lgl_xml_get_prop_length (node, "dy", 0); + gl_label_object_set_size (GL_LABEL_OBJECT(object), dx, dy); + + /* line attrs */ + line_width = lgl_xml_get_prop_length (node, "line_width", 1.0); + gl_label_object_set_line_width (GL_LABEL_OBJECT(object), line_width); + + line_color_node = gl_color_node_new_default (); + string = lgl_xml_get_prop_string (node, "line_color_field", NULL); + if ( string ) { + line_color_node->field_flag = TRUE; + line_color_node->key = string; + } else { + line_color_node->color = lgl_xml_get_prop_uint (node, "line_color", 0); + } + gl_label_object_set_line_color (GL_LABEL_OBJECT(object), line_color_node); + gl_color_node_free (&line_color_node); + + /* affine attrs */ + xml_parse_affine_attrs (node, GL_LABEL_OBJECT(object)); + + /* shadow attrs */ + xml_parse_shadow_attrs (node, GL_LABEL_OBJECT(object)); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Objects->Object-image Node */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_object_image (xmlNodePtr node, + glLabel *label) +{ + GObject *object; + gdouble x, y; + gdouble w, h; + gchar *string; + glTextNode *filename; + + gl_debug (DEBUG_XML, "START"); + + object = gl_label_image_new (label); + + /* position attrs */ + x = lgl_xml_get_prop_length (node, "x", 0.0); + y = lgl_xml_get_prop_length (node, "y", 0.0); + gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y); + + /* src or field attr */ + string = lgl_xml_get_prop_string (node, "src", NULL); + if ( string ) { + filename = g_new0 (glTextNode, 1); + filename->field_flag = FALSE; + filename->data = g_strdup ((gchar *)string); + gl_label_image_set_filename (GL_LABEL_IMAGE(object), filename); + gl_text_node_free (&filename); + xmlFree (string); + } else { + string = lgl_xml_get_prop_string (node, "field", NULL); + if ( string ) { + filename = g_new0 (glTextNode, 1); + filename->field_flag = TRUE; + filename->data = g_strdup ((gchar *)string); + gl_label_image_set_filename (GL_LABEL_IMAGE(object), filename); + gl_text_node_free (&filename); + xmlFree (string); + } else { + g_message ("Missing Object-image src or field attr"); + } + } + + /* size attrs */ + w = lgl_xml_get_prop_length (node, "w", 0); + h = lgl_xml_get_prop_length (node, "h", 0); + gl_label_object_set_size (GL_LABEL_OBJECT(object), w, h); + + /* affine attrs */ + xml_parse_affine_attrs (node, GL_LABEL_OBJECT(object)); + + /* shadow attrs */ + xml_parse_shadow_attrs (node, GL_LABEL_OBJECT(object)); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML Objects->Object-barcode Node */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_object_barcode (xmlNodePtr node, + glLabel *label) +{ + GObject *object; + gdouble x, y; + gdouble w, h; + gchar *string; + glTextNode *text_node; + gchar *id; + gboolean text_flag; + gboolean checksum_flag; + glColorNode *color_node; + guint format_digits; + + gl_debug (DEBUG_XML, "START"); + + object = gl_label_barcode_new (label); + + /* position attrs */ + x = lgl_xml_get_prop_length (node, "x", 0.0); + y = lgl_xml_get_prop_length (node, "y", 0.0); + gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y); + + /* size attrs */ + w = lgl_xml_get_prop_length (node, "w", 0); + h = lgl_xml_get_prop_length (node, "h", 0); + gl_label_object_set_size (GL_LABEL_OBJECT(object), w, h); + + /* prop attrs */ + id = lgl_xml_get_prop_string (node, "style", NULL); + text_flag = lgl_xml_get_prop_boolean (node, "text", FALSE); + checksum_flag = lgl_xml_get_prop_boolean (node, "checksum", TRUE); + format_digits = lgl_xml_get_prop_uint (node, "format", 10); + gl_label_barcode_set_props (GL_LABEL_BARCODE(object), + (gchar *)id, text_flag, checksum_flag, format_digits); + g_free (id); + + color_node = gl_color_node_new_default (); + string = lgl_xml_get_prop_string (node, "color_field", NULL); + if ( string ) { + color_node->field_flag = TRUE; + color_node->key = string; + } else { + color_node->color = lgl_xml_get_prop_uint (node, "color", 0); + } + gl_label_object_set_line_color (GL_LABEL_OBJECT(object), color_node); + gl_color_node_free (&color_node); + + /* data or field attr */ + string = lgl_xml_get_prop_string (node, "data", NULL); + if ( string ) { + text_node = g_new0 (glTextNode, 1); + text_node->field_flag = FALSE; + text_node->data = string; + gl_label_barcode_set_data (GL_LABEL_BARCODE(object), text_node); + gl_text_node_free (&text_node); + } else { + string = lgl_xml_get_prop_string (node, "field", NULL); + if ( string ) { + text_node = g_new0 (glTextNode, 1); + text_node->field_flag = TRUE; + text_node->data = string; + gl_label_barcode_set_data (GL_LABEL_BARCODE(object), text_node); + gl_text_node_free (&text_node); + } else { + g_message ("Missing Object-barcode data or field attr"); + } + } + + /* affine attrs */ + xml_parse_affine_attrs (node, GL_LABEL_OBJECT(object)); + + /* shadow attrs */ + xml_parse_shadow_attrs (node, GL_LABEL_OBJECT(object)); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML merge fields tag. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_merge_fields (xmlNodePtr node, + glLabel *label) +{ + gchar *string; + glMerge *merge; + + gl_debug (DEBUG_XML, "START"); + + string = lgl_xml_get_prop_string (node, "type", NULL); + merge = gl_merge_new (string); + g_free (string); + + string = lgl_xml_get_prop_string (node, "src", NULL); + gl_merge_set_src (merge, string); + g_free (string); + + gl_label_set_merge (label, merge); + + g_object_unref (G_OBJECT(merge)); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML data tag. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_data (xmlNodePtr node, + glLabel *label) +{ + xmlNodePtr child; + + gl_debug (DEBUG_XML, "START"); + + for (child = node->xmlChildrenNode; child != NULL; child = child->next) { + + if (lgl_xml_is_node (child, "Pixdata")) { + xml_parse_pixdata (child, label); + } else { + if (!xmlNodeIsText (child)) { + g_message (_("bad node in Data node = \"%s\""), + child->name); + } + } + } + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse XML pixbuf data tag. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_pixdata (xmlNodePtr node, + glLabel *label) +{ + gchar *name, *base64; + guchar *stream; + guint stream_length; + gboolean ret; + GdkPixdata *pixdata; + GdkPixbuf *pixbuf; + GHashTable *pixbuf_cache; + + gl_debug (DEBUG_XML, "START"); + + name = lgl_xml_get_prop_string (node, "name", NULL); + base64 = lgl_xml_get_node_content (node); + + stream = gl_base64_decode ((gchar *)base64, &stream_length); + pixdata = g_new0 (GdkPixdata, 1); + ret = gdk_pixdata_deserialize (pixdata, stream_length, stream, NULL); + + if (ret) { + pixbuf = gdk_pixbuf_from_pixdata (pixdata, TRUE, NULL); + + pixbuf_cache = gl_label_get_pixbuf_cache (label); + gl_pixbuf_cache_add_pixbuf (pixbuf_cache, (gchar *)name, pixbuf); + } + + g_free (name); + g_free (base64); + + g_free (stream); + g_free (pixdata); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse top-level Span tag. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_toplevel_span (xmlNodePtr node, + glLabelObject *object) +{ + gchar *font_family; + gdouble font_size; + PangoWeight font_weight; + gboolean font_italic_flag; + glColorNode *color_node; + gdouble text_line_spacing; + gchar *string; + GList *lines, *text_nodes; + xmlNodePtr child; + glTextNode *text_node; + + gl_debug (DEBUG_XML, "START"); + + /* Font family attr */ + font_family = lgl_xml_get_prop_string (node, "font_family", "Sans"); + gl_label_object_set_font_family (object, font_family); + g_free (font_family); + + /* Font size attr */ + font_size = lgl_xml_get_prop_double (node, "font_size", 0.0); + gl_label_object_set_font_size (object, font_size); + + /* Font weight attr */ + string = lgl_xml_get_prop_string (node, "font_weight", NULL); + font_weight = gl_util_string_to_weight (string); + g_free (string); + gl_label_object_set_font_weight (object, font_weight); + + /* Font italic flag attr */ + font_italic_flag = lgl_xml_get_prop_boolean (node, "font_italic", FALSE); + gl_label_object_set_font_italic_flag (object, font_italic_flag); + + /* Text color attr */ + color_node = gl_color_node_new_default (); + string = lgl_xml_get_prop_string (node, "color_field", NULL); + if ( string ) { + color_node->field_flag = TRUE; + color_node->key = string; + } else { + color_node->color = lgl_xml_get_prop_uint (node, "color", 0); + } + gl_label_object_set_text_color (object, color_node); + gl_color_node_free (&color_node); + + + /* Text line spacing attr */ + text_line_spacing = lgl_xml_get_prop_double (node, "line_spacing", 1.0); + gl_label_object_set_text_line_spacing (object, text_line_spacing); + + /* Now descend children, and build lines of text nodes */ + lines = NULL; + text_nodes = NULL; + for (child = node->xmlChildrenNode; child != NULL; child = child->next) { + + if (xmlNodeIsText (child)) { + gchar *data = lgl_xml_get_node_content (child); + + /* Hack: if the first char is LF, it's an xml formatting string */ + if (data[0] != '\n') { + /* Literal text */ + text_node = g_new0 (glTextNode, 1); + text_node->field_flag = FALSE; + text_node->data = g_strdup ((gchar *)data); + text_nodes = g_list_append (text_nodes, text_node); + } + g_free (data); + + } else if (lgl_xml_is_node (child, "Span")) { + + g_message ("Unexpected rich text (not supported, yet!)"); + + } else if (lgl_xml_is_node (child, "Field")) { + + /* Field node */ + string = lgl_xml_get_prop_string (child, "name", NULL); + text_node = g_new0 (glTextNode, 1); + text_node->field_flag = TRUE; + text_node->data = string; + text_nodes = g_list_append (text_nodes, text_node); + + } else if (lgl_xml_is_node (child, "NL")) { + + /* Store line. */ + lines = g_list_append (lines, text_nodes); + text_nodes = NULL; + + } else { + g_message ("Unexpected Span child: \"%s\"", child->name); + } + + } + if ( text_nodes ) { + /* Store last line. */ + lines = g_list_append (lines, text_nodes); + text_nodes = NULL; + } + gl_label_text_set_lines (GL_LABEL_TEXT(object), lines); + gl_text_node_lines_free (&lines); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse affine attributes. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_affine_attrs (xmlNodePtr node, + glLabelObject *object) +{ + gdouble a[6]; + cairo_matrix_t matrix; + + a[0] = lgl_xml_get_prop_double (node, "a0", 0.0); + a[1] = lgl_xml_get_prop_double (node, "a1", 0.0); + a[2] = lgl_xml_get_prop_double (node, "a2", 0.0); + a[3] = lgl_xml_get_prop_double (node, "a3", 0.0); + a[4] = lgl_xml_get_prop_double (node, "a4", 0.0); + a[5] = lgl_xml_get_prop_double (node, "a5", 0.0); + + cairo_matrix_init (&matrix, a[0], a[1], a[2], a[3], a[4], a[5]); + + gl_label_object_set_matrix (object, &matrix); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Parse shadow attributes. */ +/*--------------------------------------------------------------------------*/ +static void +xml_parse_shadow_attrs (xmlNodePtr node, + glLabelObject *object) +{ + gboolean shadow_state; + gdouble shadow_x; + gdouble shadow_y; + glColorNode *shadow_color_node; + gdouble shadow_opacity; + gchar *string; + + shadow_state = lgl_xml_get_prop_boolean (node, "shadow", FALSE); + gl_label_object_set_shadow_state (object, shadow_state); + + if (shadow_state) + { + shadow_x = lgl_xml_get_prop_length (node, "shadow_x", 0.0); + shadow_y = lgl_xml_get_prop_length (node, "shadow_y", 0.0); + gl_label_object_set_shadow_offset (object, shadow_x, shadow_y); + + shadow_color_node = gl_color_node_new_default (); + string = lgl_xml_get_prop_string (node, "shadow_color_field", NULL); + if ( string ) { + shadow_color_node->field_flag = TRUE; + shadow_color_node->key = string; + } else { + shadow_color_node->color = lgl_xml_get_prop_uint (node, "shadow_color", 0); + } + gl_label_object_set_shadow_color (object, shadow_color_node); + gl_color_node_free (&shadow_color_node); + + shadow_opacity = lgl_xml_get_prop_double (node, "shadow_opacity", 1.0); + gl_label_object_set_shadow_opacity (object, shadow_opacity); + } +} + +/****************************************************************************/ +/* Save label to xml label file. */ +/****************************************************************************/ +void +gl_xml_label_save (glLabel *label, + const gchar *utf8_filename, + glXMLLabelStatus *status) +{ + xmlDocPtr doc; + gint xml_ret; + gchar *filename; + + gl_debug (DEBUG_XML, "START"); + + doc = xml_label_to_doc (label, status); + + filename = g_filename_from_utf8 (utf8_filename, -1, NULL, NULL, NULL); + if (!filename) + g_message (_("Utf8 conversion error.")); + else { + xmlSetDocCompressMode (doc, gl_label_get_compression (label)); + xml_ret = xmlSaveFormatFile (filename, doc, TRUE); + xmlFreeDoc (doc); + if (xml_ret == -1) { + + g_message (_("Problem saving xml file.")); + *status = XML_LABEL_ERROR_SAVE_FILE; + + } else { + + gl_label_set_filename (label, utf8_filename); + gl_label_clear_modified (label); + + } + g_free (filename); + } + + gl_debug (DEBUG_XML, "END"); +} + +/****************************************************************************/ +/* Save label to xml buffer. */ +/****************************************************************************/ +gchar * +gl_xml_label_save_buffer (glLabel *label, + glXMLLabelStatus *status) +{ + xmlDocPtr doc; + gint size; + guchar *buffer; + + gl_debug (DEBUG_XML, "START"); + + doc = xml_label_to_doc (label, status); + + xmlDocDumpMemory (doc, &buffer, &size); + xmlFreeDoc (doc); + + gl_label_clear_modified (label); + + gl_debug (DEBUG_XML, "END"); + + return (gchar *)buffer; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Convert label to xml doc structure. */ +/*--------------------------------------------------------------------------*/ +static xmlDocPtr +xml_label_to_doc (glLabel *label, + glXMLLabelStatus *status) +{ + xmlDocPtr doc; + xmlNsPtr ns; + glMerge *merge; + + gl_debug (DEBUG_XML, "START"); + + LIBXML_TEST_VERSION; + + doc = xmlNewDoc ((xmlChar *)"1.0"); + doc->xmlRootNode = xmlNewDocNode (doc, NULL, (xmlChar *)"Glabels-document", NULL); + + ns = xmlNewNs (doc->xmlRootNode, (xmlChar *)LGL_XML_NAME_SPACE, NULL); + xmlSetNs (doc->xmlRootNode, ns); + + lgl_xml_template_create_template_node (label->template, doc->xmlRootNode, ns); + + xml_create_objects (doc->xmlRootNode, ns, label); + + merge = gl_label_get_merge (label); + gl_debug (DEBUG_XML, "merge=%p", merge); + if (merge != NULL) { + xml_create_merge_fields (doc->xmlRootNode, ns, label); + g_object_unref (G_OBJECT(merge)); + } + + xml_create_data (doc->xmlRootNode, ns, label); + + gl_debug (DEBUG_XML, "END"); + + *status = XML_LABEL_OK; + return doc; +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Objects Node */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_objects (xmlNodePtr root, + xmlNsPtr ns, + glLabel *label) +{ + xmlNodePtr node; + GList *p; + glLabelObject *object; + + gl_debug (DEBUG_XML, "START"); + + node = xmlNewChild (root, ns, (xmlChar *)"Objects", NULL); + lgl_xml_set_prop_string (node, "id", "0"); + lgl_xml_set_prop_boolean (node, "rotate", label->rotate_flag); + + for (p = label->objects; p != NULL; p = p->next) { + + object = GL_LABEL_OBJECT(p->data); + + if ( GL_IS_LABEL_TEXT(object) ) { + xml_create_object_text (node, ns, object); + } else if ( GL_IS_LABEL_BOX(object) ) { + xml_create_object_box (node, ns, object); + } else if ( GL_IS_LABEL_ELLIPSE(object) ) { + xml_create_object_ellipse (node, ns, object); + } else if ( GL_IS_LABEL_LINE(object) ) { + xml_create_object_line (node, ns, object); + } else if ( GL_IS_LABEL_IMAGE(object) ) { + xml_create_object_image (node, ns, object); + } else if ( GL_IS_LABEL_BARCODE(object) ) { + xml_create_object_barcode (node, ns, object); + } else { + g_message ("Unknown label object"); + } + + } + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Objects->Object-text Node */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_object_text (xmlNodePtr root, + xmlNsPtr ns, + glLabelObject *object) +{ + xmlNodePtr node; + gdouble x, y; + gdouble w, h; + PangoAlignment align; + gboolean auto_shrink; + + gl_debug (DEBUG_XML, "START"); + + node = xmlNewChild (root, ns, (xmlChar *)"Object-text", NULL); + + /* position attrs */ + gl_label_object_get_position (object, &x, &y); + lgl_xml_set_prop_length (node, "x", x); + lgl_xml_set_prop_length (node, "y", y); + + /* size attrs */ + gl_label_object_get_raw_size ( object, &w, &h); + lgl_xml_set_prop_length (node, "w", w); + lgl_xml_set_prop_length (node, "h", h); + + /* justify attr */ + align = gl_label_object_get_text_alignment (object); + lgl_xml_set_prop_string (node, "justify", gl_util_align_to_string (align)); + + /* auto_shrink attr */ + auto_shrink = gl_label_text_get_auto_shrink (GL_LABEL_TEXT (object)); + lgl_xml_set_prop_boolean (node, "auto_shrink", auto_shrink); + + /* affine attrs */ + xml_create_affine_attrs (node, object); + + /* shadow attrs */ + xml_create_shadow_attrs (node, object); + + /* Add children */ + xml_create_toplevel_span (node, ns, GL_LABEL_TEXT(object)); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Objects->Object-box Node */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_object_box (xmlNodePtr root, + xmlNsPtr ns, + glLabelObject *object) +{ + xmlNodePtr node; + gdouble x, y; + gdouble w, h; + gdouble line_width; + glColorNode *line_color_node; + glColorNode *fill_color_node; + + gl_debug (DEBUG_XML, "START"); + + node = xmlNewChild (root, ns, (xmlChar *)"Object-box", NULL); + + /* position attrs */ + gl_label_object_get_position (object, &x, &y); + lgl_xml_set_prop_length (node, "x", x); + lgl_xml_set_prop_length (node, "y", y); + + /* size attrs */ + gl_label_object_get_size (object, &w, &h); + lgl_xml_set_prop_length (node, "w", w); + lgl_xml_set_prop_length (node, "h", h); + + /* line attrs */ + line_width = gl_label_object_get_line_width (GL_LABEL_OBJECT(object)); + lgl_xml_set_prop_length (node, "line_width", line_width); + + line_color_node = gl_label_object_get_line_color (GL_LABEL_OBJECT(object)); + if (line_color_node->field_flag) + { + lgl_xml_set_prop_string (node, "line_color_field", line_color_node->key); + } + else + { + lgl_xml_set_prop_uint_hex (node, "line_color", line_color_node->color); + } + gl_color_node_free (&line_color_node); + + /* fill attrs (color or field) */ + fill_color_node = gl_label_object_get_fill_color (GL_LABEL_OBJECT(object)); + if (fill_color_node->field_flag) + { + lgl_xml_set_prop_string (node, "fill_color_field", fill_color_node->key); + } + else + { + lgl_xml_set_prop_uint_hex (node, "fill_color", fill_color_node->color); + } + gl_color_node_free (&fill_color_node); + + /* affine attrs */ + xml_create_affine_attrs (node, object); + + /* shadow attrs */ + xml_create_shadow_attrs (node, object); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Objects->Object-ellipse Node */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_object_ellipse (xmlNodePtr root, + xmlNsPtr ns, + glLabelObject *object) +{ + xmlNodePtr node; + gdouble x, y; + gdouble w, h; + gdouble line_width; + glColorNode *line_color_node; + glColorNode *fill_color_node; + + gl_debug (DEBUG_XML, "START"); + + node = xmlNewChild (root, ns, (xmlChar *)"Object-ellipse", NULL); + + /* position attrs */ + gl_label_object_get_position (object, &x, &y); + lgl_xml_set_prop_length (node, "x", x); + lgl_xml_set_prop_length (node, "y", y); + + /* size attrs */ + gl_label_object_get_size (object, &w, &h); + lgl_xml_set_prop_length (node, "w", w); + lgl_xml_set_prop_length (node, "h", h); + + /* line attrs */ + line_width = gl_label_object_get_line_width (GL_LABEL_OBJECT(object)); + lgl_xml_set_prop_length (node, "line_width", line_width); + + line_color_node = gl_label_object_get_line_color (GL_LABEL_OBJECT(object)); + if (line_color_node->field_flag) + { + lgl_xml_set_prop_string (node, "line_color_field", line_color_node->key); + } + else + { + lgl_xml_set_prop_uint_hex (node, "line_color", line_color_node->color); + } + gl_color_node_free (&line_color_node); + + + /* fill attrs (color or field) */ + fill_color_node = gl_label_object_get_fill_color (GL_LABEL_OBJECT(object)); + if (fill_color_node->field_flag) + { + lgl_xml_set_prop_string (node, "fill_color_field", fill_color_node->key); + } + else + { + lgl_xml_set_prop_uint_hex (node, "fill_color", fill_color_node->color); + } + gl_color_node_free (&fill_color_node); + + /* affine attrs */ + xml_create_affine_attrs (node, object); + + /* shadow attrs */ + xml_create_shadow_attrs (node, object); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Objects->Object-line Node */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_object_line (xmlNodePtr root, + xmlNsPtr ns, + glLabelObject *object) +{ + xmlNodePtr node; + gdouble x, y; + gdouble dx, dy; + gdouble line_width; + glColorNode *line_color_node; + + gl_debug (DEBUG_XML, "START"); + + node = xmlNewChild (root, ns, (xmlChar *)"Object-line", NULL); + + /* position attrs */ + gl_label_object_get_position (object, &x, &y); + lgl_xml_set_prop_length (node, "x", x); + lgl_xml_set_prop_length (node, "y", y); + + /* length attrs */ + gl_label_object_get_size (object, &dx, &dy); + lgl_xml_set_prop_length (node, "dx", dx); + lgl_xml_set_prop_length (node, "dy", dy); + + /* line attrs */ + line_width = gl_label_object_get_line_width (GL_LABEL_OBJECT(object)); + lgl_xml_set_prop_length (node, "line_width", line_width); + + line_color_node = gl_label_object_get_line_color (GL_LABEL_OBJECT(object)); + if (line_color_node->field_flag) + { + lgl_xml_set_prop_string (node, "line_color_field", line_color_node->key); + } + else + { + lgl_xml_set_prop_uint_hex (node, "line_color", line_color_node->color); + } + gl_color_node_free (&line_color_node); + + + /* affine attrs */ + xml_create_affine_attrs (node, object); + + /* shadow attrs */ + xml_create_shadow_attrs (node, object); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Objects->Object-image Node */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_object_image (xmlNodePtr root, + xmlNsPtr ns, + glLabelObject *object) +{ + xmlNodePtr node; + gdouble x, y; + gdouble w, h; + glTextNode *filename; + + gl_debug (DEBUG_XML, "START"); + + node = xmlNewChild (root, ns, (xmlChar *)"Object-image", NULL); + + /* position attrs */ + gl_label_object_get_position (object, &x, &y); + lgl_xml_set_prop_length (node, "x", x); + lgl_xml_set_prop_length (node, "y", y); + + /* size attrs */ + gl_label_object_get_size (object, &w, &h); + lgl_xml_set_prop_length (node, "w", w); + lgl_xml_set_prop_length (node, "h", h); + + /* src OR field attr */ + filename = gl_label_image_get_filename (GL_LABEL_IMAGE(object)); + if (filename->field_flag) { + lgl_xml_set_prop_string (node, "field", filename->data); + } else { + lgl_xml_set_prop_string (node, "src", filename->data); + } + gl_text_node_free (&filename); + + /* affine attrs */ + xml_create_affine_attrs (node, object); + + /* shadow attrs */ + xml_create_shadow_attrs (node, object); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Objects->Object-barcode Node */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_object_barcode (xmlNodePtr root, + xmlNsPtr ns, + glLabelObject *object) +{ + xmlNodePtr node; + gdouble x, y; + gdouble w, h; + glTextNode *text_node; + gchar *id; + gboolean text_flag; + gboolean checksum_flag; + glColorNode *color_node; + guint format_digits; + + gl_debug (DEBUG_XML, "START"); + + node = xmlNewChild (root, ns, (xmlChar *)"Object-barcode", NULL); + + /* position attrs */ + gl_label_object_get_position (object, &x, &y); + lgl_xml_set_prop_length (node, "x", x); + lgl_xml_set_prop_length (node, "y", y); + + /* size attrs */ + gl_label_object_get_raw_size (object, &w, &h); + lgl_xml_set_prop_length (node, "w", w); + lgl_xml_set_prop_length (node, "h", h); + + /* Barcode properties attrs */ + gl_label_barcode_get_props (GL_LABEL_BARCODE(object), + &id, &text_flag, &checksum_flag, &format_digits); + lgl_xml_set_prop_string (node, "style", id); + lgl_xml_set_prop_boolean (node, "text", text_flag); + lgl_xml_set_prop_boolean (node, "checksum", checksum_flag); + + g_free (id); + + color_node = gl_label_object_get_line_color (GL_LABEL_OBJECT(object)); + if (color_node->field_flag) + { + lgl_xml_set_prop_string (node, "color_field", color_node->key); + } + else + { + lgl_xml_set_prop_uint_hex (node, "color", color_node->color); + } + gl_color_node_free (&color_node); + + + /* data OR field attr */ + text_node = gl_label_barcode_get_data (GL_LABEL_BARCODE(object)); + if (text_node->field_flag) { + lgl_xml_set_prop_string (node, "field", text_node->data); + lgl_xml_set_prop_int (node, "format", format_digits); + } else { + lgl_xml_set_prop_string (node, "data", text_node->data); + } + gl_text_node_free (&text_node); + + /* affine attrs */ + xml_create_affine_attrs (node, object); + + /* shadow attrs */ + xml_create_shadow_attrs (node, object); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Label Merge Fields Node */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_merge_fields (xmlNodePtr root, + xmlNsPtr ns, + glLabel *label) +{ + xmlNodePtr node; + gchar *string; + glMerge *merge; + + gl_debug (DEBUG_XML, "START"); + + merge = gl_label_get_merge (label); + + node = xmlNewChild (root, ns, (xmlChar *)"Merge", NULL); + + string = gl_merge_get_name (merge); + lgl_xml_set_prop_string (node, "type", string); + g_free (string); + + string = gl_merge_get_src (merge); + lgl_xml_set_prop_string (node, "src", string); + g_free (string); + + g_object_unref (G_OBJECT(merge)); + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Label Data Node */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_data (xmlNodePtr root, + xmlNsPtr ns, + glLabel *label) +{ + xmlNodePtr node; + GList *name_list, *p; + GHashTable *pixbuf_cache; + + gl_debug (DEBUG_XML, "START"); + + node = xmlNewChild (root, ns, (xmlChar *)"Data", NULL); + + pixbuf_cache = gl_label_get_pixbuf_cache (label); + name_list = gl_pixbuf_cache_get_name_list (pixbuf_cache); + + for (p = name_list; p != NULL; p=p->next) { + xml_create_pixdata (node, ns, label, p->data); + } + + gl_pixbuf_cache_free_name_list (name_list); + + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Add XML Label Data Pixbuf Node */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_pixdata (xmlNodePtr root, + xmlNsPtr ns, + glLabel *label, + gchar *name) +{ + xmlNodePtr node; + GHashTable *pixbuf_cache; + GdkPixbuf *pixbuf; + GdkPixdata *pixdata; + guchar *stream; + guint stream_length; + gchar *base64; + + gl_debug (DEBUG_XML, "START"); + + pixbuf_cache = gl_label_get_pixbuf_cache (label); + + pixbuf = gl_pixbuf_cache_get_pixbuf (pixbuf_cache, name); + if ( pixbuf != NULL ) { + + pixdata = g_new0 (GdkPixdata, 1); + gdk_pixdata_from_pixbuf (pixdata, pixbuf, FALSE); + stream = gdk_pixdata_serialize (pixdata, &stream_length); + base64 = gl_base64_encode (stream, stream_length); + + node = xmlNewChild (root, ns, (xmlChar *)"Pixdata", (xmlChar *)base64); + lgl_xml_set_prop_string (node, "name", name); + lgl_xml_set_prop_string (node, "encoding", "Base64"); + + gl_pixbuf_cache_remove_pixbuf (pixbuf_cache, name); + + g_free (pixdata); + g_free (stream); + g_free (base64); + } + + + gl_debug (DEBUG_XML, "END"); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Create top-level Span node. */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_toplevel_span (xmlNodePtr root, + xmlNsPtr ns, + glLabelText *object_text) +{ + xmlNodePtr node; + gchar *font_family; + gdouble font_size; + PangoWeight font_weight; + gboolean font_italic_flag; + glColorNode *color_node; + PangoAlignment align; + gdouble text_line_spacing; + GList *lines, *p_line, *p_node; + glTextNode *text_node; + xmlNodePtr child; + + node = xmlNewChild (root, ns, (xmlChar *)"Span", NULL); + + /* All span attrs at top level. */ + font_family = gl_label_object_get_font_family (GL_LABEL_OBJECT(object_text)); + font_size = gl_label_object_get_font_size (GL_LABEL_OBJECT(object_text)); + text_line_spacing = gl_label_object_get_text_line_spacing (GL_LABEL_OBJECT(object_text)); + font_weight = gl_label_object_get_font_weight (GL_LABEL_OBJECT(object_text)); + font_italic_flag = gl_label_object_get_font_italic_flag (GL_LABEL_OBJECT(object_text)); + + color_node = gl_label_object_get_text_color (GL_LABEL_OBJECT(object_text)); + if (color_node->field_flag) + { + lgl_xml_set_prop_string (node, "color_field", color_node->key); + } + else + { + lgl_xml_set_prop_uint_hex (node, "color", color_node->color); + } + gl_color_node_free (&color_node); + + align = gl_label_object_get_text_alignment (GL_LABEL_OBJECT(object_text)); + lgl_xml_set_prop_string (node, "font_family", font_family); + lgl_xml_set_prop_double (node, "font_size", font_size); + lgl_xml_set_prop_string (node, "font_weight", gl_util_weight_to_string (font_weight)); + lgl_xml_set_prop_boolean (node, "font_italic", font_italic_flag); + + lgl_xml_set_prop_double (node, "line_spacing", text_line_spacing); + + /* Build children. */ + lines = gl_label_text_get_lines (GL_LABEL_TEXT(object_text)); + for (p_line = lines; p_line != NULL; p_line = p_line->next) { + + for (p_node = (GList *) p_line->data; p_node != NULL; + p_node = p_node->next) { + text_node = (glTextNode *) p_node->data; + + if (text_node->field_flag) { + child = xmlNewChild (node, ns, (xmlChar *)"Field", NULL); + lgl_xml_set_prop_string (child, "name", text_node->data); + } else { + xmlNodeAddContent (node, (xmlChar *)text_node->data); + } + + } + + if ( p_line->next ) { + child = xmlNewChild (node, ns, (xmlChar *)"NL", NULL); + } + + } + + gl_text_node_lines_free (&lines); + g_free (font_family); + +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Create affine attributes. */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_affine_attrs (xmlNodePtr node, + glLabelObject *object) +{ + cairo_matrix_t matrix; + + gl_label_object_get_matrix (object, &matrix); + + lgl_xml_set_prop_double (node, "a0", matrix.xx); + lgl_xml_set_prop_double (node, "a1", matrix.yx); + lgl_xml_set_prop_double (node, "a2", matrix.xy); + lgl_xml_set_prop_double (node, "a3", matrix.yy); + lgl_xml_set_prop_double (node, "a4", matrix.x0); + lgl_xml_set_prop_double (node, "a5", matrix.y0); +} + +/*--------------------------------------------------------------------------*/ +/* PRIVATE. Create shadow attributes. */ +/*--------------------------------------------------------------------------*/ +static void +xml_create_shadow_attrs (xmlNodePtr node, + glLabelObject *object) +{ + gboolean shadow_state; + gdouble shadow_x; + gdouble shadow_y; + glColorNode *shadow_color_node; + gdouble shadow_opacity; + + shadow_state = gl_label_object_get_shadow_state (object); + + if (shadow_state) + { + lgl_xml_set_prop_boolean (node, "shadow", shadow_state); + + gl_label_object_get_shadow_offset (object, &shadow_x, &shadow_y); + lgl_xml_set_prop_length (node, "shadow_x", shadow_x); + lgl_xml_set_prop_length (node, "shadow_y", shadow_y); + + shadow_color_node = gl_label_object_get_shadow_color (object); + if (shadow_color_node->field_flag) + { + lgl_xml_set_prop_string (node, "shadow_color_field", shadow_color_node->key); + } + else + { + lgl_xml_set_prop_uint_hex (node, "shadow_color", shadow_color_node->color); + } + gl_color_node_free (&shadow_color_node); + + shadow_opacity = gl_label_object_get_shadow_opacity (object); + lgl_xml_set_prop_double (node, "shadow_opacity", shadow_opacity); + } +} + + diff --git a/glabels2/src/xml-label.h b/glabels2/src/xml-label.h new file mode 100644 index 00000000..5c5f0c37 --- /dev/null +++ b/glabels2/src/xml-label.h @@ -0,0 +1,55 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * (GLABELS) Label and Business Card Creation program for GNOME + * + * xml-label.h: GLabels xml label module header file + * + * Copyright (C) 2001-2002 Jim Evins . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __XML_LABEL_H__ +#define __XML_LABEL_H__ + +#include "label.h" + +G_BEGIN_DECLS + + +typedef enum { + XML_LABEL_UNKNOWN_MEDIA = 1, + XML_LABEL_OK = 0, + XML_LABEL_ERROR_OPEN_PARSE = -10, + XML_LABEL_ERROR_SAVE_FILE = -20, +} glXMLLabelStatus; + + +extern glLabel *gl_xml_label_open (const gchar * filename, + glXMLLabelStatus *status); +extern glLabel *gl_xml_label_open_buffer (const gchar * buffer, + glXMLLabelStatus *status); + +extern void gl_xml_label_save (glLabel * label, + const gchar * filename, + glXMLLabelStatus *status); +extern gchar *gl_xml_label_save_buffer (glLabel * label, + glXMLLabelStatus *status); + + +G_END_DECLS + + +#endif /* __XML_LABEL_H__ */ -- 2.39.5