glimmer-dsl-swt 4.17.1.1 → 4.17.2.4

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.
@@ -0,0 +1,669 @@
1
+ # Copyright (c) 2007-2020 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'fileutils'
23
+ require 'os'
24
+ require 'facets'
25
+
26
+ # TODO refactor to nest under RakeTask namespace
27
+
28
+ MAIN_OBJECT = self
29
+
30
+ module Glimmer
31
+ module RakeTask
32
+ class Scaffold
33
+ class << self
34
+ include FileUtils
35
+
36
+ VERSION = File.read(File.expand_path('../../../../VERSION', __FILE__)).strip
37
+ RUBY_VERSION = File.read(File.expand_path('../../../../RUBY_VERSION', __FILE__)).strip
38
+
39
+ # TODO externalize all constants into scaffold/files
40
+
41
+ GITIGNORE = <<~MULTI_LINE_STRING
42
+ *.gem
43
+ *.rbc
44
+ /.config
45
+ /coverage/
46
+ /InstalledFiles
47
+ /pkg/
48
+ /spec/reports/
49
+ /spec/examples.txt
50
+ /test/tmp/
51
+ /test/version_tmp/
52
+ /tmp/
53
+
54
+ # Used by dotenv library to load environment variables.
55
+ # .env
56
+
57
+ ## Specific to RubyMotion:
58
+ .dat*
59
+ .repl_history
60
+ build/
61
+ *.bridgesupport
62
+ build-iPhoneOS/
63
+ build-iPhoneSimulator/
64
+
65
+ ## Specific to RubyMotion (use of CocoaPods):
66
+ #
67
+ # We recommend against adding the Pods directory to your .gitignore. However
68
+ # you should judge for yourself, the pros and cons are mentioned at:
69
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
70
+ #
71
+ # vendor/Pods/
72
+
73
+ ## Documentation cache and generated files:
74
+ /.yardoc/
75
+ /_yardoc/
76
+ /doc/
77
+ /rdoc/
78
+
79
+ ## Environment normalization:
80
+ /.bundle/
81
+ /vendor/bundle
82
+ /lib/bundler/man/
83
+
84
+ # for a library or gem, you might want to ignore these files since the code is
85
+ # intended to run in multiple environments; otherwise, check them in:
86
+ # Gemfile.lock
87
+ # .ruby-version
88
+ # .ruby-gemset
89
+
90
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
91
+ .rvmrc
92
+
93
+ # Mac
94
+ .DS_Store
95
+
96
+ # Gladiator (Glimmer Editor)
97
+ .gladiator
98
+
99
+ # Glimmer
100
+ dist
101
+ packages
102
+ vendor/jars
103
+ MULTI_LINE_STRING
104
+
105
+ GEMFILE = <<~MULTI_LINE_STRING
106
+ # frozen_string_literal: true
107
+
108
+ source 'https://rubygems.org'
109
+
110
+ git_source(:github) {|repo_name| "https://github.com/\#{repo_name}" }
111
+
112
+ gem 'glimmer-dsl-swt', '~> #{VERSION}'
113
+
114
+ group :development do
115
+ gem 'rspec', '~> 3.5.0'
116
+ gem 'git-glimmer', '1.7.0'
117
+ gem 'juwelier', '2.4.9'
118
+ gem 'warbler', '2.0.5'
119
+ gem 'simplecov', '>= 0'
120
+ end
121
+ MULTI_LINE_STRING
122
+
123
+ def app(app_name)
124
+ gem_name = file_name(app_name)
125
+ gem_summary = human_name(app_name)
126
+ return puts("The directory '#{gem_name}' already exists. Please either remove or pick a different name.") if Dir.exist?(gem_name)
127
+ system "jruby -S gem install juwelier -v2.4.9 --no-document" unless juwelier_exists?
128
+ system "jruby -r git-glimmer -S juwelier --markdown --rspec --summary '#{gem_summary}' --description '#{gem_summary}' #{gem_name}"
129
+ return puts('Your Git user.name and/or github.user are missing! Please add in for Juwelier to help Glimmer with Scaffolding.') if `git config --get github.user`.strip.empty? && `git config --get user.name`.strip.empty?
130
+ cd gem_name
131
+ rm_rf 'lib'
132
+ write '.gitignore', GITIGNORE
133
+ write '.ruby-version', RUBY_VERSION
134
+ write '.ruby-gemset', app_name
135
+ write 'VERSION', '1.0.0'
136
+ write 'LICENSE.txt', "Copyright (c) #{Time.now.year} #{app_name}"
137
+ write 'Gemfile', GEMFILE
138
+ write 'Rakefile', gem_rakefile(app_name, nil, gem_name)
139
+ mkdir 'app'
140
+ write "app/#{file_name(app_name)}.rb", app_main_file(app_name)
141
+ mkdir 'app/models'
142
+ mkdir 'app/views'
143
+ custom_shell('AppView', current_dir_name, :app)
144
+
145
+ mkdir_p 'package/windows'
146
+ icon_file = "package/windows/#{human_name(app_name)}.ico"
147
+ cp File.expand_path('../../../../icons/scaffold_app.ico', __FILE__), icon_file
148
+ puts "Created #{current_dir_name}/#{icon_file}"
149
+
150
+ mkdir_p 'package/macosx'
151
+ icon_file = "package/macosx/#{human_name(app_name)}.icns"
152
+ cp File.expand_path('../../../../icons/scaffold_app.icns', __FILE__), icon_file
153
+ puts "Created #{current_dir_name}/#{icon_file}"
154
+
155
+ mkdir_p 'package/linux'
156
+ icon_file = "package/linux/#{human_name(app_name)}.png"
157
+ cp File.expand_path('../../../../icons/scaffold_app.png', __FILE__), icon_file
158
+ puts "Created #{current_dir_name}/#{icon_file}"
159
+
160
+ mkdir 'bin'
161
+ write "bin/#{file_name(app_name)}", app_bin_file(app_name)
162
+ if OS.windows?
163
+ system "bundle"
164
+ system "rspec --init"
165
+ else
166
+ system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n rspec --init\n'"
167
+ end
168
+ write 'spec/spec_helper.rb', spec_helper_file
169
+ if OS.windows?
170
+ system "glimmer package[image]"
171
+ system "\"packages/bundles/#{human_name(app_name)}/#{human_name(app_name)}.exe\""
172
+ else
173
+ system "bash -c '#{RVM_FUNCTION}\n cd .\n glimmer package\n'"
174
+ if OS.mac?
175
+ system "open packages/bundles/#{human_name(app_name).gsub(' ', '\ ')}.app"
176
+ else
177
+ system "glimmer bin/#{file_name(app_name)}"
178
+ end
179
+ end
180
+ end
181
+
182
+ def custom_shell(custom_shell_name, namespace, shell_type = nil)
183
+ namespace ||= current_dir_name
184
+ root_dir = File.exists?('app') ? 'app' : 'lib'
185
+ parent_dir = "#{root_dir}/views/#{file_name(namespace)}"
186
+ return puts("The file '#{parent_dir}/#{file_name(custom_shell_name)}.rb' already exists. Please either remove or pick a different name.") if File.exist?("#{parent_dir}/#{file_name(custom_shell_name)}.rb")
187
+ mkdir_p parent_dir unless File.exists?(parent_dir)
188
+ write "#{parent_dir}/#{file_name(custom_shell_name)}.rb", custom_shell_file(custom_shell_name, namespace, shell_type)
189
+ end
190
+
191
+ def custom_widget(custom_widget_name, namespace)
192
+ namespace ||= current_dir_name
193
+ root_dir = File.exists?('app') ? 'app' : 'lib'
194
+ parent_dir = "#{root_dir}/views/#{file_name(namespace)}"
195
+ return puts("The file '#{parent_dir}/#{file_name(custom_widget_name)}.rb' already exists. Please either remove or pick a different name.") if File.exist?("#{parent_dir}/#{file_name(custom_widget_name)}.rb")
196
+ mkdir_p parent_dir unless File.exists?(parent_dir)
197
+ write "#{parent_dir}/#{file_name(custom_widget_name)}.rb", custom_widget_file(custom_widget_name, namespace)
198
+ end
199
+
200
+ def custom_shell_gem(custom_shell_name, namespace)
201
+ gem_name = "glimmer-cs-#{compact_name(custom_shell_name)}"
202
+ gem_summary = "#{human_name(custom_shell_name)} - Glimmer Custom Shell"
203
+ begin
204
+ custom_shell_keyword = dsl_widget_name(custom_shell_name)
205
+ MAIN_OBJECT.method(custom_shell_keyword)
206
+ return puts("CustomShell keyword `#{custom_shell_keyword}` is unavailable (occupied by a built-in Ruby method)! Please pick a different name.")
207
+ rescue NameError
208
+ # No Op (keyword is not taken by a built in Ruby method)
209
+ end
210
+ if namespace
211
+ gem_name += "-#{compact_name(namespace)}"
212
+ gem_summary += " (#{human_name(namespace)})"
213
+ else
214
+ return puts('Namespace is required! Usage: glimmer scaffold:gem:customshell[name,namespace]') unless `git config --get github.user`.to_s.strip == 'AndyObtiva'
215
+ namespace = 'glimmer'
216
+ end
217
+ return puts("The directory '#{gem_name}' already exists. Please either remove or pick a different name.") if Dir.exist?(gem_name)
218
+ system "jruby -S gem install juwelier -v2.4.9 --no-document" unless juwelier_exists?
219
+ system "jruby -r git-glimmer -S juwelier --markdown --rspec --summary '#{gem_summary}' --description '#{gem_summary}' #{gem_name}"
220
+ return puts('Your Git user.name and/or github.user are missing! Please add in for Juwelier to help Glimmer with Scaffolding.') if `git config --get github.user`.strip.empty? && `git config --get user.name`.strip.empty?
221
+ cd gem_name
222
+ write '.gitignore', GITIGNORE
223
+ write '.ruby-version', RUBY_VERSION
224
+ write '.ruby-gemset', gem_name
225
+ write 'VERSION', '1.0.0'
226
+ write 'Gemfile', GEMFILE
227
+ write 'Rakefile', gem_rakefile(custom_shell_name, namespace, gem_name)
228
+ append "lib/#{gem_name}.rb", gem_main_file(custom_shell_name, namespace)
229
+ mkdir 'lib/views'
230
+ custom_shell(custom_shell_name, namespace, :gem)
231
+ mkdir 'bin'
232
+ write "bin/#{gem_name}", gem_bin_file(gem_name, custom_shell_name, namespace)
233
+ write "bin/#{file_name(custom_shell_name)}", gem_bin_command_file(gem_name)
234
+ FileUtils.chmod 0755, "bin/#{file_name(custom_shell_name)}"
235
+ if OS.windows?
236
+ system "bundle"
237
+ system "rspec --init"
238
+ else
239
+ system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n rspec --init\n'"
240
+ end
241
+ write 'spec/spec_helper.rb', spec_helper_file
242
+
243
+ mkdir_p 'package/windows'
244
+ icon_file = "package/windows/#{human_name(custom_shell_name)}.ico"
245
+ cp File.expand_path('../../../../icons/scaffold_app.ico', __FILE__), icon_file
246
+ puts "Created #{current_dir_name}/#{icon_file}"
247
+
248
+ mkdir_p 'package/macosx'
249
+ icon_file = "package/macosx/#{human_name(custom_shell_name)}.icns"
250
+ cp File.expand_path('../../../../icons/scaffold_app.icns', __FILE__), icon_file
251
+ puts "Created #{current_dir_name}/#{icon_file}"
252
+
253
+ mkdir_p 'package/linux'
254
+ icon_file = "package/linux/#{human_name(custom_shell_name)}.png"
255
+ cp File.expand_path('../../../../icons/scaffold_app.png', __FILE__), icon_file
256
+ puts "Created #{current_dir_name}/#{icon_file}"
257
+
258
+ if OS.windows?
259
+ system "glimmer package[image]"
260
+ system "\"packages/bundles/#{human_name(custom_shell_name)}/#{human_name(custom_shell_name)}.exe\""
261
+ else
262
+ system "bash -c '#{RVM_FUNCTION}\n cd .\n glimmer package\n'"
263
+ if OS.mac?
264
+ system "open packages/bundles/#{human_name(custom_shell_name).gsub(' ', '\ ')}.app" if OS.mac?
265
+ else
266
+ system "bin/#{file_name(custom_shell_name)}"
267
+ end
268
+ end
269
+ puts "Finished creating #{gem_name} Ruby gem."
270
+ puts 'Edit Rakefile to configure gem details.'
271
+ puts 'Run `rake` to execute specs.'
272
+ puts 'Run `rake build` to build gem.'
273
+ puts 'Run `rake release` to release into rubygems.org once ready.'
274
+ end
275
+
276
+ def custom_widget_gem(custom_widget_name, namespace)
277
+ return puts('Namespace is required! Usage: glimmer scaffold:custom_widget_gem[custom_widget_name,namespace]') unless `git config --get github.user`.to_s.strip == 'AndyObtiva'
278
+ gem_name = "glimmer-cw-#{compact_name(custom_widget_name)}"
279
+ gem_summary = "#{human_name(custom_widget_name)} - Glimmer Custom Widget"
280
+ if namespace
281
+ gem_name += "-#{compact_name(namespace)}"
282
+ gem_summary += " (#{human_name(namespace)})"
283
+ else
284
+ namespace = 'glimmer'
285
+ end
286
+
287
+ return puts("The directory '#{gem_name}' already exists. Please either remove or pick a different name.") if Dir.exist?(gem_name)
288
+ system "jruby -S gem install juwelier -v2.4.9 --no-document" unless juwelier_exists?
289
+ system "jruby -r git-glimmer -S juwelier --markdown --rspec --summary '#{gem_summary}' --description '#{gem_summary}' #{gem_name}"
290
+ return puts('Your Git user.name and/or github.user are missing! Please add in for Juwelier to help Glimmer with Scaffolding.') if `git config --get github.user`.strip.empty? && `git config --get user.name`.strip.empty?
291
+ cd gem_name
292
+ write '.gitignore', GITIGNORE
293
+ write '.ruby-version', RUBY_VERSION
294
+ write '.ruby-gemset', gem_name
295
+ write 'VERSION', '1.0.0'
296
+ write 'Gemfile', GEMFILE
297
+ write 'Rakefile', gem_rakefile
298
+ append "lib/#{gem_name}.rb", gem_main_file(custom_widget_name, namespace)
299
+ mkdir 'lib/views'
300
+ custom_widget(custom_widget_name, namespace)
301
+ if OS.windows?
302
+ system "bundle"
303
+ system "rspec --init"
304
+ else
305
+ system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n rspec --init\n'"
306
+ end
307
+ write 'spec/spec_helper.rb', spec_helper_file
308
+ puts "Finished creating #{gem_name} Ruby gem."
309
+ puts 'Edit Rakefile to configure gem details.'
310
+ puts 'Run `rake` to execute specs.'
311
+ puts 'Run `rake build` to build gem.'
312
+ puts 'Run `rake release` to release into rubygems.org once ready.'
313
+ end
314
+
315
+ private
316
+
317
+ def juwelier_exists?
318
+ OS.windows? ? system('where juwelier') : system('which juwelier')
319
+ end
320
+
321
+ def write(file, content)
322
+ File.write file, content
323
+ file_path = File.expand_path(file)
324
+ puts "Created #{current_dir_name}/#{file}"
325
+ end
326
+
327
+ def append(file, content)
328
+ File.open(file, 'a') do |f|
329
+ f.write(content)
330
+ end
331
+ end
332
+
333
+ def current_dir_name
334
+ File.basename(File.expand_path('.'))
335
+ end
336
+
337
+ def class_name(app_name)
338
+ app_name.underscore.camelcase(:upper)
339
+ end
340
+
341
+ def file_name(app_name)
342
+ app_name.underscore
343
+ end
344
+ alias dsl_widget_name file_name
345
+
346
+ def human_name(app_name)
347
+ app_name.underscore.titlecase
348
+ end
349
+
350
+ def compact_name(gem_name)
351
+ gem_name.underscore.camelcase.downcase
352
+ end
353
+
354
+ def app_main_file(app_name)
355
+ <<~MULTI_LINE_STRING
356
+ $LOAD_PATH.unshift(File.expand_path('..', __FILE__))
357
+
358
+ require 'bundler/setup'
359
+ Bundler.require(:default)
360
+ require 'views/#{file_name(app_name)}/app_view'
361
+
362
+ class #{class_name(app_name)}
363
+ include Glimmer
364
+
365
+ APP_ROOT = File.expand_path('../..', __FILE__)
366
+ VERSION = File.read(File.join(APP_ROOT, 'VERSION'))
367
+ LICENSE = File.read(File.join(APP_ROOT, 'LICENSE.txt'))
368
+
369
+ def open
370
+ app_view.open
371
+ end
372
+ end
373
+ MULTI_LINE_STRING
374
+ end
375
+
376
+ def gem_main_file(custom_widget_name, namespace = nil)
377
+ custom_widget_file_path = "views"
378
+ custom_widget_file_path += "/#{file_name(namespace)}" if namespace
379
+ custom_widget_file_path += "/#{file_name(custom_widget_name)}"
380
+
381
+ <<~MULTI_LINE_STRING
382
+ $LOAD_PATH.unshift(File.expand_path('..', __FILE__))
383
+
384
+ require 'glimmer-dsl-swt'
385
+ require '#{custom_widget_file_path}'
386
+ MULTI_LINE_STRING
387
+ end
388
+
389
+ def app_bin_file(app_name)
390
+ <<~MULTI_LINE_STRING
391
+ require_relative '../app/#{file_name(app_name)}'
392
+
393
+ #{class_name(app_name)}.new.open
394
+ MULTI_LINE_STRING
395
+ end
396
+
397
+ def gem_bin_file(gem_name, custom_shell_name, namespace)
398
+ # TODO change this so that it does not mix Glimmer unto the main object
399
+ <<~MULTI_LINE_STRING
400
+ require_relative '../lib/#{gem_name}'
401
+
402
+ class #{class_name(custom_shell_name)}App
403
+ include Glimmer
404
+
405
+ def open
406
+ #{dsl_widget_name(custom_shell_name)}.open
407
+ end
408
+ end
409
+
410
+ #{class_name(custom_shell_name)}App.new.open
411
+ MULTI_LINE_STRING
412
+ end
413
+
414
+ def gem_bin_command_file(gem_name)
415
+ <<~MULTI_LINE_STRING
416
+ #!/usr/bin/env jruby
417
+
418
+ require 'glimmer/launcher'
419
+
420
+ runner = File.expand_path("../#{gem_name}", __FILE__)
421
+ launcher = Glimmer::Launcher.new([runner] + ARGV)
422
+ launcher.launch
423
+ MULTI_LINE_STRING
424
+ end
425
+
426
+ def gem_rakefile(custom_shell_name = nil, namespace = nil, gem_name = nil)
427
+ rakefile_content = File.read('Rakefile')
428
+ lines = rakefile_content.split("\n")
429
+ require_rake_line_index = lines.index(lines.detect {|l| l.include?("require 'rake'") })
430
+ lines.insert(require_rake_line_index, "require 'glimmer/launcher'")
431
+ gem_files_line_index = lines.index(lines.detect {|l| l.include?('# dependencies defined in Gemfile') })
432
+ if custom_shell_name
433
+ lines.insert(gem_files_line_index, " gem.files = Dir['VERSION', 'LICENSE.txt', 'lib/**/*', 'app/**/*', 'bin/**/*', 'vendor/**/*', 'package/**/*']")
434
+ lines.insert(gem_files_line_index+1, " gem.executables = ['#{gem_name}', '#{file_name(custom_shell_name)}']")
435
+ lines.insert(gem_files_line_index+2, " gem.require_paths = ['vendor', 'lib', 'app']")
436
+ else
437
+ lines.insert(gem_files_line_index, " gem.files = Dir['VERSION', 'LICENSE.txt', 'lib/**/*']")
438
+ end
439
+ spec_pattern_line_index = lines.index(lines.detect {|l| l.include?('spec.pattern =') })
440
+ lines.insert(spec_pattern_line_index+1, " spec.ruby_opts = [Glimmer::Launcher.jruby_os_specific_options]")
441
+ lines << "\nrequire 'glimmer/rake_task'\n"
442
+ file_content = lines.join("\n")
443
+ if custom_shell_name
444
+ file_content << <<~MULTI_LINE_STRING
445
+ Glimmer::RakeTask::Package.javapackager_extra_args =
446
+ " -name '#{human_name(custom_shell_name)}'" +
447
+ " -title '#{human_name(custom_shell_name)}'" +
448
+ " -Bmac.CFBundleName='#{human_name(custom_shell_name)}'" +
449
+ " -Bmac.CFBundleIdentifier='org.#{namespace ? compact_name(namespace) : compact_name(custom_shell_name)}.application.#{compact_name(custom_shell_name).capitalize}'"
450
+ # " -BlicenseType=" +
451
+ # " -Bmac.category=" +
452
+ # " -Bmac.signing-key-developer-id-app="
453
+ MULTI_LINE_STRING
454
+ end
455
+ file_content
456
+ end
457
+
458
+ def spec_helper_file
459
+ content = File.read('spec/spec_helper.rb')
460
+ lines = content.split("\n")
461
+ require_line_index = lines.index(lines.detect {|l| l.include?('RSpec.configure do') })
462
+ lines[require_line_index...require_line_index] = [
463
+ "require 'bundler/setup'",
464
+ 'Bundler.require(:default, :development)',
465
+ ]
466
+ configure_block_line_index = lines.index(lines.detect {|l| l.include?('RSpec.configure do') }) + 1
467
+ lines[configure_block_line_index...configure_block_line_index] = [
468
+ ' # The following ensures rspec tests that instantiate and set Glimmer DSL widgets in @target get cleaned after',
469
+ ' config.after do',
470
+ ' @target.dispose if @target && @target.respond_to?(:dispose)',
471
+ ' Glimmer::DSL::Engine.reset',
472
+ ' end',
473
+ ]
474
+
475
+ lines << "\nrequire 'glimmer/rake_task'\n"
476
+ lines.join("\n")
477
+ end
478
+
479
+ def custom_shell_file(custom_shell_name, namespace, shell_type)
480
+ namespace_type = class_name(namespace) == class_name(current_dir_name) ? 'class' : 'module'
481
+
482
+ custom_shell_file_content = <<-MULTI_LINE_STRING
483
+ #{namespace_type} #{class_name(namespace)}
484
+ class #{class_name(custom_shell_name)}
485
+ include Glimmer::UI::CustomShell
486
+
487
+ MULTI_LINE_STRING
488
+
489
+ if shell_type == :gem
490
+ custom_shell_file_content += <<-MULTI_LINE_STRING
491
+ APP_ROOT = File.expand_path('../../../..', __FILE__)
492
+ VERSION = File.read(File.join(APP_ROOT, 'VERSION'))
493
+ LICENSE = File.read(File.join(APP_ROOT, 'LICENSE.txt'))
494
+
495
+ MULTI_LINE_STRING
496
+ end
497
+
498
+ custom_shell_file_content += <<-MULTI_LINE_STRING
499
+ ## Add options like the following to configure CustomShell by outside consumers
500
+ #
501
+ # options :title, :background_color
502
+ # option :width, default: 320
503
+ # option :height, default: 240
504
+ option :greeting, default: 'Hello, World!'
505
+
506
+ ## Use before_body block to pre-initialize variables to use in body
507
+ #
508
+ #
509
+ MULTI_LINE_STRING
510
+
511
+ if %i[gem app].include?(shell_type)
512
+ custom_shell_file_content += <<-MULTI_LINE_STRING
513
+ before_body {
514
+ Display.setAppName('#{shell_type == :gem ? human_name(custom_shell_name) : human_name(namespace)}')
515
+ Display.setAppVersion(VERSION)
516
+ @display = display {
517
+ on_about {
518
+ display_about_dialog
519
+ }
520
+ on_preferences {
521
+ display_preferences_dialog
522
+ }
523
+ }
524
+ }
525
+ MULTI_LINE_STRING
526
+ else
527
+ custom_shell_file_content += <<-MULTI_LINE_STRING
528
+ # before_body {
529
+ #
530
+ # }
531
+ MULTI_LINE_STRING
532
+ end
533
+
534
+ custom_shell_file_content += <<-MULTI_LINE_STRING
535
+
536
+ ## Use after_body block to setup observers for widgets in body
537
+ #
538
+ # after_body {
539
+ #
540
+ # }
541
+
542
+ ## Add widget content inside custom shell body
543
+ ## Top-most widget must be a shell or another custom shell
544
+ #
545
+ body {
546
+ shell {
547
+ # Replace example content below with custom shell content
548
+ minimum_size 320, 240
549
+ image File.join(APP_ROOT, 'package', 'windows', "#{human_name(shell_type == :gem ? custom_shell_name : current_dir_name)}.ico") if OS.windows?
550
+ text "#{human_name(namespace)} - #{human_name(custom_shell_name)}"
551
+ grid_layout
552
+ label(:center) {
553
+ text bind(self, :greeting)
554
+ font height: 40
555
+ layout_data :fill, :center, true, true
556
+ }
557
+ menu_bar {
558
+ menu {
559
+ text '&File'
560
+ menu_item {
561
+ text '&Preferences...'
562
+ on_widget_selected {
563
+ display_preferences_dialog
564
+ }
565
+ }
566
+ }
567
+ }
568
+ }
569
+ }
570
+ MULTI_LINE_STRING
571
+
572
+ if %i[gem app].include?(shell_type)
573
+ custom_shell_file_content += <<-MULTI_LINE_STRING
574
+
575
+ def display_about_dialog
576
+ message_box(body_root) {
577
+ text 'About'
578
+ message "#{human_name(namespace)} - #{human_name(custom_shell_name)} \#{VERSION}\\n\\n\#{LICENSE}"
579
+ }.open
580
+ end
581
+
582
+ def display_preferences_dialog
583
+ dialog(swt_widget) {
584
+ text 'Preferences'
585
+ grid_layout {
586
+ margin_height 5
587
+ margin_width 5
588
+ }
589
+ group {
590
+ row_layout {
591
+ type :vertical
592
+ spacing 10
593
+ }
594
+ text 'Greeting'
595
+ font style: :bold
596
+ [
597
+ 'Hello, World!',
598
+ 'Howdy, Partner!'
599
+ ].each do |greeting_text|
600
+ button(:radio) {
601
+ text greeting_text
602
+ selection bind(self, :greeting) { |g| g == greeting_text }
603
+ layout_data {
604
+ width 160
605
+ }
606
+ on_widget_selected { |event|
607
+ self.greeting = event.widget.getText
608
+ }
609
+ }
610
+ end
611
+ }
612
+ }.open
613
+ end
614
+ MULTI_LINE_STRING
615
+ end
616
+
617
+ custom_shell_file_content += <<-MULTI_LINE_STRING
618
+ end
619
+ end
620
+ MULTI_LINE_STRING
621
+ end
622
+
623
+ def custom_widget_file(custom_widget_name, namespace)
624
+ namespace_type = class_name(namespace) == class_name(current_dir_name) ? 'class' : 'module'
625
+
626
+ <<~MULTI_LINE_STRING
627
+ #{namespace_type} #{class_name(namespace)}
628
+ class #{class_name(custom_widget_name)}
629
+ include Glimmer::UI::CustomWidget
630
+
631
+ ## Add options like the following to configure CustomWidget by outside consumers
632
+ #
633
+ # options :custom_text, :background_color
634
+ # option :foreground_color, default: :red
635
+
636
+ ## Use before_body block to pre-initialize variables to use in body
637
+ #
638
+ #
639
+ # before_body {
640
+ #
641
+ # }
642
+
643
+ ## Use after_body block to setup observers for widgets in body
644
+ #
645
+ # after_body {
646
+ #
647
+ # }
648
+
649
+ ## Add widget content under custom widget body
650
+ ##
651
+ ## If you want to add a shell as the top-most widget,
652
+ ## consider creating a custom shell instead
653
+ ## (Glimmer::UI::CustomShell offers shell convenience methods, like show and hide)
654
+ #
655
+ body {
656
+ # Replace example content below with custom widget content
657
+ label {
658
+ background :red
659
+ }
660
+ }
661
+
662
+ end
663
+ end
664
+ MULTI_LINE_STRING
665
+ end
666
+ end
667
+ end
668
+ end
669
+ end