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,604 @@
1
+ require "json"
2
+ require "mcc2/printerview_dlg"
3
+
4
+ module Mcc2
5
+ class Printerview < Dialogbox_printerview
6
+ include Fox
7
+
8
+ PrinterDescription = Struct.new :human_name, :class_name, :tab_idx
9
+ PrinterDescriptions = [
10
+ PrinterDescription.new("Windows-Printer", "GdiPrinter", 0),
11
+ PrinterDescription.new("Save as Image", "FilePrinter", 1),
12
+ PrinterDescription.new("Linux-CUPS", "LinuxCupsPrinter", 2),
13
+ PrinterDescription.new("Zebra", "PrinterZebra", 3),
14
+ PrinterDescription.new("cab Produktionstechnik GmbH", "PrinterCab", 4),
15
+ PrinterDescription.new("EPL-Drucker", "PrinterEpl", 5),
16
+ PrinterDescription.new("CX-320 Direct", "PrinterCx320Direct", 6),
17
+ PrinterDescription.new("TSC TTP 346M PRO", "PrinterTTP34x", 7),
18
+ PrinterDescription.new("CX-320 Spooler", "PrinterCx320Gdi", 0)
19
+ ]
20
+
21
+ def initialize parent, layout
22
+ @layout = layout
23
+ @parent = parent
24
+ @layout_file = nil
25
+
26
+ super(parent)
27
+ @verticalframe_printersetup.reparent parent, nil
28
+ @dialogbox_printerview.close
29
+
30
+ @combobox_printertype.connect(SEL_COMMAND) { combobox_printertype_changed }
31
+ @textfield_file_save_as.connect(SEL_COMMAND) {
32
+ changed_attributes if @layout_file.set_attr_value(S_FILEPRINTER_SAVE_AS, @textfield_file_save_as.text)
33
+ }
34
+ # Button für das Auswählen einer Datenquelle an Textfeld knüpfen
35
+ @layout.connect_filebutton_to_textfield(@button_file_save_as, @textfield_file_save_as,
36
+ filepatterns: ["JPEG 24 Bit (*.jpeg)", "Portable Netork Graphics 24 Bit (*.png)", "TIFF (*.tiff)"])
37
+
38
+ @spinner_file_dpi.connect(SEL_COMMAND) {
39
+ changed_attributes if @layout_file.set_attr_value(S_FILEPRINTER_DPI, @spinner_file_dpi.value.to_s)
40
+ }
41
+ @combobox_linux_printer.connect(SEL_COMMAND) do
42
+ prname = @combobox_linux_printer.getItemData(@combobox_linux_printer.currentItem)
43
+ linux_cups_printer_changed(prname)
44
+ changed_attributes if @layout_file.set_attr_value(S_LINUX_CUPS_PRINTER, prname)
45
+ end
46
+ @spinner_linux_cups_dpi.connect(SEL_COMMAND) {
47
+ changed_attributes if @layout_file.set_attr_value(S_LINUX_CUPS_DPI, @spinner_linux_cups_dpi.value.to_s)
48
+ }
49
+ @combobox_gdi_printer.connect(SEL_COMMAND) { gdi_combobox_changed(@combobox_gdi_printer, S_GDIPRINTER_NAME, S_GDIPRINTER_INITDATA) }
50
+ @button_gdi_printersetup.connect(SEL_COMMAND) { gdi_printersetup_pressed(@combobox_gdi_printer, S_GDIPRINTER_INITDATA) }
51
+ @combobox_zebra_printer.connect(SEL_COMMAND) { gdi_combobox_changed(@combobox_zebra_printer, S_ZEBRAPRINTER_NAME, S_ZEBRAPRINTER_INITDATA) }
52
+ @button_zebra_printersetup.connect(SEL_COMMAND) { gdi_printersetup_pressed(@combobox_zebra_printer, S_ZEBRAPRINTER_INITDATA) }
53
+
54
+ @button_zebra_reset.connect(SEL_COMMAND) { zebra_send_command(@combobox_zebra_printer, "R") }
55
+ @button_zebra_eject_card.connect(SEL_COMMAND) { zebra_send_command(@combobox_zebra_printer, "MO") }
56
+ @button_zebra_eject_card2.connect(SEL_COMMAND) { zebra_send_command(@combobox_zebra_printer, "ME") }
57
+ @button_zebra_move_contactless.connect(SEL_COMMAND) { zebra_send_command(@combobox_zebra_printer, "MCL") }
58
+ @button_zebra_print_testcard.connect(SEL_COMMAND) { zebra_send_command(@combobox_zebra_printer, "A") }
59
+ @button_zebra_printer_info.connect(SEL_COMMAND) { zebra_send_command(@combobox_zebra_printer, "V") }
60
+ @button_zebra_send.connect(SEL_COMMAND) do
61
+ command = @textfield_zebra_command.text.strip
62
+ if command.length > 0
63
+ zebra_send_command(@combobox_zebra_printer, command)
64
+ end
65
+ end
66
+ @textfield_cab_host.connect(SEL_COMMAND) {
67
+ changed_attributes if @layout_file.set_attr_value(S_CABPRINTER_HOST, @textfield_cab_host.text)
68
+ }
69
+ @spinner_cab_port.connect(SEL_COMMAND) {
70
+ changed_attributes if @layout_file.set_attr_value(S_CABPRINTER_PORT, @spinner_cab_port.value.to_s)
71
+ }
72
+ @spinner_cab_dpi.connect(SEL_COMMAND) {
73
+ changed_attributes if @layout_file.set_attr_value(S_CABPRINTER_DPI, @spinner_cab_dpi.value.to_s)
74
+ }
75
+ @text_cab_page_commands.connect(SEL_CHANGED) {
76
+ changed_attributes if @layout_file.set_attr_value(S_CABPRINTER_PAGE_COMMANDS, @text_cab_page_commands.text)
77
+ }
78
+ @button_cab_info.connect(SEL_COMMAND) { cab_send_command("\es\r\n") { |s| s.read(9) } }
79
+ @button_cab_extended_info.connect(SEL_COMMAND) { cab_send_command("\ez\r\n") { |s| s.gets("\r") } }
80
+ @button_cab_self_test.connect(SEL_COMMAND) { cab_send_command("t\r\n") }
81
+ @button_cab_firmware_version.connect(SEL_COMMAND) { cab_send_command("v\r\n") { |s| s.gets("\r") } }
82
+ @button_cab_cancel_jobs.connect(SEL_COMMAND) { cab_send_command("\et\r\n") }
83
+
84
+ @textfield_epl_device.connect(SEL_COMMAND) {
85
+ changed_attributes if @layout_file.set_attr_value(S_EPLPRINTER_DEVICE, @textfield_epl_device.text)
86
+ }
87
+ @text_epl_page_commands.connect(SEL_CHANGED) {
88
+ changed_attributes if @layout_file.set_attr_value(S_EPLPRINTER_PAGE_COMMANDS, @text_epl_page_commands.text)
89
+ }
90
+ @spinner_epl_dpi.connect(SEL_COMMAND) {
91
+ changed_attributes if @layout_file.set_attr_value(S_EPLPRINTER_DPI, @spinner_epl_dpi.value.to_s)
92
+ }
93
+
94
+ @textfield_ttp343_device.connect(SEL_COMMAND) {
95
+ changed_attributes if @layout_file.set_attr_value(S_TTP34XPRINTER_DEVICE, @textfield_ttp343_device.text)
96
+ }
97
+ @text_ttp343_page_commands.connect(SEL_CHANGED) {
98
+ changed_attributes if @layout_file.set_attr_value(S_TTP34XPRINTER_PAGE_COMMANDS, @text_ttp343_page_commands.text)
99
+ }
100
+ @spinner_ttp343_dpi.connect(SEL_COMMAND) {
101
+ changed_attributes if @layout_file.set_attr_value(S_TTP34XPRINTER_DPI, @spinner_ttp343_dpi.value.to_s)
102
+ }
103
+
104
+ @combobox_cx320_driver.appendItem("LIBUSB", "CX320_USB")
105
+ @combobox_cx320_driver.appendItem("DLL", "CX320_DLL")
106
+ @combobox_cx320_driver.appendItem("Simulation", "CX320_SIMU")
107
+ @combobox_cx320_driver.connect(SEL_COMMAND) { combobox_changed(@combobox_cx320_driver, S_CX320_DRIVER) }
108
+ @spinner_cx320_printer_nr.connect(SEL_COMMAND) {
109
+ changed_attributes if @layout_file.set_attr_value(S_CX320_PRINTER_NR, @spinner_cx320_printer_nr.value.to_s)
110
+ }
111
+ @combobox_cx320_parallel_print.appendItem(I18n.t(:on, default: "Ein"), "on")
112
+ @combobox_cx320_parallel_print.appendItem(I18n.t(:off, default: "Aus"), "off")
113
+ @combobox_cx320_parallel_print.appendItem(I18n.t(:cx320_from_second_card, default: "ab zweiter Karte"), "second_card")
114
+ @combobox_cx320_parallel_print.connect(SEL_COMMAND) { combobox_changed(@combobox_cx320_parallel_print, S_CX320_PARALLEL_PRINT) }
115
+
116
+ @button_cx320_reset.connect(SEL_COMMAND) { cx320_run_command { |printer, dev| dev.rezero_unit } }
117
+ @button_cx320_move_to_0.connect(SEL_COMMAND) { cx320_move_to(0) }
118
+ @button_cx320_move_to_2.connect(SEL_COMMAND) { cx320_move_to(2) }
119
+ @button_cx320_move_to_4.connect(SEL_COMMAND) { cx320_move_to(4) }
120
+
121
+ @button_cx320_read_config.connect(SEL_COMMAND) { cx320_read_config }
122
+ @button_cx320_write_config.connect(SEL_COMMAND) { cx320_write_config }
123
+ @button_cx320_set_defaults.connect(SEL_COMMAND) { cx320_set_defaults }
124
+
125
+ fill_printertype_list
126
+ combobox_printertype_changed
127
+
128
+ FXSeparator.new(@verticalframe_linux_cups)
129
+ @linux_cups_options = []
130
+ FXMatrix.new(@verticalframe_linux_cups, opts: MATRIX_BY_COLUMNS | LAYOUT_FILL | FRAME_GROOVE, vSpacing: 0, hSpacing: 0) do |mat|
131
+ mat.numColumns = 2
132
+ 10.times do
133
+ combo_val = nil
134
+ combo_key = FXComboBox.new(mat, 0, nil, 0,
135
+ COMBOBOX_NO_REPLACE | FRAME_SUNKEN | LAYOUT_SIDE_TOP | LAYOUT_FILL_X | LAYOUT_FILL_COLUMN) do |combo|
136
+ combo.editable = true
137
+ # names = JSON.parse( app.reg.readStringEntry('login', 'usernames', '[]') )
138
+ combo.numVisible = 10
139
+ combo.connect(SEL_COMMAND) do
140
+ linux_cups_combo_key_changed(combo, combo_val)
141
+ end
142
+ end
143
+ combo_val = FXComboBox.new(mat, 0, nil, 0,
144
+ COMBOBOX_NO_REPLACE | FRAME_SUNKEN | LAYOUT_SIDE_TOP | LAYOUT_FILL_X | LAYOUT_FILL_COLUMN) do |combo|
145
+ combo.editable = true
146
+ # names = JSON.parse( app.reg.readStringEntry('login', 'usernames', '[]') )
147
+ combo.numVisible = 10
148
+ combo.connect(SEL_COMMAND) do
149
+ linux_cups_combo_val_changed(combo)
150
+ end
151
+ end
152
+ @linux_cups_options << [combo_key, combo_val]
153
+ end
154
+ end
155
+ end
156
+
157
+ def combobox_changed(combobox, attr)
158
+ data = combobox.getItemData(combobox.currentItem)
159
+ if @layout_file.set_attr_value(attr, data)
160
+ changed_attributes
161
+ end
162
+ end
163
+
164
+ def gdi_combobox_changed(combobox, attr, attr_initdata)
165
+ data = combobox.getItemData(combobox.currentItem)
166
+ @layout_file.set_attr_value(attr, data)
167
+ @layout_file.set_binary_attr(attr_initdata, "")
168
+ end
169
+
170
+ def combobox_printertype_changed
171
+ deactivate_printer_tabs
172
+ prdesc = @combobox_printertype.getItemData(@combobox_printertype.currentItem)
173
+ @tabbook_printers.childAtIndex(prdesc.tab_idx * 2).shown = true
174
+
175
+ if @layout_file
176
+ if @layout_file.set_attr_value(S_PRINTERTYPE, prdesc.class_name)
177
+ changed_attributes
178
+ end
179
+ send :"selected_#{prdesc.class_name}"
180
+ end
181
+
182
+ @tabbook_printers.recalc
183
+ end
184
+
185
+ def selected_GdiPrinter(combobox = @combobox_gdi_printer, attr = S_GDIPRINTER_NAME)
186
+ if_driver_loadable("win32api4ruby", "win32api4ruby", I18n.t(:gdi_printer_driver_load_caption, default: "die Windows-Druckerschnittstelle"), verify_code: "Win32api4ruby::Winspool") do
187
+ Win32api4ruby::Base.unicode = true
188
+
189
+ combobox.clearItems
190
+
191
+ flags = Win32api4ruby::Winspool::PRINTER_ENUM_NAME
192
+ flags |= Win32api4ruby::Winspool::PRINTER_ENUM_CONNECTIONS
193
+ name = nil
194
+ level = 4
195
+ infos = Win32api4ruby::Winspool.enum_printers(flags, name, level)
196
+ infos.each { |info|
197
+ prname = info[:pPrinterName].to_s_utf8
198
+ combobox.appendItem(prname, prname)
199
+ }
200
+ prname = @layout_file.get_attr_value(attr)
201
+ Layout.set_combobox_by_data(combobox, prname, false)
202
+ end
203
+ end
204
+
205
+ def gdi_printersetup_pressed(combobox, attr)
206
+ if combobox.currentItem && combobox.numItems > 0
207
+ prname = combobox.getItemData(combobox.currentItem)
208
+ initdata = @layout_file.get_binary_attr(attr)
209
+
210
+ flags = Win32api4ruby::Winspool::DM_PROMPT | Win32api4ruby::Winspool::DM_OUT_BUFFER
211
+ flags |= Win32api4ruby::Winspool::DM_IN_BUFFER if initdata
212
+
213
+ # open setup-dialog
214
+ begin
215
+ devmod = Win32api4ruby::Winspool.document_properties(nil, nil, prname.to_s_win32, initdata, flags)
216
+ rescue => e
217
+ FXMessageBox.error(@parent.app, MBOX_OK, I18n.t(:gdi_printer_error_at_setup, default: "Fehler beim Einrichten des Druckers"), e.to_s)
218
+ end
219
+ if devmod
220
+ changed_attributes if @layout_file.set_binary_attr(attr, devmod.pointer.read_bytes(devmod.pointer.size))
221
+ end
222
+ end
223
+ end
224
+
225
+ def zebra_send_command(combobox, command)
226
+ @textfield_zebra_answer.text = ""
227
+
228
+ printer_name = combobox.getItemData(combobox.currentItem)
229
+ printer = Mcc2::Printer::PrinterZebra.new
230
+ printer.open_handle(printer_name)
231
+ begin
232
+ answer = printer.send_cmd_ex(command).to_s
233
+ if answer.length == 1 && answer[0] == 6
234
+ answer = "<ACK>"
235
+ end
236
+ @textfield_zebra_answer.text = answer
237
+ ensure
238
+ printer.close_handle
239
+ end
240
+ rescue => e
241
+ FXMessageBox.error(@parent.app, MBOX_OK, *I18n.t(:zebra_printer_error_send_cmd, default: [["Fehler beim Senden des Kommandos '%{command}' an den Drucker:", "%{e}\n\n%{backtrace}"]], command:, e:, backtrace: e.backtrace.join("\n")))
242
+ end
243
+
244
+ def selected_FilePrinter
245
+ end
246
+
247
+ def selected_LinuxCupsPrinter
248
+ if_driver_loadable("ffi-cups2", "ffi-cups", I18n.t(:linux_cups_printer_driver_load_caption, default: "die Linux-Druckerschnittstelle (also libcups2)")) do
249
+ combobox = @combobox_linux_printer
250
+ combobox.clearItems
251
+
252
+ printers = Cups::Printer.get_destinations
253
+ printers.each { |printer|
254
+ prname = printer.name
255
+ combobox.appendItem(prname, prname)
256
+ }
257
+ prname = @layout_file.get_attr_value(S_LINUX_CUPS_PRINTER)
258
+ Layout.set_combobox_by_data(combobox, prname, false)
259
+
260
+ @spinner_linux_cups_dpi.value = @layout_file.get_attr_value(S_LINUX_CUPS_DPI).to_i
261
+
262
+ linux_cups_printer_changed(prname)
263
+
264
+ json_str = @layout_file.get_attr_value(S_LINUX_CUPS_OPTIONS)
265
+ hash = JSON.parse(json_str).to_a
266
+ @linux_cups_options.each_with_index do |(chk, chv), idx|
267
+ chk.text = hash[idx]&.[](0) || ""
268
+ chv.text = hash[idx]&.[](1) || ""
269
+ end
270
+ end
271
+ end
272
+
273
+ def linux_cups_printer_changed(prname)
274
+ cs = Cups.constants.each.with_object({}) { |c, h| h[c] = true }
275
+ keys = cs.select { |c, _| cs[:"#{c}_SUPPORTED"] }.keys
276
+ cvals = keys.map { |c| [c, Cups.const_get(c)] }
277
+
278
+ begin
279
+ printer = Cups::Printer.get_destination(prname)
280
+ ppd = printer.ppd_options
281
+ ppd.each do |opt|
282
+ cvals << [opt[:keyword], opt[:text]]
283
+ end
284
+ rescue Cups::Error
285
+ end
286
+ @linux_cups_options.each do |combo_key, combo_val|
287
+ combo_key.clearItems
288
+ combo_key.appendItem("", nil)
289
+ cvals.each do |name, val|
290
+ combo_key.appendItem(val, name)
291
+ end
292
+ combo_val.clearItems
293
+ end
294
+
295
+ @label_linux_printer_state.text = "Status: #{printer&.state || "not reachable"}"
296
+ end
297
+
298
+ def linux_cups_combo_key_changed(combo_key, combo_val)
299
+ combo_val.clearItems
300
+ key = combo_key.getItemData(combo_key.currentItem)
301
+ if key
302
+ cs = Cups.constants
303
+ vals = cs.select { |c| c.to_s.start_with?("#{key}_") }
304
+ vals = vals.reject { |c| c.end_with?("_SUPPORTED") }
305
+ cvals = vals.map { |c| [c, Cups.const_get(c)] }
306
+
307
+ begin
308
+ prname = @layout_file.get_attr_value(S_LINUX_CUPS_PRINTER)
309
+ printer = Cups::Printer.get_destination(prname)
310
+ ppd = printer.ppd_options
311
+ ppd_opt = ppd.find{|opt| opt[:keyword] == key }
312
+ ppd_opt&.[](:choices)&.each do |choise|
313
+ cvals << [choise[:choice], choise[:choice]]
314
+ end
315
+ rescue Cups::Error
316
+ end
317
+
318
+ cvals.each do |name, name_val|
319
+ combo_val.appendItem(name == name_val ? name : "#{name}=#{name_val}", name_val)
320
+ end
321
+ end
322
+ linux_cups_combo_key_or_val_changed
323
+ end
324
+
325
+ def linux_cups_combo_val_changed(combo_val)
326
+ linux_cups_combo_key_or_val_changed
327
+ end
328
+
329
+ def linux_cups_combo_key_or_val_changed
330
+ opts = @linux_cups_options.each.with_object({}) do |(combo_key, combo_val), h|
331
+ text = combo_val.text
332
+ h[combo_key.text] = text unless text.empty?
333
+ end
334
+ changed_attributes if @layout_file.set_attr_value(S_LINUX_CUPS_OPTIONS, JSON.dump(opts))
335
+ end
336
+
337
+ def selected_PrinterZebra
338
+ if_driver_loadable("zebra_dll", "zebra_dll", I18n.t(:zebra_printer_driver_load_caption, default: "Zebra-Drucker")) do
339
+ selected_GdiPrinter(@combobox_zebra_printer, S_ZEBRAPRINTER_NAME)
340
+ end
341
+ end
342
+
343
+ def selected_PrinterCab
344
+ end
345
+
346
+ def selected_PrinterEpl
347
+ end
348
+
349
+ def selected_PrinterTTP34x
350
+ end
351
+
352
+ def selected_PrinterCx320Direct
353
+ if_driver_loadable("libcx320", "libcx320", I18n.t(:cx320_printer_driver_load_caption, default: "CX320-Drucker")) do
354
+ cx320_update_config_widgets
355
+ end
356
+ end
357
+
358
+ def selected_PrinterCx320Gdi
359
+ if_driver_loadable("libcx320", "libcx320", I18n.t(:cx320_printer_driver_load_caption, default: "CX320-Drucker")) do
360
+ # selected_GdiPrinter(@combobox_zebra_printer, S_ZEBRAPRINTER_NAME)
361
+ end
362
+ end
363
+
364
+ def if_driver_loadable(gem_name, require_name, human_name, verify_code: nil)
365
+ gem gem_name
366
+ require require_name
367
+ eval(verify_code) if verify_code
368
+ rescue LoadError, RuntimeError => e
369
+ FXMessageBox.error(@parent.app, MBOX_OK, *I18n.t(:printer_driver_load_error, default: [["Fehler beim Laden des Treibers für %{human_name}", "Der Treiber für %{human_name} konnte nicht geladen werden.\nBitte stellen Sie sicher, dass das Gem-Paket '%{gem_name}' installiert ist.\n\n%{e}"]], human_name:, gem_name:, e: e.to_s.force_encoding("UTF-8")))
370
+ else
371
+ yield
372
+ end
373
+
374
+ def cab_send_command(data, &)
375
+ cab = Mcc2::Printer::PrinterCab.new
376
+ @text_cab_output.text = cab.send_command(@layout_file, data, &).to_s
377
+ rescue => e
378
+ DebugTools.write_exception("cab_send_command", e)
379
+ FXMessageBox.error(@parent.app, MBOX_OK, *I18n.t(:cab_send_command_error, default: [["Fehler beim Senden", "Das Kommando konnte nicht ausgeführt werden\nBitte stellen Sie sicher, dass die Verbindungsparameter korrekt sind.\n\n%{e}"]], e: e.to_s))
380
+ end
381
+
382
+ def cx320_run_command(&block)
383
+ printer = Mcc2::Printer::PrinterCx320Direct.new
384
+ printer.layout_file = @layout_file
385
+ printer.run_command do |dev|
386
+ yield printer, dev
387
+ end
388
+ rescue => e
389
+ DebugTools.write_exception("cx320_run_command", e)
390
+ FXMessageBox.error(@parent.app, MBOX_OK, *I18n.t(:cx320_send_command_error, default: [["Fehler beim Senden", "Das Kommando konnte nicht ausgeführt werden\n\n%{e}"]], e: e.to_s))
391
+ end
392
+
393
+ def cx320_move_to(pos)
394
+ cx320_run_command do |printer, dev|
395
+ dev.move_card(pos)
396
+ rescue LibCX320::ErrorHandling::CommandSequenceError
397
+ dev.load_card(pos)
398
+ end
399
+ end
400
+
401
+ def cx320_fill_config(attrs)
402
+ attr_checked = {}
403
+ if c = @packer_cx320_config.children.first
404
+ c.children.each do |w|
405
+ attr, checkbutton = w.userData
406
+ next unless attr
407
+
408
+ attr_checked[attr.name.to_s] = checkbutton.checked? if attr.writeable
409
+ end
410
+ end
411
+
412
+ @packer_cx320_config.children.each do |ch|
413
+ @packer_cx320_config.removeChild(ch)
414
+ end
415
+
416
+ Fox::FXMatrix.new(@packer_cx320_config, 2, Fox::MATRIX_BY_COLUMNS) do |matrix|
417
+ attrs.each do |attr, checked|
418
+ if attr.writeable
419
+ # READ/WRITE parameter
420
+
421
+ checkbutton = FXCheckButton.new(matrix, attr.name.to_s)
422
+ checked = attr_checked[attr.name.to_s] if checked.nil?
423
+ checkbutton.setCheck(checked.nil? || checked)
424
+ checkbutton.connect(SEL_COMMAND) { cx320_config_field_changed }
425
+
426
+ w = case attr.typ
427
+ when :int
428
+ w = FXSpinner.new(matrix, 19)
429
+ w.range = attr.params
430
+ w.value = attr.value if attr.value
431
+ w.connect(SEL_COMMAND) { cx320_config_field_changed }
432
+ w
433
+ when :set
434
+ w = FXComboBox.new(matrix, 19)
435
+ attr.params.each do |k, v|
436
+ w.appendItem((k == attr.default) ? "#{v} (default)" : v, k)
437
+ end
438
+ idx = -1
439
+ if w.find { |text, data|
440
+ idx += 1
441
+ data == attr.value
442
+ }
443
+ w.setCurrentItem(idx)
444
+ end
445
+ w.numVisible = [attr.params.length, 10].min
446
+ w.editable = false
447
+ w.connect(SEL_COMMAND) { cx320_config_field_changed }
448
+ w
449
+ when :ascii
450
+ w = FXTextField.new(matrix, attr.params)
451
+ w.text = attr.value if attr.value
452
+ w.connect(SEL_COMMAND) { cx320_config_field_changed }
453
+ w
454
+ end
455
+
456
+ w.userData = [attr, checkbutton]
457
+ else
458
+ # READ-only parameter
459
+
460
+ FXLabel.new(matrix, attr.name.to_s)
461
+
462
+ value = case attr.typ
463
+ when :set then attr.params[attr.value]
464
+ else attr.value.to_s
465
+ end
466
+
467
+ w = FXLabel.new(matrix, value)
468
+ w.userData = attr
469
+ end
470
+ end
471
+
472
+ if matrix.parent.created?
473
+ matrix.create
474
+ matrix.show
475
+ matrix.recalc
476
+ end
477
+ end
478
+ end
479
+
480
+ def cx320_config_field_changed
481
+ config = JSON.parse(@layout_file.get_attr_value(S_CX320_CONFIG))
482
+
483
+ hash = {}
484
+ @packer_cx320_config.children.first.children.each do |w|
485
+ attr, checkbutton = w.userData
486
+ next unless attr
487
+
488
+ if attr.writeable && checkbutton.checked?
489
+ # READ/WRITE parameter
490
+
491
+ value = case attr.typ
492
+ when :int
493
+ w.value
494
+ when :set
495
+ w.getItemData(w.currentItem)
496
+ when :ascii
497
+ w.text
498
+ end
499
+ hash[attr.name.to_s] = value
500
+ end
501
+ end
502
+
503
+ if hash != config
504
+ changed_attributes if @layout_file.set_attr_value(S_CX320_CONFIG, hash.to_json)
505
+ end
506
+ end
507
+
508
+ def cx320_read_config
509
+ cx320_run_command do |printer, dev|
510
+ attrs = dev.mode_sense(:print) + dev.mode_sense(:ink) + dev.mode_sense(:mag) + dev.log_sense(:log)
511
+ cx320_fill_config(attrs.map { |a| [a, true] })
512
+ cx320_config_field_changed
513
+ end
514
+ end
515
+
516
+ def cx320_write_config
517
+ cx320_run_command do |printer, dev|
518
+ cx320_config_field_changed
519
+ config = JSON.parse(@layout_file.get_attr_value(S_CX320_CONFIG))
520
+ printer.write_config(config, dev)
521
+ end
522
+ end
523
+
524
+ def cx320_set_defaults
525
+ if @layout_file.set_attr_value(S_CX320_CONFIG, "{}")
526
+ cx320_update_config_widgets
527
+ changed_attributes
528
+ end
529
+ end
530
+
531
+ def deactivate_printer_tabs
532
+ 0.step(@tabbook_printers.numChildren - 1, 2) { |idx|
533
+ @tabbook_printers.childAtIndex(idx).shown = false
534
+ }
535
+ end
536
+
537
+ def fill_printertype_list
538
+ l = @combobox_printertype
539
+ l.clearItems
540
+ PrinterDescriptions.sort_by(&:tab_idx).each { |desc|
541
+ l.appendItem(desc.human_name, desc)
542
+ }
543
+ end
544
+
545
+ def printerview_tab_activated(active = true)
546
+ combobox_printertype_changed if active
547
+ end
548
+
549
+ attr_reader :layout_file
550
+ def layout_file= file
551
+ @layout_file = file
552
+ pd = PrinterDescriptions.find { |d| @layout_file.get_attr_value(S_PRINTERTYPE) == d.class_name }
553
+ Layout.set_combobox_by_data(@combobox_printertype, pd)
554
+
555
+ @textfield_file_save_as.text = @layout_file.get_attr_value(S_FILEPRINTER_SAVE_AS)
556
+ @spinner_file_dpi.value = @layout_file.get_attr_value(S_FILEPRINTER_DPI).to_i
557
+
558
+ @textfield_cab_host.text = @layout_file.get_attr_value(S_CABPRINTER_HOST)
559
+ @spinner_cab_port.value = @layout_file.get_attr_value(S_CABPRINTER_PORT).to_i
560
+ @spinner_cab_dpi.value = @layout_file.get_attr_value(S_CABPRINTER_DPI).to_i
561
+ @text_cab_page_commands.text = @layout_file.get_attr_value(S_CABPRINTER_PAGE_COMMANDS)
562
+
563
+ @textfield_epl_device.text = @layout_file.get_attr_value(S_EPLPRINTER_DEVICE)
564
+ @spinner_epl_dpi.value = @layout_file.get_attr_value(S_EPLPRINTER_DPI).to_i
565
+ @text_epl_page_commands.text = @layout_file.get_attr_value(S_EPLPRINTER_PAGE_COMMANDS)
566
+
567
+ # TSC TTP 343M Pro
568
+ @textfield_ttp343_device.text = @layout_file.get_attr_value(S_TTP34XPRINTER_DEVICE)
569
+ @spinner_ttp343_dpi.value = @layout_file.get_attr_value(S_TTP34XPRINTER_DPI).to_i
570
+ @text_ttp343_page_commands.text = @layout_file.get_attr_value(S_TTP34XPRINTER_PAGE_COMMANDS)
571
+
572
+ Layout.set_combobox_by_data(@combobox_cx320_driver, @layout_file.get_attr_value(S_CX320_DRIVER))
573
+ @spinner_cx320_printer_nr.value = @layout_file.get_attr_value(S_CX320_PRINTER_NR).to_i
574
+ Layout.set_combobox_by_data(@combobox_cx320_parallel_print, @layout_file.get_attr_value(S_CX320_PARALLEL_PRINT))
575
+
576
+ if pd == "PrinterCx320Direct"
577
+ cx320_update_config_widgets
578
+ end
579
+ end
580
+
581
+ def cx320_update_config_widgets
582
+ attrs = LibCX320::CX320.mode_sense_attrs(:print) +
583
+ LibCX320::CX320.mode_sense_attrs(:ink) +
584
+ LibCX320::CX320.mode_sense_attrs(:mag) +
585
+ LibCX320::CX320.log_sense_attrs(:log)
586
+ config = JSON.parse(@layout_file.get_attr_value(S_CX320_CONFIG))
587
+ attrs = attrs.map do |attr|
588
+ if value = config[attr.name.to_s]
589
+ attr.value = value
590
+ checked = true
591
+ else
592
+ attr.value = attr.default
593
+ checked = false
594
+ end
595
+ [attr, checked]
596
+ end
597
+ cx320_fill_config(attrs)
598
+ end
599
+
600
+ def changed_attributes
601
+ @layout.changed_attributes
602
+ end
603
+ end
604
+ end