mcc2 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/.autotest +23 -0
  4. data/.gitignore +15 -0
  5. data/.rubocop.yml +3 -0
  6. data/Gemfile +13 -0
  7. data/History.txt +6 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +51 -0
  10. data/Rakefile +12 -0
  11. data/config/i18n-tasks.yml +193 -0
  12. data/exe/mcc2 +18 -0
  13. data/exe/mcc2-generate-preview +17 -0
  14. data/exe/mcc2print +6 -0
  15. data/lib/libguib16.rb +1620 -0
  16. data/lib/mcc2/advanced_data_edit_dlg.rb +139 -0
  17. data/lib/mcc2/cc_dialogbox.rb +52 -0
  18. data/lib/mcc2/constants.rb +154 -0
  19. data/lib/mcc2/dataman/base.rb +61 -0
  20. data/lib/mcc2/dataman/csv.rb +49 -0
  21. data/lib/mcc2/dataman/database.rb +8 -0
  22. data/lib/mcc2/dataman/dbf.rb +45 -0
  23. data/lib/mcc2/dataman/none.rb +25 -0
  24. data/lib/mcc2/dataview.rb +348 -0
  25. data/lib/mcc2/dataview_dlg.rb +232 -0
  26. data/lib/mcc2/debug_tools.rb +20 -0
  27. data/lib/mcc2/fx_colored_item.rb +101 -0
  28. data/lib/mcc2/generate_preview.rb +68 -0
  29. data/lib/mcc2/gui/advanced_data_edit_dlg.rbin +0 -0
  30. data/lib/mcc2/gui/dataview_dlg.pp +522 -0
  31. data/lib/mcc2/gui/layoutview_dlg.pp +5115 -0
  32. data/lib/mcc2/gui/mcc2_mainwin.pp +838 -0
  33. data/lib/mcc2/gui/picture_data_edit_dlg.rbin +0 -0
  34. data/lib/mcc2/gui/printerview_dlg.pp +3311 -0
  35. data/lib/mcc2/images/Image-Arrow-Left.gif +0 -0
  36. data/lib/mcc2/images/Image-Arrow-Right.gif +0 -0
  37. data/lib/mcc2/images/Image-FastArrowLeft.gif +0 -0
  38. data/lib/mcc2/images/Image-FastArrowRight.bmp +0 -0
  39. data/lib/mcc2/images/Image-FastArrowRight.gif +0 -0
  40. data/lib/mcc2/images/application-exit.png +0 -0
  41. data/lib/mcc2/images/copy.png +0 -0
  42. data/lib/mcc2/images/country_de.png +0 -0
  43. data/lib/mcc2/images/country_gb.png +0 -0
  44. data/lib/mcc2/images/country_rs.png +0 -0
  45. data/lib/mcc2/images/cut.png +0 -0
  46. data/lib/mcc2/images/distribute-horizontal-baseline.png +0 -0
  47. data/lib/mcc2/images/distribute-vertical-baseline.png +0 -0
  48. data/lib/mcc2/images/document-close.png +0 -0
  49. data/lib/mcc2/images/document-edit.png +0 -0
  50. data/lib/mcc2/images/document-new.png +0 -0
  51. data/lib/mcc2/images/document-open.png +0 -0
  52. data/lib/mcc2/images/document-print-frame.png +0 -0
  53. data/lib/mcc2/images/document-print.png +0 -0
  54. data/lib/mcc2/images/document-save-as.png +0 -0
  55. data/lib/mcc2/images/document-save.png +0 -0
  56. data/lib/mcc2/images/documentation.png +0 -0
  57. data/lib/mcc2/images/draw-rectangle.png +0 -0
  58. data/lib/mcc2/images/dummy.gif +0 -0
  59. data/lib/mcc2/images/exchange-positions.png +0 -0
  60. data/lib/mcc2/images/insert-image.png +0 -0
  61. data/lib/mcc2/images/insert-text.png +0 -0
  62. data/lib/mcc2/images/libreoffice-oasis-master-document.png +0 -0
  63. data/lib/mcc2/images/measure.png +0 -0
  64. data/lib/mcc2/images/messagebox_warning.png +0 -0
  65. data/lib/mcc2/images/paste.png +0 -0
  66. data/lib/mcc2/images/process-stop.png +0 -0
  67. data/lib/mcc2/images/zoom-in.png +0 -0
  68. data/lib/mcc2/layout.rb +323 -0
  69. data/lib/mcc2/layout_file.rb +794 -0
  70. data/lib/mcc2/layout_object/barcode.rb +33 -0
  71. data/lib/mcc2/layout_object/box.rb +18 -0
  72. data/lib/mcc2/layout_object/chip.rb +54 -0
  73. data/lib/mcc2/layout_object/embed.rb +16 -0
  74. data/lib/mcc2/layout_object/go_attribut.rb +16 -0
  75. data/lib/mcc2/layout_object/graphic.rb +59 -0
  76. data/lib/mcc2/layout_object/magstripe.rb +13 -0
  77. data/lib/mcc2/layout_object/picture.rb +22 -0
  78. data/lib/mcc2/layout_object/text.rb +29 -0
  79. data/lib/mcc2/layout_win.rb +2052 -0
  80. data/lib/mcc2/layoutview.rb +845 -0
  81. data/lib/mcc2/layoutview_dlg.rb +2058 -0
  82. data/lib/mcc2/locales.rb +27 -0
  83. data/lib/mcc2/mcc2_mainwin.rb +453 -0
  84. data/lib/mcc2/mcc2gui.rb +295 -0
  85. data/lib/mcc2/mcc2print.rb +54 -0
  86. data/lib/mcc2/picture_data_edit_dlg.rb +139 -0
  87. data/lib/mcc2/print_dlg.rb +520 -0
  88. data/lib/mcc2/printer/base.rb +148 -0
  89. data/lib/mcc2/printer/card_printer.rb +45 -0
  90. data/lib/mcc2/printer/file_printer.rb +135 -0
  91. data/lib/mcc2/printer/gdi_card_printer.rb +14 -0
  92. data/lib/mcc2/printer/gdi_printer.rb +197 -0
  93. data/lib/mcc2/printer/linux_cups_printer.rb +92 -0
  94. data/lib/mcc2/printer/preview.rb +277 -0
  95. data/lib/mcc2/printer/printer_cab.rb +118 -0
  96. data/lib/mcc2/printer/printer_cx320_direct.rb +286 -0
  97. data/lib/mcc2/printer/printer_epl.rb +118 -0
  98. data/lib/mcc2/printer/printer_ttp34x.rb +124 -0
  99. data/lib/mcc2/printer/printer_zebra.rb +324 -0
  100. data/lib/mcc2/printer/svg_drawer.rb +689 -0
  101. data/lib/mcc2/printerview.rb +604 -0
  102. data/lib/mcc2/printerview_dlg.rb +1248 -0
  103. data/lib/mcc2/version.rb +3 -0
  104. data/lib/mcc2.rb +11 -0
  105. data/locales/de.yml +6 -0
  106. data/locales/en.yml +502 -0
  107. data/locales/rs.yml +502 -0
  108. data/mcc2.gemspec +41 -0
  109. data/test/dummy.rb +19 -0
  110. data/test/layouts/bart_simpson.png +0 -0
  111. data/test/layouts/color_test.xml +151 -0
  112. data/test/layouts/ms.xml +67 -0
  113. data/test/ruby_print.rb +380 -0
  114. data/test/test.csv +4 -0
  115. data/test/test.dbf +0 -0
  116. data/test/test.str +4 -0
  117. data/test/test_mcc2.rb +8 -0
  118. data.tar.gz.sig +6 -0
  119. metadata +421 -0
  120. metadata.gz.sig +0 -0
@@ -0,0 +1,101 @@
1
+ # This is a Ruby translation of FXIconItem::drawDetails in C++.
2
+ # It is extended by the possibility to set the text colors per item.
3
+ # And it does a log(n) search for text size rather than a linear search.
4
+
5
+ require "fox16"
6
+
7
+ module Mcc2
8
+ class FxColoredItem < Fox::FXIconItem
9
+ MyColor = Struct.new :f, :b
10
+
11
+ attr_accessor :on_color_requested
12
+
13
+ SIDE_SPACING = 4 # Left or right spacing between items
14
+ DETAIL_TEXT_SPACING = 2 # Spacing between text and icon in detail icon mode
15
+
16
+ def draw(list, dc, x, y, w, h)
17
+ color = on_color_requested&.call(list, self)
18
+
19
+ # For unknown reason a seperate FXDC is required in order to see any drawings.
20
+ dc = Fox::FXDCWindow.new list
21
+ dc.font = list.font
22
+
23
+ header = list.header
24
+ font = list.font
25
+ return if header.numItems == 0
26
+
27
+ iw = 0
28
+ if selected?
29
+ dc.foreground = list.selBackColor
30
+ dc.fillRectangle(x, y, header.totalSize, h)
31
+ elsif color
32
+ dc.foreground = color.b
33
+ dc.fillRectangle(x, y, header.totalSize, h)
34
+ end
35
+ if hasFocus?
36
+ dc.drawFocusRectangle(x + 1, y + 1, header.totalSize - 2, h - 2)
37
+ end
38
+ xx = x + SIDE_SPACING / 2
39
+ if miniIcon
40
+ iw = miniIcon.width
41
+ ih = miniIcon.height
42
+ dc.setClipRectangle(x, y, header.itemSize(0), h)
43
+ dc.drawIcon(miniIcon, xx, y + (h - ih) / 2)
44
+ dc.clearClipRectangle
45
+ xx += iw + DETAIL_TEXT_SPACING
46
+ end
47
+ label = text
48
+ unless label.empty?
49
+ th = font.fontHeight
50
+ dw = font.getTextWidth("...")
51
+ yt = y + (h - th - 4) / 2
52
+ dc.foreground = if !enabled?
53
+ makeShadowColor(list.backColor)
54
+ elsif selected?
55
+ list.selTextColor
56
+ elsif color
57
+ color.f
58
+ else
59
+ list.textColor
60
+ end
61
+ used = iw + DETAIL_TEXT_SPACING + SIDE_SPACING / 2
62
+ label.split("\t")[0...header.numItems].each_with_index do |snip, hi|
63
+ space = header.getItemSize(hi) - used
64
+ if text_width_bigger_than?(font, snip, space - 4)
65
+ pos = find_edge_false_to_true(0, snip.length) do |len|
66
+ text_width_bigger_than?(font, snip[0, len], space - 4 - dw)
67
+ end
68
+ snip = snip[0, pos] << "..."
69
+ dc.setClipRectangle(xx, y, space, h)
70
+ dc.drawText(xx + 2, yt + font.fontAscent + 2, snip)
71
+ dc.clearClipRectangle
72
+ # puts "drawText(#{xx+2},#{yt+font.fontAscent+2},#{snip.inspect})"
73
+ else
74
+ dc.drawText(xx + 2, yt + font.fontAscent + 2, snip)
75
+ # puts "drawText(#{xx+2},#{yt+font.fontAscent+2},#{snip.inspect})"
76
+ end
77
+ xx += space
78
+ used = 0
79
+ end
80
+ end
81
+ end
82
+
83
+ private
84
+
85
+ def text_width_bigger_than?(font, text, max_size)
86
+ # work around of int16 limitation to getTextWidth return value
87
+ (text.length > 4000) ? true : (font.getTextWidth(text) > max_size)
88
+ end
89
+
90
+ def find_edge_false_to_true(pos_false, pos_true, delta = 1, &block)
91
+ pos = (pos_false + pos_true) / 2
92
+ return pos if pos <= pos_false && pos >= pos_true - delta
93
+
94
+ if block.call(pos)
95
+ find_edge_false_to_true(pos_false, pos, delta, &block)
96
+ else
97
+ find_edge_false_to_true(pos, pos_true, delta, &block)
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,68 @@
1
+ require "pmap"
2
+
3
+ module Mcc2
4
+ class GeneratePreview
5
+ attr_accessor :verbose
6
+ attr_accessor :dpi
7
+ attr_accessor :skip_when
8
+
9
+ def initialize
10
+ @mcc2print = Mcc2::Mcc2Print.new
11
+ @dpi = 200
12
+ @skip_when = "uptodate"
13
+ end
14
+
15
+ def start!(fnames)
16
+ if fnames.empty?
17
+ fnames = (Dir.glob("*.xml") + Dir.glob("*.mcc2")).sort
18
+ end
19
+ fnames.each do |fname|
20
+ fname_png = "#{fname}.png"
21
+ sk = case skip_when
22
+ when "existing" then File.exist?(fname_png)
23
+ when "uptodate" then File.exist?(fname_png) && File.mtime(fname) <= File.mtime(fname_png)
24
+ when "none" then false
25
+ else
26
+ raise "invalid skip mode: #{skip_when}"
27
+ end
28
+ if sk
29
+ puts "Skip #{fname} (is #{skip_when})" if verbose
30
+ next
31
+ end
32
+
33
+ fna = File.basename(fname)
34
+ kwargs = {
35
+ "//Layout/datasource_typ" => "none",
36
+ "//Layout/datasource" => "3",
37
+ "//Layout/barcode_dpi" => dpi.to_s,
38
+ "{#{fna}}//Layout/datasource" => "1",
39
+ "{#{fna}}//Layout/printertype" => "FilePrinter",
40
+ "{#{fna}}//Layout/fileprinter_save_as" => fname_png,
41
+ "{#{fna}}//Layout/fileprinter_dpi" => dpi.to_s
42
+ }
43
+
44
+ begin
45
+ puts "Processing #{fname}" if verbose
46
+ @mcc2print.start!(fname, kwargs)
47
+ rescue => err
48
+ warn "#{fname}: #{err}"
49
+ end
50
+ end
51
+ end
52
+
53
+ def self.run(argv)
54
+ app = new
55
+
56
+ OptionParser.new do |opts|
57
+ opts.banner = "Usage: #{$0} <layout.mcc2>* [options]"
58
+
59
+ opts.on("-v", "--[no-]verbose", "Run verbosely", &app.method(:verbose=))
60
+ Locales.add_lang_option(opts)
61
+ opts.on("--dpi INT", "Generate previews with INT DPI [#{app.dpi}]", &app.method(:dpi=))
62
+ opts.on("--skip MODE", "Skip files when: uptodate|existing|none [#{app.skip_when}]", &app.method(:skip_when=))
63
+ end.parse!
64
+
65
+ app.start!(argv)
66
+ end
67
+ end
68
+ end