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
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,323 @@
1
+ require "mcc2/cc_dialogbox"
2
+ require "mcc2/layout_file"
3
+ require "mcc2/layoutview"
4
+ require "mcc2/dataview"
5
+ require "mcc2/printerview"
6
+ require "mcc2/printer/preview"
7
+
8
+ module Mcc2
9
+ # definiert ein Clientfenster mit allen Einstellungen und Attributen, die für ein bestimmtes Kartenlayout benötigt werden
10
+ class Layout
11
+ include Fox
12
+
13
+ # enthält die kompletten Einstellungen des Kartenlayouts
14
+ attr_reader :layout_file
15
+
16
+ # der Datamanager
17
+ attr_accessor :dataman
18
+
19
+ #---------------------------------------------------------------------------------------------------------
20
+
21
+ # initialisiert zusätzliche Elemente im Layout-Dialog, die nicht oder schlecht im Fox-GUI-Builder erzeugt werden können
22
+ # setzt Parameter bei Dialog-Elementen
23
+ # definiert die Aktionen, welche bei bestimmten Ereignissen auf bestimmten Elementen des Dialogs ausgeführt werden sollen
24
+ # ==== Parameter
25
+ # +parent+:: parent-fx-window
26
+ def initialize(parent, mdititle, filename: nil, xpath_changes: {}, new_file: false)
27
+ @parent = parent
28
+ @mdititle = mdititle
29
+ begin
30
+ require "ruby-zint"
31
+ rescue LoadError => e
32
+ puts "Loading barcode driver failed: #{e}"
33
+ end
34
+
35
+ # avoid warnings to uninit values
36
+ @preview = nil
37
+
38
+ close_dataman
39
+
40
+ FXSplitter.new(parent) do |splitter1|
41
+ @fxtabbook = FXTabBook.new(splitter1) do |tabbook|
42
+ # %w[SEL_MAP SEL_CONFIGURE SEL_ENTER SEL_FOCUSIN SEL_UPDATE SEL_UNGRABBED SEL_COMMAND].each{|se|
43
+ # tabbook.connect(Fox.const_get(se)){|sender, sel, event|
44
+ # puts "#{se}: #{sender}, #{sel}, #{event}"
45
+ # }
46
+ # }
47
+ tabbook.connect(SEL_COMMAND) do |sender, sel, event|
48
+ @layoutview.layoutview_tab_activated(event == 0)
49
+ @printerview.printerview_tab_activated(event == 1)
50
+ @dataview.dataview_tab_activated(event == 2)
51
+ end
52
+ FX::TabItem.new(tabbook) do |tabitem_layoutview|
53
+ tabitem_layoutview.text = I18n.t(:tab_layout_header, default: "&Entwurf")
54
+ tabitem_layoutview.img = "mcc2/images/document-edit.png"
55
+ end
56
+ FXVerticalFrame.new(tabbook) do |frame_layoutview|
57
+ @layoutview = Layoutview.new frame_layoutview, self
58
+ end
59
+ FX::TabItem.new(tabbook) do |tabitem_printerview|
60
+ tabitem_printerview.text = I18n.t(:tab_printer_header, default: "D&rucker")
61
+ tabitem_printerview.img = "mcc2/images/document-print.png"
62
+ end
63
+ FXVerticalFrame.new(tabbook) do |frame_printerview|
64
+ @printerview = Printerview.new frame_printerview, self
65
+ end
66
+ FX::TabItem.new(tabbook) do |tabitem_dataview|
67
+ tabitem_dataview.text = I18n.t(:tab_data_header, default: "Da&ten")
68
+ tabitem_dataview.img = "mcc2/images/documentation.png"
69
+ end
70
+ FXVerticalFrame.new(tabbook) do |frame_dataview|
71
+ @dataview = Dataview.new frame_dataview, self
72
+ end
73
+ end
74
+ FXVerticalFrame.new(splitter1) do |frame_preview|
75
+ @preview = Printer::Preview.new(frame_preview, self)
76
+ end
77
+ splitter1.setSplit(0, 400 * $gui_scale)
78
+ end
79
+
80
+ @parent.connect(SEL_CLOSE) do |sender, selector, data|
81
+ can_close? ? 0 : 1
82
+ end
83
+
84
+ if new_file
85
+ create_xml(filename, xpath_changes)
86
+ else
87
+ load_from_xml(filename, xpath_changes)
88
+ end
89
+
90
+ draw_preview(true)
91
+ set_title
92
+ end
93
+ #---------------------------------------------------------------------------------------------------------
94
+
95
+ # schließt den Datenmanager
96
+ def close_dataman
97
+ @dataman = nil
98
+ @current_dataman_settings = {}
99
+ end
100
+ #---------------------------------------------------------------------------------------------------------
101
+
102
+ DatamanAttributes = [S_DATASOURCE, S_DATASOURCETYP, S_DATASOURCEENCODING]
103
+
104
+ # erzeugt einen Datenmanager abhängig davon welcher Datensourcetyp im Layout definiert ist (momentan DATABASE oder CSV)
105
+ def open_dataman
106
+ @dataman = @layout_file.build_dataman_instance
107
+ @dataview.dataman = @dataman
108
+
109
+ @current_dataman_settings = DatamanAttributes.each_with_object({}) do |a, s|
110
+ s[a] = @layout_file.get_attr_value(a)
111
+ end
112
+ rescue => e
113
+ FXMessageBox.error(@parent.app, MBOX_OK, *I18n.t(:dataman_error_at_open_dataman, default: [["Fehler bei Datenverbindung", "Die Datenverbindung konnte nicht hergestellt werden.\n\n%{e}"]], e: ))
114
+ end
115
+ #---------------------------------------------------------------------------------------------------------
116
+
117
+ # sollte jedesmal dann aufgerufen werden, wenn ein Attribut des Layouts geändert wurde
118
+ # es wird das changed-Flag gesetzt und der Titel aktualisiert und die Vorschau neu gezeichnet
119
+ def changed_attributes
120
+ set_title
121
+
122
+ # Any datasource related values changed? -> reopen
123
+ if DatamanAttributes.find { |a| @current_dataman_settings[a] != @layout_file.get_attr_value(a) }
124
+ close_dataman
125
+ open_dataman
126
+ end
127
+ end
128
+
129
+ def filename=(string)
130
+ @layout_file.filename = string
131
+ set_title
132
+ end
133
+
134
+ # aktualisiert den Titel des Layout-Fensters
135
+ # es werden eingetragen
136
+ # * der Dateiname des Layouts
137
+ # * die verbunden Datenquelle (coming soon)
138
+ # * ein Zeichen *, ob das Layout seit dem letzten Laden oder Speichern geändert wurde
139
+ private def set_title
140
+ @parent.title = "#{@layout_file.filename} #{@layout_file.changed? ? " *" : ""}"
141
+ @mdititle.text = @parent.title
142
+ end
143
+
144
+ # speichert alle GraphicObjekte und Layout-Einstellungen im XML-File
145
+ def store_to_xml(filename_dialog = false)
146
+ if filename_dialog || !@layout_file.filename
147
+ dest = @layout_file.expand_path(@layout_file.filename.to_s.empty? ? "./" : @layout_file.filename)
148
+ fn = FXFileDialog.getSaveFilename(@parent, I18n.t(:save_layout_file_dialog_caption, default: "Speichern"), dest, "*.mcc2,*.xml", 0)
149
+ return if fn.empty?
150
+ unless ["mcc2", "xml"].include?(fn.split(".")[-1].downcase)
151
+ fn = "#{fn}.mcc2"
152
+ end
153
+ @layout_file.filename = fn
154
+ end
155
+ @layout_file.save
156
+ set_title
157
+ end
158
+
159
+ def can_close?
160
+ return true if !@layout_file.changed?
161
+
162
+ res = FXMessageBox.question(@parent.app, MBOX_YES_NO_CANCEL, *I18n.t(:save_layout_file_dialog_question, default: [["Datei speichern", "Datei %{filename} speichern ?"]], filename: @layout_file.filename))
163
+ case res
164
+ when MBOX_CLICKED_YES
165
+ store_to_xml
166
+ @layout_file.changed? ? false : true
167
+ when MBOX_CLICKED_NO
168
+ true
169
+ when MBOX_CLICKED_CANCEL
170
+ false
171
+ end
172
+ end
173
+
174
+ def load_from_xml(filename, xpath_changes)
175
+ lf = LayoutFile.load_from_xml(filename, xpath_changes)
176
+ self.layout_file = lf
177
+ unless layout_file.warnings.empty?
178
+ wa = layout_file.warnings.join("\n\n")
179
+
180
+ msg_box = FXMessageBox.new(@parent.app, I18n.t(:open_layout_file_warning, default: "Warnung beim Laden von %{filename}", filename:), wa, opts: MBOX_OK, ic: loadImage("mcc2/images/messagebox_warning.png"))
181
+ msg_box.create if @parent.created?
182
+ msg_box.show(PLACEMENT_OWNER)
183
+ end
184
+ end
185
+
186
+ def layout_file=(layout_file)
187
+ @layout_file = layout_file
188
+ @preview.layout_file = layout_file
189
+ @layoutview.layout_file = layout_file
190
+ @dataview.layout_file = layout_file
191
+ @printerview.layout_file = layout_file
192
+ open_dataman
193
+ end
194
+
195
+ def selected_object_ids=(ids)
196
+ @layoutview.selected_object_ids = ids
197
+ @preview.selected_object_ids = ids if @preview
198
+ end
199
+
200
+ def create_xml(filename, xpath_changes)
201
+ layout_file = LayoutFile.create_xml(filename, xpath_changes)
202
+ self.layout_file = layout_file
203
+ end
204
+
205
+ def add_object(typ)
206
+ @layoutview.manage_objects(ADD, typ)
207
+ end
208
+
209
+ def move_selected(x, y, modifier)
210
+ @layoutview.move_selected(x, y, modifier)
211
+ end
212
+
213
+ def clipboard_action(action)
214
+ @layoutview.clipboard_action(action)
215
+ end
216
+
217
+ #---------------------------------------------------------------------------------------------------------
218
+
219
+ def draw_preview_with_row row, immediately = false
220
+ return unless @preview
221
+ @row = row
222
+ @preview.draw_preview immediately, @row
223
+ end
224
+
225
+ def draw_preview immediately = false
226
+ return unless @preview
227
+ @preview.draw_preview immediately, nil
228
+ end
229
+
230
+ def set_focus(to)
231
+ case to
232
+ when :preview
233
+ @preview.set_focus(to)
234
+ when :layout
235
+ @fxtabbook.setCurrent(0, true)
236
+ else
237
+ raise "set_focus(#{to}) is not defined"
238
+ end
239
+ end
240
+
241
+ def connect_filebutton_to_textfield(button, textfield, filepatterns: "*")
242
+ button.connect(SEL_COMMAND) do
243
+ if textfield.enabled?
244
+ execute_filedialog_for_textfield(textfield, filepatterns: filepatterns)
245
+ end
246
+ end
247
+ add_tipText_to_filedialog_for_textfield(textfield)
248
+ end
249
+
250
+ def add_tipText_to_filedialog_for_textfield(textfield)
251
+ textfield.tipText += I18n.t(:filepath_textfield_tip, default: <<~EOT)
252
+ Folgende Ersetzungszeichen können verwendet werden:
253
+ %D - Pfad der aktuellen Layoutdatei
254
+ %F - Name der aktuellen Layoutdatei ohne ".mcc2"
255
+ ~ - Benutzerverzeichnis
256
+ relativer Pfad - aktuelles Verzeichnis in dem MCC2 gestartet wurde
257
+ EOT
258
+ end
259
+
260
+ def execute_filedialog_for_textfield(textfield, filepatterns: "*")
261
+ filepatterns = filepatterns.join("\n") if filepatterns.is_a?(Array)
262
+ lds = textfield.text
263
+
264
+ # Aktuellen File-Pattern auswählen
265
+ if lds =~ /(\.\w+?)$/i
266
+ ext = $1
267
+ pat_idx = nil
268
+ filepatterns.split("\n").each_with_index do |pat, idx|
269
+ if pat =~ /\*#{ext}/i || pat =~ /(\(\*\))/
270
+ pat_idx = idx
271
+ break
272
+ end
273
+ end
274
+ end
275
+
276
+ # Aktuelles Verzeichnis auswählen (oder Default: Verzeichnis der Layoutdatei)
277
+ dest = @layout_file.expand_path(lds.to_s.empty? ? "%D/" : lds)
278
+
279
+ s = FXFileDialog.getOpenFilename(textfield, textfield.tipText, dest, filepatterns, pat_idx || 0)
280
+ unless s.empty?
281
+ s = @layout_file.shrink_path(s)
282
+ textfield.setText(s, true)
283
+ end
284
+ end
285
+
286
+ def self.set_combobox_by_data(combobox, dataval, notify = true)
287
+ idx = -1
288
+ if combobox.find { |text, data|
289
+ idx += 1
290
+ data == dataval
291
+ }
292
+ combobox.setCurrentItem(idx, notify)
293
+ end
294
+ end
295
+ end
296
+ end
297
+
298
+ # *****************************************************************************
299
+ # Main
300
+
301
+ if __FILE__ == $0
302
+
303
+ system("ruby mcc2.rb #{ARGV}")
304
+ exit
305
+ lay = Layout.new(nil, nil)
306
+
307
+ # ...........................................................
308
+ # Test für das Erstellen einer neune XML-Datei
309
+ lay.filename = 't:\Project\MCC2a\trunk\layouts\test1.xml'
310
+ lay.load_from_xml
311
+ # ...........................................................
312
+ # Test für das Erstellen einer neune XML-Datei
313
+ # ~ lay.create_xml
314
+
315
+ # ~ lay.add_object(TEXTOBJECT)
316
+ # ~ lay.add_object(BARCODEOBJECT)
317
+ # ~ lay.add_object(PICTUREOBJECT)
318
+ # ~ lay.add_object(TEXTOBJECT)
319
+ # ~ lay.add_object(BARCODEOBJECT)
320
+ # ~ lay.add_object(TEXTOBJECT)
321
+
322
+ print lay.xml_doc
323
+ end