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,295 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rubygems"
4
+
5
+ require "fox16"
6
+ require "fox16/colors"
7
+ require "fox16/responder"
8
+ require "libguib16"
9
+ require "optparse"
10
+ require "i18n"
11
+
12
+ # convert relative image file path to absolute one
13
+ # based on dir of this file.
14
+ alias loadImage_libguib16 loadImage
15
+ def loadImage(file)
16
+ file = File.join(File.dirname(__FILE__), "..", file)
17
+ i = loadImage_libguib16(file)
18
+ i.scale($gui_scale * 16, $gui_scale * 16)
19
+ i.create
20
+ i
21
+ end
22
+
23
+ # die GUI's, alle mit FoxGUI-Builder erstellt
24
+ require "mcc2/mcc2_mainwin" # das Main-GUI
25
+ require "mcc2/cc_dialogbox"
26
+
27
+ require "mcc2/layout" # das Kartenlayout
28
+ require "mcc2/debug_tools"
29
+
30
+ require "tempfile"
31
+
32
+ # *****************************************************************************
33
+ module Mcc2
34
+ # die Haupklasse des Programms
35
+ class Mcc2Gui < MainWindow
36
+ include Fox
37
+
38
+ attr_accessor :language
39
+ attr_accessor :app
40
+
41
+ def initialize(parent, gui_scale)
42
+ @app = parent
43
+ @gui_scale = gui_scale
44
+ @xpath_changes = {}
45
+
46
+ super(parent)
47
+ # Titel des Hauptfensters mit Programmname und Version setzen
48
+
49
+ @topwin.title = "mcc2 Version #{Mcc2::VERSION}"
50
+
51
+ @mdimenu = FXMDIMenu.new(@topwin, @mdiclient)
52
+ FXMDIWindowButton.new(@menubar, @mdimenu, @mdiclient, FXMDIClient::ID_MDI_MENUWINDOW, LAYOUT_LEFT)
53
+ @mdititle = FXMenuCommand.new(@menubar, "", target: @mdiclient, selector: FXMDIClient::ID_MDI_MENUMINIMIZE, opts: FRAME_SUNKEN)
54
+ FXMDIDeleteButton.new(@menubar, @mdiclient, FXMDIClient::ID_MDI_MENUCLOSE, FRAME_RAISED | LAYOUT_RIGHT)
55
+ FXMDIRestoreButton.new(@menubar, @mdiclient, FXMDIClient::ID_MDI_MENURESTORE, FRAME_RAISED | LAYOUT_RIGHT)
56
+ FXMDIMinimizeButton.new(@menubar, @mdiclient, FXMDIClient::ID_MDI_MENUMINIMIZE, FRAME_RAISED | LAYOUT_RIGHT)
57
+
58
+ @mdiclient.connect(SEL_CHANGED) do |sender, sel, mdichild|
59
+ @mdititle.text = mdichild&.title || ""
60
+ end
61
+ # ......................................................................
62
+ # die Menue-Einträge modifizieren
63
+
64
+ # Add & accelText to menu captions
65
+ [@menutitle_datei, @menutitle_edit, @menutitle_object, @menutitle_language, @menutitle_window].each do |m|
66
+ m.text = m.text.tr("_", "&")
67
+ end
68
+
69
+ connect_with_accel(@mcmd_new) { new_layout }
70
+ connect_with_accel(@mcmd_open) { open_layout }
71
+ connect_with_accel(@mcmd_close) { close_layout }
72
+ connect_with_accel(@mcmd_save) { save_layout }
73
+ connect_with_accel(@mcmd_save_as) { save_layout(true) }
74
+ connect_with_accel(@mcmd_exit) { @app.stop if can_close? }
75
+
76
+ connect_with_accel(@mcmd_cut) { clipboard_action(:cut) }
77
+ connect_with_accel(@mcmd_copy) { clipboard_action(:copy) }
78
+ connect_with_accel(@mcmd_paste) { clipboard_action(:paste) }
79
+
80
+ connect_with_accel(@mcmd_text) { new_object(TEXTOBJECT) }
81
+ connect_with_accel(@mcmd_barcode) { new_object(BARCODEOBJECT) }
82
+ connect_with_accel(@mcmd_picture) { new_object(PICTUREOBJECT) }
83
+ connect_with_accel(@mcmd_box) { new_object(BOXOBJECT) }
84
+ connect_with_accel(@mcmd_embed) { new_object(EMBEDOBJECT) }
85
+
86
+ connect_with_accel(@mcmd_de) { change_language_to("de") }
87
+ connect_with_accel(@mcmd_en) { change_language_to("en") }
88
+ connect_with_accel(@mcmd_rs) { change_language_to("rs") }
89
+
90
+ connect_with_accel(@mcmd_horizontal) { @mdiclient.horizontal }
91
+ connect_with_accel(@mcmd_vertical) { @mdiclient.vertical }
92
+ connect_with_accel(@mcmd_cascade) { @mdiclient.cascade }
93
+
94
+ @topwin.width = (1020 * @gui_scale).to_i
95
+ @topwin.height = (748 * @gui_scale).to_i
96
+
97
+ @topwin.connect(SEL_CLOSE) do |sender, selector, data|
98
+ can_close? ? 0 : 1
99
+ end
100
+
101
+ class << @app
102
+ attr_writer :statusline
103
+ def show_on_statusline(text)
104
+ @statusline.text = text
105
+ @statusline.normalText = text
106
+ end
107
+ end
108
+ @app.statusline = @statusbar.statusLine
109
+ @statusbar.statusLine.textHighlightColor = FXRGB(255, 0, 0)
110
+ @statusbar.statusLine.normalText = ""
111
+ end
112
+
113
+ def can_close?
114
+ @mdiclient.each_child do |child|
115
+ res = child.userData.can_close?
116
+ return false unless res
117
+ end
118
+ true
119
+ end
120
+
121
+ def connect_with_accel(button, text = nil, &block)
122
+ button.text = text if text
123
+ button.text = button.text.tr("_", "&")
124
+ button.connect(SEL_COMMAND, &block)
125
+
126
+ @topwin.accelTable.addAccel(fxparseAccel(button.accelText), block)
127
+ end
128
+
129
+ def add_xpath_value(param)
130
+ xpath, value = param.split("~", 2)
131
+ @xpath_changes[xpath] = value
132
+ end
133
+
134
+ def clipboard_action(action)
135
+ child = @mdiclient.activeChild
136
+ if child
137
+ child.userData.clipboard_action(action)
138
+ end
139
+ end
140
+
141
+ def new_object(typ)
142
+ child = @mdiclient.activeChild
143
+ if child
144
+ child.userData.add_object(typ)
145
+ end
146
+ end
147
+
148
+ def change_language_to(lang)
149
+ app.reg.writeStringEntry("settings", "language", lang)
150
+ I18n.locale = app.reg.readStringEntry("settings", "language", "de")
151
+ if language
152
+ FXMessageBox.warning(app, MBOX_OK, *I18n.t(:language_forced, default: [["Achtung", "Die Sprache kann nicht geändert werden, denn sie ist über die\nOption `--lang` auf der Kommandozeile gesetzt!"]]))
153
+ else
154
+ FXMessageBox.warning(app, MBOX_OK, *I18n.t(:language_change, default: [["Achtung", "Bitte starten Sie das Programm neu,\ndamit die Sprachänderung übernommen wird!"]]))
155
+ end
156
+ end
157
+
158
+ def save_layout(filename_dialog = false)
159
+ child = @mdiclient.activeChild
160
+ if child
161
+ child.userData.store_to_xml(filename_dialog)
162
+ end
163
+ end
164
+ #---------------------------------------------------------------------------------------------------------
165
+
166
+ def new_layout(filename = nil, xpath_changes = nil)
167
+ child = FXMDIChild.new(@mdiclient, I18n.t(:new_layout_name, default: "Layout"), nil, @mdimenu, 0, 0, 0, 800 * @gui_scale, 600 * @gui_scale)
168
+ child.userData = Layout.new(child, @mdititle, filename: filename, xpath_changes: @xpath_changes, new_file: true)
169
+ child.create
170
+ child.show
171
+ child.recalc
172
+ child.setFocus
173
+ @mdiclient.setActiveChild(child)
174
+ end
175
+ #---------------------------------------------------------------------------------------------------------
176
+
177
+ def open_layout(filename = nil)
178
+ unless filename
179
+ if child = @mdiclient.activeChild
180
+ dest = child.userData.layout_file.expand_path("%D/")
181
+ end
182
+ filename = FXFileDialog.getOpenFilename(@topwin, I18n.t(:open_layout_file_dialog_caption, default: "Laden"), dest || "./", "*.mcc2,*.xml", 0)
183
+ end
184
+ return if filename.empty?
185
+ unless FileTest.exist?(filename)
186
+ return new_layout(filename, @xpath_changes)
187
+ end
188
+ unless filename.to_s.empty?
189
+ child = FXMDIChild.new(@mdiclient, I18n.t(:new_layout_name, default: "Layout"), nil, @mdimenu, 0, 0, 0, 800 * @gui_scale, 600 * @gui_scale)
190
+ begin
191
+ child.userData = Layout.new(child, @mdititle, filename: filename, xpath_changes: @xpath_changes, new_file: false)
192
+ rescue LayoutFile::Error => e
193
+ child.close
194
+ FXMessageBox.error(@topwin.app, MBOX_OK, I18n.t(:error_loading_layout_file, default: "Fehler beim Laden der Datei"), e.to_s)
195
+ else
196
+ if @topwin.created?
197
+ child.create
198
+ child.show
199
+ child.recalc
200
+ child.setFocus
201
+ end
202
+ @mdiclient.setActiveChild(child)
203
+ auto_place_children
204
+ end
205
+ end
206
+ end
207
+
208
+ def auto_place_children
209
+ if @mdiclient.numChildren == 1
210
+ @mdiclient.each_child(&:maximize)
211
+ elsif @mdiclient.numChildren > 1
212
+ @mdiclient.horizontal
213
+ end
214
+ end
215
+
216
+ def close_layout
217
+ child = @mdiclient.activeChild
218
+ if child && child.userData.can_close?
219
+ child.close
220
+ end
221
+ end
222
+
223
+ def self.hidpi_scale(fxapp)
224
+ fxapp.create
225
+
226
+ if (s=ENV['FOXSCALE'].to_f) > 0
227
+ s
228
+ elsif fxapp.rootWindow.width >= 3500 && fxapp.rootWindow.height >= 2000
229
+ 2.0
230
+ else
231
+ 1.0
232
+ end
233
+ end
234
+
235
+ def self.enable_hidpi(fxapp)
236
+ tooltip = Fox::FXToolTip.new(fxapp, Fox::TOOLTIP_PERMANENT)
237
+ gui_scale = hidpi_scale(fxapp)
238
+
239
+ fxapp.normalFont = Fox::FXFont.new(fxapp, "arial,100")
240
+ fd = fxapp.normalFont.fontDesc
241
+ fd.size *= gui_scale
242
+ fxapp.normalFont.destroy
243
+ fxapp.normalFont.fontDesc = fd
244
+ fxapp.normalFont.create
245
+ tooltip.setFont(fxapp.normalFont)
246
+ gui_scale
247
+ end
248
+
249
+ def self.run(argv)
250
+ Thread.abort_on_exception = true
251
+
252
+ app = FX::App.new("MCC2", "larskanis")
253
+ $gui_scale = enable_hidpi(app)
254
+
255
+ language = nil
256
+ options = []
257
+
258
+ OptionParser.new do |opts|
259
+ opts.banner = "Usage: #{$0} <layout.mcc2>* [options]"
260
+
261
+ Locales.add_lang_option(opts) { |o| language = o; options << [:language=, o] }
262
+ opts.on("-x", "--xpath-value XPATH~VALUE", "Replace XML-value on the given xpath"){|o| options << [:add_xpath_value, o] }
263
+ opts.separator "\tExamples:"
264
+ opts.separator "\t -x //Layout/datasource~mydata.csv"
265
+ opts.separator "\t -x {layout.mcc2}//Layout/fileprinter_save_as~image_%d_%p.png"
266
+ end.parse!(argv)
267
+
268
+ begin
269
+ I18n.locale = language || app.reg.readStringEntry("settings", "language", "en")
270
+
271
+ w = Mcc2Gui.new(app, $gui_scale)
272
+ options.each do |meth, arg|
273
+ w.send(meth, arg)
274
+ end
275
+
276
+ w.topwin.create
277
+ w.topwin.show(Fox::PLACEMENT_SCREEN)
278
+
279
+ app.create
280
+ argv.each do |arg|
281
+ w.open_layout(arg)
282
+ end
283
+
284
+ if defined?(RubyVM::YJIT.enable)
285
+ RubyVM::YJIT.enable
286
+ end
287
+
288
+ app.run
289
+ rescue Exception => e
290
+ DebugTools.write_exception("main", e)
291
+ exit(-1)
292
+ end
293
+ end
294
+ end
295
+ end
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "mcc2"
4
+ require "fileutils"
5
+ require "tempfile"
6
+ require "optparse"
7
+ require "i18n"
8
+ require "ruby-zint"
9
+
10
+ module Mcc2
11
+ # die Haupklasse des Programms
12
+ class Mcc2Print
13
+ attr_accessor :verbose
14
+
15
+ def initialize
16
+ @xpath_changes = {}
17
+ end
18
+
19
+ def start!(layout_fname, xpath_changes = {})
20
+ lf = Mcc2::LayoutFile.load_from_xml(layout_fname, @xpath_changes.merge(xpath_changes))
21
+ printer = lf.build_printer_instance
22
+ dataman = lf.build_dataman_instance
23
+ rows = dataman.rows || [nil]
24
+
25
+ rows.each do |row|
26
+ printer.print_card(lf, row)
27
+ end
28
+ end
29
+
30
+ def add_xpath_value(param)
31
+ xpath, value = param.split("~", 2)
32
+ @xpath_changes[xpath] = value
33
+ end
34
+
35
+ def self.run(argv)
36
+ Thread.abort_on_exception = true
37
+
38
+ app = new
39
+
40
+ OptionParser.new do |opts|
41
+ opts.banner = "Usage: #{$0} <layout.mcc2>* [options]"
42
+
43
+ opts.on("-v", "--[no-]verbose", "Run verbosely", &app.method(:verbose=))
44
+ Locales.add_lang_option(opts)
45
+ opts.on("-x", "--xpath-value XPATH~VALUE", "Replace XML-value on the given xpath", &app.method(:add_xpath_value))
46
+ opts.separator "\tExamples:"
47
+ opts.separator "\t -x //Layout/datasource~mydata.csv"
48
+ opts.separator "\t -x {layout.mcc2}//Layout/fileprinter_save_as~image_%d_%p.png"
49
+ end.parse!
50
+
51
+ app.start!(argv[0])
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,139 @@
1
+ # source generated by foxGUIb 0.7.1
2
+
3
+ class PictureDataEditDialogBox
4
+ def initialize(parent)
5
+ construct_widget_tree(parent)
6
+ init if respond_to? :init
7
+ end
8
+
9
+ def construct_widget_tree(parent)
10
+ @topwin =
11
+ FX::DialogBox.new(parent) { |w|
12
+ @pictureDataEditDialogBox = w
13
+ w.wdg_name = "pictureDataEditDialogBox"
14
+ w.width = 365
15
+ w.shown = true
16
+ w.y = 382
17
+ w.height = 119
18
+ w.x = 173
19
+ FX::VerticalFrame.new(@pictureDataEditDialogBox) { |w|
20
+ @verticalframe1 = w
21
+ w.wdg_name = "verticalframe1"
22
+ w.width = 365
23
+ w.height = 119
24
+ FX::Packer.new(@verticalframe1) { |w|
25
+ @packer2 = w
26
+ w.wdg_name = "packer2"
27
+ w.width = 365
28
+ w.height = 20
29
+ w.layoutHints = 1536
30
+ }
31
+ FX::HorizontalFrame.new(@verticalframe1) { |w|
32
+ @horizontalframe1 = w
33
+ w.wdg_name = "horizontalframe1"
34
+ w.width = 365
35
+ w.y = 20
36
+ w.height = 21
37
+ w.layoutHints = 1024
38
+ FX::Packer.new(@horizontalframe1) { |w|
39
+ @packer3 = w
40
+ w.wdg_name = "packer3"
41
+ w.width = 20
42
+ w.height = 21
43
+ w.layoutHints = 2304
44
+ }
45
+ FX::TextField.new(@horizontalframe1) { |w|
46
+ @textfield_data = w
47
+ w.wdg_name = "textfield_data"
48
+ w.width = 325
49
+ w.height = 19
50
+ w.numColumns = 10
51
+ w.layoutHints = 1024
52
+ w.x = 20
53
+ }
54
+ FX::Button.new(@horizontalframe1) { |w|
55
+ @button_file = w
56
+ w.wdg_name = "button_file"
57
+ w.text = "..."
58
+ w.width = 20
59
+ w.height = 21
60
+ w.x = 345
61
+ }
62
+ }
63
+ FX::Packer.new(@verticalframe1) { |w|
64
+ @packer4 = w
65
+ w.wdg_name = "packer4"
66
+ w.width = 365
67
+ w.y = 41
68
+ w.height = 20
69
+ w.layoutHints = 1536
70
+ }
71
+ FX::HorizontalFrame.new(@verticalframe1) { |w|
72
+ @horizontalframe2 = w
73
+ w.wdg_name = "horizontalframe2"
74
+ w.width = 365
75
+ w.y = 61
76
+ w.height = 58
77
+ FX::Packer.new(@horizontalframe2) { |w|
78
+ @packer5 = w
79
+ w.wdg_name = "packer5"
80
+ w.width = 20
81
+ w.height = 58
82
+ w.layoutHints = 2304
83
+ }
84
+ FX::Button.new(@horizontalframe2) { |w|
85
+ @button_exit = w
86
+ w.wdg_name = "button_exit"
87
+ w.text = "Beenden"
88
+ w.width = 100
89
+ w.height = 21
90
+ w.layoutHints = 256
91
+ w.x = 20
92
+ }
93
+ FX::Button.new(@horizontalframe2) { |w|
94
+ @button_cancel = w
95
+ w.wdg_name = "button_cancel"
96
+ w.text = "Abbrechen"
97
+ w.width = 100
98
+ w.height = 21
99
+ w.layoutHints = 256
100
+ w.x = 120
101
+ }
102
+ FX::Button.new(@horizontalframe2) { |w|
103
+ @button_apply = w
104
+ w.wdg_name = "button_apply"
105
+ w.text = "\303\234bernehmen"
106
+ w.width = 100
107
+ w.height = 21
108
+ w.layoutHints = 256
109
+ w.x = 220
110
+ }
111
+ }
112
+ }
113
+ }
114
+ end
115
+ attr_reader :topwin
116
+ attr_reader :pictureDataEditDialogBox
117
+ attr_reader :verticalframe1
118
+ attr_reader :packer2
119
+ attr_reader :horizontalframe1
120
+ attr_reader :packer3
121
+ attr_reader :textfield_data
122
+ attr_reader :button_file
123
+ attr_reader :packer4
124
+ attr_reader :horizontalframe2
125
+ attr_reader :packer5
126
+ attr_reader :button_exit
127
+ attr_reader :button_cancel
128
+ attr_reader :button_apply
129
+ end
130
+
131
+ # unit test
132
+ if __FILE__ == $0
133
+ require "libGUIb16"
134
+ app = FX::App.new
135
+ w = PictureDataEditDialogBox.new app
136
+ w.topwin.show(Fox::PLACEMENT_SCREEN)
137
+ app.create
138
+ app.run
139
+ end