glimmer 0.7.6 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +239 -107
- data/VERSION +1 -1
- data/lib/glimmer/data_binding/table_items_binding.rb +14 -5
- data/lib/glimmer/dsl/swt/dialog_expression.rb +26 -0
- data/lib/glimmer/dsl/swt/message_box_expression.rb +29 -0
- data/lib/glimmer/dsl/swt/widget_expression.rb +1 -0
- data/lib/glimmer/launcher.rb +13 -10
- data/lib/glimmer/package.rb +48 -0
- data/lib/glimmer/rake_task.rb +14 -45
- data/lib/glimmer/scaffold.rb +205 -65
- data/lib/glimmer/swt/display_proxy.rb +14 -0
- data/lib/glimmer/swt/menu_proxy.rb +17 -0
- data/lib/glimmer/swt/message_box_proxy.rb +48 -0
- data/lib/glimmer/swt/shell_proxy.rb +14 -32
- data/lib/glimmer/swt/table_proxy.rb +150 -0
- data/lib/glimmer/swt/tree_proxy.rb +1 -1
- data/lib/glimmer/ui/custom_widget.rb +9 -6
- metadata +11 -32
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.8.2
|
@@ -16,6 +16,11 @@ module Glimmer
|
|
16
16
|
@table = parent
|
17
17
|
@model_binding = model_binding
|
18
18
|
@column_properties = column_properties
|
19
|
+
if @table.respond_to?(:column_properties=)
|
20
|
+
@table.column_properties = @column_properties
|
21
|
+
else # assume custom widget
|
22
|
+
@table.body_root.column_properties = @column_properties
|
23
|
+
end
|
19
24
|
call(@model_binding.evaluate_property)
|
20
25
|
model = model_binding.base_model
|
21
26
|
observe(model, model_binding.property_name_expression)
|
@@ -24,23 +29,27 @@ module Glimmer
|
|
24
29
|
end
|
25
30
|
end
|
26
31
|
|
27
|
-
def call(
|
28
|
-
if
|
29
|
-
|
30
|
-
|
31
|
-
@model_collection = model_collection
|
32
|
+
def call(new_model_collection=nil)
|
33
|
+
if new_model_collection and new_model_collection.is_a?(Array)
|
34
|
+
observe(new_model_collection, @column_properties)
|
35
|
+
@model_collection = new_model_collection
|
32
36
|
end
|
33
37
|
populate_table(@model_collection, @table, @column_properties)
|
34
38
|
end
|
35
39
|
|
36
40
|
def populate_table(model_collection, parent, column_properties)
|
41
|
+
selected_table_item_models = parent.swt_widget.getSelection.map(&:getData)
|
37
42
|
parent.swt_widget.removeAll
|
38
43
|
model_collection.each do |model|
|
39
44
|
table_item = TableItem.new(parent.swt_widget, SWT::SWTProxy[:none])
|
40
45
|
for index in 0..(column_properties.size-1)
|
41
46
|
table_item.setText(index, model.send(column_properties[index]).to_s)
|
42
47
|
end
|
48
|
+
table_item.setData(model)
|
43
49
|
end
|
50
|
+
selected_table_items = parent.search {|item| selected_table_item_models.include?(item.getData) }
|
51
|
+
selected_table_items = [parent.swt_widget.getItems.first].to_java(TableItem) if selected_table_items.empty? && !parent.swt_widget.getItems.empty?
|
52
|
+
parent.swt_widget.setSelection(selected_table_items) unless selected_table_items.empty?
|
44
53
|
end
|
45
54
|
end
|
46
55
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
require 'glimmer/dsl/parent_expression'
|
3
|
+
require 'glimmer/dsl/top_level_expression'
|
4
|
+
require 'glimmer/swt/shell_proxy'
|
5
|
+
|
6
|
+
module Glimmer
|
7
|
+
module DSL
|
8
|
+
module SWT
|
9
|
+
class DialogExpression < StaticExpression
|
10
|
+
include TopLevelExpression
|
11
|
+
include ParentExpression
|
12
|
+
|
13
|
+
def can_interpret?(parent, keyword, *args, &block)
|
14
|
+
keyword == 'dialog' and
|
15
|
+
(parent.nil? or parent.is_a?(Glimmer::SWT::ShellProxy))
|
16
|
+
end
|
17
|
+
|
18
|
+
def interpret(parent, keyword, *args, &block)
|
19
|
+
args = [parent] + args unless parent.nil?
|
20
|
+
args += [:dialog_trim, :application_modal]
|
21
|
+
Glimmer::SWT::ShellProxy.send(:new, *args)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
require 'glimmer/dsl/parent_expression'
|
3
|
+
require 'glimmer/dsl/top_level_expression'
|
4
|
+
require 'glimmer/swt/shell_proxy'
|
5
|
+
require 'glimmer/swt/message_box_proxy'
|
6
|
+
require 'glimmer/swt/swt_proxy'
|
7
|
+
|
8
|
+
module Glimmer
|
9
|
+
module DSL
|
10
|
+
module SWT
|
11
|
+
class MessageBoxExpression < StaticExpression
|
12
|
+
include TopLevelExpression
|
13
|
+
include ParentExpression
|
14
|
+
|
15
|
+
include_package 'org.eclipse.swt.widgets'
|
16
|
+
|
17
|
+
def can_interpret?(parent, keyword, *args, &block)
|
18
|
+
keyword == 'message_box'
|
19
|
+
end
|
20
|
+
|
21
|
+
def interpret(parent, keyword, *args, &block)
|
22
|
+
potential_parent = args.first
|
23
|
+
parent = args.shift if potential_parent.is_a?(Shell) || (potential_parent.respond_to?(:swt_widget) && potential_parent.swt_widget.is_a?(Shell))
|
24
|
+
Glimmer::SWT::MessageBoxProxy.new(parent, Glimmer::SWT::SWTProxy[args])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/glimmer/launcher.rb
CHANGED
@@ -8,7 +8,7 @@ module Glimmer
|
|
8
8
|
OPERATING_SYSTEMS_SUPPORTED = ["mac", "windows", "linux"]
|
9
9
|
|
10
10
|
TEXT_USAGE_PREFIX = <<~MULTI_LINE_STRING
|
11
|
-
Usage: glimmer [--debug] [--log-level=VALUE] [[ENV_VAR=VALUE]...] [[-jruby-option]...] (application.rb or task[task_args]) [[application2.rb]...]
|
11
|
+
Usage: glimmer [--quiet] [--debug] [--log-level=VALUE] [[ENV_VAR=VALUE]...] [[-jruby-option]...] (application.rb or task[task_args]) [[application2.rb]...]
|
12
12
|
|
13
13
|
Runs Glimmer applications/tasks.
|
14
14
|
|
@@ -27,8 +27,9 @@ module Glimmer
|
|
27
27
|
Optionally, extra Glimmer options, JRuby options and environment variables may be passed in.
|
28
28
|
|
29
29
|
Glimmer options:
|
30
|
-
- "--
|
31
|
-
- "--
|
30
|
+
- "--quiet" : Does not announce file path of Glimmer application being launched
|
31
|
+
- "--debug" : Displays extra debugging information, passes "--debug" to JRuby, and enables debug logging
|
32
|
+
- "--log-level=VALUE" : Sets Glimmer's Ruby logger level ("ERROR" / "WARN" / "INFO" / "DEBUG"; default is none)
|
32
33
|
|
33
34
|
Example: glimmer samples/hello_world.rb
|
34
35
|
|
@@ -37,7 +38,7 @@ module Glimmer
|
|
37
38
|
|
38
39
|
GLIMMER_LIB_LOCAL = File.expand_path(File.join(__FILE__, '..', '..', 'glimmer.rb'))
|
39
40
|
GLIMMER_LIB_GEM = 'glimmer'
|
40
|
-
GLIMMER_OPTIONS = %w[--log-level]
|
41
|
+
GLIMMER_OPTIONS = %w[--log-level --quiet]
|
41
42
|
GLIMMER_OPTION_ENV_VAR_MAPPING = {
|
42
43
|
'--log-level' => 'GLIMMER_LOGGER_LEVEL'
|
43
44
|
}
|
@@ -77,8 +78,8 @@ module Glimmer
|
|
77
78
|
end
|
78
79
|
|
79
80
|
def glimmer_option_env_vars(glimmer_options)
|
80
|
-
|
81
|
-
hash.merge(GLIMMER_OPTION_ENV_VAR_MAPPING[pair.first] => pair.
|
81
|
+
GLIMMER_OPTION_ENV_VAR_MAPPING.reduce({}) do |hash, pair|
|
82
|
+
glimmer_options[pair.first] ? hash.merge(GLIMMER_OPTION_ENV_VAR_MAPPING[pair.first] => glimmer_options[pair.first]) : hash
|
82
83
|
end
|
83
84
|
end
|
84
85
|
|
@@ -108,7 +109,7 @@ module Glimmer
|
|
108
109
|
Rake::Task[rake_task].invoke(*rake_task_args)
|
109
110
|
else
|
110
111
|
@@mutex.synchronize do
|
111
|
-
puts "Launching Glimmer Application: #{application}"
|
112
|
+
puts "Launching Glimmer Application: #{application}" if jruby_options_string.to_s.include?('--debug') || glimmer_options['--quiet'].to_s.downcase != 'true'
|
112
113
|
end
|
113
114
|
command = "#{env_vars_string} jruby #{jruby_options_string}#{jruby_os_specific_options} #{devmode_require}-r #{the_glimmer_lib} -S #{application}"
|
114
115
|
puts command if jruby_options_string.to_s.include?('--debug')
|
@@ -123,6 +124,8 @@ module Glimmer
|
|
123
124
|
attr_reader :jruby_options
|
124
125
|
|
125
126
|
def initialize(raw_options)
|
127
|
+
raw_options << '--quiet' if !caller.join("\n").include?('/bin/glimmer:') && !raw_options.join.include?('--quiet=')
|
128
|
+
raw_options << '--log-level=DEBUG' if raw_options.join.include?('--debug') && !raw_options.join.include?('--log-level=')
|
126
129
|
@application_paths = extract_application_paths(raw_options)
|
127
130
|
@env_vars = extract_env_vars(raw_options)
|
128
131
|
@glimmer_options = extract_glimmer_options(raw_options)
|
@@ -140,7 +143,7 @@ module Glimmer
|
|
140
143
|
private
|
141
144
|
|
142
145
|
def launch_application
|
143
|
-
load File.expand_path('./Rakefile') if File.exist?(File.expand_path('./Rakefile'))
|
146
|
+
load File.expand_path('./Rakefile') if File.exist?(File.expand_path('./Rakefile')) && caller.join("\n").include?('/bin/glimmer:')
|
144
147
|
threads = @application_paths.map do |application_path|
|
145
148
|
Thread.new do
|
146
149
|
self.class.launch(
|
@@ -188,8 +191,8 @@ module Glimmer
|
|
188
191
|
end.each do |glimmer_option|
|
189
192
|
options.delete(glimmer_option)
|
190
193
|
end.reduce({}) do |hash, glimmer_option_string|
|
191
|
-
match = glimmer_option_string.match(/^([^=]+)=?(
|
192
|
-
hash.merge(match[1] => match[2])
|
194
|
+
match = glimmer_option_string.match(/^([^=]+)=?(.+)?$/)
|
195
|
+
hash.merge(match[1] => (match[2] || 'true'))
|
193
196
|
end
|
194
197
|
end
|
195
198
|
end
|
data/lib/glimmer/package.rb
CHANGED
@@ -2,6 +2,54 @@ module Glimmer
|
|
2
2
|
module Package
|
3
3
|
class << self
|
4
4
|
attr_accessor :javapackager_extra_args
|
5
|
+
|
6
|
+
def config
|
7
|
+
project_name = File.basename(File.expand_path('.'))
|
8
|
+
if !File.exists?('config/warble.rb')
|
9
|
+
puts 'Generating JAR configuration (config/warble.rb) to use with Warbler...'
|
10
|
+
system('mkdir -p config')
|
11
|
+
system('warble config')
|
12
|
+
new_config = File.read('config/warble.rb').split("\n").inject('') do |output, line|
|
13
|
+
if line.include?('config.dirs =')
|
14
|
+
line = line.sub('# ', '').sub(/=[^=\n]+$/, '= %w(app config db lib script bin docs fonts icons images sounds videos)')
|
15
|
+
end
|
16
|
+
if line.include?('config.includes =')
|
17
|
+
line = line.sub('# ', '').sub(/=[^=\n]+$/, "= FileList['LICENSE.txt', 'VERSION']")
|
18
|
+
end
|
19
|
+
if line.include?('config.autodeploy_dir =')
|
20
|
+
line = line.sub('# ', '')
|
21
|
+
end
|
22
|
+
output + "\n" + line
|
23
|
+
end
|
24
|
+
File.write('config/warble.rb', new_config)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def jar
|
29
|
+
system('mkdir -p dist')
|
30
|
+
puts "Generating JAR with Warbler..."
|
31
|
+
system('warble')
|
32
|
+
end
|
33
|
+
|
34
|
+
def native
|
35
|
+
require 'facets/string/titlecase'
|
36
|
+
require 'facets/string/underscore'
|
37
|
+
project_name = File.basename(File.expand_path('.'))
|
38
|
+
version_file = File.expand_path('./VERSION')
|
39
|
+
version = (File.read(version_file).strip if File.exists?(version_file) && File.file?(version_file)) rescue nil
|
40
|
+
license_file = File.expand_path('./LICENSE.txt')
|
41
|
+
license = (File.read(license_file).strip if File.exists?(license_file) && File.file?(license_file)) rescue nil
|
42
|
+
human_name = project_name.underscore.titlecase
|
43
|
+
command = "javapackager -deploy -native -outdir packages -outfile \"#{project_name}\" -srcfiles \"dist/#{project_name}.jar\" -appclass JarMain -name \"#{human_name}\" -title \"#{human_name}\" -Bmac.CFBundleName=\"#{human_name}\" -Bmac.CFBundleIdentifier=\"org.#{project_name}.application.#{project_name}\" -Bmac.category=\"public.app-category.business\" "
|
44
|
+
command += " -BjvmOptions=-XstartOnFirstThread " if OS.mac?
|
45
|
+
command += " -BappVersion=#{version} -Bmac.CFBundleVersion=#{version} " if version
|
46
|
+
command += " -srcfiles LICENSE.txt -BlicenseFile=LICENSE.txt " if license
|
47
|
+
command += " #{javapackager_extra_args} " if javapackager_extra_args
|
48
|
+
command += " #{ENV['JAVAPACKAGER_EXTRA_ARGS']} " if ENV['JAVAPACKAGER_EXTRA_ARGS']
|
49
|
+
puts "Generating DMG/PKG/APP/JNLP with javapackager..."
|
50
|
+
puts command
|
51
|
+
system command
|
52
|
+
end
|
5
53
|
end
|
6
54
|
end
|
7
55
|
end
|
data/lib/glimmer/rake_task.rb
CHANGED
@@ -7,57 +7,26 @@ namespace :glimmer do
|
|
7
7
|
namespace :package do
|
8
8
|
desc 'Generate JAR config file'
|
9
9
|
task :config do
|
10
|
-
|
11
|
-
if !File.exists?('config/warble.rb')
|
12
|
-
puts 'Generating JAR configuration (config/warble.rb) to use with Warbler...'
|
13
|
-
system('mkdir -p config')
|
14
|
-
system('warble config')
|
15
|
-
new_config = File.read('config/warble.rb').split("\n").inject('') do |output, line|
|
16
|
-
if line.include?('config.dirs =')
|
17
|
-
line = line.sub('# ', '').sub(/=[^=\n]+$/, '= %w(app config db lib script bin docs fonts icons images sounds videos)')
|
18
|
-
end
|
19
|
-
if line.include?('config.includes =')
|
20
|
-
line = line.sub('# ', '').sub(/=[^=\n]+$/, "= FileList['LICENSE.txt', 'VERSION']")
|
21
|
-
end
|
22
|
-
if line.include?('config.autodeploy_dir =')
|
23
|
-
line = line.sub('# ', '')
|
24
|
-
end
|
25
|
-
output + "\n" + line
|
26
|
-
end
|
27
|
-
File.write('config/warble.rb', new_config)
|
28
|
-
end
|
10
|
+
Glimmer::Package.config
|
29
11
|
end
|
30
12
|
|
31
13
|
desc 'Generate JAR file'
|
32
|
-
task :jar
|
33
|
-
|
34
|
-
puts "Generating JAR with Warbler..."
|
35
|
-
system('warble')
|
14
|
+
task :jar do
|
15
|
+
Glimmer::Package.jar
|
36
16
|
end
|
37
17
|
|
38
|
-
desc 'Generate Native files (DMG/PKG/APP on the Mac)'
|
39
|
-
task :native
|
40
|
-
|
41
|
-
require 'facets/string/underscore'
|
42
|
-
project_name = File.basename(File.expand_path('.'))
|
43
|
-
version_file = File.expand_path('./VERSION')
|
44
|
-
version = (File.read(version_file).strip if File.exists?(version_file) && File.file?(version_file)) rescue nil
|
45
|
-
license_file = File.expand_path('./LICENSE.txt')
|
46
|
-
license = (File.read(license_file).strip if File.exists?(license_file) && File.file?(license_file)) rescue nil
|
47
|
-
human_name = project_name.underscore.titlecase
|
48
|
-
command = "javapackager -deploy -native -outdir packages -outfile \"#{project_name}\" -srcfiles \"dist/#{project_name}.jar\" -appclass JarMain -name \"#{human_name}\" -title \"#{human_name}\" -BjvmOptions=-XstartOnFirstThread -Bmac.CFBundleName=\"#{human_name}\" -Bmac.CFBundleIdentifier=\"org.#{project_name}.application.#{project_name}\" -Bmac.category=\"public.app-category.business\" "
|
49
|
-
command += " -BappVersion=#{version} -Bmac.CFBundleVersion=#{version} " if version
|
50
|
-
command += " -srcfiles LICENSE.txt -BlicenseFile=LICENSE.txt " if license
|
51
|
-
command += " #{Glimmer::Package.javapackager_extra_args} " if Glimmer::Package.javapackager_extra_args
|
52
|
-
command += " #{ENV['JAVAPACKAGER_EXTRA_ARGS']} " if ENV['JAVAPACKAGER_EXTRA_ARGS']
|
53
|
-
puts "Generating DMG/PKG/APP/JNLP with javapackager..."
|
54
|
-
puts command
|
55
|
-
system command
|
18
|
+
desc 'Generate Native files (DMG/PKG/APP on the Mac, EXE on Windows, RPM/DEB on Linux)'
|
19
|
+
task :native do
|
20
|
+
Glimmer::Package.native
|
56
21
|
end
|
57
22
|
end
|
58
23
|
|
59
24
|
desc 'Package app for distribution (generating config, jar, and native files)'
|
60
|
-
task :package
|
25
|
+
task :package do
|
26
|
+
Rake::Task['glimmer:package:config'].execute
|
27
|
+
Rake::Task['glimmer:package:jar'].execute
|
28
|
+
Rake::Task['glimmer:package:native'].execute
|
29
|
+
end
|
61
30
|
|
62
31
|
|
63
32
|
desc 'Scaffold a Glimmer application directory structure to begin building a new app'
|
@@ -76,9 +45,9 @@ namespace :glimmer do
|
|
76
45
|
Scaffold.custom_widget(args[:custom_widget_name], args[:namespace])
|
77
46
|
end
|
78
47
|
|
79
|
-
desc 'Scaffold a Glimmer::UI::CustomShell subclass (represents a full window view) under its own Ruby gem project (namespace is required)'
|
80
|
-
task :custom_shell_gem, [:
|
81
|
-
Scaffold.custom_shell_gem(args[:
|
48
|
+
desc 'Scaffold a Glimmer::UI::CustomShell subclass (represents a full window view) under its own Ruby gem + app project (namespace is required)'
|
49
|
+
task :custom_shell_gem, [:custom_shell_name, :namespace] do |t, args|
|
50
|
+
Scaffold.custom_shell_gem(args[:custom_shell_name], args[:namespace])
|
82
51
|
end
|
83
52
|
|
84
53
|
desc 'Scaffold a Glimmer::UI::CustomWidget subclass (represents a part of a view) under its own Ruby gem project (namespace is required)'
|
data/lib/glimmer/scaffold.rb
CHANGED
@@ -77,7 +77,7 @@ class Scaffold
|
|
77
77
|
GEMFILE_APP = <<~MULTI_LINE_STRING
|
78
78
|
# frozen_string_literal: true
|
79
79
|
|
80
|
-
source
|
80
|
+
source 'https://rubygems.org'
|
81
81
|
|
82
82
|
git_source(:github) {|repo_name| "https://github.com/\#{repo_name}" }
|
83
83
|
|
@@ -91,23 +91,23 @@ class Scaffold
|
|
91
91
|
GEMFILE_GEM = <<~MULTI_LINE_STRING
|
92
92
|
# frozen_string_literal: true
|
93
93
|
|
94
|
-
source
|
94
|
+
source 'https://rubygems.org'
|
95
95
|
|
96
96
|
git_source(:github) {|repo_name| "https://github.com/\#{repo_name}" }
|
97
97
|
|
98
98
|
gem 'glimmer', '~> #{VERSION}'
|
99
99
|
|
100
100
|
group :development do
|
101
|
-
gem
|
102
|
-
gem
|
103
|
-
gem
|
101
|
+
gem 'rspec', '~> 3.5.0'
|
102
|
+
gem 'jeweler', '2.3.9'
|
103
|
+
gem 'simplecov', '>= 0'
|
104
104
|
end
|
105
105
|
MULTI_LINE_STRING
|
106
106
|
|
107
107
|
RAKEFILE = <<~MULTI_LINE_STRING
|
108
108
|
require 'glimmer/rake_task'
|
109
109
|
|
110
|
-
##
|
110
|
+
## Use the following configuration if you would like to customize javapackager
|
111
111
|
## arguments for `glimmer package` command.
|
112
112
|
#
|
113
113
|
# Glimmer::Package.javapackager_extra_args =
|
@@ -146,7 +146,7 @@ class Scaffold
|
|
146
146
|
write "app/#{file_name(app_name)}.rb", app_main_file(app_name)
|
147
147
|
mkdir 'app/models'
|
148
148
|
mkdir 'app/views'
|
149
|
-
custom_shell('AppView', current_dir_name)
|
149
|
+
custom_shell('AppView', current_dir_name, :app)
|
150
150
|
if OS.mac?
|
151
151
|
mkdir_p 'package/macosx'
|
152
152
|
icon_file = "package/macosx/#{human_name(app_name)}.icns"
|
@@ -155,18 +155,18 @@ class Scaffold
|
|
155
155
|
end
|
156
156
|
mkdir 'bin'
|
157
157
|
write "bin/#{file_name(app_name)}", app_bin_file(app_name)
|
158
|
-
FileUtils.chmod 0755, "bin/#{app_name
|
158
|
+
FileUtils.chmod 0755, "bin/#{file_name(app_name)}"
|
159
159
|
system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n glimmer package\n'"
|
160
160
|
system "open packages/bundles/#{human_name(app_name).gsub(' ', '\ ')}.app"
|
161
161
|
# TODO generate rspec test suite
|
162
162
|
end
|
163
163
|
|
164
|
-
def custom_shell(custom_shell_name, namespace)
|
164
|
+
def custom_shell(custom_shell_name, namespace, shell_type = nil)
|
165
165
|
namespace ||= current_dir_name
|
166
166
|
root_dir = File.exists?('app') ? 'app' : 'lib'
|
167
167
|
parent_dir = "#{root_dir}/views/#{file_name(namespace)}"
|
168
168
|
mkdir_p parent_dir unless File.exists?(parent_dir)
|
169
|
-
write "#{parent_dir}/#{file_name(custom_shell_name)}.rb", custom_shell_file(custom_shell_name, namespace)
|
169
|
+
write "#{parent_dir}/#{file_name(custom_shell_name)}.rb", custom_shell_file(custom_shell_name, namespace, shell_type)
|
170
170
|
end
|
171
171
|
|
172
172
|
def custom_widget(custom_widget_name, namespace)
|
@@ -179,7 +179,7 @@ class Scaffold
|
|
179
179
|
|
180
180
|
def custom_shell_gem(custom_shell_name, namespace)
|
181
181
|
gem_name = "glimmer-cs-#{compact_name(custom_shell_name)}"
|
182
|
-
gem_summary = "
|
182
|
+
gem_summary = "#{human_name(custom_shell_name)} - Glimmer Custom Shell"
|
183
183
|
if namespace
|
184
184
|
gem_name += "-#{compact_name(namespace)}"
|
185
185
|
gem_summary += " (#{human_name(namespace)})"
|
@@ -193,11 +193,22 @@ class Scaffold
|
|
193
193
|
write '.ruby-gemset', gem_name
|
194
194
|
write 'VERSION', '1.0.0'
|
195
195
|
write 'Gemfile', GEMFILE_GEM
|
196
|
-
write 'Rakefile', gem_rakefile
|
196
|
+
write 'Rakefile', gem_rakefile(custom_shell_name, namespace)
|
197
197
|
append "lib/#{gem_name}.rb", gem_main_file(custom_shell_name, namespace)
|
198
198
|
mkdir 'lib/views'
|
199
|
-
custom_shell(custom_shell_name, namespace)
|
200
|
-
|
199
|
+
custom_shell(custom_shell_name, namespace, :gem)
|
200
|
+
mkdir 'bin'
|
201
|
+
write "bin/#{gem_name}", gem_bin_file(gem_name, custom_shell_name, namespace)
|
202
|
+
write "bin/#{file_name(custom_shell_name)}", gem_bin_command_file(gem_name)
|
203
|
+
FileUtils.chmod 0755, "bin/#{file_name(custom_shell_name)}"
|
204
|
+
if OS.mac?
|
205
|
+
mkdir_p 'package/macosx'
|
206
|
+
icon_file = "package/macosx/#{human_name(custom_shell_name)}.icns"
|
207
|
+
cp File.expand_path('../../../icons/scaffold_app.icns', __FILE__), icon_file
|
208
|
+
puts "Created #{current_dir_name}/#{icon_file}"
|
209
|
+
end
|
210
|
+
system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n glimmer package\n'"
|
211
|
+
system "open packages/bundles/#{human_name(custom_shell_name).gsub(' ', '\ ')}.app"
|
201
212
|
puts "Finished creating #{gem_name} Ruby gem."
|
202
213
|
puts 'Edit Rakefile to configure gem details.'
|
203
214
|
puts 'Run `rake` to execute specs.'
|
@@ -207,7 +218,7 @@ class Scaffold
|
|
207
218
|
|
208
219
|
def custom_widget_gem(custom_widget_name, namespace)
|
209
220
|
gem_name = "glimmer-cw-#{compact_name(custom_widget_name)}"
|
210
|
-
gem_summary = "
|
221
|
+
gem_summary = "#{human_name(custom_widget_name)} - Glimmer Custom Widget"
|
211
222
|
if namespace
|
212
223
|
gem_name += "-#{compact_name(namespace)}"
|
213
224
|
gem_summary += " (#{human_name(namespace)})"
|
@@ -253,19 +264,20 @@ class Scaffold
|
|
253
264
|
end
|
254
265
|
|
255
266
|
def class_name(app_name)
|
256
|
-
app_name.camelcase(:upper)
|
267
|
+
app_name.underscore.camelcase(:upper)
|
257
268
|
end
|
258
269
|
|
259
270
|
def file_name(app_name)
|
260
271
|
app_name.underscore
|
261
272
|
end
|
273
|
+
alias dsl_widget_name file_name
|
262
274
|
|
263
275
|
def human_name(app_name)
|
264
276
|
app_name.underscore.titlecase
|
265
277
|
end
|
266
278
|
|
267
279
|
def compact_name(gem_name)
|
268
|
-
gem_name.camelcase.downcase
|
280
|
+
gem_name.underscore.camelcase.downcase
|
269
281
|
end
|
270
282
|
|
271
283
|
def app_main_file(app_name)
|
@@ -280,7 +292,8 @@ class Scaffold
|
|
280
292
|
include Glimmer
|
281
293
|
|
282
294
|
APP_ROOT = File.expand_path('../..', __FILE__)
|
283
|
-
VERSION = File.read(File.
|
295
|
+
VERSION = File.read(File.join(APP_ROOT, 'VERSION'))
|
296
|
+
LICENSE = File.read(File.join(APP_ROOT, 'LICENSE.txt'))
|
284
297
|
|
285
298
|
def open
|
286
299
|
app_view.open
|
@@ -312,17 +325,59 @@ class Scaffold
|
|
312
325
|
MULTI_LINE_STRING
|
313
326
|
end
|
314
327
|
|
315
|
-
def
|
328
|
+
def gem_bin_file(gem_name, custom_shell_name, namespace)
|
329
|
+
<<~MULTI_LINE_STRING
|
330
|
+
#!/usr/bin/env ruby
|
331
|
+
|
332
|
+
require_relative '../lib/#{gem_name}'
|
333
|
+
|
334
|
+
include Glimmer
|
335
|
+
|
336
|
+
#{dsl_widget_name(custom_shell_name)}.open
|
337
|
+
MULTI_LINE_STRING
|
338
|
+
end
|
339
|
+
|
340
|
+
def gem_bin_command_file(gem_name)
|
341
|
+
<<~MULTI_LINE_STRING
|
342
|
+
#!/usr/bin/env ruby
|
343
|
+
|
344
|
+
require 'glimmer/launcher'
|
345
|
+
|
346
|
+
runner = File.expand_path("../#{gem_name}", __FILE__)
|
347
|
+
launcher = Glimmer::Launcher.new([runner] + ARGV)
|
348
|
+
launcher.launch
|
349
|
+
MULTI_LINE_STRING
|
350
|
+
end
|
351
|
+
|
352
|
+
def gem_rakefile(custom_shell_name = nil, namespace = nil)
|
316
353
|
rakefile_content = File.read('Rakefile')
|
317
354
|
lines = rakefile_content.split("\n")
|
318
355
|
require_rake_line_index = lines.index(lines.detect {|l| l.include?("require 'rake'") })
|
319
356
|
lines.insert(require_rake_line_index, "require 'glimmer/launcher'")
|
320
357
|
gem_files_line_index = lines.index(lines.detect {|l| l.include?('# dependencies defined in Gemfile') })
|
321
|
-
|
358
|
+
if custom_shell_name
|
359
|
+
lines.insert(gem_files_line_index, " gem.files = Dir['VERSION', 'LICENSE.txt', 'lib/**/*.rb', 'bin/**/*']")
|
360
|
+
lines.insert(gem_files_line_index+1, " gem.executables = ['#{file_name(custom_shell_name)}']")
|
361
|
+
else
|
362
|
+
lines.insert(gem_files_line_index, " gem.files = Dir['lib/**/*.rb']")
|
363
|
+
end
|
322
364
|
spec_pattern_line_index = lines.index(lines.detect {|l| l.include?('spec.pattern =') })
|
323
365
|
lines.insert(spec_pattern_line_index+1, " spec.ruby_opts = [Glimmer::Launcher.jruby_swt_options]")
|
324
|
-
lines << "\nrequire 'glimmer/rake_task'\n"
|
325
|
-
lines.join("\n")
|
366
|
+
lines << "\nrequire 'glimmer/rake_task'\n"
|
367
|
+
file_content = lines.join("\n")
|
368
|
+
if custom_shell_name
|
369
|
+
file_content << <<~MULTI_LINE_STRING
|
370
|
+
Glimmer::Package.javapackager_extra_args =
|
371
|
+
" -name '#{human_name(custom_shell_name)}'" +
|
372
|
+
" -title '#{human_name(custom_shell_name)}'" +
|
373
|
+
" -Bmac.CFBundleName='#{human_name(custom_shell_name)}'" +
|
374
|
+
" -Bmac.CFBundleIdentifier='org.#{namespace ? compact_name(namespace) : compact_name(custom_shell_name)}.application.#{compact_name(custom_shell_name)}'"
|
375
|
+
# " -BlicenseType=" +
|
376
|
+
# " -Bmac.category=" +
|
377
|
+
# " -Bmac.signing-key-developer-id-app="
|
378
|
+
MULTI_LINE_STRING
|
379
|
+
end
|
380
|
+
file_content
|
326
381
|
end
|
327
382
|
|
328
383
|
def spec_helper_file
|
@@ -346,52 +401,137 @@ class Scaffold
|
|
346
401
|
lines.join("\n")
|
347
402
|
end
|
348
403
|
|
349
|
-
def custom_shell_file(custom_shell_name, namespace)
|
404
|
+
def custom_shell_file(custom_shell_name, namespace, shell_type)
|
350
405
|
namespace_type = class_name(namespace) == class_name(current_dir_name) ? 'class' : 'module'
|
351
406
|
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
#
|
365
|
-
#
|
366
|
-
# before_body {
|
367
|
-
#
|
368
|
-
# }
|
369
|
-
|
370
|
-
## Uncomment after_body block to setup observers for widgets in body
|
371
|
-
#
|
372
|
-
# after_body {
|
373
|
-
#
|
374
|
-
# }
|
407
|
+
custom_shell_file_content = <<-MULTI_LINE_STRING
|
408
|
+
#{namespace_type} #{class_name(namespace)}
|
409
|
+
class #{class_name(custom_shell_name)}
|
410
|
+
include Glimmer::UI::CustomShell
|
411
|
+
|
412
|
+
MULTI_LINE_STRING
|
413
|
+
|
414
|
+
if shell_type == :gem
|
415
|
+
custom_shell_file_content += <<-MULTI_LINE_STRING
|
416
|
+
GEM_ROOT = File.expand_path('../../../..', __FILE__)
|
417
|
+
VERSION = File.read(File.join(GEM_ROOT, 'VERSION'))
|
418
|
+
LICENSE = File.read(File.join(GEM_ROOT, 'LICENSE.txt'))
|
375
419
|
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
420
|
+
MULTI_LINE_STRING
|
421
|
+
end
|
422
|
+
|
423
|
+
custom_shell_file_content += <<-MULTI_LINE_STRING
|
424
|
+
## Add options like the following to configure CustomShell by outside consumers
|
425
|
+
#
|
426
|
+
# options :title, :background_color
|
427
|
+
# option :width, default: 320
|
428
|
+
# option :height, default: 240
|
429
|
+
option :greeting, default: 'Hello, World!'
|
430
|
+
|
431
|
+
## Use before_body block to pre-initialize variables to use in body
|
432
|
+
#
|
433
|
+
#
|
434
|
+
MULTI_LINE_STRING
|
435
|
+
|
436
|
+
if %i[gem app].include?(shell_type)
|
437
|
+
custom_shell_file_content += <<-MULTI_LINE_STRING
|
438
|
+
before_body {
|
439
|
+
Display.setAppName('#{shell_type == :gem ? human_name(custom_shell_name) : human_name(namespace)}')
|
440
|
+
Display.setAppVersion(VERSION)
|
441
|
+
@display = display {
|
442
|
+
on_about {
|
443
|
+
display_about_dialog
|
444
|
+
}
|
445
|
+
on_preferences {
|
446
|
+
display_preferences_dialog
|
447
|
+
}
|
448
|
+
}
|
449
|
+
}
|
450
|
+
MULTI_LINE_STRING
|
451
|
+
else
|
452
|
+
custom_shell_file_content += <<-MULTI_LINE_STRING
|
453
|
+
# before_body {
|
454
|
+
#
|
455
|
+
# }
|
456
|
+
MULTI_LINE_STRING
|
457
|
+
end
|
458
|
+
|
459
|
+
custom_shell_file_content += <<-MULTI_LINE_STRING
|
460
|
+
|
461
|
+
## Use after_body block to setup observers for widgets in body
|
462
|
+
#
|
463
|
+
# after_body {
|
464
|
+
#
|
465
|
+
# }
|
466
|
+
|
467
|
+
## Add widget content inside custom shell body
|
468
|
+
## Top-most widget must be a shell or another custom shell
|
469
|
+
#
|
470
|
+
body {
|
471
|
+
shell {
|
472
|
+
# Replace example content below with custom shell content
|
473
|
+
minimum_size 320, 240
|
474
|
+
text "#{human_name(namespace)} - #{human_name(custom_shell_name)}"
|
475
|
+
grid_layout
|
476
|
+
label(:center) {
|
477
|
+
text bind(self, :greeting)
|
478
|
+
font height: 40
|
479
|
+
layout_data :fill, :center, true, true
|
480
|
+
}
|
481
|
+
}
|
482
|
+
}
|
483
|
+
MULTI_LINE_STRING
|
484
|
+
|
485
|
+
if %i[gem app].include?(shell_type)
|
486
|
+
custom_shell_file_content += <<-MULTI_LINE_STRING
|
487
|
+
|
488
|
+
def display_about_dialog
|
489
|
+
message_box = MessageBox.new(swt_widget)
|
490
|
+
message_box.setText("About")
|
491
|
+
message = "#{human_name(namespace)} - #{human_name(custom_shell_name)} \#{VERSION}\n\n"
|
492
|
+
message += LICENSE
|
493
|
+
message_box.setMessage(message)
|
494
|
+
message_box.open
|
495
|
+
end
|
496
|
+
|
497
|
+
def display_preferences_dialog
|
498
|
+
dialog(swt_widget) {
|
499
|
+
text 'Preferences'
|
500
|
+
grid_layout {
|
501
|
+
margin_height 5
|
502
|
+
margin_width 5
|
503
|
+
}
|
504
|
+
group {
|
505
|
+
row_layout {
|
506
|
+
type :vertical
|
507
|
+
spacing 10
|
508
|
+
}
|
509
|
+
text 'Greeting'
|
510
|
+
font style: :bold
|
511
|
+
[
|
512
|
+
'Hello, World!',
|
513
|
+
'Howdy, Partner!'
|
514
|
+
].each do |greeting_text|
|
515
|
+
button(:radio) {
|
516
|
+
text greeting_text
|
517
|
+
selection bind(self, :greeting) { |g| g == greeting_text }
|
518
|
+
layout_data {
|
519
|
+
width 160
|
520
|
+
}
|
521
|
+
on_widget_selected { |event|
|
522
|
+
self.greeting = event.widget.getText
|
390
523
|
}
|
391
524
|
}
|
392
|
-
|
393
525
|
end
|
394
|
-
|
526
|
+
}
|
527
|
+
}.open
|
528
|
+
end
|
529
|
+
MULTI_LINE_STRING
|
530
|
+
end
|
531
|
+
|
532
|
+
custom_shell_file_content += <<-MULTI_LINE_STRING
|
533
|
+
end
|
534
|
+
end
|
395
535
|
MULTI_LINE_STRING
|
396
536
|
end
|
397
537
|
|
@@ -406,16 +546,16 @@ class Scaffold
|
|
406
546
|
## Add options like the following to configure CustomWidget by outside consumers
|
407
547
|
#
|
408
548
|
# options :custom_text, :background_color
|
409
|
-
# option :foreground_color, :red
|
549
|
+
# option :foreground_color, default: :red
|
410
550
|
|
411
|
-
##
|
551
|
+
## Use before_body block to pre-initialize variables to use in body
|
412
552
|
#
|
413
553
|
#
|
414
554
|
# before_body {
|
415
555
|
#
|
416
556
|
# }
|
417
557
|
|
418
|
-
##
|
558
|
+
## Use after_body block to setup observers for widgets in body
|
419
559
|
#
|
420
560
|
# after_body {
|
421
561
|
#
|